@nextclaw/ui 0.9.18 → 0.10.1

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.
Files changed (65) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/assets/ChannelsList-BX7KqEk7.js +8 -0
  3. package/dist/assets/ChatPage-zXLBKIAY.js +38 -0
  4. package/dist/assets/{DocBrowser-DiLg-99Z.js → DocBrowser-Cdbh4cVD.js} +1 -1
  5. package/dist/assets/{LogoBadge-B0RCYFfk.js → LogoBadge-4801esOJ.js} +1 -1
  6. package/dist/assets/MarketplacePage-GZgus0Or.js +49 -0
  7. package/dist/assets/{McpMarketplacePage-C9AxrIdJ.js → McpMarketplacePage-CAGGvoMo.js} +1 -1
  8. package/dist/assets/{ModelConfig-Cns1fRR4.js → ModelConfig-CfLYjQM3.js} +1 -1
  9. package/dist/assets/ProvidersList-CEo1kdf-.js +1 -0
  10. package/dist/assets/{RemoteAccessPage-BVph-WSP.js → RemoteAccessPage-6GYzD7cc.js} +1 -1
  11. package/dist/assets/{RuntimeConfig-BhBUz1gc.js → RuntimeConfig-BZdbp8mH.js} +1 -1
  12. package/dist/assets/{SearchConfig-D8t1on1b.js → SearchConfig-ifvYKix-.js} +1 -1
  13. package/dist/assets/{SecretsConfig-BoOaUo2a.js → SecretsConfig-tDPbhTeR.js} +1 -1
  14. package/dist/assets/{SessionsConfig-B-LZan9R.js → SessionsConfig-DhkAIzGm.js} +1 -1
  15. package/dist/assets/{chat-message-C8oGQU2P.js → chat-message-C5Gl-dCH.js} +1 -1
  16. package/dist/assets/index-BTt_JlNV.css +1 -0
  17. package/dist/assets/index-JN3V84h_.js +8 -0
  18. package/dist/assets/{label-D8x2fgJm.js → label-D8zWKdqp.js} +1 -1
  19. package/dist/assets/{page-layout-Bxdxpr9D.js → page-layout-qAJ47LNQ.js} +1 -1
  20. package/dist/assets/{popover-Daq39m2s.js → popover-hyBGxpxS.js} +1 -1
  21. package/dist/assets/{security-config-Bd51WlxA.js → security-config-BJYZSnCA.js} +1 -1
  22. package/dist/assets/skeleton-CUQLsNsM.js +1 -0
  23. package/dist/assets/{status-dot-D11eQRlx.js → status-dot-DKcoD-iY.js} +1 -1
  24. package/dist/assets/{switch-DizAKjZa.js → switch-DtUdQxr_.js} +1 -1
  25. package/dist/assets/tabs-custom-Dj1BWHGK.js +1 -0
  26. package/dist/assets/useConfirmDialog-nZdrtETU.js +1 -0
  27. package/dist/assets/{vendor-DJt0Azq5.js → vendor-CNhxtHCf.js} +1 -1
  28. package/dist/index.html +3 -3
  29. package/package.json +4 -4
  30. package/src/components/chat/ChatSidebar.tsx +41 -69
  31. package/src/components/chat/adapters/chat-message.adapter.test.ts +141 -163
  32. package/src/components/chat/adapters/chat-message.adapter.ts +35 -0
  33. package/src/components/chat/chat-composer-state.ts +38 -0
  34. package/src/components/chat/chat-stream/types.ts +2 -0
  35. package/src/components/chat/containers/chat-input-bar.container.tsx +116 -55
  36. package/src/components/chat/containers/chat-message-list.container.tsx +2 -0
  37. package/src/components/chat/managers/chat-session-list.manager.test.ts +16 -1
  38. package/src/components/chat/managers/chat-session-list.manager.ts +0 -2
  39. package/src/components/chat/managers/chat-thread.manager.ts +0 -1
  40. package/src/components/chat/ncp/NcpChatPage.tsx +18 -18
  41. package/src/components/chat/ncp/ncp-chat-input.manager.ts +56 -1
  42. package/src/components/chat/ncp/ncp-chat-thread.manager.ts +0 -1
  43. package/src/components/chat/presenter/chat-presenter-context.tsx +6 -0
  44. package/src/components/chat/stores/chat-input.store.ts +3 -0
  45. package/src/components/config/ChannelsList.test.tsx +2 -1
  46. package/src/components/config/channel-form-fields.ts +9 -1
  47. package/src/components/config/weixin-channel-auth-section.test.tsx +2 -1
  48. package/src/components/layout/Sidebar.tsx +62 -102
  49. package/src/components/layout/sidebar-items.tsx +172 -0
  50. package/src/components/layout/sidebar.layout.test.tsx +11 -4
  51. package/src/lib/i18n.channels.ts +1 -0
  52. package/src/lib/i18n.chat.ts +117 -0
  53. package/src/lib/i18n.remote.ts +1 -1
  54. package/src/lib/i18n.ts +2 -112
  55. package/src/transport/remote.transport.test.ts +135 -0
  56. package/src/transport/remote.transport.ts +11 -1
  57. package/dist/assets/ChannelsList-BrUyWJt-.js +0 -8
  58. package/dist/assets/ChatPage-BkVleCOF.js +0 -38
  59. package/dist/assets/MarketplacePage-CS2QbUvK.js +0 -49
  60. package/dist/assets/ProvidersList-BeKvkVyz.js +0 -1
  61. package/dist/assets/index-C63mHRbE.css +0 -1
  62. package/dist/assets/index-D45Vnh0I.js +0 -8
  63. package/dist/assets/skeleton-CAcIFczu.js +0 -1
  64. package/dist/assets/tabs-custom-Daa81i4V.js +0 -1
  65. package/dist/assets/useConfirmDialog-DS-q2zMX.js +0 -1
package/src/lib/i18n.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { CHANNEL_LABELS } from './i18n.channels';
2
2
  import { CHANNEL_AUTH_LABELS } from './i18n.channel-auth';
3
+ import { CHAT_LABELS } from './i18n.chat';
3
4
  import { MARKETPLACE_LABELS } from './i18n.marketplace';
4
5
  import { REMOTE_LABELS } from './i18n.remote';
5
6
  export type I18nLanguage = 'zh' | 'en';
@@ -557,118 +558,7 @@ export const LABELS: Record<string, { zh: string; en: string }> = {
557
558
  },
558
559
 
559
560
  // Chat
560
- chatPageTitle: { zh: 'Agent 对话', en: 'Agent Chat' },
561
- chatPageDescription: {
562
- zh: '在 UI 内直接与 Agent 交互,支持多会话与多 Agent 切换。',
563
- en: 'Chat with your agent directly in UI with multi-session and multi-agent switching.'
564
- },
565
- chatRefresh: { zh: '刷新', en: 'Refresh' },
566
- chatNewSession: { zh: '新会话', en: 'New Session' },
567
- chatSearchSessionPlaceholder: { zh: '搜索会话 key / 标签', en: 'Search session key / label' },
568
- chatAgentLabel: { zh: '目标 Agent', en: 'Target Agent' },
569
- chatSelectAgent: { zh: '选择 Agent', en: 'Select Agent' },
570
- chatModelLabel: { zh: '对话模型', en: 'Chat Model' },
571
- chatSelectModel: { zh: '选择模型', en: 'Select model' },
572
- chatThinkingLevelOff: { zh: '思考关闭', en: 'Thinking Off' },
573
- chatThinkingLevelMinimal: { zh: '思考 Minimal', en: 'Thinking Minimal' },
574
- chatThinkingLevelLow: { zh: '思考 Low', en: 'Thinking Low' },
575
- chatThinkingLevelMedium: { zh: '思考 Medium', en: 'Thinking Medium' },
576
- chatThinkingLevelHigh: { zh: '思考 High', en: 'Thinking High' },
577
- chatThinkingLevelAdaptive: { zh: '思考 Adaptive', en: 'Thinking Adaptive' },
578
- chatThinkingLevelXhigh: { zh: '思考 XHigh', en: 'Thinking XHigh' },
579
- chatSessionTypeLabel: { zh: '会话类型', en: 'Session Type' },
580
- chatSessionTypeNative: { zh: '原生', en: 'Native' },
581
- chatSessionTypeCodex: { zh: 'Codex', en: 'Codex' },
582
- chatSessionTypeClaude: { zh: 'Claude Code', en: 'Claude Code' },
583
- chatSessionTypeUnavailableSuffix: {
584
- zh: '当前不可用,请启用对应插件或新建 Native 会话。',
585
- en: 'is unavailable now. Re-enable the plugin or create a native session.'
586
- },
587
- chatModelNoOptions: { zh: '暂无可用模型,请先配置提供商。', en: 'No available models. Configure a provider first.' },
588
- chatGoConfigureProvider: { zh: '去配置提供商', en: 'Go to Providers' },
589
- chatProviderSetupTitle: { zh: '开始前先配置提供商', en: 'Configure a Provider First' },
590
- chatProviderSetupDescription: {
591
- zh: '你还没有可用模型。先在提供商页面配置并保存至少一个 Provider 后,再回来开始对话。',
592
- en: 'No models are available yet. Configure and save at least one provider, then return to start chatting.'
593
- },
594
- chatSessionLabel: { zh: '当前会话', en: 'Current Session' },
595
- chatNoSession: { zh: '未选择会话', en: 'No session selected' },
596
- chatNoSessionHint: { zh: '创建一个会话并发送第一条消息。', en: 'Create a session and send your first message.' },
597
- chatHistoryLoading: { zh: '加载会话历史中...', en: 'Loading session history...' },
598
- chatNoMessages: { zh: '暂无消息,发送一条开始对话。', en: 'No messages yet. Send one to start.' },
599
- chatTyping: { zh: 'Agent 正在思考...', en: 'Agent is thinking...' },
600
- chatInputPlaceholder: { zh: '输入消息,输入 / 选择技能,Enter 发送,Shift + Enter 换行', en: 'Type a message, type / to select skills, Enter to send, Shift + Enter for newline' },
601
- chatInputHint: { zh: '支持多轮上下文,默认走当前会话。', en: 'Multi-turn context is preserved in the current session.' },
602
- chatSlashSectionCommands: { zh: '命令', en: 'Commands' },
603
- chatSlashSectionSkills: { zh: '技能', en: 'Skills' },
604
- chatSlashTypeCommand: { zh: '命令', en: 'Command' },
605
- chatSlashTypeSkill: { zh: '技能', en: 'Skill' },
606
- chatSlashSkillSpec: { zh: '标识', en: 'Spec' },
607
- chatSlashLoading: { zh: '加载命令与技能中…', en: 'Loading commands and skills…' },
608
- chatSlashNoResult: { zh: '无匹配项', en: 'No matches' },
609
- chatSlashHint: { zh: '输入 / 触发命令或技能选择', en: 'Type / to access commands and skills' },
610
- chatSlashCommandHint: { zh: '回车插入命令,继续输入参数后发送。', en: 'Press Enter to insert command, then add args and send.' },
611
- chatSlashSkillHint: { zh: '回车把该技能加入本轮请求。', en: 'Press Enter to add this skill for the next turn.' },
612
- chatSend: { zh: '发送', en: 'Send' },
613
- chatStop: { zh: '停止', en: 'Stop' },
614
- chatStopPreparing: { zh: '正在建立可停止会话,请稍候…', en: 'Preparing stoppable run…' },
615
- chatStopUnavailable: { zh: '当前后端引擎不支持手动停止。', en: 'Manual stop is not supported by the current backend engine.' },
616
- chatSending: { zh: '发送中...', en: 'Sending...' },
617
- chatQueueSend: { zh: '排队发送', en: 'Queue' },
618
- chatQueuedHintPrefix: { zh: '当前有', en: 'Queued' },
619
- chatQueuedHintSuffix: { zh: '条消息待发送。', en: 'pending messages.' },
620
- chatQueueMoveFirst: { zh: '置顶到下一条', en: 'Move to Next' },
621
- chatDeleteSession: { zh: '删除会话', en: 'Delete Session' },
622
- chatDeleteSessionConfirm: { zh: '确认删除当前会话?', en: 'Delete the current session?' },
623
- chatSendFailed: { zh: '发送消息失败', en: 'Failed to send message' },
624
- chatRoleUser: { zh: '你', en: 'You' },
625
- chatRoleAssistant: { zh: '助手', en: 'Assistant' },
626
- chatRoleTool: { zh: '工具', en: 'Tool' },
627
- chatRoleSystem: { zh: '系统', en: 'System' },
628
- chatRoleMessage: { zh: '消息', en: 'Message' },
629
- chatToolCall: { zh: '工具调用', en: 'Tool Call' },
630
- chatToolResult: { zh: '工具结果', en: 'Tool Result' },
631
- chatToolWorkflow: { zh: '工具工作流', en: 'Tool Workflow' },
632
- chatToolWorkflowDetails: { zh: '展开查看参数和结果', en: 'Expand to view params and results' },
633
- chatToolOutput: { zh: '查看输出', en: 'View Output' },
634
- chatToolNoOutput: { zh: '无输出(执行完成)', en: 'No output (completed)' },
635
- chatReasoning: { zh: '推理过程', en: 'Reasoning' },
636
- chatUnknownPart: { zh: '未知消息片段', en: 'Unknown message part' },
637
- chatCodeCopy: { zh: '复制代码', en: 'Copy' },
638
- chatCodeCopied: { zh: '已复制', en: 'Copied' },
639
-
640
- // Chat Sidebar (unified)
641
- chatSidebarNewTask: { zh: '新任务', en: 'New Task' },
642
- chatSidebarSearchPlaceholder: { zh: '搜索对话...', en: 'Search conversations...' },
643
- chatSidebarScheduledTasks: { zh: '定时任务', en: 'Scheduled Tasks' },
644
- chatSidebarSkills: { zh: '技能', en: 'Skills' },
645
- chatSidebarTaskRecords: { zh: '会话记录', en: 'Sessions' },
646
- chatSidebarToday: { zh: '今天', en: 'Today' },
647
- chatSidebarYesterday: { zh: '昨天', en: 'Yesterday' },
648
- chatSidebarPrevious7Days: { zh: '近 7 天', en: 'Previous 7 Days' },
649
- chatSidebarOlder: { zh: '更早', en: 'Older' },
650
-
651
- // Welcome page
652
- chatWelcomeTitle: { zh: '你好,有什么可以帮你的吗?', en: 'Hello, how can I help you?' },
653
- chatWelcomeSubtitle: { zh: '开始一个新任务或选择已有对话', en: 'Start a new task or select an existing conversation' },
654
- chatWelcomeCapability1Title: { zh: '智能对话', en: 'Smart Conversations' },
655
- chatWelcomeCapability1Desc: { zh: '多轮上下文对话,支持多种 AI 模型', en: 'Multi-turn context conversations with multiple AI models' },
656
- chatWelcomeCapability2Title: { zh: '技能扩展', en: 'Skill Extensions' },
657
- chatWelcomeCapability2Desc: { zh: '通过安装技能扩展 Agent 能力', en: 'Extend Agent capabilities by installing skills' },
658
- chatWelcomeCapability3Title: { zh: '定时任务', en: 'Scheduled Tasks' },
659
- chatWelcomeCapability3Desc: { zh: '设置定时执行的自动化任务', en: 'Set up scheduled automated tasks' },
660
-
661
- // Skills picker
662
- chatSkillsPickerTitle: { zh: '技能', en: 'Skills' },
663
- chatSkillsPickerEmpty: { zh: '暂无已安装技能', en: 'No skills installed' },
664
- chatSkillsPickerSearchPlaceholder: { zh: '搜索技能', en: 'Search skills' },
665
- chatSkillsPickerNoDescription: { zh: '暂无描述', en: 'No description' },
666
- chatSkillsPickerOfficial: { zh: '官方', en: 'Official' },
667
- chatSkillsPickerManage: { zh: '管理技能', en: 'Manage Skills' },
668
-
669
- // Input bar
670
- chatInputAttach: { zh: '添加附件', en: 'Attach file' },
671
- chatInputAttachComingSoon: { zh: '即将支持', en: 'Coming soon' },
561
+ ...CHAT_LABELS,
672
562
 
673
563
  // Cron
674
564
  cronPageTitle: { zh: '定时任务', en: 'Cron Jobs' },
@@ -0,0 +1,135 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { RemoteSessionMultiplexTransport } from '@/transport/remote.transport';
3
+
4
+ class MockWebSocket {
5
+ static readonly CONNECTING = 0;
6
+ static readonly OPEN = 1;
7
+ static readonly CLOSING = 2;
8
+ static readonly CLOSED = 3;
9
+ static instances: MockWebSocket[] = [];
10
+
11
+ readonly sent: string[] = [];
12
+ readyState = MockWebSocket.CONNECTING;
13
+ onopen: ((event: Event) => void) | null = null;
14
+ onmessage: ((event: MessageEvent) => void) | null = null;
15
+ onerror: ((event: Event) => void) | null = null;
16
+ onclose: ((event: CloseEvent) => void) | null = null;
17
+
18
+ constructor(public readonly url: string) {
19
+ MockWebSocket.instances.push(this);
20
+ }
21
+
22
+ send(data: string): void {
23
+ this.sent.push(data);
24
+ }
25
+
26
+ close(): void {
27
+ this.readyState = MockWebSocket.CLOSED;
28
+ this.onclose?.({} as CloseEvent);
29
+ }
30
+
31
+ open(): void {
32
+ this.readyState = MockWebSocket.OPEN;
33
+ this.onopen?.({} as Event);
34
+ }
35
+
36
+ receive(frame: unknown): void {
37
+ this.onmessage?.({
38
+ data: JSON.stringify(frame)
39
+ } as MessageEvent);
40
+ }
41
+
42
+ static reset(): void {
43
+ MockWebSocket.instances = [];
44
+ }
45
+ }
46
+
47
+ function lastSentRequestFrame(socket: MockWebSocket): { type: 'request'; id: string } {
48
+ const raw = socket.sent.at(-1);
49
+ if (!raw) {
50
+ throw new Error('Expected a sent request frame.');
51
+ }
52
+ return JSON.parse(raw) as { type: 'request'; id: string };
53
+ }
54
+
55
+ describe('RemoteSessionMultiplexTransport request path', () => {
56
+ beforeEach(() => {
57
+ MockWebSocket.reset();
58
+ vi.useFakeTimers();
59
+ vi.stubGlobal('WebSocket', MockWebSocket as unknown as typeof WebSocket);
60
+ });
61
+
62
+ afterEach(() => {
63
+ vi.useRealTimers();
64
+ vi.unstubAllGlobals();
65
+ });
66
+
67
+ it('keeps ordinary requests on the remote websocket multiplex channel', async () => {
68
+ const transport = new RemoteSessionMultiplexTransport({
69
+ mode: 'remote',
70
+ protocolVersion: 1,
71
+ wsPath: '/_remote/ws'
72
+ }, 'https://remote.claw.cool');
73
+
74
+ const requestPromise = transport.request<{ sessions: unknown[]; total: number }>({
75
+ method: 'GET',
76
+ path: '/api/sessions'
77
+ });
78
+
79
+ const socket = MockWebSocket.instances[0];
80
+ if (!socket) {
81
+ throw new Error('Expected remote websocket to be created.');
82
+ }
83
+ socket.open();
84
+ await Promise.resolve();
85
+ await Promise.resolve();
86
+
87
+ const requestFrame = lastSentRequestFrame(socket);
88
+ socket.receive({
89
+ type: 'response',
90
+ id: requestFrame.id,
91
+ status: 200,
92
+ body: {
93
+ ok: true,
94
+ data: {
95
+ sessions: [],
96
+ total: 0
97
+ }
98
+ }
99
+ });
100
+
101
+ await expect(requestPromise).resolves.toEqual({
102
+ sessions: [],
103
+ total: 0
104
+ });
105
+ expect(socket.url).toBe('wss://remote.claw.cool/_remote/ws');
106
+ });
107
+
108
+ it('fails predictably when a remote request frame never receives a response', async () => {
109
+ const transport = new RemoteSessionMultiplexTransport({
110
+ mode: 'remote',
111
+ protocolVersion: 1,
112
+ wsPath: '/_remote/ws'
113
+ }, 'https://remote.claw.cool');
114
+
115
+ const requestPromise = transport.request({
116
+ method: 'GET',
117
+ path: '/api/sessions'
118
+ });
119
+ const timeoutExpectation = expect(requestPromise).rejects.toThrow(
120
+ 'Timed out waiting for remote request response: GET /api/sessions'
121
+ );
122
+
123
+ const socket = MockWebSocket.instances[0];
124
+ if (!socket) {
125
+ throw new Error('Expected remote websocket to be created.');
126
+ }
127
+ socket.open();
128
+ await Promise.resolve();
129
+ await Promise.resolve();
130
+
131
+ await vi.advanceTimersByTimeAsync(15_000);
132
+
133
+ await timeoutExpectation;
134
+ });
135
+ });
@@ -27,6 +27,7 @@ type RemoteBrowserCommand =
27
27
  type PendingRequest = {
28
28
  resolve: (value: unknown) => void;
29
29
  reject: (error: Error) => void;
30
+ timeoutId: number;
30
31
  };
31
32
 
32
33
  type PendingStream = {
@@ -69,6 +70,8 @@ function createId(prefix: string): string {
69
70
  return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
70
71
  }
71
72
 
73
+ const REMOTE_REQUEST_TIMEOUT_MS = 15_000;
74
+
72
75
  export class RemoteSessionMultiplexTransport implements AppTransport {
73
76
  private socket: WebSocket | null = null;
74
77
  private connectPromise: Promise<void> | null = null;
@@ -88,9 +91,14 @@ export class RemoteSessionMultiplexTransport implements AppTransport {
88
91
  await this.ensureSocket();
89
92
  const id = createId('req');
90
93
  return await new Promise<T>((resolve, reject) => {
94
+ const timeoutId = window.setTimeout(() => {
95
+ this.pendingRequests.delete(id);
96
+ reject(new Error(`Timed out waiting for remote request response: ${input.method} ${input.path}`));
97
+ }, REMOTE_REQUEST_TIMEOUT_MS);
91
98
  this.pendingRequests.set(id, {
92
99
  resolve: (value) => resolve(value as T),
93
- reject
100
+ reject,
101
+ timeoutId
94
102
  });
95
103
  this.send({
96
104
  type: 'request',
@@ -297,6 +305,7 @@ export class RemoteSessionMultiplexTransport implements AppTransport {
297
305
 
298
306
  private failPendingWork(error: Error): void {
299
307
  for (const pending of this.pendingRequests.values()) {
308
+ window.clearTimeout(pending.timeoutId);
300
309
  pending.reject(error);
301
310
  }
302
311
  this.pendingRequests.clear();
@@ -331,6 +340,7 @@ export class RemoteSessionMultiplexTransport implements AppTransport {
331
340
  return;
332
341
  }
333
342
  this.pendingRequests.delete(frame.id);
343
+ window.clearTimeout(pending.timeoutId);
334
344
  if (frame.type === 'request.error') {
335
345
  pending.reject(new Error(frame.message));
336
346
  return;
@@ -1,8 +0,0 @@
1
- import{r as L,j as u,X as It,K as Bt,aq as Pt,b1 as Tt,b2 as Mt,b3 as Rt,a0 as Lt,g as ut,f as kt,b4 as Pe,ae as Te,b5 as Dt,ai as dt,e as q,a3 as Ut,i as Ft,G as qt,H as _t}from"./vendor-DJt0Azq5.js";import{Z as zt,t as c,c as K,I as Q,S as Ot,e as Ht,f as Kt,g as Vt,h as Jt,$ as ft,B as Ne,n as Gt,u as gt,a as ht,b as mt,a0 as Yt,a1 as Qt}from"./index-D45Vnh0I.js";import{S as pt}from"./status-dot-D11eQRlx.js";import{L as yt}from"./LogoBadge-B0RCYFfk.js";import{h as Ee}from"./config-hints-CApS3K_7.js";import{c as Wt,b as Zt,a as Xt,C as $t}from"./config-layout-BHnOoweL.js";import{L as en}from"./label-D8x2fgJm.js";import{S as tn}from"./switch-DizAKjZa.js";import{T as nn}from"./tabs-custom-Daa81i4V.js";import{P as rn,a as sn}from"./page-layout-Bxdxpr9D.js";function bt(e){var n,t;const s=zt();return((n=e.tutorialUrls)==null?void 0:n[s])||((t=e.tutorialUrls)==null?void 0:t.default)||e.tutorialUrl}const an={telegram:"telegram.svg",slack:"slack.svg",discord:"discord.svg",whatsapp:"whatsapp.svg",qq:"qq.svg",feishu:"feishu.svg",dingtalk:"dingtalk.svg",wecom:"wecom.svg",weixin:"weixin.svg",mochat:"mochat.svg",email:"email.svg"};function on(e,s){const a=s.toLowerCase(),n=e[a];return n?`/logos/${n}`:null}function wt(e){return on(an,e)}function ln({value:e,onChange:s,className:a,placeholder:n=""}){const[t,r]=L.useState(""),i=l=>{l.key==="Enter"&&t.trim()?(l.preventDefault(),s([...e,t.trim()]),r("")):l.key==="Backspace"&&!t&&e.length>0&&s(e.slice(0,-1))},o=l=>{s(e.filter((d,h)=>h!==l))};return u.jsxs("div",{className:K("flex flex-wrap gap-2 p-2 border rounded-md min-h-[42px]",a),children:[e.map((l,d)=>u.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 bg-primary text-primary-foreground rounded text-sm",children:[l,u.jsx("button",{type:"button",onClick:()=>o(d),className:"hover:text-red-300 transition-colors",children:u.jsx(It,{className:"h-3 w-3"})})]},d)),u.jsx("input",{type:"text",value:t,onChange:l=>r(l.target.value),onKeyDown:i,className:"flex-1 outline-none min-w-[100px] bg-transparent text-sm",placeholder:n||c("enterTag")})]})}function cn(e){return e.includes("token")||e.includes("secret")||e.includes("password")?u.jsx(Bt,{className:"h-3.5 w-3.5 text-gray-500"}):e.includes("url")||e.includes("host")?u.jsx(Pt,{className:"h-3.5 w-3.5 text-gray-500"}):e.includes("email")||e.includes("mail")?u.jsx(Tt,{className:"h-3.5 w-3.5 text-gray-500"}):e.includes("id")||e.includes("from")?u.jsx(Mt,{className:"h-3.5 w-3.5 text-gray-500"}):e==="enabled"||e==="consentGranted"?u.jsx(Rt,{className:"h-3.5 w-3.5 text-gray-500"}):u.jsx(Lt,{className:"h-3.5 w-3.5 text-gray-500"})}function Me({channelName:e,fields:s,formData:a,jsonDrafts:n,setJsonDrafts:t,updateField:r,uiHints:i}){return u.jsx(u.Fragment,{children:s.map(o=>{const l=Ee(`channels.${e}.${o.name}`,i),d=(l==null?void 0:l.label)??o.label,h=l==null?void 0:l.placeholder;return u.jsxs("div",{className:"space-y-2.5",children:[u.jsxs(en,{htmlFor:o.name,className:"flex items-center gap-2 text-sm font-medium text-gray-900",children:[cn(o.name),d]}),o.type==="boolean"&&u.jsxs("div",{className:"flex items-center justify-between rounded-xl bg-gray-50 p-3",children:[u.jsx("span",{className:"text-sm text-gray-500",children:a[o.name]?c("enabled"):c("disabled")}),u.jsx(tn,{id:o.name,checked:a[o.name]||!1,onCheckedChange:f=>r(o.name,f),className:"data-[state=checked]:bg-emerald-500"})]}),(o.type==="text"||o.type==="email")&&u.jsx(Q,{id:o.name,type:o.type,value:a[o.name]||"",onChange:f=>r(o.name,f.target.value),placeholder:h,className:"rounded-xl"}),o.type==="password"&&u.jsx(Q,{id:o.name,type:"password",value:a[o.name]||"",onChange:f=>r(o.name,f.target.value),placeholder:h??c("leaveBlankToKeepUnchanged"),className:"rounded-xl"}),o.type==="number"&&u.jsx(Q,{id:o.name,type:"number",value:a[o.name]||0,onChange:f=>r(o.name,parseInt(f.target.value,10)||0),placeholder:h,className:"rounded-xl"}),o.type==="tags"&&u.jsx(ln,{value:a[o.name]||[],onChange:f=>r(o.name,f)}),o.type==="select"&&u.jsxs(Ot,{value:a[o.name]||"",onValueChange:f=>r(o.name,f),children:[u.jsx(Ht,{className:"rounded-xl",children:u.jsx(Kt,{})}),u.jsx(Vt,{children:(o.options??[]).map(f=>u.jsx(Jt,{value:f.value,children:f.label},f.value))})]}),o.type==="json"&&u.jsx("textarea",{id:o.name,value:n[o.name]??"{}",onChange:f=>t(x=>({...x,[o.name]:f.target.value})),className:"min-h-[120px] w-full resize-none rounded-lg border border-gray-200 bg-white px-3 py-2 text-xs font-mono"})]},o.name)})})}const Re=[{value:"pairing",label:"pairing"},{value:"allowlist",label:"allowlist"},{value:"open",label:"open"},{value:"disabled",label:"disabled"}],Le=[{value:"open",label:"open"},{value:"allowlist",label:"allowlist"},{value:"disabled",label:"disabled"}],un=[{value:"off",label:"off"},{value:"partial",label:"partial"},{value:"block",label:"block"},{value:"progress",label:"progress"}];function ke(){return{telegram:[{name:"enabled",type:"boolean",label:c("enabled")},{name:"token",type:"password",label:c("botToken")},{name:"allowFrom",type:"tags",label:c("allowFrom")},{name:"proxy",type:"text",label:c("proxy")},{name:"accountId",type:"text",label:c("accountId")},{name:"dmPolicy",type:"select",label:c("dmPolicy"),options:Re},{name:"groupPolicy",type:"select",label:c("groupPolicy"),options:Le},{name:"groupAllowFrom",type:"tags",label:c("groupAllowFrom")},{name:"requireMention",type:"boolean",label:c("requireMention")},{name:"mentionPatterns",type:"tags",label:c("mentionPatterns")},{name:"groups",type:"json",label:c("groupRulesJson")}],discord:[{name:"enabled",type:"boolean",label:c("enabled")},{name:"token",type:"password",label:c("botToken")},{name:"allowBots",type:"boolean",label:c("allowBotMessages")},{name:"allowFrom",type:"tags",label:c("allowFrom")},{name:"gatewayUrl",type:"text",label:c("gatewayUrl")},{name:"intents",type:"number",label:c("intents")},{name:"proxy",type:"text",label:c("proxy")},{name:"mediaMaxMb",type:"number",label:c("attachmentMaxSizeMb")},{name:"streaming",type:"select",label:c("streamingMode"),options:un},{name:"draftChunk",type:"json",label:c("draftChunkingJson")},{name:"textChunkLimit",type:"number",label:c("textChunkLimit")},{name:"accountId",type:"text",label:c("accountId")},{name:"dmPolicy",type:"select",label:c("dmPolicy"),options:Re},{name:"groupPolicy",type:"select",label:c("groupPolicy"),options:Le},{name:"groupAllowFrom",type:"tags",label:c("groupAllowFrom")},{name:"requireMention",type:"boolean",label:c("requireMention")},{name:"mentionPatterns",type:"tags",label:c("mentionPatterns")},{name:"groups",type:"json",label:c("groupRulesJson")}],whatsapp:[{name:"enabled",type:"boolean",label:c("enabled")},{name:"bridgeUrl",type:"text",label:c("bridgeUrl")},{name:"allowFrom",type:"tags",label:c("allowFrom")}],feishu:[{name:"enabled",type:"boolean",label:c("enabled")},{name:"appId",type:"text",label:c("appId")},{name:"appSecret",type:"password",label:c("appSecret")},{name:"encryptKey",type:"password",label:c("encryptKey")},{name:"verificationToken",type:"password",label:c("verificationToken")},{name:"allowFrom",type:"tags",label:c("allowFrom")}],dingtalk:[{name:"enabled",type:"boolean",label:c("enabled")},{name:"clientId",type:"text",label:c("clientId")},{name:"clientSecret",type:"password",label:c("clientSecret")},{name:"allowFrom",type:"tags",label:c("allowFrom")}],wecom:[{name:"enabled",type:"boolean",label:c("enabled")},{name:"corpId",type:"text",label:c("corpId")},{name:"agentId",type:"text",label:c("agentId")},{name:"secret",type:"password",label:c("secret")},{name:"token",type:"password",label:c("token")},{name:"callbackPort",type:"number",label:c("callbackPort")},{name:"callbackPath",type:"text",label:c("callbackPath")},{name:"allowFrom",type:"tags",label:c("allowFrom")}],weixin:[{name:"enabled",type:"boolean",label:c("enabled")},{name:"defaultAccountId",type:"text",label:c("defaultAccountId")},{name:"baseUrl",type:"text",label:c("baseUrl")},{name:"pollTimeoutMs",type:"number",label:c("pollTimeoutMs")},{name:"allowFrom",type:"tags",label:c("allowFrom")},{name:"accounts",type:"json",label:c("accountsJson")}],slack:[{name:"enabled",type:"boolean",label:c("enabled")},{name:"mode",type:"text",label:c("mode")},{name:"webhookPath",type:"text",label:c("webhookPath")},{name:"allowBots",type:"boolean",label:c("allowBotMessages")},{name:"botToken",type:"password",label:c("botToken")},{name:"appToken",type:"password",label:c("appToken")}],email:[{name:"enabled",type:"boolean",label:c("enabled")},{name:"consentGranted",type:"boolean",label:c("consentGranted")},{name:"imapHost",type:"text",label:c("imapHost")},{name:"imapPort",type:"number",label:c("imapPort")},{name:"imapUsername",type:"text",label:c("imapUsername")},{name:"imapPassword",type:"password",label:c("imapPassword")},{name:"fromAddress",type:"email",label:c("fromAddress")}],mochat:[{name:"enabled",type:"boolean",label:c("enabled")},{name:"baseUrl",type:"text",label:c("baseUrl")},{name:"clawToken",type:"password",label:c("clawToken")},{name:"agentUserId",type:"text",label:c("agentUserId")},{name:"allowFrom",type:"tags",label:c("allowFrom")}],qq:[{name:"enabled",type:"boolean",label:c("enabled")},{name:"appId",type:"text",label:c("appId")},{name:"secret",type:"password",label:c("appSecret")},{name:"markdownSupport",type:"boolean",label:c("markdownSupport")},{name:"allowFrom",type:"tags",label:c("allowFrom")}]}}var H={},te,De;function dn(){return De||(De=1,te=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then}),te}var ne={},F={},Ue;function _(){if(Ue)return F;Ue=1;let e;const s=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];return F.getSymbolSize=function(n){if(!n)throw new Error('"version" cannot be null or undefined');if(n<1||n>40)throw new Error('"version" should be in range from 1 to 40');return n*4+17},F.getSymbolTotalCodewords=function(n){return s[n]},F.getBCHDigit=function(a){let n=0;for(;a!==0;)n++,a>>>=1;return n},F.setToSJISFunction=function(n){if(typeof n!="function")throw new Error('"toSJISFunc" is not a valid function.');e=n},F.isKanjiModeEnabled=function(){return typeof e<"u"},F.toSJIS=function(n){return e(n)},F}var re={},Fe;function je(){return Fe||(Fe=1,(function(e){e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function s(a){if(typeof a!="string")throw new Error("Param is not a string");switch(a.toLowerCase()){case"l":case"low":return e.L;case"m":case"medium":return e.M;case"q":case"quartile":return e.Q;case"h":case"high":return e.H;default:throw new Error("Unknown EC Level: "+a)}}e.isValid=function(n){return n&&typeof n.bit<"u"&&n.bit>=0&&n.bit<4},e.from=function(n,t){if(e.isValid(n))return n;try{return s(n)}catch{return t}}})(re)),re}var se,qe;function fn(){if(qe)return se;qe=1;function e(){this.buffer=[],this.length=0}return e.prototype={get:function(s){const a=Math.floor(s/8);return(this.buffer[a]>>>7-s%8&1)===1},put:function(s,a){for(let n=0;n<a;n++)this.putBit((s>>>a-n-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(s){const a=Math.floor(this.length/8);this.buffer.length<=a&&this.buffer.push(0),s&&(this.buffer[a]|=128>>>this.length%8),this.length++}},se=e,se}var ae,_e;function gn(){if(_e)return ae;_e=1;function e(s){if(!s||s<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=s,this.data=new Uint8Array(s*s),this.reservedBit=new Uint8Array(s*s)}return e.prototype.set=function(s,a,n,t){const r=s*this.size+a;this.data[r]=n,t&&(this.reservedBit[r]=!0)},e.prototype.get=function(s,a){return this.data[s*this.size+a]},e.prototype.xor=function(s,a,n){this.data[s*this.size+a]^=n},e.prototype.isReserved=function(s,a){return this.reservedBit[s*this.size+a]},ae=e,ae}var oe={},ze;function hn(){return ze||(ze=1,(function(e){const s=_().getSymbolSize;e.getRowColCoords=function(n){if(n===1)return[];const t=Math.floor(n/7)+2,r=s(n),i=r===145?26:Math.ceil((r-13)/(2*t-2))*2,o=[r-7];for(let l=1;l<t-1;l++)o[l]=o[l-1]-i;return o.push(6),o.reverse()},e.getPositions=function(n){const t=[],r=e.getRowColCoords(n),i=r.length;for(let o=0;o<i;o++)for(let l=0;l<i;l++)o===0&&l===0||o===0&&l===i-1||o===i-1&&l===0||t.push([r[o],r[l]]);return t}})(oe)),oe}var ie={},Oe;function mn(){if(Oe)return ie;Oe=1;const e=_().getSymbolSize,s=7;return ie.getPositions=function(n){const t=e(n);return[[0,0],[t-s,0],[0,t-s]]},ie}var le={},He;function pn(){return He||(He=1,(function(e){e.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};const s={N1:3,N2:3,N3:40,N4:10};e.isValid=function(t){return t!=null&&t!==""&&!isNaN(t)&&t>=0&&t<=7},e.from=function(t){return e.isValid(t)?parseInt(t,10):void 0},e.getPenaltyN1=function(t){const r=t.size;let i=0,o=0,l=0,d=null,h=null;for(let f=0;f<r;f++){o=l=0,d=h=null;for(let x=0;x<r;x++){let g=t.get(f,x);g===d?o++:(o>=5&&(i+=s.N1+(o-5)),d=g,o=1),g=t.get(x,f),g===h?l++:(l>=5&&(i+=s.N1+(l-5)),h=g,l=1)}o>=5&&(i+=s.N1+(o-5)),l>=5&&(i+=s.N1+(l-5))}return i},e.getPenaltyN2=function(t){const r=t.size;let i=0;for(let o=0;o<r-1;o++)for(let l=0;l<r-1;l++){const d=t.get(o,l)+t.get(o,l+1)+t.get(o+1,l)+t.get(o+1,l+1);(d===4||d===0)&&i++}return i*s.N2},e.getPenaltyN3=function(t){const r=t.size;let i=0,o=0,l=0;for(let d=0;d<r;d++){o=l=0;for(let h=0;h<r;h++)o=o<<1&2047|t.get(d,h),h>=10&&(o===1488||o===93)&&i++,l=l<<1&2047|t.get(h,d),h>=10&&(l===1488||l===93)&&i++}return i*s.N3},e.getPenaltyN4=function(t){let r=0;const i=t.data.length;for(let l=0;l<i;l++)r+=t.data[l];return Math.abs(Math.ceil(r*100/i/5)-10)*s.N4};function a(n,t,r){switch(n){case e.Patterns.PATTERN000:return(t+r)%2===0;case e.Patterns.PATTERN001:return t%2===0;case e.Patterns.PATTERN010:return r%3===0;case e.Patterns.PATTERN011:return(t+r)%3===0;case e.Patterns.PATTERN100:return(Math.floor(t/2)+Math.floor(r/3))%2===0;case e.Patterns.PATTERN101:return t*r%2+t*r%3===0;case e.Patterns.PATTERN110:return(t*r%2+t*r%3)%2===0;case e.Patterns.PATTERN111:return(t*r%3+(t+r)%2)%2===0;default:throw new Error("bad maskPattern:"+n)}}e.applyMask=function(t,r){const i=r.size;for(let o=0;o<i;o++)for(let l=0;l<i;l++)r.isReserved(l,o)||r.xor(l,o,a(t,l,o))},e.getBestMask=function(t,r){const i=Object.keys(e.Patterns).length;let o=0,l=1/0;for(let d=0;d<i;d++){r(d),e.applyMask(d,t);const h=e.getPenaltyN1(t)+e.getPenaltyN2(t)+e.getPenaltyN3(t)+e.getPenaltyN4(t);e.applyMask(d,t),h<l&&(l=h,o=d)}return o}})(le)),le}var Y={},Ke;function xt(){if(Ke)return Y;Ke=1;const e=je(),s=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],a=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];return Y.getBlocksCount=function(t,r){switch(r){case e.L:return s[(t-1)*4+0];case e.M:return s[(t-1)*4+1];case e.Q:return s[(t-1)*4+2];case e.H:return s[(t-1)*4+3];default:return}},Y.getTotalCodewordsCount=function(t,r){switch(r){case e.L:return a[(t-1)*4+0];case e.M:return a[(t-1)*4+1];case e.Q:return a[(t-1)*4+2];case e.H:return a[(t-1)*4+3];default:return}},Y}var ce={},J={},Ve;function yn(){if(Ve)return J;Ve=1;const e=new Uint8Array(512),s=new Uint8Array(256);return(function(){let n=1;for(let t=0;t<255;t++)e[t]=n,s[n]=t,n<<=1,n&256&&(n^=285);for(let t=255;t<512;t++)e[t]=e[t-255]})(),J.log=function(n){if(n<1)throw new Error("log("+n+")");return s[n]},J.exp=function(n){return e[n]},J.mul=function(n,t){return n===0||t===0?0:e[s[n]+s[t]]},J}var Je;function bn(){return Je||(Je=1,(function(e){const s=yn();e.mul=function(n,t){const r=new Uint8Array(n.length+t.length-1);for(let i=0;i<n.length;i++)for(let o=0;o<t.length;o++)r[i+o]^=s.mul(n[i],t[o]);return r},e.mod=function(n,t){let r=new Uint8Array(n);for(;r.length-t.length>=0;){const i=r[0];for(let l=0;l<t.length;l++)r[l]^=s.mul(t[l],i);let o=0;for(;o<r.length&&r[o]===0;)o++;r=r.slice(o)}return r},e.generateECPolynomial=function(n){let t=new Uint8Array([1]);for(let r=0;r<n;r++)t=e.mul(t,new Uint8Array([1,s.exp(r)]));return t}})(ce)),ce}var ue,Ge;function wn(){if(Ge)return ue;Ge=1;const e=bn();function s(a){this.genPoly=void 0,this.degree=a,this.degree&&this.initialize(this.degree)}return s.prototype.initialize=function(n){this.degree=n,this.genPoly=e.generateECPolynomial(this.degree)},s.prototype.encode=function(n){if(!this.genPoly)throw new Error("Encoder not initialized");const t=new Uint8Array(n.length+this.degree);t.set(n);const r=e.mod(t,this.genPoly),i=this.degree-r.length;if(i>0){const o=new Uint8Array(this.degree);return o.set(r,i),o}return r},ue=s,ue}var de={},fe={},ge={},Ye;function Ct(){return Ye||(Ye=1,ge.isValid=function(s){return!isNaN(s)&&s>=1&&s<=40}),ge}var k={},Qe;function At(){if(Qe)return k;Qe=1;const e="[0-9]+",s="[A-Z $%*+\\-./:]+";let a="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";a=a.replace(/u/g,"\\u");const n="(?:(?![A-Z0-9 $%*+\\-./:]|"+a+`)(?:.|[\r
2
- ]))+`;k.KANJI=new RegExp(a,"g"),k.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),k.BYTE=new RegExp(n,"g"),k.NUMERIC=new RegExp(e,"g"),k.ALPHANUMERIC=new RegExp(s,"g");const t=new RegExp("^"+a+"$"),r=new RegExp("^"+e+"$"),i=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");return k.testKanji=function(l){return t.test(l)},k.testNumeric=function(l){return r.test(l)},k.testAlphanumeric=function(l){return i.test(l)},k}var We;function z(){return We||(We=1,(function(e){const s=Ct(),a=At();e.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},e.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},e.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(r,i){if(!r.ccBits)throw new Error("Invalid mode: "+r);if(!s.isValid(i))throw new Error("Invalid version: "+i);return i>=1&&i<10?r.ccBits[0]:i<27?r.ccBits[1]:r.ccBits[2]},e.getBestModeForData=function(r){return a.testNumeric(r)?e.NUMERIC:a.testAlphanumeric(r)?e.ALPHANUMERIC:a.testKanji(r)?e.KANJI:e.BYTE},e.toString=function(r){if(r&&r.id)return r.id;throw new Error("Invalid mode")},e.isValid=function(r){return r&&r.bit&&r.ccBits};function n(t){if(typeof t!="string")throw new Error("Param is not a string");switch(t.toLowerCase()){case"numeric":return e.NUMERIC;case"alphanumeric":return e.ALPHANUMERIC;case"kanji":return e.KANJI;case"byte":return e.BYTE;default:throw new Error("Unknown mode: "+t)}}e.from=function(r,i){if(e.isValid(r))return r;try{return n(r)}catch{return i}}})(fe)),fe}var Ze;function xn(){return Ze||(Ze=1,(function(e){const s=_(),a=xt(),n=je(),t=z(),r=Ct(),i=7973,o=s.getBCHDigit(i);function l(x,g,y){for(let A=1;A<=40;A++)if(g<=e.getCapacity(A,y,x))return A}function d(x,g){return t.getCharCountIndicator(x,g)+4}function h(x,g){let y=0;return x.forEach(function(A){const T=d(A.mode,g);y+=T+A.getBitsLength()}),y}function f(x,g){for(let y=1;y<=40;y++)if(h(x,y)<=e.getCapacity(y,g,t.MIXED))return y}e.from=function(g,y){return r.isValid(g)?parseInt(g,10):y},e.getCapacity=function(g,y,A){if(!r.isValid(g))throw new Error("Invalid QR Code version");typeof A>"u"&&(A=t.BYTE);const T=s.getSymbolTotalCodewords(g),E=a.getTotalCodewordsCount(g,y),P=(T-E)*8;if(A===t.MIXED)return P;const b=P-d(A,g);switch(A){case t.NUMERIC:return Math.floor(b/10*3);case t.ALPHANUMERIC:return Math.floor(b/11*2);case t.KANJI:return Math.floor(b/13);case t.BYTE:default:return Math.floor(b/8)}},e.getBestVersionForData=function(g,y){let A;const T=n.from(y,n.M);if(Array.isArray(g)){if(g.length>1)return f(g,T);if(g.length===0)return 1;A=g[0]}else A=g;return l(A.mode,A.getLength(),T)},e.getEncodedBits=function(g){if(!r.isValid(g)||g<7)throw new Error("Invalid QR Code version");let y=g<<12;for(;s.getBCHDigit(y)-o>=0;)y^=i<<s.getBCHDigit(y)-o;return g<<12|y}})(de)),de}var he={},Xe;function Cn(){if(Xe)return he;Xe=1;const e=_(),s=1335,a=21522,n=e.getBCHDigit(s);return he.getEncodedBits=function(r,i){const o=r.bit<<3|i;let l=o<<10;for(;e.getBCHDigit(l)-n>=0;)l^=s<<e.getBCHDigit(l)-n;return(o<<10|l)^a},he}var me={},pe,$e;function An(){if($e)return pe;$e=1;const e=z();function s(a){this.mode=e.NUMERIC,this.data=a.toString()}return s.getBitsLength=function(n){return 10*Math.floor(n/3)+(n%3?n%3*3+1:0)},s.prototype.getLength=function(){return this.data.length},s.prototype.getBitsLength=function(){return s.getBitsLength(this.data.length)},s.prototype.write=function(n){let t,r,i;for(t=0;t+3<=this.data.length;t+=3)r=this.data.substr(t,3),i=parseInt(r,10),n.put(i,10);const o=this.data.length-t;o>0&&(r=this.data.substr(t),i=parseInt(r,10),n.put(i,o*3+1))},pe=s,pe}var ye,et;function vn(){if(et)return ye;et=1;const e=z(),s=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function a(n){this.mode=e.ALPHANUMERIC,this.data=n}return a.getBitsLength=function(t){return 11*Math.floor(t/2)+6*(t%2)},a.prototype.getLength=function(){return this.data.length},a.prototype.getBitsLength=function(){return a.getBitsLength(this.data.length)},a.prototype.write=function(t){let r;for(r=0;r+2<=this.data.length;r+=2){let i=s.indexOf(this.data[r])*45;i+=s.indexOf(this.data[r+1]),t.put(i,11)}this.data.length%2&&t.put(s.indexOf(this.data[r]),6)},ye=a,ye}var be,tt;function Nn(){if(tt)return be;tt=1;const e=z();function s(a){this.mode=e.BYTE,typeof a=="string"?this.data=new TextEncoder().encode(a):this.data=new Uint8Array(a)}return s.getBitsLength=function(n){return n*8},s.prototype.getLength=function(){return this.data.length},s.prototype.getBitsLength=function(){return s.getBitsLength(this.data.length)},s.prototype.write=function(a){for(let n=0,t=this.data.length;n<t;n++)a.put(this.data[n],8)},be=s,be}var we,nt;function En(){if(nt)return we;nt=1;const e=z(),s=_();function a(n){this.mode=e.KANJI,this.data=n}return a.getBitsLength=function(t){return t*13},a.prototype.getLength=function(){return this.data.length},a.prototype.getBitsLength=function(){return a.getBitsLength(this.data.length)},a.prototype.write=function(n){let t;for(t=0;t<this.data.length;t++){let r=s.toSJIS(this.data[t]);if(r>=33088&&r<=40956)r-=33088;else if(r>=57408&&r<=60351)r-=49472;else throw new Error("Invalid SJIS character: "+this.data[t]+`
3
- Make sure your charset is UTF-8`);r=(r>>>8&255)*192+(r&255),n.put(r,13)}},we=a,we}var xe={exports:{}},rt;function jn(){return rt||(rt=1,(function(e){var s={single_source_shortest_paths:function(a,n,t){var r={},i={};i[n]=0;var o=s.PriorityQueue.make();o.push(n,0);for(var l,d,h,f,x,g,y,A,T;!o.empty();){l=o.pop(),d=l.value,f=l.cost,x=a[d]||{};for(h in x)x.hasOwnProperty(h)&&(g=x[h],y=f+g,A=i[h],T=typeof i[h]>"u",(T||A>y)&&(i[h]=y,o.push(h,y),r[h]=d))}if(typeof t<"u"&&typeof i[t]>"u"){var E=["Could not find a path from ",n," to ",t,"."].join("");throw new Error(E)}return r},extract_shortest_path_from_predecessor_list:function(a,n){for(var t=[],r=n;r;)t.push(r),a[r],r=a[r];return t.reverse(),t},find_path:function(a,n,t){var r=s.single_source_shortest_paths(a,n,t);return s.extract_shortest_path_from_predecessor_list(r,t)},PriorityQueue:{make:function(a){var n=s.PriorityQueue,t={},r;a=a||{};for(r in n)n.hasOwnProperty(r)&&(t[r]=n[r]);return t.queue=[],t.sorter=a.sorter||n.default_sorter,t},default_sorter:function(a,n){return a.cost-n.cost},push:function(a,n){var t={value:a,cost:n};this.queue.push(t),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};e.exports=s})(xe)),xe.exports}var st;function Sn(){return st||(st=1,(function(e){const s=z(),a=An(),n=vn(),t=Nn(),r=En(),i=At(),o=_(),l=jn();function d(E){return unescape(encodeURIComponent(E)).length}function h(E,P,b){const N=[];let M;for(;(M=E.exec(b))!==null;)N.push({data:M[0],index:M.index,mode:P,length:M[0].length});return N}function f(E){const P=h(i.NUMERIC,s.NUMERIC,E),b=h(i.ALPHANUMERIC,s.ALPHANUMERIC,E);let N,M;return o.isKanjiModeEnabled()?(N=h(i.BYTE,s.BYTE,E),M=h(i.KANJI,s.KANJI,E)):(N=h(i.BYTE_KANJI,s.BYTE,E),M=[]),P.concat(b,N,M).sort(function(S,I){return S.index-I.index}).map(function(S){return{data:S.data,mode:S.mode,length:S.length}})}function x(E,P){switch(P){case s.NUMERIC:return a.getBitsLength(E);case s.ALPHANUMERIC:return n.getBitsLength(E);case s.KANJI:return r.getBitsLength(E);case s.BYTE:return t.getBitsLength(E)}}function g(E){return E.reduce(function(P,b){const N=P.length-1>=0?P[P.length-1]:null;return N&&N.mode===b.mode?(P[P.length-1].data+=b.data,P):(P.push(b),P)},[])}function y(E){const P=[];for(let b=0;b<E.length;b++){const N=E[b];switch(N.mode){case s.NUMERIC:P.push([N,{data:N.data,mode:s.ALPHANUMERIC,length:N.length},{data:N.data,mode:s.BYTE,length:N.length}]);break;case s.ALPHANUMERIC:P.push([N,{data:N.data,mode:s.BYTE,length:N.length}]);break;case s.KANJI:P.push([N,{data:N.data,mode:s.BYTE,length:d(N.data)}]);break;case s.BYTE:P.push([{data:N.data,mode:s.BYTE,length:d(N.data)}])}}return P}function A(E,P){const b={},N={start:{}};let M=["start"];for(let w=0;w<E.length;w++){const S=E[w],I=[];for(let v=0;v<S.length;v++){const B=S[v],j=""+w+v;I.push(j),b[j]={node:B,lastCount:0},N[j]={};for(let m=0;m<M.length;m++){const p=M[m];b[p]&&b[p].node.mode===B.mode?(N[p][j]=x(b[p].lastCount+B.length,B.mode)-x(b[p].lastCount,B.mode),b[p].lastCount+=B.length):(b[p]&&(b[p].lastCount=B.length),N[p][j]=x(B.length,B.mode)+4+s.getCharCountIndicator(B.mode,P))}}M=I}for(let w=0;w<M.length;w++)N[M[w]].end=0;return{map:N,table:b}}function T(E,P){let b;const N=s.getBestModeForData(E);if(b=s.from(P,N),b!==s.BYTE&&b.bit<N.bit)throw new Error('"'+E+'" cannot be encoded with mode '+s.toString(b)+`.
4
- Suggested mode is: `+s.toString(N));switch(b===s.KANJI&&!o.isKanjiModeEnabled()&&(b=s.BYTE),b){case s.NUMERIC:return new a(E);case s.ALPHANUMERIC:return new n(E);case s.KANJI:return new r(E);case s.BYTE:return new t(E)}}e.fromArray=function(P){return P.reduce(function(b,N){return typeof N=="string"?b.push(T(N,null)):N.data&&b.push(T(N.data,N.mode)),b},[])},e.fromString=function(P,b){const N=f(P,o.isKanjiModeEnabled()),M=y(N),w=A(M,b),S=l.find_path(w.map,"start","end"),I=[];for(let v=1;v<S.length-1;v++)I.push(w.table[S[v]].node);return e.fromArray(g(I))},e.rawSplit=function(P){return e.fromArray(f(P,o.isKanjiModeEnabled()))}})(me)),me}var at;function In(){if(at)return ne;at=1;const e=_(),s=je(),a=fn(),n=gn(),t=hn(),r=mn(),i=pn(),o=xt(),l=wn(),d=xn(),h=Cn(),f=z(),x=Sn();function g(w,S){const I=w.size,v=r.getPositions(S);for(let B=0;B<v.length;B++){const j=v[B][0],m=v[B][1];for(let p=-1;p<=7;p++)if(!(j+p<=-1||I<=j+p))for(let C=-1;C<=7;C++)m+C<=-1||I<=m+C||(p>=0&&p<=6&&(C===0||C===6)||C>=0&&C<=6&&(p===0||p===6)||p>=2&&p<=4&&C>=2&&C<=4?w.set(j+p,m+C,!0,!0):w.set(j+p,m+C,!1,!0))}}function y(w){const S=w.size;for(let I=8;I<S-8;I++){const v=I%2===0;w.set(I,6,v,!0),w.set(6,I,v,!0)}}function A(w,S){const I=t.getPositions(S);for(let v=0;v<I.length;v++){const B=I[v][0],j=I[v][1];for(let m=-2;m<=2;m++)for(let p=-2;p<=2;p++)m===-2||m===2||p===-2||p===2||m===0&&p===0?w.set(B+m,j+p,!0,!0):w.set(B+m,j+p,!1,!0)}}function T(w,S){const I=w.size,v=d.getEncodedBits(S);let B,j,m;for(let p=0;p<18;p++)B=Math.floor(p/3),j=p%3+I-8-3,m=(v>>p&1)===1,w.set(B,j,m,!0),w.set(j,B,m,!0)}function E(w,S,I){const v=w.size,B=h.getEncodedBits(S,I);let j,m;for(j=0;j<15;j++)m=(B>>j&1)===1,j<6?w.set(j,8,m,!0):j<8?w.set(j+1,8,m,!0):w.set(v-15+j,8,m,!0),j<8?w.set(8,v-j-1,m,!0):j<9?w.set(8,15-j-1+1,m,!0):w.set(8,15-j-1,m,!0);w.set(v-8,8,1,!0)}function P(w,S){const I=w.size;let v=-1,B=I-1,j=7,m=0;for(let p=I-1;p>0;p-=2)for(p===6&&p--;;){for(let C=0;C<2;C++)if(!w.isReserved(B,p-C)){let R=!1;m<S.length&&(R=(S[m]>>>j&1)===1),w.set(B,p-C,R),j--,j===-1&&(m++,j=7)}if(B+=v,B<0||I<=B){B-=v,v=-v;break}}}function b(w,S,I){const v=new a;I.forEach(function(C){v.put(C.mode.bit,4),v.put(C.getLength(),f.getCharCountIndicator(C.mode,w)),C.write(v)});const B=e.getSymbolTotalCodewords(w),j=o.getTotalCodewordsCount(w,S),m=(B-j)*8;for(v.getLengthInBits()+4<=m&&v.put(0,4);v.getLengthInBits()%8!==0;)v.putBit(0);const p=(m-v.getLengthInBits())/8;for(let C=0;C<p;C++)v.put(C%2?17:236,8);return N(v,w,S)}function N(w,S,I){const v=e.getSymbolTotalCodewords(S),B=o.getTotalCodewordsCount(S,I),j=v-B,m=o.getBlocksCount(S,I),p=v%m,C=m-p,R=Math.floor(v/m),V=Math.floor(j/m),Et=V+1,Se=R-V,jt=new l(Se);let Z=0;const G=new Array(m),Ie=new Array(m);let X=0;const St=new Uint8Array(w.buffer);for(let O=0;O<m;O++){const ee=O<C?V:Et;G[O]=St.slice(Z,Z+ee),Ie[O]=jt.encode(G[O]),Z+=ee,X=Math.max(X,ee)}const $=new Uint8Array(v);let Be=0,D,U;for(D=0;D<X;D++)for(U=0;U<m;U++)D<G[U].length&&($[Be++]=G[U][D]);for(D=0;D<Se;D++)for(U=0;U<m;U++)$[Be++]=Ie[U][D];return $}function M(w,S,I,v){let B;if(Array.isArray(w))B=x.fromArray(w);else if(typeof w=="string"){let R=S;if(!R){const V=x.rawSplit(w);R=d.getBestVersionForData(V,I)}B=x.fromString(w,R||40)}else throw new Error("Invalid data");const j=d.getBestVersionForData(B,I);if(!j)throw new Error("The amount of data is too big to be stored in a QR Code");if(!S)S=j;else if(S<j)throw new Error(`
5
- The chosen QR Code version cannot contain this amount of data.
6
- Minimum version required to store current data is: `+j+`.
7
- `);const m=b(S,I,B),p=e.getSymbolSize(S),C=new n(p);return g(C,S),y(C),A(C,S),E(C,I,0),S>=7&&T(C,S),P(C,m),isNaN(v)&&(v=i.getBestMask(C,E.bind(null,C,I))),i.applyMask(v,C),E(C,I,v),{modules:C,version:S,errorCorrectionLevel:I,maskPattern:v,segments:B}}return ne.create=function(S,I){if(typeof S>"u"||S==="")throw new Error("No input text");let v=s.M,B,j;return typeof I<"u"&&(v=s.from(I.errorCorrectionLevel,s.M),B=d.from(I.version),j=i.from(I.maskPattern),I.toSJISFunc&&e.setToSJISFunction(I.toSJISFunc)),M(S,B,v,j)},ne}var Ce={},Ae={},ot;function vt(){return ot||(ot=1,(function(e){function s(a){if(typeof a=="number"&&(a=a.toString()),typeof a!="string")throw new Error("Color should be defined as hex string");let n=a.slice().replace("#","").split("");if(n.length<3||n.length===5||n.length>8)throw new Error("Invalid hex color: "+a);(n.length===3||n.length===4)&&(n=Array.prototype.concat.apply([],n.map(function(r){return[r,r]}))),n.length===6&&n.push("F","F");const t=parseInt(n.join(""),16);return{r:t>>24&255,g:t>>16&255,b:t>>8&255,a:t&255,hex:"#"+n.slice(0,6).join("")}}e.getOptions=function(n){n||(n={}),n.color||(n.color={});const t=typeof n.margin>"u"||n.margin===null||n.margin<0?4:n.margin,r=n.width&&n.width>=21?n.width:void 0,i=n.scale||4;return{width:r,scale:r?4:i,margin:t,color:{dark:s(n.color.dark||"#000000ff"),light:s(n.color.light||"#ffffffff")},type:n.type,rendererOpts:n.rendererOpts||{}}},e.getScale=function(n,t){return t.width&&t.width>=n+t.margin*2?t.width/(n+t.margin*2):t.scale},e.getImageWidth=function(n,t){const r=e.getScale(n,t);return Math.floor((n+t.margin*2)*r)},e.qrToImageData=function(n,t,r){const i=t.modules.size,o=t.modules.data,l=e.getScale(i,r),d=Math.floor((i+r.margin*2)*l),h=r.margin*l,f=[r.color.light,r.color.dark];for(let x=0;x<d;x++)for(let g=0;g<d;g++){let y=(x*d+g)*4,A=r.color.light;if(x>=h&&g>=h&&x<d-h&&g<d-h){const T=Math.floor((x-h)/l),E=Math.floor((g-h)/l);A=f[o[T*i+E]?1:0]}n[y++]=A.r,n[y++]=A.g,n[y++]=A.b,n[y]=A.a}}})(Ae)),Ae}var it;function Bn(){return it||(it=1,(function(e){const s=vt();function a(t,r,i){t.clearRect(0,0,r.width,r.height),r.style||(r.style={}),r.height=i,r.width=i,r.style.height=i+"px",r.style.width=i+"px"}function n(){try{return document.createElement("canvas")}catch{throw new Error("You need to specify a canvas element")}}e.render=function(r,i,o){let l=o,d=i;typeof l>"u"&&(!i||!i.getContext)&&(l=i,i=void 0),i||(d=n()),l=s.getOptions(l);const h=s.getImageWidth(r.modules.size,l),f=d.getContext("2d"),x=f.createImageData(h,h);return s.qrToImageData(x.data,r,l),a(f,d,h),f.putImageData(x,0,0),d},e.renderToDataURL=function(r,i,o){let l=o;typeof l>"u"&&(!i||!i.getContext)&&(l=i,i=void 0),l||(l={});const d=e.render(r,i,l),h=l.type||"image/png",f=l.rendererOpts||{};return d.toDataURL(h,f.quality)}})(Ce)),Ce}var ve={},lt;function Pn(){if(lt)return ve;lt=1;const e=vt();function s(t,r){const i=t.a/255,o=r+'="'+t.hex+'"';return i<1?o+" "+r+'-opacity="'+i.toFixed(2).slice(1)+'"':o}function a(t,r,i){let o=t+r;return typeof i<"u"&&(o+=" "+i),o}function n(t,r,i){let o="",l=0,d=!1,h=0;for(let f=0;f<t.length;f++){const x=Math.floor(f%r),g=Math.floor(f/r);!x&&!d&&(d=!0),t[f]?(h++,f>0&&x>0&&t[f-1]||(o+=d?a("M",x+i,.5+g+i):a("m",l,0),l=0,d=!1),x+1<r&&t[f+1]||(o+=a("h",h),h=0)):l++}return o}return ve.render=function(r,i,o){const l=e.getOptions(i),d=r.modules.size,h=r.modules.data,f=d+l.margin*2,x=l.color.light.a?"<path "+s(l.color.light,"fill")+' d="M0 0h'+f+"v"+f+'H0z"/>':"",g="<path "+s(l.color.dark,"stroke")+' d="'+n(h,d,l.margin)+'"/>',y='viewBox="0 0 '+f+" "+f+'"',T='<svg xmlns="http://www.w3.org/2000/svg" '+(l.width?'width="'+l.width+'" height="'+l.width+'" ':"")+y+' shape-rendering="crispEdges">'+x+g+`</svg>
8
- `;return typeof o=="function"&&o(null,T),T},ve}var ct;function Tn(){if(ct)return H;ct=1;const e=dn(),s=In(),a=Bn(),n=Pn();function t(r,i,o,l,d){const h=[].slice.call(arguments,1),f=h.length,x=typeof h[f-1]=="function";if(!x&&!e())throw new Error("Callback required as last argument");if(x){if(f<2)throw new Error("Too few arguments provided");f===2?(d=o,o=i,i=l=void 0):f===3&&(i.getContext&&typeof d>"u"?(d=l,l=void 0):(d=l,l=o,o=i,i=void 0))}else{if(f<1)throw new Error("Too few arguments provided");return f===1?(o=i,i=l=void 0):f===2&&!i.getContext&&(l=o,o=i,i=void 0),new Promise(function(g,y){try{const A=s.create(o,l);g(r(A,i,l))}catch(A){y(A)}})}try{const g=s.create(o,l);d(null,r(g,i,l))}catch(g){d(g)}}return H.create=s.create,H.toCanvas=t.bind(null,a.render),H.toDataURL=t.bind(null,a.renderToDataURL),H.toString=t.bind(null,function(r,i,o){return n.render(r,o)}),H}var Mn=Tn();async function Rn(e,s={}){const a=await ft.post(`/api/config/channels/${e}/auth/start`,s);if(!a.ok)throw new Error(a.error.message);return a.data}async function Ln(e,s){const a=await ft.post(`/api/config/channels/${e}/auth/poll`,s);if(!a.ok)throw new Error(a.error.message);return a.data}function kn(){return ut({mutationFn:({channel:e,data:s})=>Rn(e,s)})}function Dn(){return ut({mutationFn:({channel:e,data:s})=>Ln(e,s)})}function Un(e){const s=e.accounts,a=new Set;if(typeof e.defaultAccountId=="string"&&e.defaultAccountId.trim()&&a.add(e.defaultAccountId.trim()),s&&typeof s=="object"&&!Array.isArray(s))for(const n of Object.keys(s)){const t=n.trim();t&&a.add(t)}return[...a]}function Fn(e,s){if(typeof e.baseUrl=="string"&&e.baseUrl.trim())return e.baseUrl.trim();if(typeof s.baseUrl=="string"&&s.baseUrl.trim())return s.baseUrl.trim()}function qn({channelConfig:e,formData:s,disabled:a=!1}){const n=kt(),t=kn(),r=Dn(),[i,o]=L.useState(null),[l,d]=L.useState(null),[h,f]=L.useState(null),x=L.useMemo(()=>Un(e),[e]),g=x[0],y=Fn(s,e),A=x.length>0;L.useEffect(()=>{A&&(o(null),d(b=>(b==null?void 0:b.status)==="authorized"?b:{channel:"weixin",status:"authorized",message:c("weixinAuthAuthorized"),accountId:g??null}))},[A,g]),L.useEffect(()=>{if(!i){f(null);return}let b=!1;return Mn.toDataURL(i.qrCodeUrl,{errorCorrectionLevel:"M",margin:1,width:480}).then(N=>{b||f(N)}).catch(()=>{b||f(null)}),()=>{b=!0}},[i]),L.useEffect(()=>{if(!i)return;let b=!1,N=null;const M=async()=>{try{const w=await r.mutateAsync({channel:"weixin",data:{sessionId:i.sessionId}});if(b)return;if(d(w),w.status==="authorized"){await n.invalidateQueries({queryKey:["config"]}),await n.invalidateQueries({queryKey:["config-meta"]}),q.success(w.message||c("weixinAuthAuthorized")),o(null);return}if(w.status==="expired"||w.status==="error"){q.error(w.message||c("weixinAuthRetryRequired")),o(null);return}N=setTimeout(M,w.nextPollMs??i.intervalMs)}catch(w){if(b)return;const S=w instanceof Error?w.message:String(w);q.error(`${c("error")}: ${S}`),o(null)}};return N=setTimeout(M,i.intervalMs),()=>{b=!0,N&&clearTimeout(N)}},[i,r,n]);const T=async()=>{try{const b=await t.mutateAsync({channel:"weixin",data:{baseUrl:y,accountId:typeof s.defaultAccountId=="string"&&s.defaultAccountId.trim()?s.defaultAccountId.trim():void 0}});o(b),d({channel:"weixin",status:"pending",message:b.note,nextPollMs:b.intervalMs})}catch(b){const N=b instanceof Error?b.message:String(b);q.error(`${c("error")}: ${N}`)}},E=i?(l==null?void 0:l.status)==="scanned"?c("weixinAuthScanned"):c("weixinAuthWaiting"):A?c("weixinAuthAuthorized"):c("weixinAuthNotConnected"),P=t.isPending?c("weixinAuthStarting"):i?c("weixinAuthWaiting"):A?c("weixinAuthReconnect"):c("weixinAuthConnect");return u.jsx("section",{className:"rounded-2xl border border-primary/20 bg-gradient-to-br from-primary-50/70 via-white to-emerald-50/60 p-5",children:u.jsxs("div",{className:"flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between",children:[u.jsxs("div",{className:"space-y-3",children:[u.jsxs("div",{className:"inline-flex items-center gap-2 rounded-full bg-white/90 px-3 py-1 text-xs font-medium text-primary shadow-sm",children:[u.jsx(Pe,{className:"h-3.5 w-3.5"}),c("weixinAuthTitle")]}),u.jsxs("div",{children:[u.jsx("h4",{className:"text-base font-semibold text-gray-900",children:c("weixinAuthDescription")}),u.jsx("p",{className:"mt-1 text-sm text-gray-600",children:c("weixinAuthHint")})]}),u.jsxs("div",{className:K("inline-flex w-fit items-center gap-2 rounded-full px-3 py-1 text-xs font-medium",i?"bg-amber-50 text-amber-700":A?"bg-emerald-50 text-emerald-700":"bg-gray-100 text-gray-600"),children:[i?u.jsx(Te,{className:"h-3.5 w-3.5 animate-spin"}):u.jsx(Dt,{className:"h-3.5 w-3.5"}),E]}),u.jsxs("div",{className:"space-y-1 text-sm text-gray-600",children:[u.jsx("p",{children:c("weixinAuthCapabilityHint")}),g?u.jsxs("p",{children:[c("weixinAuthPrimaryAccount"),": ",u.jsx("span",{className:"font-mono text-xs text-gray-900",children:g})]}):null,x.length>1?u.jsxs("p",{children:[c("weixinAuthConnectedAccounts"),": ",u.jsx("span",{className:"font-mono text-xs text-gray-900",children:x.join(", ")})]}):null,y?u.jsxs("p",{children:[c("weixinAuthBaseUrl"),": ",u.jsx("span",{className:"font-mono text-xs text-gray-900",children:y})]}):null]}),u.jsx(Ne,{type:"button",onClick:T,disabled:a||t.isPending||!!i,className:"rounded-xl",children:P})]}),u.jsx("div",{className:"w-full max-w-sm rounded-2xl border border-dashed border-primary/25 bg-white/85 p-4 shadow-sm",children:i?u.jsxs("div",{className:"space-y-3",children:[u.jsx("div",{className:"overflow-hidden rounded-2xl border border-gray-100 bg-white p-3",children:h?u.jsx("img",{src:h,alt:c("weixinAuthQrAlt"),className:"mx-auto aspect-square w-full max-w-[240px] object-contain"}):u.jsx("div",{className:"flex aspect-square w-full items-center justify-center rounded-xl bg-gray-50 text-gray-500",children:u.jsxs("div",{className:"flex flex-col items-center gap-2 text-center",children:[u.jsx(Te,{className:"h-5 w-5 animate-spin"}),u.jsx("p",{className:"text-xs",children:c("weixinAuthStarting")})]})})}),u.jsxs("div",{className:"space-y-1 text-xs text-gray-500",children:[u.jsx("p",{children:(l==null?void 0:l.message)||i.note||c("weixinAuthScanPrompt")}),u.jsxs("p",{children:[c("weixinAuthExpiresAt"),": ",Gt(i.expiresAt)]})]}),u.jsxs("a",{href:i.qrCodeUrl,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1.5 text-xs text-primary transition-colors hover:text-primary-hover",children:[u.jsx(dt,{className:"h-3.5 w-3.5"}),c("weixinAuthOpenQr")]})]}):u.jsxs("div",{className:"flex min-h-[280px] flex-col items-center justify-center rounded-2xl bg-gray-50/80 px-6 text-center",children:[u.jsx(Pe,{className:"h-9 w-9 text-gray-300"}),u.jsx("p",{className:"mt-3 text-sm font-medium text-gray-700",children:c("weixinAuthReadyTitle")}),u.jsx("p",{className:"mt-1 text-xs leading-5 text-gray-500",children:c("weixinAuthReadyDescription")})]})})]})})}function W(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Nt(e,s){const a={...e};for(const[n,t]of Object.entries(s)){const r=a[n];if(W(r)&&W(t)){a[n]=Nt(r,t);continue}a[n]=t}return a}function _n(e,s){const a=e.split("."),n={};let t=n;for(let r=0;r<a.length-1;r+=1){const i=a[r];t[i]={},t=t[i]}return t[a[a.length-1]]=s,n}function zn({channelName:e}){var B,j;const{data:s}=gt(),{data:a}=ht(),{data:n}=mt(),t=Yt(),r=Qt(),[i,o]=L.useState({}),[l,d]=L.useState({}),[h,f]=L.useState(null),x=e?s==null?void 0:s.channels[e]:null,g=e?ke()[e]??[]:[],y=n==null?void 0:n.uiHints,A=e?`channels.${e}`:null,T=((B=n==null?void 0:n.actions)==null?void 0:B.filter(m=>m.scope===A))??[],E=e&&(((j=Ee(`channels.${e}`,y))==null?void 0:j.label)??e),P=a==null?void 0:a.channels.find(m=>m.name===e),b=P?bt(P):void 0,N=e==="weixin";L.useEffect(()=>{if(x){o({...x});const m={};(e?ke()[e]??[]:[]).filter(C=>C.type==="json").forEach(C=>{const R=x[C.name];m[C.name]=JSON.stringify(R??{},null,2)}),d(m)}else o({}),d({})},[x,e]);const M=(m,p)=>{o(C=>({...C,[m]:p}))},w=m=>{if(m.preventDefault(),!e)return;const p={...i};for(const C of g){if(C.type!=="password")continue;const R=p[C.name];(typeof R!="string"||R.length===0)&&delete p[C.name]}for(const C of g){if(C.type!=="json")continue;const R=l[C.name]??"";try{p[C.name]=R.trim()?JSON.parse(R):{}}catch{q.error(`${c("invalidJson")}: ${C.name}`);return}}t.mutate({channel:e,data:p})},S=m=>{if(!m||!e)return;const p=m.channels;if(!W(p))return;const C=p[e];W(C)&&o(R=>Nt(R,C))},I=async m=>{if(!(!e||!A)){f(m.id);try{let p={...i};m.saveBeforeRun&&(p={...p,...m.savePatch??{}},o(p),await t.mutateAsync({channel:e,data:p}));const C=await r.mutateAsync({actionId:m.id,data:{scope:A,draftConfig:_n(A,p)}});S(C.patch),C.ok?q.success(C.message||c("success")):q.error(C.message||c("error"))}catch(p){const C=p instanceof Error?p.message:String(p);q.error(`${c("error")}: ${C}`)}finally{f(null)}}};if(!e||!P||!x)return u.jsx("div",{className:Wt,children:u.jsxs("div",{children:[u.jsx("h3",{className:"text-base font-semibold text-gray-900",children:c("channelsSelectTitle")}),u.jsx("p",{className:"mt-2 text-sm text-gray-500",children:c("channelsSelectDescription")})]})});const v=!!x.enabled;return u.jsxs("div",{className:Zt,children:[u.jsx("div",{className:"border-b border-gray-100 px-6 py-5",children:u.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[u.jsxs("div",{className:"min-w-0",children:[u.jsxs("div",{className:"flex items-center gap-3",children:[u.jsx(yt,{name:e,src:wt(e),className:K("h-9 w-9 rounded-lg border",v?"border-primary/30 bg-white":"border-gray-200/70 bg-white"),imgClassName:"h-5 w-5 object-contain",fallback:u.jsx("span",{className:"text-sm font-semibold uppercase text-gray-500",children:e[0]})}),u.jsx("h3",{className:"truncate text-lg font-semibold text-gray-900 capitalize",children:E})]}),u.jsx("p",{className:"mt-2 text-sm text-gray-500",children:c("channelsFormDescription")}),b&&u.jsxs("a",{href:b,className:"mt-2 inline-flex items-center gap-1.5 text-xs text-primary transition-colors hover:text-primary-hover",children:[u.jsx(Ut,{className:"h-3.5 w-3.5"}),c("channelsGuideTitle")]})]}),u.jsx(pt,{status:v?"active":"inactive",label:v?c("statusActive"):c("statusInactive")})]})}),u.jsxs("form",{onSubmit:w,className:"flex min-h-0 flex-1 flex-col",children:[u.jsx("div",{className:"min-h-0 flex-1 space-y-6 overflow-y-auto overscroll-contain px-6 py-5",children:N?u.jsxs(u.Fragment,{children:[u.jsx(qn,{channelConfig:x,formData:i,disabled:t.isPending||!!h}),u.jsxs("details",{className:"group rounded-2xl border border-gray-200/80 bg-white",children:[u.jsxs("summary",{className:"flex cursor-pointer list-none items-center justify-between gap-3 px-5 py-4 text-sm font-medium text-gray-900",children:[u.jsxs("div",{children:[u.jsx("p",{children:c("weixinAuthAdvancedTitle")}),u.jsx("p",{className:"mt-1 text-xs font-normal text-gray-500",children:c("weixinAuthAdvancedDescription")})]}),u.jsx(Ft,{className:"h-4 w-4 text-gray-400 transition-transform group-open:rotate-180"})]}),u.jsx("div",{className:"space-y-6 border-t border-gray-100 px-5 py-5",children:u.jsx(Me,{channelName:e,fields:g,formData:i,jsonDrafts:l,setJsonDrafts:d,updateField:M,uiHints:y})})]})]}):u.jsx(Me,{channelName:e,fields:g,formData:i,jsonDrafts:l,setJsonDrafts:d,updateField:M,uiHints:y})}),u.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 border-t border-gray-100 px-6 py-4",children:[u.jsx("div",{className:"flex flex-wrap items-center gap-2",children:T.filter(m=>m.trigger==="manual").map(m=>u.jsx(Ne,{type:"button",onClick:()=>I(m),disabled:t.isPending||!!h,variant:"secondary",children:h===m.id?c("connecting"):m.title},m.id))}),u.jsx(Ne,{type:"submit",disabled:t.isPending||!!h,children:t.isPending?c("saving"):c("save")})]})]})]})}const On={telegram:"channelDescTelegram",slack:"channelDescSlack",email:"channelDescEmail",webhook:"channelDescWebhook",discord:"channelDescDiscord",feishu:"channelDescFeishu",weixin:"channelDescWeixin"};function $n(){const{data:e}=gt(),{data:s}=ht(),{data:a}=mt(),[n,t]=L.useState("enabled"),[r,i]=L.useState(),[o,l]=L.useState(""),d=a==null?void 0:a.uiHints,h=s==null?void 0:s.channels,f=e==null?void 0:e.channels,x=[{id:"enabled",label:c("channelsTabEnabled"),count:(h??[]).filter(y=>{var A;return(A=f==null?void 0:f[y.name])==null?void 0:A.enabled}).length},{id:"all",label:c("channelsTabAll"),count:(h??[]).length}],g=L.useMemo(()=>{const y=o.trim().toLowerCase();return(h??[]).filter(A=>{var E;const T=((E=f==null?void 0:f[A.name])==null?void 0:E.enabled)||!1;return n==="enabled"?T:!0}).filter(A=>y?(A.displayName||A.name).toLowerCase().includes(y)||A.name.toLowerCase().includes(y):!0)},[n,f,h,o]);return L.useEffect(()=>{if(g.length===0){i(void 0);return}g.some(A=>A.name===r)||i(g[0].name)},[g,r]),!e||!s?u.jsx("div",{className:"p-8 text-gray-400",children:c("channelsLoading")}):u.jsxs(rn,{className:"xl:flex xl:h-full xl:min-h-0 xl:flex-col xl:pb-0",children:[u.jsx(sn,{title:c("channelsPageTitle"),description:c("channelsPageDescription")}),u.jsxs("div",{className:K($t,"xl:min-h-0 xl:flex-1"),children:[u.jsxs("section",{className:Xt,children:[u.jsx("div",{className:"border-b border-gray-100 px-4 pt-4",children:u.jsx(nn,{tabs:x,activeTab:n,onChange:t,className:"mb-0"})}),u.jsx("div",{className:"border-b border-gray-100 px-4 py-3",children:u.jsxs("div",{className:"relative",children:[u.jsx(qt,{className:"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400"}),u.jsx(Q,{value:o,onChange:y=>l(y.target.value),placeholder:c("channelsFilterPlaceholder"),className:"h-10 rounded-xl pl-9"})]})}),u.jsxs("div",{className:"min-h-0 flex-1 space-y-2 overflow-y-auto overscroll-contain p-3",children:[g.map(y=>{const A=e.channels[y.name],T=(A==null?void 0:A.enabled)||!1,E=Ee(`channels.${y.name}`,d),P=bt(y),b=(E==null?void 0:E.help)||c(On[y.name]||"channelDescriptionDefault"),N=r===y.name;return u.jsx("button",{type:"button",onClick:()=>i(y.name),className:K("w-full rounded-xl border p-2.5 text-left transition-all",N?"border-primary/30 bg-primary-50/40 shadow-sm":"border-gray-200/70 bg-white hover:border-gray-300 hover:bg-gray-50/70"),children:u.jsxs("div",{className:"flex items-start justify-between gap-3",children:[u.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[u.jsx(yt,{name:y.name,src:wt(y.name),className:K("h-10 w-10 rounded-lg border",T?"border-primary/30 bg-white":"border-gray-200/70 bg-white"),imgClassName:"h-5 w-5 object-contain",fallback:u.jsx("span",{className:"text-sm font-semibold uppercase text-gray-500",children:y.name[0]})}),u.jsxs("div",{className:"min-w-0",children:[u.jsx("p",{className:"truncate text-sm font-semibold text-gray-900",children:y.displayName||y.name}),u.jsx("p",{className:"line-clamp-1 text-[11px] text-gray-500",children:b})]})]}),u.jsxs("div",{className:"flex items-center gap-2",children:[P&&u.jsx("a",{href:P,onClick:M=>M.stopPropagation(),className:"inline-flex h-7 w-7 items-center justify-center rounded-md text-gray-300 transition-colors hover:bg-gray-100/70 hover:text-gray-500",title:c("channelsGuideTitle"),children:u.jsx(dt,{className:"h-3.5 w-3.5"})}),u.jsx(pt,{status:T?"active":"inactive",label:T?c("statusActive"):c("statusInactive"),className:"min-w-[56px] justify-center"})]})]})},y.name)}),g.length===0&&u.jsxs("div",{className:"flex h-full min-h-[220px] flex-col items-center justify-center rounded-xl border border-dashed border-gray-200 bg-gray-50/70 py-10 text-center",children:[u.jsx("div",{className:"mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-white",children:u.jsx(_t,{className:"h-5 w-5 text-gray-300"})}),u.jsx("p",{className:"text-sm font-medium text-gray-700",children:c("channelsNoMatch")})]})]})]}),u.jsx(zn,{channelName:r})]})]})}export{$n as ChannelsList};