@wu529778790/open-im 1.9.3-beta.11 → 1.9.3-beta.12
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.
|
@@ -15,7 +15,7 @@ export declare const PAGE_TEXTS: {
|
|
|
15
15
|
readonly mode: "Flow";
|
|
16
16
|
readonly dashboardTitle: "Dashboard";
|
|
17
17
|
readonly dashboardSubtitle: "Platform health status";
|
|
18
|
-
readonly dashboardSubtitleFull: "Platform
|
|
18
|
+
readonly dashboardSubtitleFull: "Platform and service status";
|
|
19
19
|
readonly quickActionsTitle: "Quick Actions";
|
|
20
20
|
readonly serviceTitle: "Service Control";
|
|
21
21
|
readonly serviceHint: "Validate, save, start, and stop the local bridge from one place.";
|
|
@@ -47,7 +47,7 @@ export declare const PAGE_TEXTS: {
|
|
|
47
47
|
readonly openImConfigCardHint: "Full open-im configuration. Use Format, then Save. Invalid JSON is rejected.";
|
|
48
48
|
readonly claudeSettingsCardHint: "Claude SDK environment (ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, ANTHROPIC_MODEL, etc.). Set API access here without shell exports.";
|
|
49
49
|
readonly claudeJsonShortcutHint: "Edit ~/.claude/settings.json in the sidebar «Config files» section below.";
|
|
50
|
-
readonly platformsHint: "
|
|
50
|
+
readonly platformsHint: "Disabled platforms keep their saved values.";
|
|
51
51
|
readonly enabled: "Enabled";
|
|
52
52
|
readonly readyState: "Ready";
|
|
53
53
|
readonly setupRequired: "Setup required";
|
|
@@ -141,28 +141,10 @@ export declare const PAGE_TEXTS: {
|
|
|
141
141
|
readonly saveBtn: "Save";
|
|
142
142
|
readonly jsonValid: "Valid JSON";
|
|
143
143
|
readonly jsonInvalid: "Invalid JSON: {error}";
|
|
144
|
-
readonly wizardTitle: "First-time setup";
|
|
145
|
-
readonly wizardStep1Title: "Connect an IM channel";
|
|
146
|
-
readonly wizardStep1Desc: "Enable at least one platform below and fill every required field. Use Check config when available.";
|
|
147
|
-
readonly wizardStep2Title: "Set the default AI tool";
|
|
148
|
-
readonly wizardStep2Desc: "Claude SDK: edit ~/.claude/settings.json under sidebar Config files. Codex / CodeBuddy: set the CLI path in the AI section.";
|
|
149
|
-
readonly wizardStep3Title: "Validate and save";
|
|
150
|
-
readonly wizardStep3Desc: "Click Validate, then Save config. Fix any errors shown in the banner above.";
|
|
151
|
-
readonly wizardStep4Title: "Start the bridge";
|
|
152
|
-
readonly wizardStep4Desc: "Open Service and click Start bridge. If it exits, read ~/.open-im/logs.";
|
|
153
|
-
readonly wizardStatusDone: "Done";
|
|
154
|
-
readonly wizardStatusTodo: "To do";
|
|
155
|
-
readonly wizardJumpPlatforms: "Open Platforms";
|
|
156
|
-
readonly wizardJumpAi: "Open AI";
|
|
157
|
-
readonly wizardJumpService: "Open Service";
|
|
158
144
|
readonly validationNoPlatformEnabled: "Enable at least one IM platform and fill its required credentials before saving.";
|
|
159
145
|
readonly validationPlatformIncomplete: "Platform \"{platform}\" is enabled but these required fields are empty: {fields}";
|
|
160
146
|
readonly validationAiCodexNoCli: "Default AI is Codex but Codex CLI path is empty. Set it under AI Tooling or change the default tool.";
|
|
161
147
|
readonly validationAiCodebuddyNoCli: "Default AI is CodeBuddy but CodeBuddy CLI path is empty. Set it under AI Tooling or change the default tool.";
|
|
162
|
-
readonly onboardingTitle: "Welcome to open-im";
|
|
163
|
-
readonly onboardingDismiss: "Got it";
|
|
164
|
-
readonly onboardingReadme: "README (setup)";
|
|
165
|
-
readonly onboardingBody: "<p><strong>open-im</strong> bridges Telegram, Feishu, QQ, WeWork, DingTalk, and WorkBuddy to Claude / Codex / CodeBuddy on your machine.</p><ol style=\"margin:12px 0 12px 18px;line-height:1.65\"><li>Pick <strong>one</strong> chat app in <strong>Platforms</strong> and paste credentials (see hints under each field).</li><li>Set the <strong>default AI</strong> under AI Tooling; for Claude SDK, put API keys in sidebar <strong>Config files</strong> → <strong>~/.claude/settings.json</strong>.</li><li>Edit <strong>~/.open-im/config.json</strong> in the same <strong>Config files</strong> section when you need raw JSON.</li><li>Use <strong>Validate</strong> then <strong>Save config</strong>, then <strong>Start bridge</strong> under Service.</li><li>CLI alternative: run <code style=\"background:var(--bg-tertiary);padding:2px 6px;border-radius:4px\">open-im init</code> in a terminal.</li></ol>";
|
|
166
148
|
readonly tipTelegramToken: "From Telegram, open <a href=\"https://t.me/BotFather\" target=\"_blank\" rel=\"noopener\">@BotFather</a> → /newbot → copy the token.";
|
|
167
149
|
readonly tipFeishuAppId: "Feishu Open Platform → your app → Credentials → App ID.";
|
|
168
150
|
readonly tipFeishuSecret: "Same page → App Secret (click show / reset if needed).";
|
|
@@ -188,7 +170,7 @@ export declare const PAGE_TEXTS: {
|
|
|
188
170
|
readonly mode: "模式";
|
|
189
171
|
readonly dashboardTitle: "概览";
|
|
190
172
|
readonly dashboardSubtitle: "平台健康状态";
|
|
191
|
-
readonly dashboardSubtitleFull: "
|
|
173
|
+
readonly dashboardSubtitleFull: "平台与服务状态";
|
|
192
174
|
readonly quickActionsTitle: "快捷操作";
|
|
193
175
|
readonly refreshHealth: "刷新健康状态";
|
|
194
176
|
readonly viewConfig: "查看配置";
|
|
@@ -218,7 +200,7 @@ export declare const PAGE_TEXTS: {
|
|
|
218
200
|
readonly openImConfigCardHint: "open-im 完整配置。先格式化再保存;JSON 不合法时无法写入。";
|
|
219
201
|
readonly claudeSettingsCardHint: "Claude SDK 环境变量(ANTHROPIC_API_KEY、ANTHROPIC_BASE_URL、ANTHROPIC_MODEL 等)。在此配置 API,无需在终端 export。";
|
|
220
202
|
readonly claudeJsonShortcutHint: "提示:请在左侧栏「配置文件」分区编辑 ~/.claude/settings.json。";
|
|
221
|
-
readonly platformsHint: "
|
|
203
|
+
readonly platformsHint: "禁用的平台仍保留已保存的值。";
|
|
222
204
|
readonly enabled: "启用";
|
|
223
205
|
readonly readyState: "已就绪";
|
|
224
206
|
readonly setupRequired: "需要完成配置";
|
|
@@ -308,28 +290,10 @@ export declare const PAGE_TEXTS: {
|
|
|
308
290
|
readonly saveBtn: "保存";
|
|
309
291
|
readonly jsonValid: "JSON 有效";
|
|
310
292
|
readonly jsonInvalid: "JSON 无效:{error}";
|
|
311
|
-
readonly wizardTitle: "首次使用引导";
|
|
312
|
-
readonly wizardStep1Title: "接入一个 IM 渠道";
|
|
313
|
-
readonly wizardStep1Desc: "在下方启用至少一个平台,并填写所有必填项。有条件时用「校验配置」测试凭证。";
|
|
314
|
-
readonly wizardStep2Title: "设置默认 AI 工具";
|
|
315
|
-
readonly wizardStep2Desc: "Claude SDK:在左侧栏「配置文件」编辑 ~/.claude/settings.json。Codex / CodeBuddy:在 AI 区填 CLI 路径。";
|
|
316
|
-
readonly wizardStep3Title: "校验并保存";
|
|
317
|
-
readonly wizardStep3Desc: "先点「校验」,再点「保存配置」。按顶部提示修复错误。";
|
|
318
|
-
readonly wizardStep4Title: "启动桥接";
|
|
319
|
-
readonly wizardStep4Desc: "到「服务」区点「启动桥接」。若马上退出,查 ~/.open-im/logs 日志。";
|
|
320
|
-
readonly wizardStatusDone: "已完成";
|
|
321
|
-
readonly wizardStatusTodo: "待完成";
|
|
322
|
-
readonly wizardJumpPlatforms: "打开平台配置";
|
|
323
|
-
readonly wizardJumpAi: "打开 AI 配置";
|
|
324
|
-
readonly wizardJumpService: "打开服务控制";
|
|
325
293
|
readonly validationNoPlatformEnabled: "保存前请至少启用一个 IM 平台,并填完必填凭证。";
|
|
326
294
|
readonly validationPlatformIncomplete: "平台「{platform}」已启用,但以下必填项为空:{fields}";
|
|
327
295
|
readonly validationAiCodexNoCli: "默认 AI 为 Codex,但 Codex CLI 路径为空。请在 AI 区填写,或改默认工具。";
|
|
328
296
|
readonly validationAiCodebuddyNoCli: "默认 AI 为 CodeBuddy,但 CodeBuddy CLI 路径为空。请在 AI 区填写,或改默认工具。";
|
|
329
|
-
readonly onboardingTitle: "欢迎使用 open-im";
|
|
330
|
-
readonly onboardingDismiss: "知道了";
|
|
331
|
-
readonly onboardingReadme: "README(部署说明)";
|
|
332
|
-
readonly onboardingBody: "<p><strong>open-im</strong> 在本机把 Telegram、飞书、QQ、企微、钉钉、WorkBuddy 等渠道连到 Claude / Codex / CodeBuddy。</p><ol style=\"margin:12px 0 12px 18px;line-height:1.65\"><li>在<strong>平台配置</strong>选一个聊天应用,按字段下方提示填凭证。</li><li>在<strong>AI 工具配置</strong>设默认 AI;用 Claude SDK 时在左侧<strong>配置文件</strong>分区编辑<strong>~/.claude/settings.json</strong>。</li><li>同一<strong>配置文件</strong>分区可编辑<strong>~/.open-im/config.json</strong>。</li><li>先<strong>校验</strong>再<strong>保存配置</strong>,然后到<strong>服务</strong>启动桥接。</li><li>也可在终端运行 <code style=\"background:var(--bg-tertiary);padding:2px 6px;border-radius:4px\">open-im init</code> 交互配置。</li></ol>";
|
|
333
297
|
readonly tipTelegramToken: "在 Telegram 搜 <a href=\"https://t.me/BotFather\" target=\"_blank\" rel=\"noopener\">@BotFather</a>,发 /newbot 创建机器人后复制 Token。";
|
|
334
298
|
readonly tipFeishuAppId: "飞书开放平台 → 应用 → 凭证与基础信息 → App ID。";
|
|
335
299
|
readonly tipFeishuSecret: "同一页 App Secret(可重置后查看)。";
|
|
@@ -15,7 +15,7 @@ export const PAGE_TEXTS = {
|
|
|
15
15
|
mode: "Flow",
|
|
16
16
|
dashboardTitle: "Dashboard",
|
|
17
17
|
dashboardSubtitle: "Platform health status",
|
|
18
|
-
dashboardSubtitleFull: "Platform
|
|
18
|
+
dashboardSubtitleFull: "Platform and service status",
|
|
19
19
|
quickActionsTitle: "Quick Actions",
|
|
20
20
|
serviceTitle: "Service Control",
|
|
21
21
|
serviceHint: "Validate, save, start, and stop the local bridge from one place.",
|
|
@@ -47,7 +47,7 @@ export const PAGE_TEXTS = {
|
|
|
47
47
|
openImConfigCardHint: "Full open-im configuration. Use Format, then Save. Invalid JSON is rejected.",
|
|
48
48
|
claudeSettingsCardHint: "Claude SDK environment (ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, ANTHROPIC_MODEL, etc.). Set API access here without shell exports.",
|
|
49
49
|
claudeJsonShortcutHint: "Edit ~/.claude/settings.json in the sidebar «Config files» section below.",
|
|
50
|
-
platformsHint: "
|
|
50
|
+
platformsHint: "Disabled platforms keep their saved values.",
|
|
51
51
|
enabled: "Enabled",
|
|
52
52
|
readyState: "Ready",
|
|
53
53
|
setupRequired: "Setup required",
|
|
@@ -141,28 +141,10 @@ export const PAGE_TEXTS = {
|
|
|
141
141
|
saveBtn: "Save",
|
|
142
142
|
jsonValid: "Valid JSON",
|
|
143
143
|
jsonInvalid: "Invalid JSON: {error}",
|
|
144
|
-
wizardTitle: "First-time setup",
|
|
145
|
-
wizardStep1Title: "Connect an IM channel",
|
|
146
|
-
wizardStep1Desc: "Enable at least one platform below and fill every required field. Use Check config when available.",
|
|
147
|
-
wizardStep2Title: "Set the default AI tool",
|
|
148
|
-
wizardStep2Desc: "Claude SDK: edit ~/.claude/settings.json under sidebar Config files. Codex / CodeBuddy: set the CLI path in the AI section.",
|
|
149
|
-
wizardStep3Title: "Validate and save",
|
|
150
|
-
wizardStep3Desc: "Click Validate, then Save config. Fix any errors shown in the banner above.",
|
|
151
|
-
wizardStep4Title: "Start the bridge",
|
|
152
|
-
wizardStep4Desc: "Open Service and click Start bridge. If it exits, read ~/.open-im/logs.",
|
|
153
|
-
wizardStatusDone: "Done",
|
|
154
|
-
wizardStatusTodo: "To do",
|
|
155
|
-
wizardJumpPlatforms: "Open Platforms",
|
|
156
|
-
wizardJumpAi: "Open AI",
|
|
157
|
-
wizardJumpService: "Open Service",
|
|
158
144
|
validationNoPlatformEnabled: "Enable at least one IM platform and fill its required credentials before saving.",
|
|
159
145
|
validationPlatformIncomplete: "Platform \"{platform}\" is enabled but these required fields are empty: {fields}",
|
|
160
146
|
validationAiCodexNoCli: "Default AI is Codex but Codex CLI path is empty. Set it under AI Tooling or change the default tool.",
|
|
161
147
|
validationAiCodebuddyNoCli: "Default AI is CodeBuddy but CodeBuddy CLI path is empty. Set it under AI Tooling or change the default tool.",
|
|
162
|
-
onboardingTitle: "Welcome to open-im",
|
|
163
|
-
onboardingDismiss: "Got it",
|
|
164
|
-
onboardingReadme: "README (setup)",
|
|
165
|
-
onboardingBody: "<p><strong>open-im</strong> bridges Telegram, Feishu, QQ, WeWork, DingTalk, and WorkBuddy to Claude / Codex / CodeBuddy on your machine.</p><ol style=\"margin:12px 0 12px 18px;line-height:1.65\"><li>Pick <strong>one</strong> chat app in <strong>Platforms</strong> and paste credentials (see hints under each field).</li><li>Set the <strong>default AI</strong> under AI Tooling; for Claude SDK, put API keys in sidebar <strong>Config files</strong> → <strong>~/.claude/settings.json</strong>.</li><li>Edit <strong>~/.open-im/config.json</strong> in the same <strong>Config files</strong> section when you need raw JSON.</li><li>Use <strong>Validate</strong> then <strong>Save config</strong>, then <strong>Start bridge</strong> under Service.</li><li>CLI alternative: run <code style=\"background:var(--bg-tertiary);padding:2px 6px;border-radius:4px\">open-im init</code> in a terminal.</li></ol>",
|
|
166
148
|
tipTelegramToken: 'From Telegram, open <a href="https://t.me/BotFather" target="_blank" rel="noopener">@BotFather</a> → /newbot → copy the token.',
|
|
167
149
|
tipFeishuAppId: "Feishu Open Platform → your app → Credentials → App ID.",
|
|
168
150
|
tipFeishuSecret: "Same page → App Secret (click show / reset if needed).",
|
|
@@ -188,7 +170,7 @@ export const PAGE_TEXTS = {
|
|
|
188
170
|
mode: "\u6a21\u5f0f",
|
|
189
171
|
dashboardTitle: "\u6982\u89c8",
|
|
190
172
|
dashboardSubtitle: "\u5e73\u53f0\u5065\u5eb7\u72b6\u6001",
|
|
191
|
-
dashboardSubtitleFull: "\u5e73\u53f0\
|
|
173
|
+
dashboardSubtitleFull: "\u5e73\u53f0\u4e0e\u670d\u52a1\u72b6\u6001",
|
|
192
174
|
quickActionsTitle: "\u5feb\u6377\u64cd\u4f5c",
|
|
193
175
|
refreshHealth: "\u5237\u65b0\u5065\u5eb7\u72b6\u6001",
|
|
194
176
|
viewConfig: "\u67e5\u770b\u914d\u7f6e",
|
|
@@ -218,7 +200,7 @@ export const PAGE_TEXTS = {
|
|
|
218
200
|
openImConfigCardHint: "open-im \u5b8c\u6574\u914d\u7f6e\u3002\u5148\u683c\u5f0f\u5316\u518d\u4fdd\u5b58\uff1bJSON \u4e0d\u5408\u6cd5\u65f6\u65e0\u6cd5\u5199\u5165\u3002",
|
|
219
201
|
claudeSettingsCardHint: "Claude SDK \u73af\u5883\u53d8\u91cf\uff08ANTHROPIC_API_KEY\u3001ANTHROPIC_BASE_URL\u3001ANTHROPIC_MODEL \u7b49\uff09\u3002\u5728\u6b64\u914d\u7f6e API\uff0c\u65e0\u9700\u5728\u7ec8\u7aef export\u3002",
|
|
220
202
|
claudeJsonShortcutHint: "\u63d0\u793a\uff1a\u8bf7\u5728\u5de6\u4fa7\u680f\u300c\u914d\u7f6e\u6587\u4ef6\u300d\u5206\u533a\u7f16\u8f91 ~/.claude/settings.json\u3002",
|
|
221
|
-
platformsHint: "\
|
|
203
|
+
platformsHint: "\u7981\u7528\u7684\u5e73\u53f0\u4ecd\u4fdd\u7559\u5df2\u4fdd\u5b58\u7684\u503c\u3002",
|
|
222
204
|
enabled: "\u542f\u7528",
|
|
223
205
|
readyState: "\u5df2\u5c31\u7eea",
|
|
224
206
|
setupRequired: "\u9700\u8981\u5b8c\u6210\u914d\u7f6e",
|
|
@@ -308,28 +290,10 @@ export const PAGE_TEXTS = {
|
|
|
308
290
|
saveBtn: "\u4fdd\u5b58",
|
|
309
291
|
jsonValid: "JSON \u6709\u6548",
|
|
310
292
|
jsonInvalid: "JSON \u65e0\u6548\uff1a{error}",
|
|
311
|
-
wizardTitle: "\u9996\u6b21\u4f7f\u7528\u5f15\u5bfc",
|
|
312
|
-
wizardStep1Title: "\u63a5\u5165\u4e00\u4e2a IM \u6e20\u9053",
|
|
313
|
-
wizardStep1Desc: "\u5728\u4e0b\u65b9\u542f\u7528\u81f3\u5c11\u4e00\u4e2a\u5e73\u53f0\uff0c\u5e76\u586b\u5199\u6240\u6709\u5fc5\u586b\u9879\u3002\u6709\u6761\u4ef6\u65f6\u7528\u300c\u6821\u9a8c\u914d\u7f6e\u300d\u6d4b\u8bd5\u51ed\u8bc1\u3002",
|
|
314
|
-
wizardStep2Title: "\u8bbe\u7f6e\u9ed8\u8ba4 AI \u5de5\u5177",
|
|
315
|
-
wizardStep2Desc: "Claude SDK\uff1a\u5728\u5de6\u4fa7\u680f\u300c\u914d\u7f6e\u6587\u4ef6\u300d\u7f16\u8f91 ~/.claude/settings.json\u3002Codex / CodeBuddy\uff1a\u5728 AI \u533a\u586b CLI \u8def\u5f84\u3002",
|
|
316
|
-
wizardStep3Title: "\u6821\u9a8c\u5e76\u4fdd\u5b58",
|
|
317
|
-
wizardStep3Desc: "\u5148\u70b9\u300c\u6821\u9a8c\u300d\uff0c\u518d\u70b9\u300c\u4fdd\u5b58\u914d\u7f6e\u300d\u3002\u6309\u9876\u90e8\u63d0\u793a\u4fee\u590d\u9519\u8bef\u3002",
|
|
318
|
-
wizardStep4Title: "\u542f\u52a8\u6865\u63a5",
|
|
319
|
-
wizardStep4Desc: "\u5230\u300c\u670d\u52a1\u300d\u533a\u70b9\u300c\u542f\u52a8\u6865\u63a5\u300d\u3002\u82e5\u9a6c\u4e0a\u9000\u51fa\uff0c\u67e5 ~/.open-im/logs \u65e5\u5fd7\u3002",
|
|
320
|
-
wizardStatusDone: "\u5df2\u5b8c\u6210",
|
|
321
|
-
wizardStatusTodo: "\u5f85\u5b8c\u6210",
|
|
322
|
-
wizardJumpPlatforms: "\u6253\u5f00\u5e73\u53f0\u914d\u7f6e",
|
|
323
|
-
wizardJumpAi: "\u6253\u5f00 AI \u914d\u7f6e",
|
|
324
|
-
wizardJumpService: "\u6253\u5f00\u670d\u52a1\u63a7\u5236",
|
|
325
293
|
validationNoPlatformEnabled: "\u4fdd\u5b58\u524d\u8bf7\u81f3\u5c11\u542f\u7528\u4e00\u4e2a IM \u5e73\u53f0\uff0c\u5e76\u586b\u5b8c\u5fc5\u586b\u51ed\u8bc1\u3002",
|
|
326
294
|
validationPlatformIncomplete: "\u5e73\u53f0\u300c{platform}\u300d\u5df2\u542f\u7528\uff0c\u4f46\u4ee5\u4e0b\u5fc5\u586b\u9879\u4e3a\u7a7a\uff1a{fields}",
|
|
327
295
|
validationAiCodexNoCli: "\u9ed8\u8ba4 AI \u4e3a Codex\uff0c\u4f46 Codex CLI \u8def\u5f84\u4e3a\u7a7a\u3002\u8bf7\u5728 AI \u533a\u586b\u5199\uff0c\u6216\u6539\u9ed8\u8ba4\u5de5\u5177\u3002",
|
|
328
296
|
validationAiCodebuddyNoCli: "\u9ed8\u8ba4 AI \u4e3a CodeBuddy\uff0c\u4f46 CodeBuddy CLI \u8def\u5f84\u4e3a\u7a7a\u3002\u8bf7\u5728 AI \u533a\u586b\u5199\uff0c\u6216\u6539\u9ed8\u8ba4\u5de5\u5177\u3002",
|
|
329
|
-
onboardingTitle: "\u6b22\u8fce\u4f7f\u7528 open-im",
|
|
330
|
-
onboardingDismiss: "\u77e5\u9053\u4e86",
|
|
331
|
-
onboardingReadme: "README\uff08\u90e8\u7f72\u8bf4\u660e\uff09",
|
|
332
|
-
onboardingBody: "<p><strong>open-im</strong> \u5728\u672c\u673a\u628a Telegram\u3001\u98de\u4e66\u3001QQ\u3001\u4f01\u5fae\u3001\u9489\u9489\u3001WorkBuddy \u7b49\u6e20\u9053\u8fde\u5230 Claude / Codex / CodeBuddy\u3002</p><ol style=\"margin:12px 0 12px 18px;line-height:1.65\"><li>\u5728<strong>\u5e73\u53f0\u914d\u7f6e</strong>\u9009\u4e00\u4e2a\u804a\u5929\u5e94\u7528\uff0c\u6309\u5b57\u6bb5\u4e0b\u65b9\u63d0\u793a\u586b\u51ed\u8bc1\u3002</li><li>\u5728<strong>AI \u5de5\u5177\u914d\u7f6e</strong>\u8bbe\u9ed8\u8ba4 AI\uff1b\u7528 Claude SDK \u65f6\u5728\u5de6\u4fa7<strong>\u914d\u7f6e\u6587\u4ef6</strong>\u5206\u533a\u7f16\u8f91<strong>~/.claude/settings.json</strong>\u3002</li><li>\u540c\u4e00<strong>\u914d\u7f6e\u6587\u4ef6</strong>\u5206\u533a\u53ef\u7f16\u8f91<strong>~/.open-im/config.json</strong>\u3002</li><li>\u5148<strong>\u6821\u9a8c</strong>\u518d<strong>\u4fdd\u5b58\u914d\u7f6e</strong>\uff0c\u7136\u540e\u5230<strong>\u670d\u52a1</strong>\u542f\u52a8\u6865\u63a5\u3002</li><li>\u4e5f\u53ef\u5728\u7ec8\u7aef\u8fd0\u884c <code style=\"background:var(--bg-tertiary);padding:2px 6px;border-radius:4px\">open-im init</code> \u4ea4\u4e92\u914d\u7f6e\u3002</li></ol>",
|
|
333
297
|
tipTelegramToken: '\u5728 Telegram \u641c <a href="https://t.me/BotFather" target="_blank" rel="noopener">@BotFather</a>\uff0c\u53d1 /newbot \u521b\u5efa\u673a\u5668\u4eba\u540e\u590d\u5236 Token\u3002',
|
|
334
298
|
tipFeishuAppId: "\u98de\u4e66\u5f00\u653e\u5e73\u53f0 \u2192 \u5e94\u7528 \u2192 \u51ed\u8bc1\u4e0e\u57fa\u7840\u4fe1\u606f \u2192 App ID\u3002",
|
|
335
299
|
tipFeishuSecret: "\u540c\u4e00\u9875 App Secret\uff08\u53ef\u91cd\u7f6e\u540e\u67e5\u770b\uff09\u3002",
|
|
@@ -10,8 +10,6 @@ export const PAGE_SCRIPT = String.raw ` const platformDefinitions = [
|
|
|
10
10
|
const aiTools = ["claude", "codex", "codebuddy"];
|
|
11
11
|
const STORAGE_KEY_LANG = "open-im-web-lang";
|
|
12
12
|
const STORAGE_KEY_DARK_MODE = "open-im-web-dark-mode";
|
|
13
|
-
const STORAGE_KEY_ONBOARDING = "open-im-dashboard-onboarding-v1";
|
|
14
|
-
const STORAGE_KEY_SAVED_SESSION = "open-im-setup-saved-session";
|
|
15
13
|
const POLLING_INTERVAL = 10000;
|
|
16
14
|
const toolLabels = { claude: "Claude", codex: "Codex", codebuddy: "CodeBuddy" };
|
|
17
15
|
|
|
@@ -156,7 +154,6 @@ export const PAGE_SCRIPT = String.raw ` const platformDefinitions = [
|
|
|
156
154
|
const LANGUAGE_UPDATES = {
|
|
157
155
|
simpleText: [
|
|
158
156
|
{ id: "mainTitle", key: "dashboardTitle" },
|
|
159
|
-
{ id: "mainSubtitle", key: "dashboardSubtitleFull" },
|
|
160
157
|
{ id: "navOverviewText", key: "dashboardTitle" },
|
|
161
158
|
{ id: "navPlatformsText", key: "platformsTitle" },
|
|
162
159
|
{ id: "navConfigFilesText", key: "navConfigFiles" },
|
|
@@ -185,22 +182,6 @@ export const PAGE_SCRIPT = String.raw ` const platformDefinitions = [
|
|
|
185
182
|
{ id: "resetJsonButtonText", key: "resetJson" },
|
|
186
183
|
{ id: "saveClaudeSettingsBtnText", key: "saveBtn" },
|
|
187
184
|
{ id: "saveOpenImConfigBtnText", key: "saveBtn" },
|
|
188
|
-
{ id: "wizardTitle", key: "wizardTitle" },
|
|
189
|
-
{ id: "wizardStep1Title", key: "wizardStep1Title" },
|
|
190
|
-
{ id: "wizardStep1Desc", key: "wizardStep1Desc" },
|
|
191
|
-
{ id: "wizardStep2Title", key: "wizardStep2Title" },
|
|
192
|
-
{ id: "wizardStep2Desc", key: "wizardStep2Desc" },
|
|
193
|
-
{ id: "wizardStep3Title", key: "wizardStep3Title" },
|
|
194
|
-
{ id: "wizardStep3Desc", key: "wizardStep3Desc" },
|
|
195
|
-
{ id: "wizardStep4Title", key: "wizardStep4Title" },
|
|
196
|
-
{ id: "wizardStep4Desc", key: "wizardStep4Desc" },
|
|
197
|
-
{ id: "wizardJumpPlatforms", key: "wizardJumpPlatforms" },
|
|
198
|
-
{ id: "wizardJumpAi", key: "wizardJumpAi" },
|
|
199
|
-
{ id: "wizardJumpService", key: "wizardJumpService" },
|
|
200
|
-
{ id: "wizardJumpService2", key: "wizardJumpService" },
|
|
201
|
-
{ id: "onboardingTitle", key: "onboardingTitle" },
|
|
202
|
-
{ id: "onboardingDismiss", key: "onboardingDismiss" },
|
|
203
|
-
{ id: "onboardingReadme", key: "onboardingReadme" },
|
|
204
185
|
],
|
|
205
186
|
platformLabels: {
|
|
206
187
|
enabled: { suffix: "-label", key: "enabled" },
|
|
@@ -328,9 +309,6 @@ export const PAGE_SCRIPT = String.raw ` const platformDefinitions = [
|
|
|
328
309
|
if (tipEl) tipEl.innerHTML = t(tipKey);
|
|
329
310
|
});
|
|
330
311
|
|
|
331
|
-
const onboardBody = el("onboardingBody");
|
|
332
|
-
if (onboardBody) onboardBody.innerHTML = t("onboardingBody");
|
|
333
|
-
|
|
334
312
|
// AI labels
|
|
335
313
|
LANGUAGE_UPDATES.aiLabels.forEach(({ id, key }) => {
|
|
336
314
|
const label = el(id + "-label");
|
|
@@ -360,14 +338,6 @@ export const PAGE_SCRIPT = String.raw ` const platformDefinitions = [
|
|
|
360
338
|
|
|
361
339
|
const headerToolbar = el("headerToolbar");
|
|
362
340
|
if (headerToolbar) headerToolbar.setAttribute("aria-label", t("headerToolbarAria"));
|
|
363
|
-
|
|
364
|
-
const readmeLink = el("onboardingReadmeLink");
|
|
365
|
-
if (readmeLink && readmeLink instanceof HTMLAnchorElement) {
|
|
366
|
-
readmeLink.href = isZh
|
|
367
|
-
? "https://github.com/wu529778790/open-im/blob/main/README.zh-CN.md"
|
|
368
|
-
: "https://github.com/wu529778790/open-im/blob/main/README.md";
|
|
369
|
-
}
|
|
370
|
-
updateSetupWizard();
|
|
371
341
|
}
|
|
372
342
|
|
|
373
343
|
// AI tool switcher
|
|
@@ -399,34 +369,6 @@ export const PAGE_SCRIPT = String.raw ` const platformDefinitions = [
|
|
|
399
369
|
const liveSummary = el("liveSummary");
|
|
400
370
|
if (liveSummary) liveSummary.textContent = summary;
|
|
401
371
|
updateAiToolVisibility();
|
|
402
|
-
updateSetupWizard();
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
function hasReadyPlatform() {
|
|
406
|
-
return platformDefinitions.some((platform) => {
|
|
407
|
-
if (!getChecked(platform.key + "-enabled")) return false;
|
|
408
|
-
return platform.requiredFields.every((field) => getValue(platform.key + "-" + field).trim().length > 0);
|
|
409
|
-
});
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
function aiStepComplete() {
|
|
413
|
-
const cmd = getValue("ai-aiCommand");
|
|
414
|
-
if (cmd === "codex") return getValue("ai-codexCliPath").trim().length > 0;
|
|
415
|
-
if (cmd === "codebuddy") return getValue("ai-codebuddyCliPath").trim().length > 0;
|
|
416
|
-
return true;
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
function updateSetupWizard() {
|
|
420
|
-
const s1 = hasReadyPlatform();
|
|
421
|
-
const s2 = aiStepComplete();
|
|
422
|
-
const s3 = sessionStorage.getItem(STORAGE_KEY_SAVED_SESSION) === "1";
|
|
423
|
-
const s4 = Boolean(lastHealthPayload && lastHealthPayload.serviceStatus && lastHealthPayload.serviceStatus.running);
|
|
424
|
-
const done = [s1, s2, s3, s4];
|
|
425
|
-
for (let i = 0; i < 4; i += 1) {
|
|
426
|
-
const step = el("wizard-step-" + (i + 1));
|
|
427
|
-
if (step) step.classList.toggle("wizard-step--done", done[i]);
|
|
428
|
-
setText("wizardStep" + (i + 1) + "Status", done[i] ? t("wizardStatusDone") : t("wizardStatusTodo"));
|
|
429
|
-
}
|
|
430
372
|
}
|
|
431
373
|
|
|
432
374
|
function collectClientValidationErrors() {
|
|
@@ -515,7 +457,6 @@ export const PAGE_SCRIPT = String.raw ` const platformDefinitions = [
|
|
|
515
457
|
el("statServiceValue").textContent = serviceStatus.running ? t("serviceRunningShort") : t("serviceIdleShort");
|
|
516
458
|
|
|
517
459
|
lastHealthPayload = data;
|
|
518
|
-
updateSetupWizard();
|
|
519
460
|
|
|
520
461
|
return data;
|
|
521
462
|
} catch (error) {
|
|
@@ -801,26 +742,6 @@ export const PAGE_SCRIPT = String.raw ` const platformDefinitions = [
|
|
|
801
742
|
el("navAiBtn").onclick = () => scrollToSection("aiSection", "navAiBtn");
|
|
802
743
|
el("navServiceBtn").onclick = () => scrollToSection("serviceSection", "navServiceBtn");
|
|
803
744
|
|
|
804
|
-
document.querySelectorAll(".wizard-jump").forEach((jumpBtn) => {
|
|
805
|
-
jumpBtn.addEventListener("click", () => {
|
|
806
|
-
const sec = jumpBtn.getAttribute("data-section");
|
|
807
|
-
const nav = jumpBtn.getAttribute("data-nav");
|
|
808
|
-
if (sec && nav) scrollToSection(sec, nav);
|
|
809
|
-
});
|
|
810
|
-
});
|
|
811
|
-
|
|
812
|
-
const onboardBackdrop = el("onboardingBackdrop");
|
|
813
|
-
const onboardDismiss = el("onboardingDismiss");
|
|
814
|
-
if (onboardBackdrop && onboardDismiss) {
|
|
815
|
-
if (!localStorage.getItem(STORAGE_KEY_ONBOARDING)) {
|
|
816
|
-
onboardBackdrop.classList.remove("hidden");
|
|
817
|
-
}
|
|
818
|
-
onboardDismiss.onclick = () => {
|
|
819
|
-
localStorage.setItem(STORAGE_KEY_ONBOARDING, "1");
|
|
820
|
-
onboardBackdrop.classList.add("hidden");
|
|
821
|
-
};
|
|
822
|
-
}
|
|
823
|
-
|
|
824
745
|
// Language toggle
|
|
825
746
|
el("langButton").onclick = () => {
|
|
826
747
|
currentLang = currentLang === "zh" ? "en" : "zh";
|
|
@@ -886,9 +807,7 @@ export const PAGE_SCRIPT = String.raw ` const platformDefinitions = [
|
|
|
886
807
|
await saveOpenImConfig();
|
|
887
808
|
// Then save form data
|
|
888
809
|
await request("/api/config/save?final=1", { method: "POST", body: JSON.stringify(payload()) });
|
|
889
|
-
sessionStorage.setItem(STORAGE_KEY_SAVED_SESSION, "1");
|
|
890
810
|
setMessage(t("saveOk"), "success");
|
|
891
|
-
updateSetupWizard();
|
|
892
811
|
} catch (error) {
|
|
893
812
|
setMessage(error.message || String(error), "error");
|
|
894
813
|
} finally {
|
|
@@ -250,12 +250,6 @@ export const PAGE_HTML_PREFIX = String.raw `<!doctype html>
|
|
|
250
250
|
color: var(--text-primary);
|
|
251
251
|
}
|
|
252
252
|
|
|
253
|
-
.main-subtitle {
|
|
254
|
-
font-size: 13px;
|
|
255
|
-
color: var(--text-secondary);
|
|
256
|
-
margin-top: 2px;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
253
|
.header-actions {
|
|
260
254
|
display: flex;
|
|
261
255
|
gap: 12px;
|
|
@@ -383,88 +377,6 @@ export const PAGE_HTML_PREFIX = String.raw `<!doctype html>
|
|
|
383
377
|
line-height: 1;
|
|
384
378
|
}
|
|
385
379
|
|
|
386
|
-
/* Setup wizard (overview) */
|
|
387
|
-
.setup-wizard-card {
|
|
388
|
-
background: var(--bg-card);
|
|
389
|
-
border: 1px solid var(--border-subtle);
|
|
390
|
-
border-radius: var(--radius-lg);
|
|
391
|
-
padding: 20px 24px;
|
|
392
|
-
margin-bottom: 24px;
|
|
393
|
-
box-shadow: var(--shadow-sm);
|
|
394
|
-
}
|
|
395
|
-
.setup-wizard-card h2 {
|
|
396
|
-
margin: 0 0 16px;
|
|
397
|
-
font-size: 16px;
|
|
398
|
-
font-weight: 600;
|
|
399
|
-
color: var(--text-primary);
|
|
400
|
-
}
|
|
401
|
-
.wizard-steps {
|
|
402
|
-
display: grid;
|
|
403
|
-
gap: 12px;
|
|
404
|
-
}
|
|
405
|
-
@media (min-width: 900px) {
|
|
406
|
-
.wizard-steps {
|
|
407
|
-
grid-template-columns: repeat(2, 1fr);
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
.wizard-step {
|
|
411
|
-
display: flex;
|
|
412
|
-
gap: 14px;
|
|
413
|
-
align-items: flex-start;
|
|
414
|
-
padding: 14px 16px;
|
|
415
|
-
border-radius: var(--radius-md);
|
|
416
|
-
border: 1px solid var(--border-subtle);
|
|
417
|
-
background: var(--bg-secondary);
|
|
418
|
-
transition: border-color var(--transition-fast), background var(--transition-fast);
|
|
419
|
-
}
|
|
420
|
-
.wizard-step--done {
|
|
421
|
-
border-color: var(--success-border);
|
|
422
|
-
background: var(--success-bg);
|
|
423
|
-
}
|
|
424
|
-
.wizard-step-badge {
|
|
425
|
-
flex-shrink: 0;
|
|
426
|
-
width: 28px;
|
|
427
|
-
height: 28px;
|
|
428
|
-
border-radius: 999px;
|
|
429
|
-
display: flex;
|
|
430
|
-
align-items: center;
|
|
431
|
-
justify-content: center;
|
|
432
|
-
font-size: 13px;
|
|
433
|
-
font-weight: 700;
|
|
434
|
-
background: var(--bg-tertiary);
|
|
435
|
-
color: var(--text-secondary);
|
|
436
|
-
}
|
|
437
|
-
.wizard-step--done .wizard-step-badge {
|
|
438
|
-
background: var(--success-text);
|
|
439
|
-
color: #fff;
|
|
440
|
-
}
|
|
441
|
-
.wizard-step-body {
|
|
442
|
-
flex: 1;
|
|
443
|
-
min-width: 0;
|
|
444
|
-
}
|
|
445
|
-
.wizard-step-title {
|
|
446
|
-
font-weight: 600;
|
|
447
|
-
font-size: 14px;
|
|
448
|
-
color: var(--text-primary);
|
|
449
|
-
margin-bottom: 4px;
|
|
450
|
-
}
|
|
451
|
-
.wizard-step-desc {
|
|
452
|
-
font-size: 13px;
|
|
453
|
-
color: var(--text-secondary);
|
|
454
|
-
line-height: 1.5;
|
|
455
|
-
margin-bottom: 8px;
|
|
456
|
-
}
|
|
457
|
-
.wizard-step-status {
|
|
458
|
-
font-size: 11px;
|
|
459
|
-
font-weight: 600;
|
|
460
|
-
text-transform: uppercase;
|
|
461
|
-
letter-spacing: 0.04em;
|
|
462
|
-
margin-bottom: 6px;
|
|
463
|
-
color: var(--text-tertiary);
|
|
464
|
-
}
|
|
465
|
-
.wizard-step--done .wizard-step-status {
|
|
466
|
-
color: var(--success-text);
|
|
467
|
-
}
|
|
468
380
|
.field-inline-tip {
|
|
469
381
|
font-size: 12px;
|
|
470
382
|
color: var(--text-tertiary);
|
|
@@ -481,51 +393,6 @@ export const PAGE_HTML_PREFIX = String.raw `<!doctype html>
|
|
|
481
393
|
border-radius: var(--radius-xs);
|
|
482
394
|
}
|
|
483
395
|
|
|
484
|
-
/* First-visit onboarding */
|
|
485
|
-
.onboarding-backdrop {
|
|
486
|
-
position: fixed;
|
|
487
|
-
inset: 0;
|
|
488
|
-
background: rgba(15, 23, 42, 0.45);
|
|
489
|
-
z-index: 100;
|
|
490
|
-
display: flex;
|
|
491
|
-
align-items: center;
|
|
492
|
-
justify-content: center;
|
|
493
|
-
padding: 24px;
|
|
494
|
-
}
|
|
495
|
-
.onboarding-backdrop.hidden {
|
|
496
|
-
display: none;
|
|
497
|
-
}
|
|
498
|
-
.onboarding-card {
|
|
499
|
-
background: var(--bg-card);
|
|
500
|
-
color: var(--text-primary);
|
|
501
|
-
border-radius: var(--radius-xl);
|
|
502
|
-
max-width: 520px;
|
|
503
|
-
width: 100%;
|
|
504
|
-
padding: 28px 28px 24px;
|
|
505
|
-
box-shadow: var(--shadow-lg);
|
|
506
|
-
border: 1px solid var(--border-subtle);
|
|
507
|
-
}
|
|
508
|
-
.onboarding-card h2 {
|
|
509
|
-
margin: 0 0 12px;
|
|
510
|
-
font-size: 20px;
|
|
511
|
-
font-weight: 700;
|
|
512
|
-
}
|
|
513
|
-
.onboarding-card .onboarding-body {
|
|
514
|
-
font-size: 14px;
|
|
515
|
-
color: var(--text-secondary);
|
|
516
|
-
line-height: 1.55;
|
|
517
|
-
}
|
|
518
|
-
.onboarding-card .onboarding-body p {
|
|
519
|
-
margin: 0 0 8px;
|
|
520
|
-
}
|
|
521
|
-
.onboarding-actions {
|
|
522
|
-
display: flex;
|
|
523
|
-
flex-wrap: wrap;
|
|
524
|
-
gap: 10px;
|
|
525
|
-
margin-top: 20px;
|
|
526
|
-
align-items: center;
|
|
527
|
-
}
|
|
528
|
-
|
|
529
396
|
.config-files-stack {
|
|
530
397
|
display: flex;
|
|
531
398
|
flex-direction: column;
|
|
@@ -983,7 +850,6 @@ export const PAGE_HTML_PREFIX = String.raw `<!doctype html>
|
|
|
983
850
|
<div class="main-header-top">
|
|
984
851
|
<div>
|
|
985
852
|
<h1 class="main-title" id="mainTitle">Dashboard</h1>
|
|
986
|
-
<p class="main-subtitle" id="mainSubtitle">Platform status and setup progress</p>
|
|
987
853
|
</div>
|
|
988
854
|
<div class="header-actions">
|
|
989
855
|
<a href="https://github.com/wu529778790/open-im" target="_blank" class="btn btn-ghost btn-sm">
|
|
@@ -1040,48 +906,6 @@ export const PAGE_HTML_PREFIX = String.raw `<!doctype html>
|
|
|
1040
906
|
<div class="stat-value" id="statServiceValue">Idle</div>
|
|
1041
907
|
</div>
|
|
1042
908
|
</div>
|
|
1043
|
-
|
|
1044
|
-
<div class="setup-wizard-card">
|
|
1045
|
-
<h2 id="wizardTitle">First-time setup</h2>
|
|
1046
|
-
<div class="wizard-steps" id="wizardSteps">
|
|
1047
|
-
<div class="wizard-step" id="wizard-step-1">
|
|
1048
|
-
<div class="wizard-step-badge">1</div>
|
|
1049
|
-
<div class="wizard-step-body">
|
|
1050
|
-
<div class="wizard-step-status" id="wizardStep1Status">To do</div>
|
|
1051
|
-
<div class="wizard-step-title" id="wizardStep1Title">Connect an IM channel</div>
|
|
1052
|
-
<div class="wizard-step-desc" id="wizardStep1Desc"></div>
|
|
1053
|
-
<button type="button" class="btn btn-secondary btn-sm wizard-jump" data-section="configSection" data-nav="navPlatformsBtn" id="wizardJumpPlatforms">Open Platforms</button>
|
|
1054
|
-
</div>
|
|
1055
|
-
</div>
|
|
1056
|
-
<div class="wizard-step" id="wizard-step-2">
|
|
1057
|
-
<div class="wizard-step-badge">2</div>
|
|
1058
|
-
<div class="wizard-step-body">
|
|
1059
|
-
<div class="wizard-step-status" id="wizardStep2Status">To do</div>
|
|
1060
|
-
<div class="wizard-step-title" id="wizardStep2Title">Set the default AI tool</div>
|
|
1061
|
-
<div class="wizard-step-desc" id="wizardStep2Desc"></div>
|
|
1062
|
-
<button type="button" class="btn btn-secondary btn-sm wizard-jump" data-section="aiSection" data-nav="navAiBtn" id="wizardJumpAi">Open AI</button>
|
|
1063
|
-
</div>
|
|
1064
|
-
</div>
|
|
1065
|
-
<div class="wizard-step" id="wizard-step-3">
|
|
1066
|
-
<div class="wizard-step-badge">3</div>
|
|
1067
|
-
<div class="wizard-step-body">
|
|
1068
|
-
<div class="wizard-step-status" id="wizardStep3Status">To do</div>
|
|
1069
|
-
<div class="wizard-step-title" id="wizardStep3Title">Validate and save</div>
|
|
1070
|
-
<div class="wizard-step-desc" id="wizardStep3Desc"></div>
|
|
1071
|
-
<button type="button" class="btn btn-secondary btn-sm wizard-jump" data-section="serviceSection" data-nav="navServiceBtn" id="wizardJumpService">Open Service</button>
|
|
1072
|
-
</div>
|
|
1073
|
-
</div>
|
|
1074
|
-
<div class="wizard-step" id="wizard-step-4">
|
|
1075
|
-
<div class="wizard-step-badge">4</div>
|
|
1076
|
-
<div class="wizard-step-body">
|
|
1077
|
-
<div class="wizard-step-status" id="wizardStep4Status">To do</div>
|
|
1078
|
-
<div class="wizard-step-title" id="wizardStep4Title">Start the bridge</div>
|
|
1079
|
-
<div class="wizard-step-desc" id="wizardStep4Desc"></div>
|
|
1080
|
-
<button type="button" class="btn btn-secondary btn-sm wizard-jump" data-section="serviceSection" data-nav="navServiceBtn" id="wizardJumpService2">Open Service</button>
|
|
1081
|
-
</div>
|
|
1082
|
-
</div>
|
|
1083
|
-
</div>
|
|
1084
|
-
</div>
|
|
1085
909
|
</section>
|
|
1086
910
|
|
|
1087
911
|
<!-- Platforms Section -->
|
|
@@ -1527,17 +1351,6 @@ export const PAGE_HTML_PREFIX = String.raw `<!doctype html>
|
|
|
1527
1351
|
</div>
|
|
1528
1352
|
</section>
|
|
1529
1353
|
|
|
1530
|
-
<div id="onboardingBackdrop" class="onboarding-backdrop hidden" role="dialog" aria-modal="true" aria-labelledby="onboardingTitle">
|
|
1531
|
-
<div class="onboarding-card">
|
|
1532
|
-
<h2 id="onboardingTitle">Welcome</h2>
|
|
1533
|
-
<div id="onboardingBody" class="onboarding-body"></div>
|
|
1534
|
-
<div class="onboarding-actions">
|
|
1535
|
-
<button type="button" class="btn btn-primary" id="onboardingDismiss">Got it</button>
|
|
1536
|
-
<a href="https://github.com/wu529778790/open-im/blob/main/README.zh-CN.md" target="_blank" rel="noopener" class="btn btn-ghost" id="onboardingReadmeLink"><span id="onboardingReadme">README</span></a>
|
|
1537
|
-
</div>
|
|
1538
|
-
</div>
|
|
1539
|
-
</div>
|
|
1540
|
-
|
|
1541
1354
|
</div>
|
|
1542
1355
|
</main>
|
|
1543
1356
|
</div>
|