@@ -735,45 +756,54 @@ function StepPlatform({
{t('wizard.platform.description')}
-
- {adapters.map((adapter) => (
-
onSelect(adapter.name)}
- >
-
-
-
-
- {extractI18nObject(adapter.label)}
-
-
- {selected === adapter.name && (
-
-
-
+ {groupedAdapters.map((group) => (
+
+ {group.categoryId && (
+
+ {getCategoryLabel(t, group.categoryId)}
+
+ )}
+
+ {group.items.map((adapter) => (
+
onSelect(adapter.name)}
+ >
+
+
+
+
+ {extractI18nObject(adapter.label)}
+
-
- )}
-
-
-
- {extractI18nObject(adapter.description)}
-
-
-
- ))}
-
+ {selected === adapter.name && (
+
+ )}
+
+
+
+ {extractI18nObject(adapter.description)}
+
+
+
+ ))}
+
+
+ ))}
);
}
@@ -1118,18 +1148,27 @@ function StepDone() {
const [isCompleting, setIsCompleting] = useState(false);
const handleBack = useCallback(async () => {
- if (systemInfo.wizard_status === 'none') {
- setIsCompleting(true);
- try {
+ setIsCompleting(true);
+ try {
+ if (systemInfo.wizard_status === 'none') {
await httpClient.updateWizardStatus('completed');
systemInfo.wizard_status = 'completed';
- } catch {
- toast.error(t('wizard.completeSaveError'));
- setIsCompleting(false);
- return; // Don't navigate — let user retry
}
+ // Always clear persisted progress so re-entering starts fresh
+ await httpClient.saveWizardProgress({
+ step: 0,
+ selected_adapter: null,
+ created_bot_uuid: null,
+ bot_saved: false,
+ selected_runner: null,
+ });
+ systemInfo.wizard_progress = null;
+ } catch {
+ toast.error(t('wizard.completeSaveError'));
setIsCompleting(false);
+ return;
}
+ setIsCompleting(false);
router.push('/home/bots');
}, [router, t]);
diff --git a/web/src/i18n/locales/en-US.ts b/web/src/i18n/locales/en-US.ts
index 10e2e656..22ea474b 100644
--- a/web/src/i18n/locales/en-US.ts
+++ b/web/src/i18n/locales/en-US.ts
@@ -321,6 +321,12 @@ const enUS = {
webhookSaasHint:
'Webhook requires a publicly accessible domain. LangBot Cloud provides a ready-to-use public endpoint for your bot.',
webhookSaasLink: 'Learn more about LangBot Cloud',
+ adapterCategory: {
+ popular: 'Popular',
+ china: 'China',
+ global: 'Global',
+ protocol: 'Protocol',
+ },
logLevel: 'Log Level',
allLevels: 'All Levels',
selectLevel: 'Select Level',
diff --git a/web/src/i18n/locales/ja-JP.ts b/web/src/i18n/locales/ja-JP.ts
index 3fe04bf0..619282bf 100644
--- a/web/src/i18n/locales/ja-JP.ts
+++ b/web/src/i18n/locales/ja-JP.ts
@@ -326,6 +326,12 @@
webhookSaasHint:
'Webhook には公開アクセス可能なドメインが必要です。LangBot Cloud では、ボット用のパブリックエンドポイントをすぐにご利用いただけます。',
webhookSaasLink: 'LangBot Cloud の詳細はこちら',
+ adapterCategory: {
+ popular: '人気',
+ china: '中国',
+ global: 'グローバル',
+ protocol: 'プロトコル',
+ },
logLevel: 'ログレベル',
allLevels: 'すべてのレベル',
selectLevel: 'レベルを選択',
diff --git a/web/src/i18n/locales/zh-Hans.ts b/web/src/i18n/locales/zh-Hans.ts
index 20306d52..308cf603 100644
--- a/web/src/i18n/locales/zh-Hans.ts
+++ b/web/src/i18n/locales/zh-Hans.ts
@@ -306,6 +306,12 @@ const zhHans = {
webhookSaasHint:
'Webhook 需要公网可访问的域名。LangBot Cloud 为你的机器人提供开箱即用的公网地址。',
webhookSaasLink: '了解 LangBot Cloud',
+ adapterCategory: {
+ popular: '热门',
+ china: '中国',
+ global: '全球',
+ protocol: '协议',
+ },
logLevel: '日志级别',
allLevels: '全部级别',
selectLevel: '选择级别',
diff --git a/web/src/i18n/locales/zh-Hant.ts b/web/src/i18n/locales/zh-Hant.ts
index b43f58bb..5804a3fa 100644
--- a/web/src/i18n/locales/zh-Hant.ts
+++ b/web/src/i18n/locales/zh-Hant.ts
@@ -305,6 +305,12 @@ const zhHant = {
webhookSaasHint:
'Webhook 需要公網可存取的網域。LangBot Cloud 為你的機器人提供即開即用的公網位址。',
webhookSaasLink: '了解 LangBot Cloud',
+ adapterCategory: {
+ popular: '熱門',
+ china: '中國',
+ global: '全球',
+ protocol: '協定',
+ },
logLevel: '日誌級別',
allLevels: '全部級別',
selectLevel: '選擇級別',