@niubitli/plugin-feishu-connector 0.3.1-connector-feishu
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +266 -0
- package/dist/manifest.js +806 -0
- package/dist/manifest.js.map +7 -0
- package/dist/ui/index.js +4047 -0
- package/dist/ui/index.js.map +7 -0
- package/dist/worker.js +14724 -0
- package/dist/worker.js.map +7 -0
- package/migrations/001_feishu_connector.sql +133 -0
- package/package.json +31 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/ui/index.tsx", "../../src/constants.ts", "../../src/config.ts", "../../src/routing.ts"],
|
|
4
|
+
"sourcesContent": ["import { Children, Fragment, useEffect, useMemo, useState, type CSSProperties, type ReactNode } from \"react\";\nimport {\n usePluginAction,\n usePluginData,\n type PluginCommentContextMenuItemProps,\n type PluginDetailTabProps,\n type PluginSettingsPageProps,\n type PluginSidebarProps,\n type PluginWidgetProps,\n} from \"@paperclipai/plugin-sdk/ui\";\nimport { ACTION_KEYS, DATA_KEYS, PLUGIN_ID } from \"../constants.js\";\nimport { DEFAULT_CONFIG } from \"../config.js\";\nimport { describeRouteForHumans, isLikelyInternalRouteName } from \"../routing.js\";\nimport type {\n FeishuBaseSinkConfig,\n FeishuCapabilityConfig,\n FeishuCapabilityScope,\n FeishuConnectionConfig,\n FeishuConnectorConfig,\n FeishuRouteConfig,\n} from \"../types.js\";\n\ntype ConnectorStatus = {\n dryRunCli: boolean;\n eventSubscriberEnabled: boolean;\n connectionCount: number;\n usableConnectionCount?: number;\n missingProfileConnectionIds?: string[];\n profileReadError?: string | null;\n routeCount: number;\n baseSinkCount: number;\n subscribers: Array<{ connectionId: string; profileName?: string; pid: number | null; killed: boolean; running?: boolean }>;\n monitor?: {\n health: \"ok\" | \"warning\" | \"error\";\n message: string;\n checkedAt: string;\n enabledConnectionCount: number;\n usableConnectionCount?: number;\n missingProfileConnectionIds?: string[];\n profileReadError?: string | null;\n enabledRouteCount: number;\n expectedSubscriberCount: number;\n activeSubscriberCount: number;\n missingSubscriberConnectionIds: string[];\n recentErrorCount: number;\n recentWarningCount: number;\n lastEventAt: string | null;\n lastWatchdogAt: string | null;\n checks: CheckReportItem[];\n };\n retryQueue?: {\n totalCount: number;\n pendingCount: number;\n failedCount: number;\n succeededCount: number;\n items: RetryQueueItem[];\n };\n lastInboundEventAt?: string | null;\n recentRecords: RecentRecord[];\n};\n\ntype IssueSourceData = {\n found: boolean;\n sourceKind?: string | null;\n issueId?: string | null;\n issueIdentifier?: string | null;\n issueTitle?: string | null;\n entryName?: string | null;\n routeId?: string | null;\n botName?: string | null;\n connectionId?: string | null;\n profileName?: string | null;\n conversationName?: string | null;\n conversationLabel?: string | null;\n chatId?: string | null;\n requesterName?: string | null;\n requesterOpenId?: string | null;\n messageId?: string | null;\n rootMessageId?: string | null;\n threadId?: string | null;\n replyMode?: NonNullable<FeishuRouteConfig[\"replyMode\"]> | string | null;\n issueUrl?: string | null;\n lastRunId?: string | null;\n lastRunStatus?: string | null;\n updatedAt?: string | null;\n attachmentCount?: number;\n attachments?: Array<{\n filename?: string | null;\n resourceKey: string;\n resourceType: string;\n }>;\n reason?: string | null;\n recentComments?: Array<{\n id: string;\n body: string;\n authorAgentId?: string | null;\n authorUserId?: string | null;\n createdAt?: string | null;\n }>;\n};\n\ntype PluginInstanceProps = {\n slot?: {\n pluginId?: string | null;\n };\n};\n\nfunction pluginInstanceIdFromProps(props?: PluginInstanceProps | null): string {\n const slotPluginId = props?.slot?.pluginId?.trim();\n if (slotPluginId) return slotPluginId;\n if (typeof window !== \"undefined\") {\n const match = window.location.pathname.match(/\\/instance\\/settings\\/plugins\\/([^/?#]+)/);\n if (match?.[1]) return decodeURIComponent(match[1]);\n }\n return PLUGIN_ID;\n}\n\nfunction pluginSettingsHref(props?: PluginInstanceProps | null): string {\n return `/instance/settings/plugins/${encodeURIComponent(pluginInstanceIdFromProps(props))}`;\n}\n\ntype CapabilityCenterData = {\n summary: string;\n defaultPolicy?: {\n mode: \"authorized\" | \"conservative\";\n text: string;\n };\n syncPolicy: {\n cliAutoBundled: boolean;\n larkSkillsAutoSynced: boolean;\n paperclipSkillsAutoSynced: boolean;\n text: string;\n };\n relationship: {\n larkCli: string;\n larkSkills: string;\n paperclipTools: string;\n };\n recommendedPermissionJson: {\n note: string;\n scopes: {\n tenant: string[];\n user: string[];\n };\n };\n permissionStrategy: string;\n schemaDiscovery: {\n checked: boolean;\n checkedAt?: string;\n cliBin?: string;\n reason?: string;\n updateNotice?: {\n current?: string;\n latest?: string;\n message?: string;\n } | null;\n services: Array<{\n name: string;\n available: boolean;\n methodCount: number;\n scopeCount: number;\n sampleScopes: string[];\n error?: string;\n }>;\n commands: Array<{\n capabilityKey: string;\n command: string;\n schemaService?: string | null;\n schemaAvailable: boolean | null;\n cliHelpAvailable: boolean | null;\n status: \"schema_backed\" | \"cli_help_backed\" | \"not_found\" | \"not_checked\";\n note: string;\n }>;\n errors: string[];\n summary: string;\n };\n groups: Array<{\n name: string;\n capabilities: CapabilityItemData[];\n }>;\n};\n\ntype CapabilityItemData = {\n key: string;\n group: string;\n title: string;\n description: string;\n enabled: boolean;\n implemented: boolean;\n statusLabel: string;\n scope: FeishuCapabilityScope;\n scopeLabel: string;\n connectionId?: string | null;\n routeId?: string | null;\n agentId?: string | null;\n toolName?: string | null;\n legacyToolName?: string | null;\n larkCliCommands: string[];\n schemaCommands?: CapabilityCenterData[\"schemaDiscovery\"][\"commands\"];\n recommendedScopes: string[];\n relatedSkills: string[];\n risk: \"low\" | \"medium\" | \"high\";\n};\n\ntype PermissionCheckResult = {\n ok?: boolean;\n profileName?: string;\n verified?: boolean;\n identity?: string;\n tokenStatus?: string;\n grantedScopes?: string[];\n recommendedScopes?: string[];\n missingScopes?: string[];\n message?: string;\n};\n\ntype RecentRecord = {\n level: string;\n message: string;\n createdAt: string;\n data?: Record<string, unknown> | null;\n};\n\ntype RetryQueueItem = {\n id: string;\n kind: \"feishu_reply\" | \"base_record\";\n status: \"queued\" | \"succeeded\" | \"failed\";\n reason: string;\n connectionId: string;\n profileName: string;\n messageId?: string;\n routeId?: string;\n issueId?: string;\n attemptCount: number;\n lastError?: string;\n updatedAt: string;\n};\n\ntype AgentOption = {\n id: string;\n name: string;\n title?: string | null;\n urlKey?: string | null;\n};\n\ntype CompanyOption = {\n id: string;\n name: string;\n issuePrefix?: string | null;\n agents: AgentOption[];\n};\n\ntype CatalogData = {\n companies: CompanyOption[];\n};\n\ntype ProfileOption = {\n name: string;\n appId?: string | null;\n brand?: string | null;\n active?: boolean;\n user?: string | null;\n tokenStatus?: string | null;\n botName?: string | null;\n botOpenId?: string | null;\n botAvatarUrl?: string | null;\n botActivateStatus?: number | null;\n};\n\ntype ProfilesData = {\n profiles: ProfileOption[];\n error?: string;\n};\n\ntype DirectoryChatOption = {\n chatId: string;\n name: string;\n description?: string | null;\n external?: boolean;\n};\n\ntype DirectoryUserOption = {\n openId: string;\n userId?: string | null;\n name: string;\n departmentIds?: string[];\n};\n\ntype DirectoryData = {\n profileName?: string | null;\n chats: DirectoryChatOption[];\n users: DirectoryUserOption[];\n chatError?: string;\n userError?: string;\n};\n\ntype ConfigRecord = FeishuConnectorConfig & Record<string, unknown>;\n\ntype BindFormState = {\n displayName: string;\n botAliases: string;\n profileName: string;\n appId: string;\n appSecret: string;\n appSecretRef: string;\n};\n\ntype GuidedBindResult = {\n ok?: boolean;\n profileName?: string;\n command?: string;\n args?: string[];\n pid?: number | null;\n running?: boolean;\n stdout?: string;\n stderr?: string;\n url?: string;\n userCode?: string;\n};\n\ntype FinishGuidedBindResult = {\n ok?: boolean;\n profile?: ProfileOption;\n warning?: string;\n};\n\ntype UserAuthResult = {\n ok?: boolean;\n profileName?: string;\n url?: string;\n expiresIn?: number;\n userCode?: string;\n profile?: ProfileOption;\n};\n\ntype BindProfileResult = {\n ok?: boolean;\n profileName?: string;\n requestedProfileName?: string;\n appId?: string;\n brand?: \"feishu\" | \"lark\";\n reusedExistingProfile?: boolean;\n profile?: ProfileOption;\n};\n\ntype RouteTestResult = {\n ok?: boolean;\n dryRun?: boolean;\n routeId?: string;\n sampleText?: string;\n message?: string;\n};\n\ntype CheckReportItem = {\n tone: \"success\" | \"warning\" | \"error\";\n title: string;\n detail: string;\n};\n\ntype BotCheckState = {\n checkedAt: string;\n items: CheckReportItem[];\n};\n\ntype EntryWizardDraft = {\n connectionId?: string;\n matchType: FeishuRouteConfig[\"matchType\"];\n chatId?: string;\n chatName?: string;\n userOpenId?: string;\n userName?: string;\n keyword?: string;\n regex?: string;\n companyId?: string;\n targetAgentId?: string;\n replyMode: NonNullable<FeishuRouteConfig[\"replyMode\"]>;\n baseSinkId?: string;\n};\n\ntype AdvancedPanelKey = \"auth\" | \"capabilities\" | \"deploy\" | \"runtime\" | \"events\" | \"base\" | \"config\";\ntype MainTabKey = \"overview\" | \"entries\" | \"robots\" | \"test\" | \"advanced\";\ntype NextStepKind = \"bind\" | \"rebind\" | \"entry\" | \"edit-entry\" | \"enable-listen\" | \"enable-real\" | \"test\";\ntype BindMethod = \"guided\" | \"secret\";\n\nconst mainTabs: Array<{ key: MainTabKey; label: string; detail: string; hash: string }> = [\n { key: \"overview\", label: \"\u603B\u89C8\", detail: \"\u4E0B\u4E00\u6B65\", hash: \"feishu-overview\" },\n { key: \"entries\", label: \"\u5165\u53E3\", detail: \"\u4E1A\u52A1\u89C4\u5219\", hash: \"feishu-entries\" },\n { key: \"robots\", label: \"\u673A\u5668\u4EBA\", detail: \"\u8D26\u53F7\u6C60\", hash: \"feishu-robots\" },\n { key: \"test\", label: \"\u6D4B\u8BD5\", detail: \"\u771F\u5B9E\u786E\u8BA4\", hash: \"feishu-test\" },\n { key: \"advanced\", label: \"\u9AD8\u7EA7\", detail: \"\u5DE5\u7A0B\u914D\u7F6E\", hash: \"feishu-advanced\" },\n];\n\nfunction mainTabFromHash(hash: string): MainTabKey {\n const match = mainTabs.find((tab) => `#${tab.hash}` === hash);\n return match?.key ?? \"overview\";\n}\n\nfunction initialMainTab(): MainTabKey {\n if (typeof window === \"undefined\") return \"overview\";\n return mainTabFromHash(window.location.hash);\n}\n\nconst pageStyle: CSSProperties = {\n display: \"grid\",\n gap: \"18px\",\n fontSize: \"14px\",\n};\n\nconst sectionStyle: CSSProperties = {\n border: \"1px solid var(--border)\",\n borderRadius: \"8px\",\n padding: \"16px\",\n display: \"grid\",\n gap: \"14px\",\n background: \"var(--background)\",\n};\n\nconst sectionHeaderStyle: CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: \"12px\",\n alignItems: \"flex-start\",\n};\n\nconst actionBarStyle: CSSProperties = {\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"10px\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n};\n\nconst gridTwoStyle: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(260px, 1fr))\",\n gap: \"12px\",\n};\n\nconst stepGridStyle: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(220px, 1fr))\",\n gap: \"12px\",\n};\n\nconst fieldStyle: CSSProperties = {\n display: \"grid\",\n gap: \"6px\",\n};\n\nconst labelStyle: CSSProperties = {\n fontSize: \"13px\",\n fontWeight: 600,\n};\n\nconst helpStyle: CSSProperties = {\n fontSize: \"12px\",\n color: \"var(--muted-foreground)\",\n lineHeight: 1.5,\n};\n\nconst inputStyle: CSSProperties = {\n width: \"100%\",\n height: \"38px\",\n border: \"1px solid var(--border)\",\n borderRadius: \"8px\",\n padding: \"0 12px\",\n background: \"var(--background)\",\n color: \"var(--foreground)\",\n fontSize: \"14px\",\n};\n\nconst selectStyle: CSSProperties = {\n ...inputStyle,\n};\n\nconst buttonStyle: CSSProperties = {\n height: \"36px\",\n border: \"1px solid var(--border)\",\n borderRadius: \"8px\",\n padding: \"0 12px\",\n background: \"var(--background)\",\n color: \"var(--foreground)\",\n fontSize: \"14px\",\n cursor: \"pointer\",\n};\n\nconst primaryButtonStyle: CSSProperties = {\n ...buttonStyle,\n border: \"1px solid var(--primary)\",\n background: \"var(--primary)\",\n color: \"var(--primary-foreground)\",\n fontWeight: 600,\n};\n\nconst subtleBoxStyle: CSSProperties = {\n border: \"1px solid var(--border)\",\n borderRadius: \"8px\",\n padding: \"12px\",\n background: \"var(--muted)\",\n};\n\nconst successBoxStyle: CSSProperties = {\n ...subtleBoxStyle,\n border: \"1px solid color-mix(in oklab, var(--primary) 40%, var(--border))\",\n background: \"color-mix(in oklab, var(--primary) 8%, var(--background))\",\n};\n\nconst recommendedBoxStyle: CSSProperties = {\n ...subtleBoxStyle,\n border: \"1px solid color-mix(in oklab, var(--primary) 55%, var(--border))\",\n background: \"color-mix(in oklab, var(--primary) 10%, var(--background))\",\n};\n\nconst qrPlaceholderStyle: CSSProperties = {\n width: \"132px\",\n height: \"132px\",\n borderRadius: \"8px\",\n border: \"1px solid var(--border)\",\n display: \"grid\",\n placeItems: \"center\",\n textAlign: \"center\",\n padding: \"10px\",\n background: \"var(--background)\",\n color: \"var(--muted-foreground)\",\n fontSize: \"12px\",\n lineHeight: 1.4,\n};\n\nconst heroStyle: CSSProperties = {\n border: \"1px solid color-mix(in oklab, var(--primary) 35%, var(--border))\",\n borderRadius: \"12px\",\n padding: \"16px\",\n display: \"grid\",\n gap: \"14px\",\n background: \"var(--background)\",\n boxShadow: \"0 18px 40px color-mix(in oklab, var(--foreground) 5%, transparent)\",\n};\n\nconst tabNavStyle: CSSProperties = {\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n padding: \"0\",\n borderBottom: \"1px solid var(--border)\",\n alignItems: \"flex-end\",\n};\n\nconst tabLinkStyle: CSSProperties = {\n appearance: \"none\",\n border: \"0\",\n background: \"transparent\",\n padding: \"0 12px 10px\",\n color: \"var(--muted-foreground)\",\n textDecoration: \"none\",\n fontSize: \"14px\",\n fontWeight: 700,\n borderBottom: \"2px solid transparent\",\n display: \"grid\",\n gap: \"2px\",\n textAlign: \"left\",\n cursor: \"pointer\",\n};\n\nconst activeTabLinkStyle: CSSProperties = {\n ...tabLinkStyle,\n color: \"var(--foreground)\",\n borderBottom: \"2px solid var(--foreground)\",\n};\n\nconst tabDetailStyle: CSSProperties = {\n fontSize: \"11px\",\n fontWeight: 500,\n color: \"var(--muted-foreground)\",\n};\n\nconst metricGridStyle: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(220px, 1fr))\",\n gap: \"10px\",\n};\n\nconst metricCardStyle: CSSProperties = {\n borderRight: \"1px solid var(--border)\",\n padding: \"12px 18px\",\n background: \"transparent\",\n display: \"grid\",\n gap: \"6px\",\n};\n\nconst metricHeaderStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n color: \"var(--muted-foreground)\",\n fontSize: \"12px\",\n};\n\nconst metricIconStyle: CSSProperties = {\n width: \"28px\",\n height: \"28px\",\n borderRadius: \"999px\",\n display: \"inline-grid\",\n placeItems: \"center\",\n fontSize: \"13px\",\n fontWeight: 800,\n};\n\nconst productSectionStyle: CSSProperties = {\n border: \"1px solid var(--border)\",\n borderRadius: \"14px\",\n padding: \"16px\",\n display: \"grid\",\n gap: \"14px\",\n background: \"var(--background)\",\n};\n\nconst productEntryStyle: CSSProperties = {\n border: \"1px solid var(--border)\",\n borderRadius: \"12px\",\n padding: \"14px\",\n display: \"grid\",\n gap: \"10px\",\n background: \"var(--background)\",\n};\n\nconst productEntryEditorStyle: CSSProperties = {\n border: \"1px solid color-mix(in oklab, var(--primary) 34%, var(--border))\",\n borderRadius: \"12px\",\n padding: \"14px\",\n display: \"grid\",\n gap: \"12px\",\n background: \"color-mix(in oklab, var(--primary) 5%, var(--background))\",\n};\n\nconst compactPillStyle: CSSProperties = {\n border: \"1px solid var(--border)\",\n borderRadius: \"999px\",\n padding: \"3px 8px\",\n background: \"var(--muted)\",\n color: \"var(--muted-foreground)\",\n fontSize: \"12px\",\n};\n\nconst botIconStyle: CSSProperties = {\n width: \"52px\",\n height: \"52px\",\n borderRadius: \"999px\",\n display: \"grid\",\n placeItems: \"center\",\n background: \"var(--primary)\",\n color: \"var(--primary-foreground)\",\n fontWeight: 900,\n fontSize: \"20px\",\n flex: \"0 0 auto\",\n};\n\nconst wizardStepperStyle: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(150px, 1fr))\",\n gap: \"10px\",\n};\n\nconst sectionTitleRowStyle: CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"12px\",\n padding: \"16px 16px 0\",\n};\n\nconst checklistGridStyle: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(180px, 1fr))\",\n gap: \"10px\",\n};\n\nconst entryCardStyle: CSSProperties = {\n border: \"1px solid var(--border)\",\n borderRadius: \"8px\",\n padding: \"14px\",\n display: \"grid\",\n gap: \"14px\",\n background: \"var(--muted)\",\n};\n\nconst flowGridStyle: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(190px, 1fr))\",\n gap: \"10px\",\n};\n\nconst flowStepStyle: CSSProperties = {\n border: \"1px solid var(--border)\",\n borderRadius: \"8px\",\n padding: \"10px\",\n background: \"var(--background)\",\n minHeight: \"74px\",\n};\n\nconst settingsListStyle: CSSProperties = {\n border: \"1px solid var(--border)\",\n borderRadius: \"12px\",\n overflow: \"hidden\",\n background: \"var(--background)\",\n};\n\nconst wizardStyle: CSSProperties = {\n border: \"1px solid color-mix(in oklab, var(--primary) 45%, var(--border))\",\n borderRadius: \"8px\",\n padding: \"16px\",\n display: \"grid\",\n gap: \"16px\",\n background: \"color-mix(in oklab, var(--primary) 6%, var(--background))\",\n};\n\nconst guideCardStyle: CSSProperties = {\n border: \"1px solid var(--border)\",\n borderRadius: \"8px\",\n padding: \"12px\",\n display: \"grid\",\n gap: \"8px\",\n background: \"var(--background)\",\n};\n\nconst codeStyle: CSSProperties = {\n display: \"block\",\n border: \"1px solid var(--border)\",\n borderRadius: \"8px\",\n padding: \"10px\",\n background: \"var(--muted)\",\n color: \"var(--foreground)\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n fontSize: \"12px\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"anywhere\",\n};\n\nconst linkButtonStyle: CSSProperties = {\n ...buttonStyle,\n display: \"inline-flex\",\n alignItems: \"center\",\n width: \"fit-content\",\n textDecoration: \"none\",\n};\n\nconst modalBackdropStyle: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 1000,\n background: \"rgba(0, 0, 0, 0.28)\",\n display: \"grid\",\n placeItems: \"center\",\n padding: \"24px\",\n};\n\nconst modalPanelStyle: CSSProperties = {\n width: \"min(720px, 100%)\",\n maxHeight: \"min(760px, calc(100vh - 48px))\",\n overflow: \"auto\",\n border: \"1px solid var(--border)\",\n borderRadius: \"14px\",\n background: \"var(--background)\",\n boxShadow: \"0 24px 80px rgba(0,0,0,0.24)\",\n padding: \"18px\",\n display: \"grid\",\n gap: \"14px\",\n};\n\nconst floatingToastStyle: CSSProperties = {\n position: \"fixed\",\n right: \"24px\",\n bottom: \"24px\",\n zIndex: 1100,\n width: \"min(420px, calc(100vw - 48px))\",\n border: \"1px solid color-mix(in oklab, var(--primary) 45%, var(--border))\",\n borderRadius: \"12px\",\n padding: \"12px 14px\",\n background: \"var(--background)\",\n boxShadow: \"0 18px 44px rgba(0,0,0,0.18)\",\n};\n\nconst nextStepStyle: CSSProperties = {\n border: \"1px solid color-mix(in oklab, var(--primary) 38%, var(--border))\",\n borderRadius: \"12px\",\n padding: \"14px\",\n background: \"color-mix(in oklab, var(--primary) 5%, var(--background))\",\n display: \"grid\",\n gap: \"10px\",\n};\n\nconst heroCommandStyle: CSSProperties = {\n border: \"1px solid var(--border)\",\n borderRadius: \"14px\",\n padding: \"16px\",\n display: \"grid\",\n gap: \"14px\",\n background: \"var(--background)\",\n};\n\nconst setupStepStyle: CSSProperties = {\n border: \"1px solid var(--border)\",\n borderRadius: \"12px\",\n padding: \"12px\",\n display: \"grid\",\n gap: \"8px\",\n minHeight: \"118px\",\n background: \"var(--background)\",\n};\n\nconst pipelineStyle: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(150px, 1fr))\",\n gap: \"8px\",\n};\n\nconst pipelineStepStyle: CSSProperties = {\n border: \"1px solid var(--border)\",\n borderRadius: \"12px\",\n padding: \"12px\",\n display: \"grid\",\n gap: \"6px\",\n background: \"var(--background)\",\n};\n\nconst settingsShellStyle: CSSProperties = {\n ...settingsListStyle,\n display: \"grid\",\n};\n\nconst cardStyle = {\n display: \"grid\",\n gap: \"8px\",\n fontSize: \"12px\",\n} as const;\n\nconst rowStyle = {\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n alignItems: \"center\",\n} as const;\n\nconst mutedRowStyle = {\n ...rowStyle,\n color: \"var(--muted-foreground)\",\n fontSize: \"12px\",\n} as const;\n\nconst matchTypeLabels: Record<FeishuRouteConfig[\"matchType\"], string> = {\n chat: \"\u53EA\u63A5\u67D0\u4E2A\u7FA4\u6216\u5355\u804A\",\n user: \"\u53EA\u63A5\u67D0\u4E2A\u4EBA\",\n keyword: \"\u6D88\u606F\u91CC\u6709\u5173\u952E\u8BCD\",\n regex: \"\u9AD8\u7EA7\u89C4\u5219\",\n default: \"\u5176\u4ED6\u6D88\u606F\u90FD\u63A5\u6536\",\n};\n\nconst replyModeLabels: Record<NonNullable<FeishuRouteConfig[\"replyMode\"]>, string> = {\n none: \"\u4E0D\u81EA\u52A8\u56DE\u590D\",\n message: \"\u53D1\u4E00\u6761\u65B0\u6D88\u606F\",\n thread: \"\u5728\u539F\u6D88\u606F\u7EBF\u7A0B\u91CC\u56DE\u590D\",\n};\n\nfunction isLikelyFeishuInternalId(value?: string | null): boolean {\n const trimmed = (value ?? \"\").trim();\n return /^(oc|ou|om|on|od|of|cli)_[a-z0-9][a-z0-9_-]{5,}$/i.test(trimmed);\n}\n\nfunction issueSourceDisplayName(value: string | null | undefined): string | null {\n const trimmed = value?.trim();\n if (!trimmed || isLikelyFeishuInternalId(trimmed)) return null;\n return trimmed;\n}\n\nfunction issueSourceValue(value: string | null | undefined, fallback = \"\u672A\u8BB0\u5F55\"): string {\n const trimmed = value?.trim();\n return trimmed ? trimmed : fallback;\n}\n\nfunction issueReplyModeLabel(mode: IssueSourceData[\"replyMode\"]): string {\n if (mode === \"none\" || mode === \"message\" || mode === \"thread\") {\n return replyModeLabels[mode];\n }\n return issueSourceValue(typeof mode === \"string\" ? mode : null);\n}\n\nfunction Badge({ children }: { children: string }) {\n return (\n <span style={{\n border: \"1px solid var(--border)\",\n borderRadius: \"999px\",\n padding: \"2px 8px\",\n opacity: 0.82,\n }}>\n {children}\n </span>\n );\n}\n\nfunction StatusBadge({ tone = \"neutral\", children }: { tone?: \"success\" | \"warning\" | \"neutral\"; children: string }) {\n const background = tone === \"success\"\n ? \"color-mix(in oklab, var(--primary) 12%, var(--background))\"\n : tone === \"warning\"\n ? \"color-mix(in oklab, #f59e0b 14%, var(--background))\"\n : \"var(--muted)\";\n return (\n <span style={{\n border: \"1px solid var(--border)\",\n borderRadius: \"999px\",\n padding: \"4px 10px\",\n fontSize: \"12px\",\n fontWeight: 600,\n background,\n }}>\n {children}\n </span>\n );\n}\n\nfunction CheckReport({ items, title = \"\u8FDE\u63A5\u4F53\u68C0\u62A5\u544A\" }: { items: CheckReportItem[]; title?: string }) {\n return (\n <div\n style={{\n border: \"1px solid var(--border)\",\n borderRadius: \"12px\",\n padding: \"12px\",\n display: \"grid\",\n gap: \"10px\",\n background: \"var(--background)\",\n }}\n >\n <div key=\"title\" style={{ fontWeight: 800 }}>{title}</div>\n <div key=\"items\" style={checklistGridStyle}>\n {items.map((item, index) => {\n const marker = item.tone === \"success\" ? \"\u2713\" : item.tone === \"warning\" ? \"!\" : \"\u00D7\";\n const border = item.tone === \"error\"\n ? \"1px solid var(--destructive)\"\n : item.tone === \"warning\"\n ? \"1px solid color-mix(in oklab, #f59e0b 55%, var(--border))\"\n : \"1px solid color-mix(in oklab, var(--primary) 35%, var(--border))\";\n return (\n <div\n key={`${item.title}-${index}`}\n style={{\n border,\n borderRadius: \"8px\",\n padding: \"10px\",\n display: \"grid\",\n gap: \"6px\",\n background: \"var(--muted)\",\n }}\n >\n <div key=\"head\" style={{ ...rowStyle, gap: \"6px\" }}>\n <strong\n key=\"marker\"\n style={{\n width: \"20px\",\n height: \"20px\",\n borderRadius: \"999px\",\n display: \"inline-grid\",\n placeItems: \"center\",\n border: \"1px solid var(--border)\",\n fontSize: \"12px\",\n }}\n >\n {marker}\n </strong>\n <strong key=\"title\">{item.title}</strong>\n </div>\n <div key=\"detail\" style={helpStyle}>{item.detail}</div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction dataString(data: Record<string, unknown> | null | undefined, key: string): string | null {\n const value = data?.[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction routeDiagnosticReasons(data: Record<string, unknown> | null | undefined): string[] {\n const diagnostics = data?.routeDiagnostics;\n if (!Array.isArray(diagnostics)) return [];\n return diagnostics\n .map((item) => {\n if (typeof item !== \"object\" || item === null) return null;\n const record = item as Record<string, unknown>;\n const name = typeof record.routeName === \"string\" ? record.routeName : \"\u5165\u53E3\";\n const reason = typeof record.reason === \"string\" ? record.reason : \"\";\n return reason ? `${name}\uFF1A${reason}` : null;\n })\n .filter((item): item is string => Boolean(item))\n .slice(0, 3);\n}\n\nfunction recentRecordDetails(record: RecentRecord): string[] {\n const data = record.data;\n const details: string[] = [];\n const connection = dataString(data, \"connectionName\") ?? (dataString(data, \"connectionId\") ? \"\u5DF2\u8BB0\u5F55\uFF0C\u540D\u79F0\u5F85\u540C\u6B65\" : null);\n const chat = dataString(data, \"chatName\") ?? (dataString(data, \"chatId\") ? \"\u5DF2\u8BB0\u5F55\uFF0C\u540D\u79F0\u5F85\u540C\u6B65\" : null);\n const sender = dataString(data, \"senderName\") ?? (dataString(data, \"senderOpenId\") ? \"\u5DF2\u8BB0\u5F55\uFF0C\u540D\u79F0\u5F85\u540C\u6B65\" : null);\n const route = dataString(data, \"routeName\") ?? (dataString(data, \"routeId\") ? \"\u5DF2\u8BB0\u5F55\uFF0C\u540D\u79F0\u5F85\u540C\u6B65\" : null);\n const agent = dataString(data, \"targetAgentName\");\n const preview = dataString(data, \"textPreview\");\n\n if (connection) details.push(`\u673A\u5668\u4EBA\uFF1A${connection}`);\n if (route) details.push(`\u5165\u53E3\uFF1A${route}${agent ? ` \u2192 ${agent}` : \"\"}`);\n if (chat) details.push(`\u4F1A\u8BDD\uFF1A${chat}`);\n if (sender) details.push(`\u63D0\u51FA\u4EBA\uFF1A${sender}`);\n if (preview) details.push(`\u6D88\u606F\uFF1A${preview}`);\n details.push(...routeDiagnosticReasons(data));\n return details;\n}\n\nfunction isInboundMessageRecord(record: RecentRecord): boolean {\n if (dataString(record.data, \"messageId\")) return true;\n return record.message.includes(\"\u98DE\u4E66\u5165\u53E3\u6D4B\u8BD5\") || record.message.includes(\"\u5FEB\u6377\u6D4B\u8BD5\u56DE\u590D\");\n}\n\nfunction friendlyMonitorMessage(message: string | null | undefined): string {\n const text = message?.trim();\n if (!text) return \"\u98DE\u4E66\u8FDE\u63A5\u5668\u8FD0\u884C\u6B63\u5E38\";\n if (text.includes(\"\u751F\u4EA7\u76D1\u63A7\u53D1\u73B0\u9700\u8981\u786E\u8BA4\u7684\u98CE\u9669\u9879\")) return \"\u9700\u8981\u786E\u8BA4\uFF1A\u6700\u8FD1\u6709\u98DE\u4E66\u6D88\u606F\u672A\u547D\u4E2D\u5165\u53E3\";\n if (text.includes(\"\u98DE\u4E66\u6D88\u606F\u76D1\u542C\u51FA\u73B0\u63D0\u9192\")) return \"\u6700\u8FD1\u6709\u98DE\u4E66\u6D88\u606F\u672A\u547D\u4E2D\u5165\u53E3\";\n return text.replace(/^\u751F\u4EA7\u76D1\u63A7[\uFF1A:]\\s*/, \"\");\n}\n\nfunction connectorHealthLabel(data: ConnectorStatus | null | undefined): string {\n if (!data?.connectionCount) return \"\u5F85\u7ED1\u5B9A\u673A\u5668\u4EBA\";\n if (!data.eventSubscriberEnabled) return \"\u5DF2\u914D\u7F6E\uFF0C\u672A\u76D1\u542C\";\n if (data.dryRunCli) return \"\u76D1\u542C\u4E2D\uFF0C\u6D4B\u8BD5\u6A21\u5F0F\";\n return data.monitor?.health === \"error\" ? \"\u9700\u8981\u5904\u7406\" : data.monitor?.health === \"warning\" ? \"\u53EF\u7528\uFF0C\u6709\u63D0\u9192\" : \"\u8FD0\u884C\u4E2D\";\n}\n\nfunction RecentEventList({ records, emptyText = \"\u8FD8\u6CA1\u6709\u6536\u5230\u98DE\u4E66\u6D88\u606F\u4E8B\u4EF6\u3002\" }: { records: RecentRecord[]; emptyText?: string }) {\n if (records.length === 0) {\n return <div style={helpStyle}>{emptyText}</div>;\n }\n return (\n <div style={{ display: \"grid\", gap: \"8px\" }}>\n {records.map((record, index) => {\n const color = record.level === \"error\"\n ? \"var(--destructive)\"\n : record.level === \"warning\"\n ? \"#b45309\"\n : \"var(--foreground)\";\n const details = recentRecordDetails(record);\n return (\n <div\n key={`${record.createdAt}-${index}`}\n style={{\n border: \"1px solid var(--border)\",\n borderRadius: \"8px\",\n padding: \"10px 12px\",\n display: \"grid\",\n gap: \"6px\",\n background: \"var(--background)\",\n }}\n >\n <div key=\"head\" style={{ ...rowStyle, justifyContent: \"space-between\", gap: \"12px\" }}>\n <strong key=\"message\" style={{ color }}>{record.message}</strong>\n <span key=\"time\" style={helpStyle}>{record.createdAt}</span>\n </div>\n {details.length ? (\n <div key=\"details\" style={{ ...helpStyle, display: \"grid\", gap: \"3px\" }}>\n {details.map((detail, detailIndex) => (\n <span key={`${detail}-${detailIndex}`}>{detail}</span>\n ))}\n </div>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction InlineCheckReport({ items, checkedAt }: { items: CheckReportItem[]; checkedAt?: string }) {\n return (\n <div style={{ display: \"grid\", gap: \"8px\", marginTop: \"4px\" }}>\n {checkedAt ? <div key=\"checked-at\" style={helpStyle}>\u68C0\u67E5\u65F6\u95F4\uFF1A{checkedAt}</div> : null}\n {items.map((item, index) => {\n const mark = item.tone === \"success\" ? \"\u2713\" : item.tone === \"warning\" ? \"!\" : \"\u00D7\";\n const color = item.tone === \"error\"\n ? \"var(--destructive)\"\n : item.tone === \"warning\"\n ? \"#b45309\"\n : \"var(--foreground)\";\n return (\n <div\n key={`${item.title}-${index}`}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"22px minmax(0, 1fr)\",\n gap: \"8px\",\n alignItems: \"start\",\n padding: \"8px 10px\",\n border: \"1px solid var(--border)\",\n borderRadius: \"8px\",\n background: \"var(--muted)\",\n }}\n >\n <strong key=\"mark\" style={{ color }}>{mark}</strong>\n <div key=\"copy\" style={{ display: \"grid\", gap: \"2px\" }}>\n <strong key=\"title\" style={{ fontSize: \"13px\", color }}>{item.title}</strong>\n <span key=\"detail\" style={helpStyle}>{item.detail}</span>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction ChatSearchControl(props: {\n query: string;\n onQueryChange: (value: string) => void;\n chats: DirectoryChatOption[];\n loading: boolean;\n error?: string;\n currentChatId?: string;\n currentChatName?: string;\n profileName?: string | null;\n onSelect: (chat: DirectoryChatOption) => void;\n}) {\n return (\n <div style={{ display: \"grid\", gap: \"8px\" }}>\n <input\n style={inputStyle}\n placeholder=\"\u8F93\u5165\u7FA4\u540D\u6216\u5355\u804A\u540D\u79F0\uFF0C\u4F8B\u5982\u201C\u8001\u677F\u7FA4\u201D\u201C\u667A\u80FD\u4F53\u56E2\u961F\u201D\"\n value={props.query}\n onChange={(event) => props.onQueryChange(event.target.value)}\n />\n <div style={helpStyle}>\n \u7528 {props.profileName || \"\u5F53\u524D\u98DE\u4E66\u8D26\u53F7\"} \u641C\u7D22\u53EF\u89C1\u4F1A\u8BDD\u3002\u9009\u4E2D\u540E\u81EA\u52A8\u7ED1\u5B9A\u5230\u8FD9\u6761\u5165\u53E3\u3002\n </div>\n {props.currentChatId ? (\n <div style={helpStyle}>\n \u5F53\u524D\u9009\u62E9\uFF1A{props.currentChatName || \"\u5DF2\u9009\u62E9\u4E00\u4E2A\u4F1A\u8BDD\uFF0C\u540D\u79F0\u5F85\u540C\u6B65\"}\n </div>\n ) : null}\n {props.loading ? <div style={helpStyle}>\u6B63\u5728\u641C\u7D22\u98DE\u4E66\u4F1A\u8BDD...</div> : null}\n {props.error ? <div style={{ ...helpStyle, color: \"var(--destructive)\" }}>\u641C\u7D22\u5931\u8D25\uFF1A{props.error}</div> : null}\n {!props.loading && !props.error && props.query && props.chats.length === 0 ? (\n <div style={helpStyle}>\u6CA1\u6709\u641C\u5230\u3002\u786E\u8BA4\u4F60\u6709\u6743\u9650\u770B\u5230\u8FD9\u4E2A\u7FA4\uFF0C\u6216\u5148\u628A\u98DE\u4E66\u673A\u5668\u4EBA\u52A0\u8FDB\u7FA4\u91CC\u3002</div>\n ) : null}\n <div style={stepGridStyle}>\n {props.chats.map((chat) => (\n <button\n key={chat.chatId}\n type=\"button\"\n style={{\n ...buttonStyle,\n height: \"auto\",\n minHeight: \"54px\",\n padding: \"10px 12px\",\n textAlign: \"left\",\n justifyContent: \"flex-start\",\n border: chat.chatId === props.currentChatId ? \"1px solid var(--primary)\" : buttonStyle.border,\n }}\n onClick={() => props.onSelect(chat)}\n >\n <strong style={{ display: \"block\" }}>{chat.name}</strong>\n <span style={{ ...helpStyle, display: \"block\" }}>{chat.description || (chat.external ? \"\u5916\u90E8\u7FA4\" : \"\u5185\u90E8\u4F1A\u8BDD\")}</span>\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nfunction UserSearchControl(props: {\n query: string;\n onQueryChange: (value: string) => void;\n users: DirectoryUserOption[];\n loading: boolean;\n error?: string;\n currentUserOpenId?: string;\n currentUserName?: string;\n profileName?: string | null;\n onSelect: (user: DirectoryUserOption) => void;\n}) {\n return (\n <div style={{ display: \"grid\", gap: \"8px\" }}>\n <input\n style={inputStyle}\n placeholder=\"\u8F93\u5165\u59D3\u540D\u3001\u90AE\u7BB1\u6216\u5DE5\u53F7\uFF0C\u4F8B\u5982\u201C\u5F20\u6D2A\u4E39\u201D\"\n value={props.query}\n onChange={(event) => props.onQueryChange(event.target.value)}\n />\n <div style={helpStyle}>\n \u7528 {props.profileName || \"\u5F53\u524D\u98DE\u4E66\u8D26\u53F7\"} \u641C\u7D22\u901A\u8BAF\u5F55\u3002\u9009\u4E2D\u540E\u81EA\u52A8\u7ED1\u5B9A\u5230\u8FD9\u6761\u5165\u53E3\u3002\n </div>\n {props.currentUserOpenId ? (\n <div style={helpStyle}>\n \u5F53\u524D\u9009\u62E9\uFF1A{props.currentUserName || \"\u5DF2\u9009\u62E9\u4E00\u4E2A\u8054\u7CFB\u4EBA\uFF0C\u540D\u79F0\u5F85\u540C\u6B65\"}\n </div>\n ) : null}\n {props.loading ? <div style={helpStyle}>\u6B63\u5728\u641C\u7D22\u98DE\u4E66\u8054\u7CFB\u4EBA...</div> : null}\n {props.error ? <div style={{ ...helpStyle, color: \"var(--destructive)\" }}>\u641C\u7D22\u5931\u8D25\uFF1A{props.error}</div> : null}\n {!props.loading && !props.error && props.query && props.users.length === 0 ? (\n <div style={helpStyle}>\u6CA1\u6709\u641C\u5230\u3002\u786E\u8BA4\u98DE\u4E66\u5E94\u7528\u53EF\u89C1\u8303\u56F4\u548C\u901A\u8BAF\u5F55\u6743\u9650\u3002</div>\n ) : null}\n <div style={stepGridStyle}>\n {props.users.map((user) => (\n <button\n key={user.openId}\n type=\"button\"\n style={{\n ...buttonStyle,\n height: \"auto\",\n minHeight: \"54px\",\n padding: \"10px 12px\",\n textAlign: \"left\",\n justifyContent: \"flex-start\",\n border: user.openId === props.currentUserOpenId ? \"1px solid var(--primary)\" : buttonStyle.border,\n }}\n onClick={() => props.onSelect(user)}\n >\n <strong style={{ display: \"block\" }}>{user.name}</strong>\n <span style={{ ...helpStyle, display: \"block\" }}>\n {user.userId ? `\u5DE5\u53F7\uFF1A${user.userId}` : user.departmentIds?.length ? \"\u5DF2\u5339\u914D\u901A\u8BAF\u5F55\u90E8\u95E8\" : \"\u901A\u8BAF\u5F55\u7528\u6237\"}\n </span>\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nfunction StatusDot({ done }: { done: boolean }) {\n return (\n <span\n aria-hidden=\"true\"\n style={{\n width: \"18px\",\n height: \"18px\",\n borderRadius: \"999px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flex: \"0 0 auto\",\n border: \"1px solid var(--border)\",\n background: done ? \"var(--primary)\" : \"var(--background)\",\n color: done ? \"var(--primary-foreground)\" : \"var(--muted-foreground)\",\n fontSize: \"12px\",\n lineHeight: 1,\n }}\n >\n {done ? \"\u2713\" : \"\u2022\"}\n </span>\n );\n}\n\nfunction ChecklistItem({ done, title, detail }: { done: boolean; title: string; detail: string }) {\n return (\n <div\n style={{\n border: \"1px solid var(--border)\",\n borderRadius: \"8px\",\n padding: \"10px\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n background: done ? \"color-mix(in oklab, var(--primary) 6%, var(--background))\" : \"var(--background)\",\n }}\n >\n <StatusDot key=\"dot\" done={done} />\n <div key=\"body\">\n <div key=\"title\" style={{ fontWeight: 700, fontSize: \"13px\" }}>{title}</div>\n <div key=\"detail\" style={helpStyle}>{detail}</div>\n </div>\n </div>\n );\n}\n\nfunction FlowStep({ title, value, detail }: { title: string; value: string; detail?: string }) {\n return (\n <div style={flowStepStyle}>\n <div key=\"title\" style={{ ...helpStyle, marginBottom: \"6px\" }}>{title}</div>\n <div key=\"value\" style={{ fontWeight: 700, lineHeight: 1.35 }}>{value}</div>\n {detail ? <div key=\"detail\" style={{ ...helpStyle, marginTop: \"6px\" }}>{detail}</div> : null}\n </div>\n );\n}\n\nfunction SetupStep({\n index,\n done,\n title,\n detail,\n action,\n}: {\n index: number;\n done: boolean;\n title: string;\n detail: string;\n action?: ReactNode;\n}) {\n return (\n <div\n style={{\n ...setupStepStyle,\n border: done ? \"1px solid color-mix(in oklab, var(--primary) 34%, var(--border))\" : setupStepStyle.border,\n background: done ? \"color-mix(in oklab, var(--primary) 5%, var(--background))\" : setupStepStyle.background,\n }}\n >\n <div key=\"head\" style={{ ...rowStyle, justifyContent: \"space-between\" }}>\n <span key=\"number\" style={{ ...compactPillStyle, color: done ? \"var(--foreground)\" : \"var(--muted-foreground)\" }}>\n {done ? \"\u5B8C\u6210\" : `\u7B2C ${index} \u6B65`}\n </span>\n <StatusDot key=\"dot\" done={done} />\n </div>\n <div key=\"title\" style={{ fontWeight: 900, fontSize: \"15px\" }}>{title}</div>\n <div key=\"detail\" style={helpStyle}>{detail}</div>\n {action ? <div key=\"action\" style={{ marginTop: \"auto\" }}>{action}</div> : null}\n </div>\n );\n}\n\nfunction PipelineStep({\n done,\n label,\n detail,\n}: {\n done: boolean;\n label: string;\n detail: string;\n}) {\n return (\n <div\n style={{\n ...pipelineStepStyle,\n border: done ? \"1px solid color-mix(in oklab, var(--primary) 36%, var(--border))\" : pipelineStepStyle.border,\n }}\n >\n <div key=\"head\" style={rowStyle}>\n <StatusDot key=\"dot\" done={done} />\n <strong key=\"label\">{label}</strong>\n </div>\n <div key=\"detail\" style={helpStyle}>{detail}</div>\n </div>\n );\n}\n\nfunction FieldPath({ items }: { items: string[] }) {\n return (\n <div style={{ ...rowStyle, gap: \"6px\" }}>\n {items.map((item, index) => (\n <span key={`${item}-${index}`} style={{ ...rowStyle, gap: \"6px\" }}>\n <Badge key=\"item\">{item}</Badge>\n {index < items.length - 1 ? <span key=\"arrow\" style={helpStyle}>\u2192</span> : null}\n </span>\n ))}\n </div>\n );\n}\n\nfunction Field({ label, help, children }: { label: string; help?: string; children: ReactNode }) {\n return (\n <div style={fieldStyle}>\n <span key=\"label\" style={labelStyle}>{label}</span>\n <span key=\"control\" style={{ display: \"contents\" }}>{Children.toArray(children)}</span>\n {help ? <span key=\"help\" style={helpStyle}>{help}</span> : null}\n </div>\n );\n}\n\nfunction ToggleField({\n label,\n help,\n checked,\n onChange,\n}: {\n label: string;\n help?: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n}) {\n return (\n <div style={fieldStyle}>\n <div key=\"row\" style={actionBarStyle}>\n <span key=\"label\" style={labelStyle}>{label}</span>\n <button\n key=\"switch\"\n type=\"button\"\n aria-pressed={checked}\n onClick={() => onChange(!checked)}\n style={{\n width: \"44px\",\n height: \"24px\",\n borderRadius: \"999px\",\n border: \"1px solid var(--border)\",\n padding: \"2px\",\n background: checked ? \"var(--primary)\" : \"var(--muted)\",\n cursor: \"pointer\",\n display: \"flex\",\n justifyContent: checked ? \"flex-end\" : \"flex-start\",\n alignItems: \"center\",\n }}\n >\n <span key=\"knob\" style={{\n width: \"18px\",\n height: \"18px\",\n borderRadius: \"999px\",\n background: checked ? \"var(--primary-foreground)\" : \"var(--background)\",\n boxShadow: \"0 1px 2px rgba(0,0,0,0.16)\",\n }} />\n </button>\n </div>\n {help ? <span key=\"help\" style={helpStyle}>{help}</span> : null}\n </div>\n );\n}\n\nfunction NoticeBanner({ notice, meta }: { notice: { tone: \"success\" | \"error\" | \"info\"; text: string }; meta?: string | null }) {\n const border = notice.tone === \"error\"\n ? \"1px solid var(--destructive)\"\n : notice.tone === \"success\"\n ? \"1px solid color-mix(in oklab, var(--primary) 45%, var(--border))\"\n : \"1px solid var(--border)\";\n const background = notice.tone === \"error\"\n ? \"color-mix(in oklab, var(--destructive) 8%, var(--background))\"\n : notice.tone === \"success\"\n ? \"color-mix(in oklab, var(--primary) 8%, var(--background))\"\n : \"var(--background)\";\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={{\n border,\n borderRadius: \"8px\",\n padding: \"10px 12px\",\n background,\n display: \"grid\",\n gap: \"4px\",\n }}\n >\n <div key=\"text\" style={{ fontWeight: 700 }}>{notice.text}</div>\n {meta ? <div key=\"meta\" style={helpStyle}>{meta}</div> : null}\n </div>\n );\n}\n\nfunction normalizeText(value: string | undefined | null): string {\n return (value ?? \"\").trim().toLowerCase();\n}\n\nfunction normalizeMentionLabel(value: string | undefined | null): string {\n return normalizeText(value).replace(/^@+/, \"\").replace(/\\s+/g, \"\");\n}\n\nfunction splitBotAliases(value: unknown): string[] {\n const values = Array.isArray(value)\n ? value\n : typeof value === \"string\"\n ? value.split(/[,\uFF0C\u3001\\n]/g)\n : [];\n return [...new Set(values\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim().replace(/^@+/, \"\"))\n .filter(Boolean))];\n}\n\nfunction isPlaceholderBotName(value: string | undefined | null): boolean {\n const normalized = normalizeText(value);\n return !normalized\n || normalized === \"\u98DE\u4E66\u673A\u5668\u4EBA\"\n || normalized === \"\u98DE\u4E66\u5E94\u7528\"\n || normalized.startsWith(\"cli_\")\n || normalized.includes(\"\u98DE\u4E66\u5E94\u7528\")\n || /^[0-9a-f-]{12,}$/.test(normalized);\n}\n\nfunction connectionAliasList(connection?: FeishuConnectionConfig | null): string[] {\n return splitBotAliases(connection?.botAliases);\n}\n\nfunction formatBotAliases(connection?: FeishuConnectionConfig | null): string {\n return connectionAliasList(connection).join(\"\u3001\");\n}\n\nfunction normalizeUiConfig(input: Record<string, unknown> | null | undefined): ConfigRecord {\n const source = (input ?? {}) as ConfigRecord;\n return {\n ...DEFAULT_CONFIG,\n ...source,\n connections: Array.isArray(source.connections)\n ? source.connections.map((connection) => ({\n ...connection,\n botAliases: splitBotAliases((connection as FeishuConnectionConfig).botAliases),\n }))\n : [],\n routes: Array.isArray(source.routes) ? source.routes : [],\n baseSinks: Array.isArray(source.baseSinks) ? source.baseSinks : [],\n };\n}\n\nfunction portableConfig(input: ConfigRecord): ConfigRecord {\n const secretKeys = new Set([\n \"appSecret\",\n \"app_secret\",\n \"clientSecret\",\n \"client_secret\",\n \"tenantAccessToken\",\n \"userAccessToken\",\n \"accessToken\",\n \"refreshToken\",\n \"verificationToken\",\n \"encryptKey\",\n ]);\n\n function sanitize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map((item) => sanitize(item));\n if (!value || typeof value !== \"object\") return value;\n const next: Record<string, unknown> = {};\n Object.entries(value as Record<string, unknown>).forEach(([key, nested]) => {\n if (secretKeys.has(key)) return;\n next[key] = sanitize(nested);\n });\n return next;\n }\n\n return normalizeUiConfig(sanitize(input) as Record<string, unknown>);\n}\n\nfunction readableError(error: unknown): string {\n if (error instanceof Error) return readableError(error.message);\n if (typeof error === \"string\") {\n const trimmed = error.trim();\n if (trimmed.startsWith(\"{\")) {\n try {\n const parsed = JSON.parse(trimmed) as { message?: unknown; error?: unknown };\n const errorRecord = typeof parsed.error === \"object\" && parsed.error !== null\n ? parsed.error as { message?: unknown; hint?: unknown }\n : null;\n const message = typeof errorRecord?.message === \"string\"\n ? errorRecord.message\n : typeof parsed.error === \"string\"\n ? parsed.error\n : typeof parsed.message === \"string\"\n ? parsed.message\n : trimmed;\n const hint = typeof errorRecord?.hint === \"string\" ? errorRecord.hint : \"\";\n return hint ? `${message}\u3002${hint}` : message;\n } catch {\n return trimmed;\n }\n }\n return trimmed;\n }\n if (typeof error === \"object\" && error !== null) {\n const record = error as { message?: unknown; error?: unknown };\n const errorRecord = typeof record.error === \"object\" && record.error !== null\n ? record.error as { message?: unknown; hint?: unknown }\n : null;\n if (typeof errorRecord?.message === \"string\") {\n const hint = typeof errorRecord.hint === \"string\" ? errorRecord.hint : \"\";\n return hint ? `${errorRecord.message}\u3002${hint}` : errorRecord.message;\n }\n if (typeof record.error === \"string\") {\n return record.error;\n }\n if (typeof record.message === \"string\") return readableError(record.message);\n }\n return \"\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5\u3002\";\n}\n\nfunction companyLabel(company: CompanyOption): string {\n return company.issuePrefix ? `${company.name}\uFF08${company.issuePrefix}\uFF09` : company.name;\n}\n\nfunction agentLabel(agent: AgentOption): string {\n return agent.title ? `${agent.name} - ${agent.title}` : agent.name;\n}\n\nfunction profileLabel(profile: ProfileOption): string {\n const parts = [profileDisplayName(profile)];\n parts.push(profileAuthLabel(profile));\n if (profile.appId) parts.push(`App ID\uFF1A${maskTechnicalId(profile.appId)}`);\n if (profile.name && profile.name !== profile.appId) parts.push(`\u914D\u7F6E\uFF1A${profile.name}`);\n if (profile.active) parts.push(\"\u5F53\u524D\u9ED8\u8BA4\");\n return parts.join(\" \u00B7 \");\n}\n\nfunction maskTechnicalId(value: string | null | undefined): string {\n const trimmed = value?.trim();\n if (!trimmed) return \"\u672A\u8FD4\u56DE\";\n if (trimmed.length <= 14) return trimmed;\n return `${trimmed.slice(0, 8)}\u2026${trimmed.slice(-4)}`;\n}\n\nfunction profileAuthLabel(profile?: ProfileOption | null): string {\n if (profile?.user) return `\u4E2A\u4EBA\u6388\u6743\uFF1A${profile.user}`;\n return \"\u673A\u5668\u4EBA\u8EAB\u4EFD\uFF1A\u5DF2\u7528\u4E8E\u6536\u53D1\u6D88\u606F\";\n}\n\nfunction profileAuthDetail(profile?: ProfileOption | null): string {\n if (profile?.user) return \"\u5DF2\u7ECF\u5B8C\u6210\u7528\u6237\u6388\u6743\uFF0C\u53EF\u6309\u6388\u6743\u8303\u56F4\u8BBF\u95EE\u4E2A\u4EBA\u98DE\u4E66\u8D44\u6E90\u3002\";\n return \"\u8FD9\u662F\u6B63\u5E38\u72B6\u6001\uFF1A\u6536\u6D88\u606F\u3001\u56DE\u6D88\u606F\u3001\u5199\u591A\u7EF4\u8868\u683C\u8D70\u673A\u5668\u4EBA\u8EAB\u4EFD\uFF0C\u4E0D\u9700\u8981\u4E2A\u4EBA\u6388\u6743\u3002\u53EA\u6709\u8BBF\u95EE\u4E2A\u4EBA\u6587\u6863\u3001\u65E5\u5386\u3001\u90AE\u7BB1\u65F6\u624D\u5355\u72EC\u6388\u6743\u3002\";\n}\n\nfunction missingProfileHelp(connection?: FeishuConnectionConfig | null): string {\n const label = connection?.name || connection?.profileName || \"\u8FD9\u4E2A\u673A\u5668\u4EBA\";\n return `\u5F53\u524D\u9875\u9762\u8FD8\u4FDD\u7559\u201C${label}\u201D\uFF0C\u4F46\u8FD9\u53F0\u673A\u5668/\u670D\u52A1\u5668\u6CA1\u6709\u8BFB\u5230\u5BF9\u5E94\u7684 lark-cli \u6388\u6743\u3002\u5148\u70B9\u201C\u5237\u65B0\u673A\u5668\u4EBA\u5217\u8868\u201D\uFF1B\u5982\u679C\u8FD8\u6CA1\u6709\uFF0C\u5C31\u70B9\u201C\u91CD\u65B0\u7ED1\u5B9A\u201D\u91CD\u65B0\u8D70\u4E00\u6B21\u98DE\u4E66\u6388\u6743\u3002\u4E91\u670D\u52A1\u5668\u90E8\u7F72\u65F6\uFF0C\u672C\u5730\u7ED1\u5B9A\u4E0D\u4F1A\u81EA\u52A8\u5E26\u8FC7\u53BB\uFF0C\u670D\u52A1\u5668\u4E0A\u4E5F\u8981\u7ED1\u5B9A\u6216\u6CE8\u5165\u540C\u4E00\u5957\u5BC6\u94A5\u3002`;\n}\n\nfunction missingBotNameHelp(connection?: FeishuConnectionConfig | null): string {\n const aliases = formatBotAliases(connection);\n if (aliases) return `\u98DE\u4E66\u6CA1\u6709\u8FD4\u56DE\u5B98\u65B9\u673A\u5668\u4EBA\u540D\uFF0C\u5F53\u524D\u4F1A\u7528\u4F60\u586B\u5199\u7684 @ \u540D\u79F0\u201C${aliases}\u201D\u5224\u65AD\u6D88\u606F\u662F\u4E0D\u662F\u53D1\u7ED9\u8FD9\u4E2A\u673A\u5668\u4EBA\u3002`;\n return \"\u6CA1\u6709\u4ECE\u98DE\u4E66\u8BFB\u53D6\u5230\u673A\u5668\u4EBA\u663E\u793A\u540D\u3002\u8BF7\u586B\u5199\u98DE\u4E66\u91CC @ \u5B83\u65F6\u770B\u5230\u7684\u540D\u5B57\uFF0C\u4F8B\u5982\u201C\u5C0F\u9510\u201D\u3002\u5426\u5219\u591A\u4E2A\u673A\u5668\u4EBA\u5728\u540C\u4E00\u4E2A\u7FA4\u91CC\u65F6\uFF0C@\u5C0F\u9510/@\u9510\u601D \u53EF\u80FD\u88AB\u9519\u8BEF\u63A5\u8D70\u3002\";\n}\n\nfunction profileDisplayName(profile?: ProfileOption | null): string {\n if (!profile) return \"\u98DE\u4E66\u5E94\u7528\";\n return profile.botName || (profile.user ? `\u98DE\u4E66\u5E94\u7528\uFF08${profile.user}\uFF09` : profile.name || \"\u98DE\u4E66\u5E94\u7528\");\n}\n\nfunction primaryMentionName(connection?: FeishuConnectionConfig, profile?: ProfileOption | null): string {\n const realBotName = profile?.botName?.trim();\n if (realBotName) return realBotName;\n const alias = connectionAliasList(connection)[0];\n if (alias) return alias;\n const connectionName = connection?.name?.trim();\n if (connectionName && !isPlaceholderBotName(connectionName)) return connectionName;\n return \"\u673A\u5668\u4EBA\";\n}\n\nfunction appLabel(connection?: FeishuConnectionConfig, profile?: ProfileOption | null): string {\n const realBotName = profile?.botName ?? null;\n const alias = connectionAliasList(connection)[0];\n const connectionName = connection?.name?.trim();\n if (realBotName) return realBotName;\n if (alias) return alias;\n if (connectionName) return connectionName;\n if (profile?.user) return `\u98DE\u4E66\u5E94\u7528\uFF08${profile.user}\uFF09`;\n if (profile?.name) return profile.name;\n return \"\u98DE\u4E66\u5E94\u7528\";\n}\n\nfunction appMeta(connection?: FeishuConnectionConfig, profile?: ProfileOption | null): string {\n const parts: string[] = [];\n if (connection?.name && profile?.botName && connection.name !== profile.botName) parts.push(`\u9875\u9762\u5907\u6CE8\uFF1A${connection.name}`);\n const aliases = formatBotAliases(connection);\n if (aliases) parts.push(`\u98DE\u4E66 @ \u540D\u79F0\uFF1A${aliases}`);\n if (profile?.user) parts.push(`\u6388\u6743\u7528\u6237\uFF1A${profile.user}`);\n const appId = connection?.appId || profile?.appId;\n if (appId) parts.push(`App ID\uFF1A${maskTechnicalId(appId)}`);\n if (profile?.active) parts.push(\"\u5F53\u524D\u9ED8\u8BA4\");\n return parts.join(\" \u00B7 \");\n}\n\nfunction routeTitle(route: FeishuRouteConfig, index: number): string {\n const explicitName = route.name?.trim();\n if (explicitName && !isLikelyInternalRouteName(explicitName)) return explicitName;\n const described = describeRouteForHumans(route);\n if (described && described !== \"\u9ED8\u8BA4\u5165\u53E3\") return described;\n if (route.matchType === \"regex\") {\n if (route.regex?.includes(\"\u9510\u601D\") && route.regex?.includes(\"paperclip\")) {\n return route.targetAgentName?.trim()\n ? `\u9AD8\u7EA7\u5165\u53E3\uFF1A\u5173\u952E\u8BCD\u201C\u9510\u601D / paperclip\u201D \u2192 ${route.targetAgentName.trim()}`\n : \"\u9AD8\u7EA7\u5165\u53E3\uFF1A\u5173\u952E\u8BCD\u201C\u9510\u601D / paperclip\u201D\";\n }\n }\n if (route.matchType === \"default\") return \"\u5176\u4ED6\u672A\u5339\u914D\u6D88\u606F\";\n return `\u63A5\u6536\u89C4\u5219 ${index + 1}`;\n}\n\nfunction routeSourceLabel(route: FeishuRouteConfig): string {\n if (route.matchType === \"chat\") return route.chatName ? `\u98DE\u4E66\u4F1A\u8BDD\u201C${route.chatName}\u201D` : route.chatId ? \"\u6307\u5B9A\u4F1A\u8BDD\uFF08\u540D\u79F0\u5F85\u540C\u6B65\uFF09\" : \"\u6307\u5B9A\u7FA4\u6216\u5355\u804A\";\n if (route.matchType === \"user\") return route.userName ? `\u6307\u5B9A\u4EBA\u5458\u201C${route.userName}\u201D` : route.userOpenId ? \"\u6307\u5B9A\u4EBA\u5458\uFF08\u540D\u79F0\u5F85\u540C\u6B65\uFF09\" : \"\u6307\u5B9A\u53D1\u6D88\u606F\u4EBA\";\n if (route.matchType === \"keyword\") return route.keyword ? `\u6D88\u606F\u5305\u542B\u201C${route.keyword}\u201D` : \"\u6D88\u606F\u5305\u542B\u5173\u952E\u8BCD\";\n if (route.matchType === \"regex\") return route.regex ? \"\u6309\u9AD8\u7EA7\u89C4\u5219\u5339\u914D\" : \"\u9AD8\u7EA7\u89C4\u5219\";\n return \"\u672A\u88AB\u5176\u4ED6\u89C4\u5219\u63A5\u8D70\u7684\u6D88\u606F\";\n}\n\nfunction routeTargetLabel(company: CompanyOption | null, agent: AgentOption | null): string {\n if (!company && !agent) return \"\u8FD8\u6CA1\u9009\u62E9\";\n if (company && agent) return `${agentLabel(agent)}\uFF08${companyLabel(company)}\uFF09`;\n if (company) return `${companyLabel(company)}\u91CC\u7684\u667A\u80FD\u4F53`;\n return agent ? agentLabel(agent) : \"\u8FD8\u6CA1\u9009\u62E9\";\n}\n\nfunction baseSinkLabel(baseSinks: FeishuBaseSinkConfig[], sinkId?: string): string {\n if (!sinkId) return \"\u4E0D\u5199\u5165\u591A\u7EF4\u8868\u683C\";\n const sink = baseSinks.find((item) => item.id === sinkId);\n if (!sink) return `${sinkId}\uFF08\u672A\u627E\u5230\uFF09`;\n return `${sink.tableIdOrName || sink.id}`;\n}\n\nfunction feishuTriggerText(\n route?: FeishuRouteConfig | null,\n connection?: FeishuConnectionConfig,\n profile?: ProfileOption | null,\n): string {\n const botName = primaryMentionName(connection, profile);\n const mention = `@${botName}`;\n if (!route) return `${mention} paperclip`;\n if (route.matchType === \"keyword\") {\n const keyword = route.keyword?.trim() || \"paperclip\";\n return normalizeMentionLabel(keyword) === normalizeMentionLabel(botName)\n ? mention\n : `${mention} ${keyword}`;\n }\n if (route.matchType === \"regex\" && route.regex?.includes(\"paperclip\")) return `${mention} paperclip`;\n return mention;\n}\n\nfunction feishuSmokeText(\n route?: FeishuRouteConfig | null,\n connection?: FeishuConnectionConfig,\n profile?: ProfileOption | null,\n): string {\n return `${feishuTriggerText(route, connection, profile)} \u53EA\u56DE\u590D ok`;\n}\n\nfunction feishuTaskTestText(\n route?: FeishuRouteConfig | null,\n connection?: FeishuConnectionConfig,\n profile?: ProfileOption | null,\n): string {\n const trigger = feishuTriggerText(route, connection, profile);\n return `${trigger} \u8BF7\u521B\u5EFA\u4E00\u4E2A paperclip \u6D4B\u8BD5\u4EFB\u52A1\uFF0C\u5B8C\u6210\u540E\u56DE\u590D\u6211\uFF1B\u5982\u679C\u6211\u5E26\u4E86\u56FE\u7247\u6216\u6587\u4EF6\uFF0C\u4E5F\u8BF7\u4E00\u8D77\u5904\u7406\u3002`;\n}\n\nfunction routeTestHint(route?: FeishuRouteConfig | null): string {\n if (!route) return \"\u5148\u65B0\u589E\u4E00\u6761\u98DE\u4E66\u5165\u53E3\uFF0C\u518D\u53BB\u98DE\u4E66\u91CC\u53D1\u6D4B\u8BD5\u6D88\u606F\u3002\";\n if (route.matchType === \"chat\") return \"\u8BF7\u5728\u8FD9\u6761\u5165\u53E3\u7ED1\u5B9A\u7684\u98DE\u4E66\u7FA4\u6216\u5355\u804A\u91CC\u53D1\u9001\u3002\";\n if (route.matchType === \"user\") return \"\u8BF7\u7528\u8FD9\u6761\u5165\u53E3\u6307\u5B9A\u7684\u98DE\u4E66\u7528\u6237\u8D26\u53F7\u53D1\u9001\u3002\";\n if (route.matchType === \"keyword\") return \"\u6D88\u606F\u91CC\u5305\u542B\u5165\u53E3\u5173\u952E\u8BCD\u5C31\u4F1A\u89E6\u53D1\uFF0C\u4E0D\u533A\u5206\u5927\u5C0F\u5199\u3002\u673A\u5668\u4EBA\u88AB @ \u65F6\u66F4\u5BB9\u6613\u89E6\u53D1\u3002\";\n if (route.matchType === \"regex\") return \"\u6D88\u606F\u8981\u5339\u914D\u9AD8\u7EA7\u89C4\u5219\u3002\u666E\u901A\u7528\u6237\u5EFA\u8BAE\u6539\u6210\u5173\u952E\u8BCD\u5165\u53E3\u3002\";\n return \"\u8FD9\u6761\u5165\u53E3\u4F1A\u63A5\u6536\u6CA1\u6709\u88AB\u5176\u4ED6\u89C4\u5219\u5339\u914D\u7684\u6D88\u606F\u3002\";\n}\n\nfunction deploymentHint(): string {\n const host = typeof window !== \"undefined\" ? window.location.hostname : \"\";\n if (host === \"localhost\" || host === \"127.0.0.1\") {\n return \"\u5F53\u524D\u662F\u672C\u5730\u6D4B\u8BD5\uFF1A\u8FD9\u4E2A\u98DE\u4E66\u5E94\u7528\u7ED1\u5728\u8FD9\u53F0 Mac \u4E0A\u3002\u672A\u6765\u90E8\u7F72\u5230\u4E91\u670D\u52A1\u5668\u540E\uFF0C\u8981\u628A\u540C\u4E00\u4E2A\u98DE\u4E66\u5E94\u7528\u7ED1\u5B9A\u5230\u670D\u52A1\u5668\u4E0A\u3002\";\n }\n return \"\u5F53\u524D\u662F\u670D\u52A1\u5668\u73AF\u5883\uFF1A\u98DE\u4E66\u5E94\u7528\u914D\u7F6E\u6765\u81EA Paperclip \u670D\u52A1\u5668\uFF0C\u4E0D\u4F1A\u8BFB\u53D6\u7528\u6237\u7535\u8111\u3002\";\n}\n\nfunction isLocalRuntime(): boolean {\n const host = typeof window !== \"undefined\" ? window.location.hostname : \"\";\n return host === \"localhost\" || host === \"127.0.0.1\";\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction serverProfileName(connection?: FeishuConnectionConfig): string {\n return connection?.profileName?.trim() || \"paperclip-feishu-bot\";\n}\n\nfunction buildServerDeployCommands(connection?: FeishuConnectionConfig): string {\n const profileName = serverProfileName(connection);\n const appId = connection?.appId?.trim() || \"<App ID>\";\n return [\n \"# 1. \u5728 Paperclip \u670D\u52A1\u5668\u4E0A\u786E\u8BA4 lark-cli \u53EF\u7528\uFF08\u63D2\u4EF6\u5305\u4F1A\u81EA\u5E26 CLI\uFF1B\u8FD9\u91CC\u7528\u4E8E\u4EBA\u5DE5\u4F53\u68C0\uFF09\",\n \"lark-cli --version\",\n \"lark-cli doctor\",\n \"\",\n \"# 2. \u5728\u670D\u52A1\u5668\u4E0A\u7ED1\u5B9A\u540C\u4E00\u4E2A\u98DE\u4E66\u5E94\u7528\u3002App Secret \u4E0D\u8981\u53D1\u5230\u804A\u5929\u6216\u622A\u56FE\u91CC\u3002\",\n `lark-cli config init --new --name ${shellQuote(profileName)} --brand feishu --lang zh`,\n `printf '<App Secret>' | lark-cli profile add --name ${shellQuote(profileName)} --app-id ${shellQuote(appId)} --brand feishu --app-secret-stdin --use`,\n \"\",\n \"# 3. \u56DE\u5230 Paperclip \u98DE\u4E66\u8FDE\u63A5\u5668\u9875\u9762\uFF0C\u5237\u65B0\u673A\u5668\u4EBA\u5217\u8868\uFF0C\u786E\u8BA4\u540C\u540D profile \u51FA\u73B0\u540E\u518D\u4FDD\u5B58\u914D\u7F6E\u3002\",\n ].join(\"\\n\");\n}\n\nfunction connectionOptionNodes(\n connections: FeishuConnectionConfig[],\n prefix: string,\n defaultLabel = \"\u9ED8\u8BA4\u7B2C\u4E00\u4E2A\u53EF\u7528\u673A\u5668\u4EBA\",\n profiles: ProfileOption[] = [],\n): ReactNode {\n return Children.toArray([\n <option key={`${prefix}-default`} value=\"\">{defaultLabel}</option>,\n ...connections.map((connection, optionIndex) => {\n const profile = profiles.find((item) => item.name === connection.profileName) ?? null;\n return (\n <option key={`${prefix}-connection-${optionIndex}-${connection.id}`} value={connection.id}>\n {appLabel(connection, profile)}\n </option>\n );\n }),\n ]);\n}\n\nfunction companyOptionNodes(companies: CompanyOption[], prefix: string): ReactNode {\n return Children.toArray([\n <option key={`${prefix}-empty-company`} value=\"\">\u8BF7\u9009\u62E9\u516C\u53F8</option>,\n ...companies.map((item, optionIndex) => (\n <option key={`${prefix}-company-${optionIndex}-${item.id}`} value={item.id}>\n {companyLabel(item)}\n </option>\n )),\n ]);\n}\n\nfunction agentOptionNodes(agents: AgentOption[], prefix: string): ReactNode {\n return Children.toArray([\n <option key={`${prefix}-empty-agent`} value=\"\">\u8BF7\u9009\u62E9\u667A\u80FD\u4F53</option>,\n ...agents.map((item, optionIndex) => (\n <option key={`${prefix}-agent-${optionIndex}-${item.id}`} value={item.id}>\n {agentLabel(item)}\n </option>\n )),\n ]);\n}\n\nfunction baseSinkOptionNodes(baseSinks: FeishuBaseSinkConfig[], prefix: string): ReactNode {\n return Children.toArray([\n <option key={`${prefix}-empty-base-sink`} value=\"\">\u4E0D\u5199\u5165\u591A\u7EF4\u8868\u683C</option>,\n ...baseSinks.map((sink, optionIndex) => (\n <option key={`${prefix}-base-sink-${optionIndex}-${sink.id}`} value={sink.id}>\n {sink.id}\n </option>\n )),\n ]);\n}\n\nfunction profileOptionNodes(\n profiles: ProfileOption[],\n currentProfileName: string | undefined,\n prefix: string,\n): ReactNode {\n const hasCurrent = currentProfileName\n ? profiles.some((profile) => profile.name === currentProfileName)\n : false;\n return Children.toArray([\n <option key={`${prefix}-empty-profile`} value=\"\">\u8BF7\u9009\u62E9\u5DF2\u767B\u5F55 profile</option>,\n ...profiles.map((profile, optionIndex) => (\n <option key={`${prefix}-profile-${optionIndex}-${profile.name}`} value={profile.name}>\n {profileLabel(profile)}\n </option>\n )),\n ...(currentProfileName && !hasCurrent\n ? [\n <option key={`${prefix}-current-profile`} value={currentProfileName}>\n {currentProfileName}\uFF08\u5F53\u524D\u914D\u7F6E\uFF0C\u672A\u5728\u672C\u673A\u5217\u8868\u4E2D\uFF09\n </option>,\n ]\n : []),\n ]);\n}\n\nfunction resolveCompany(route: FeishuRouteConfig, companies: CompanyOption[]): CompanyOption | null {\n const id = normalizeText(route.companyId);\n if (id) {\n const byId = companies.find((company) => normalizeText(company.id) === id);\n if (byId) return byId;\n }\n\n const ref = normalizeText(route.companyRef);\n if (!ref) return null;\n return companies.find((company) =>\n normalizeText(company.id) === ref ||\n normalizeText(company.name) === ref ||\n normalizeText(company.issuePrefix) === ref\n ) ?? null;\n}\n\nfunction resolveAgent(route: FeishuRouteConfig, company: CompanyOption | null): AgentOption | null {\n if (!company) return null;\n const id = normalizeText(route.targetAgentId);\n if (id) {\n const byId = company.agents.find((agent) => normalizeText(agent.id) === id);\n if (byId) return byId;\n }\n\n const ref = normalizeText(route.targetAgentRef ?? route.targetAgentName);\n if (!ref) return null;\n return company.agents.find((agent) =>\n normalizeText(agent.id) === ref ||\n normalizeText(agent.name) === ref ||\n normalizeText(agent.title) === ref ||\n normalizeText(agent.urlKey) === ref\n ) ?? null;\n}\n\nasync function hostFetchJson<T>(path: string, init?: RequestInit): Promise<T> {\n const response = await fetch(path, {\n credentials: \"include\",\n headers: {\n \"content-type\": \"application/json\",\n ...(init?.headers ?? {}),\n },\n ...init,\n });\n if (!response.ok) {\n const text = await response.text();\n throw new Error(readableError(text || `Request failed: ${response.status}`));\n }\n return await response.json() as T;\n}\n\nfunction useSettingsConfig(pluginApiId: string) {\n const [configJson, setConfigJson] = useState<ConfigRecord>(() => normalizeUiConfig({}));\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n hostFetchJson<{ configJson?: Record<string, unknown> | null } | null>(`/api/plugins/${encodeURIComponent(pluginApiId)}/config`)\n .then((result) => {\n if (cancelled) return;\n setConfigJson(normalizeUiConfig(result?.configJson ?? {}));\n setError(null);\n })\n .catch((nextError) => {\n if (cancelled) return;\n setError(readableError(nextError));\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [pluginApiId]);\n\n async function save(nextConfig: ConfigRecord) {\n setSaving(true);\n try {\n await hostFetchJson(`/api/plugins/${encodeURIComponent(pluginApiId)}/config`, {\n method: \"POST\",\n body: JSON.stringify({ configJson: nextConfig }),\n });\n setConfigJson(normalizeUiConfig(nextConfig));\n setError(null);\n } catch (nextError) {\n setError(readableError(nextError));\n throw nextError;\n } finally {\n setSaving(false);\n }\n }\n\n async function test(nextConfig: ConfigRecord) {\n return await hostFetchJson<{ valid: boolean; message?: string }>(`/api/plugins/${encodeURIComponent(pluginApiId)}/config/test`, {\n method: \"POST\",\n body: JSON.stringify({ configJson: nextConfig }),\n });\n }\n\n return { configJson, setConfigJson, loading, saving, error, save, test };\n}\n\nfunction connectionFromProfile(input: {\n index: number;\n profileName: string;\n appId?: string;\n displayName?: string;\n}): FeishuConnectionConfig {\n const baseId = input.profileName\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 42) || \"feishu-bot\";\n return {\n id: input.index === 0 ? baseId : `${baseId}-${input.index + 1}`,\n name: input.displayName?.trim() || `\u98DE\u4E66\u673A\u5668\u4EBA ${input.index + 1}`,\n botAliases: input.displayName && !isPlaceholderBotName(input.displayName) ? [input.displayName.trim()] : [],\n profileName: input.profileName,\n appId: input.appId,\n enabled: true,\n };\n}\n\nfunction suggestedBindProfileName(profiles: ProfileOption[]): string {\n const existing = new Set(profiles.map((profile) => profile.name));\n if (!existing.has(\"paperclip-feishu-bot\")) return \"paperclip-feishu-bot\";\n for (let index = 2; index < 100; index += 1) {\n const candidate = `paperclip-feishu-bot-${index}`;\n if (!existing.has(candidate)) return candidate;\n }\n return `paperclip-feishu-bot-${Date.now()}`;\n}\n\nfunction defaultRoute(\n index: number,\n connection: FeishuConnectionConfig | undefined,\n company: CompanyOption | undefined,\n): FeishuRouteConfig {\n const agent = company?.agents[0];\n return {\n id: index === 0 ? \"feishu-to-agent\" : `feishu-to-agent-${index + 1}`,\n connectionId: connection?.id,\n enabled: true,\n priority: 10,\n matchType: \"keyword\",\n keyword: \"paperclip\",\n companyId: company?.id,\n companyRef: company?.issuePrefix ?? company?.name,\n targetAgentId: agent?.id,\n targetAgentName: agent?.name,\n replyMode: \"thread\",\n };\n}\n\nexport function FeishuSettingsPage(props: PluginSettingsPageProps & PluginInstanceProps) {\n const pluginApiId = pluginInstanceIdFromProps(props);\n const catalog = usePluginData<CatalogData>(DATA_KEYS.catalog);\n const profileCatalog = usePluginData<ProfilesData>(DATA_KEYS.profiles);\n const connectorStatus = usePluginData<ConnectorStatus>(DATA_KEYS.status);\n const capabilityCenter = usePluginData<CapabilityCenterData>(DATA_KEYS.capabilities);\n const bindProfile = usePluginAction(ACTION_KEYS.bindProfile);\n const startGuidedBind = usePluginAction(ACTION_KEYS.startGuidedBind);\n const finishGuidedBind = usePluginAction(ACTION_KEYS.finishGuidedBind);\n const startUserAuth = usePluginAction(ACTION_KEYS.startUserAuth);\n const finishUserAuth = usePluginAction(ACTION_KEYS.finishUserAuth);\n const testRoute = usePluginAction(ACTION_KEYS.testRoute);\n const checkPermissions = usePluginAction(ACTION_KEYS.checkPermissions);\n const retryFailedDeliveries = usePluginAction(ACTION_KEYS.retryFailedDeliveries);\n const {\n configJson,\n setConfigJson,\n loading,\n saving,\n error,\n save,\n test,\n } = useSettingsConfig(pluginApiId);\n const [notice, setNotice] = useState<{ tone: \"success\" | \"error\" | \"info\"; text: string } | null>(null);\n const [toast, setToast] = useState<{ tone: \"success\" | \"error\" | \"info\"; text: string } | null>(null);\n const [showBindPanel, setShowBindPanel] = useState(false);\n const [bindPanelTitle, setBindPanelTitle] = useState(\"\u7ED1\u5B9A\u65B0\u7684\u98DE\u4E66\u673A\u5668\u4EBA\");\n const [bindMethod, setBindMethod] = useState<BindMethod>(\"guided\");\n const [binding, setBinding] = useState(false);\n const [checking, setChecking] = useState(false);\n const [lastCheckAt, setLastCheckAt] = useState<string | null>(null);\n const [checkReportItems, setCheckReportItems] = useState<CheckReportItem[]>([]);\n const [startingGuidedBind, setStartingGuidedBind] = useState(false);\n const [finishingGuidedBind, setFinishingGuidedBind] = useState(false);\n const [startingUserAuthProfileName, setStartingUserAuthProfileName] = useState<string | null>(null);\n const [finishingUserAuthProfileName, setFinishingUserAuthProfileName] = useState<string | null>(null);\n const [userAuthResults, setUserAuthResults] = useState<Record<string, UserAuthResult>>({});\n const [guidedBindResult, setGuidedBindResult] = useState<GuidedBindResult | null>(null);\n const [testingRouteId, setTestingRouteId] = useState<string | null>(null);\n const [checkingPermissions, setCheckingPermissions] = useState(false);\n const [permissionCheck, setPermissionCheck] = useState<PermissionCheckResult | null>(null);\n const [retryingQueue, setRetryingQueue] = useState(false);\n const [importConfigText, setImportConfigText] = useState(\"\");\n const [importConfigError, setImportConfigError] = useState<string | null>(null);\n const [fixingRouteId, setFixingRouteId] = useState<string | null>(null);\n const [routeTestResults, setRouteTestResults] = useState<Record<string, { tone: \"success\" | \"error\"; text: string }>>({});\n const [checkingConnectionId, setCheckingConnectionId] = useState<string | null>(null);\n const [connectionCheckResults, setConnectionCheckResults] = useState<Record<string, BotCheckState>>({});\n const [showFeishuTestGuide, setShowFeishuTestGuide] = useState(false);\n const [bindForm, setBindForm] = useState<BindFormState>({\n displayName: \"\u98DE\u4E66\u673A\u5668\u4EBA\",\n botAliases: \"\",\n profileName: \"\",\n appId: \"\",\n appSecret: \"\",\n appSecretRef: \"\",\n });\n const [showEntryWizard, setShowEntryWizard] = useState(false);\n const [savedEntry, setSavedEntry] = useState<{ routeId: string; at: string } | null>(null);\n const [showAdvancedSettings, setShowAdvancedSettings] = useState(false);\n const [activeAdvancedPanel, setActiveAdvancedPanel] = useState<AdvancedPanelKey>(\"auth\");\n const [activeMainTab, setActiveMainTab] = useState<MainTabKey>(() => initialMainTab());\n const [expandedEntryRouteId, setExpandedEntryRouteId] = useState<string | null>(null);\n const [chatSearchQuery, setChatSearchQuery] = useState(\"\u667A\u80FD\u4F53\");\n const [userSearchQuery, setUserSearchQuery] = useState(\"\u5F20\");\n const [wizardDraft, setWizardDraft] = useState<EntryWizardDraft>({\n matchType: \"keyword\",\n keyword: \"paperclip\",\n replyMode: \"thread\",\n });\n\n useEffect(() => {\n if (!toast) return undefined;\n const timer = window.setTimeout(() => setToast(null), 4200);\n return () => window.clearTimeout(timer);\n }, [toast]);\n\n useEffect(() => {\n const syncFromHash = () => setActiveMainTab(mainTabFromHash(window.location.hash));\n syncFromHash();\n window.addEventListener(\"hashchange\", syncFromHash);\n return () => window.removeEventListener(\"hashchange\", syncFromHash);\n }, []);\n\n const companies = catalog.data?.companies ?? [];\n const allAgentOptions = companies.flatMap((company) =>\n company.agents.map((agent) => ({ company, agent }))\n );\n const connections = configJson.connections ?? [];\n const routes = configJson.routes ?? [];\n const baseSinks = configJson.baseSinks ?? [];\n const capabilityOverrides = (configJson.capabilities ?? []) as FeishuCapabilityConfig[];\n const capabilityGroups = capabilityCenter.data?.groups ?? [];\n const enabledCapabilityCount = capabilityGroups\n .flatMap((group) => group.capabilities)\n .filter((capability) => capability.enabled).length;\n const profiles = profileCatalog.data?.profiles ?? [];\n const profileError = profileCatalog.data?.error ?? profileCatalog.error?.message;\n const suggestedNewProfileName = suggestedBindProfileName(profiles);\n const activeConnections = connections.filter((connection) => connection.enabled !== false);\n const availableProfileNames = new Set(profiles.map((profile) => profile.name));\n const usableConnections = activeConnections.filter((connection) => availableProfileNames.has(connection.profileName));\n const missingProfileConnections = activeConnections.filter((connection) => !availableProfileNames.has(connection.profileName));\n const firstEnabledConnection = activeConnections[0] ?? connections[0];\n const preferredConnection = usableConnections[0] ?? firstEnabledConnection;\n const suggestedProfileName = firstEnabledConnection?.profileName || \"paperclip-feishu-bot\";\n const runtimeHint = deploymentHint();\n const connectedProfile = profiles.find((profile) => profile.name === firstEnabledConnection?.profileName);\n const directoryProfileName = profiles.find((profile) => profile.user)?.name\n ?? connectedProfile?.name\n ?? firstEnabledConnection?.profileName\n ?? \"\";\n const directoryParams = useMemo(() => ({\n profileName: directoryProfileName,\n chatQuery: chatSearchQuery,\n userQuery: userSearchQuery,\n }), [directoryProfileName, chatSearchQuery, userSearchQuery]);\n const directoryCatalog = usePluginData<DirectoryData>(DATA_KEYS.directory, directoryParams);\n const hasConnection = activeConnections.some((connection) => connection.profileName);\n const hasUsableConnection = usableConnections.length > 0;\n const enabledRouteCount = routes.filter((route) => route.enabled !== false).length;\n const isSendingRealMessages = configJson.dryRunCli !== true;\n const isListening = configJson.enableEventSubscriber === true;\n const runningOnLocalhost = isLocalRuntime();\n\n const routeSummaries = useMemo(() => routes.map((route) => {\n const company = resolveCompany(route, companies);\n const agent = resolveAgent(route, company);\n return { route, company, agent };\n }), [companies, routes]);\n const enabledRouteSummaries = routeSummaries.filter(({ route }) => route.enabled !== false);\n const firstEnabledRouteSummary = routeSummaries.find(({ route }) => route.enabled !== false) ?? routeSummaries[0] ?? null;\n const firstRouteConnection = firstEnabledRouteSummary?.route.connectionId\n ? connections.find((connection) => connection.id === firstEnabledRouteSummary.route.connectionId) ?? preferredConnection\n : preferredConnection;\n const firstRouteProfile = profiles.find((profile) => profile.name === firstRouteConnection?.profileName);\n const firstRouteConnectionReady = Boolean(firstRouteConnection?.profileName && availableProfileNames.has(firstRouteConnection.profileName));\n const enabledRoutesWithMissingConnection = enabledRouteSummaries.filter(({ route }) => {\n const connection = route.connectionId\n ? connections.find((candidate) => candidate.id === route.connectionId)\n : preferredConnection;\n return !connection?.profileName || !availableProfileNames.has(connection.profileName);\n }).length;\n const firstMissingRouteSummary = enabledRouteSummaries.find(({ route }) => {\n const connection = route.connectionId\n ? connections.find((candidate) => candidate.id === route.connectionId)\n : preferredConnection;\n return !connection?.profileName || !availableProfileNames.has(connection.profileName);\n }) ?? null;\n const connectionToFix = firstMissingRouteSummary?.route.connectionId\n ? connections.find((connection) => connection.id === firstMissingRouteSummary.route.connectionId)\n : missingProfileConnections[0] ?? null;\n const quickSmokeText = feishuSmokeText(firstEnabledRouteSummary?.route, firstRouteConnection, firstRouteProfile);\n const smokeText = feishuTaskTestText(firstEnabledRouteSummary?.route, firstRouteConnection, firstRouteProfile);\n const currentBotName = primaryMentionName(firstRouteConnection, firstRouteProfile ?? connectedProfile);\n const routeUsesOldBotKeyword = Boolean(\n firstEnabledRouteSummary?.route.matchType === \"regex\"\n && firstEnabledRouteSummary.route.regex?.includes(\"\u9510\u601D\")\n && currentBotName\n && !firstEnabledRouteSummary.route.regex.includes(currentBotName),\n );\n const canTryFeishuSmokeTest = firstRouteConnectionReady && enabledRouteCount > 0 && isListening && isSendingRealMessages;\n const connectionUsageCounts = useMemo(() => {\n const counts = new Map<string, number>();\n const fallbackConnectionId = preferredConnection?.id;\n for (const route of routes) {\n if (route.enabled === false) continue;\n const connectionId = route.connectionId || fallbackConnectionId;\n if (!connectionId) continue;\n counts.set(connectionId, (counts.get(connectionId) ?? 0) + 1);\n }\n return counts;\n }, [routes, preferredConnection?.id]);\n const activeConnectionLabels = activeConnections\n .map((connection) => {\n const label = appLabel(connection, profiles.find((profile) => profile.name === connection.profileName));\n const routeCount = connectionUsageCounts.get(connection.id) ?? 0;\n const profileReady = availableProfileNames.has(connection.profileName);\n return `${label}\uFF08${profileReady ? `${routeCount} \u6761\u5165\u53E3` : \"profile \u7F3A\u5931\"}\uFF09`;\n })\n .filter(Boolean);\n const runtimeStatusLabel = isListening && isSendingRealMessages\n ? \"\u76D1\u542C\u4E2D\"\n : isListening\n ? \"\u76D1\u542C\u4E2D\uFF0C\u6A21\u62DF\u56DE\u590D\"\n : \"\u672A\u76D1\u542C\";\n const runtimeStatusDetail = isListening && isSendingRealMessages\n ? \"\u771F\u5B9E\u56DE\u590D\u5DF2\u5F00\u542F\"\n : `${isListening ? \"\u5DF2\u63A5\u6536\u4E8B\u4EF6\" : \"\u4E0D\u4F1A\u81EA\u52A8\u63A5\u6536\u98DE\u4E66\u6D88\u606F\"} \u00B7 ${isSendingRealMessages ? \"\u771F\u5B9E\u56DE\u590D\" : \"\u6D4B\u8BD5\u6A21\u5F0F\"}`;\n const feishuEventRecords = useMemo(() => {\n const records = connectorStatus.data?.recentRecords ?? [];\n return records.filter(isInboundMessageRecord);\n }, [connectorStatus.data?.recentRecords]);\n const latestFeishuEvent = feishuEventRecords[0] ?? null;\n const latestOperationalRecord = (connectorStatus.data?.recentRecords ?? [])\n .find((record) => !isInboundMessageRecord(record)) ?? null;\n const feishuEventEmptyText = connectorStatus.data?.lastInboundEventAt\n ? `\u8FD8\u6CA1\u6709\u65B0\u7684\u98DE\u4E66\u6D88\u606F\u4E8B\u4EF6\u3002\u4E0A\u6B21\u8FDB\u5165\u63D2\u4EF6\u7684\u98DE\u4E66\u6D88\u606F\u662F ${connectorStatus.data.lastInboundEventAt}\uFF1B\u5982\u679C\u521A\u53D1\u8FC7\u6D4B\u8BD5\u6D88\u606F\uFF0C\u8BF7\u5148\u786E\u8BA4\u6D88\u606F\u53D1\u7ED9\u4E86\u5F53\u524D\u5165\u53E3\u7ED1\u5B9A\u7684\u673A\u5668\u4EBA\u3002`\n : \"\u8FD8\u6CA1\u6709\u6536\u5230\u98DE\u4E66\u6D88\u606F\u4E8B\u4EF6\u3002\u8BF7\u786E\u8BA4\u4F60 @ \u7684\u673A\u5668\u4EBA\u5C31\u662F\u4E0B\u65B9\u5165\u53E3\u9009\u62E9\u7684\u673A\u5668\u4EBA\u3002\";\n const statusTitle = !hasConnection\n ? \"\u5F85\u63A5\u5165\u98DE\u4E66\u673A\u5668\u4EBA\"\n : !hasUsableConnection\n ? \"\u5DF2\u914D\u7F6E\u673A\u5668\u4EBA\uFF0C\u4F46\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u7F3A\u5C11\u6388\u6743\"\n : enabledRouteCount === 0\n ? \"\u5DF2\u6DFB\u52A0\u98DE\u4E66\u673A\u5668\u4EBA\uFF0C\u5F85\u914D\u7F6E\u6D88\u606F\u5165\u53E3\"\n : enabledRoutesWithMissingConnection > 0\n ? \"\u6709\u5165\u53E3\u4F7F\u7528\u7684\u98DE\u4E66\u673A\u5668\u4EBA\u4E0D\u53EF\u8FD0\u884C\uFF0C\u9700\u8981\u91CD\u65B0\u7ED1\u5B9A\u6216\u6362\u673A\u5668\u4EBA\"\n : !isListening\n ? \"\u5DF2\u914D\u7F6E\u5165\u53E3\uFF0C\u5F85\u5F00\u542F\u98DE\u4E66\u6D88\u606F\u76D1\u542C\"\n : !isSendingRealMessages\n ? \"\u5F53\u524D\u4E3A\u6D4B\u8BD5\u6A21\u5F0F\uFF0C\u6682\u4E0D\u4F1A\u771F\u5B9E\u56DE\u590D\u98DE\u4E66\"\n : \"\u673A\u5668\u4EBA\u3001\u5165\u53E3\u548C\u76D1\u542C\u90FD\u5DF2\u5C31\u7EEA\uFF0C\u5EFA\u8BAE\u5B8C\u6210\u4E00\u6B21\u98DE\u4E66\u771F\u5B9E\u6D4B\u8BD5\";\n const overviewTitle = !hasConnection\n ? \"\u5148\u63A5\u5165\u4E00\u4E2A\u98DE\u4E66\u673A\u5668\u4EBA\"\n : enabledRoutesWithMissingConnection > 0\n ? \"\u98DE\u4E66\u5165\u53E3\u9700\u8981\u4FEE\u590D\"\n : hasUsableConnection\n ? \"\u98DE\u4E66\u5DF2\u7ECF\u8FDE\u63A5\u5230 Paperclip\"\n : \"\u98DE\u4E66\u673A\u5668\u4EBA\u8FD8\u6CA1\u6709\u6388\u6743\u5230\u5F53\u524D\u73AF\u5883\";\n const nextStepKind: NextStepKind = !hasConnection\n ? \"bind\"\n : !hasUsableConnection\n ? \"rebind\"\n : enabledRouteCount === 0\n ? \"entry\"\n : enabledRoutesWithMissingConnection > 0\n ? \"edit-entry\"\n : !isListening\n ? \"enable-listen\"\n : !isSendingRealMessages\n ? \"enable-real\"\n : \"test\";\n const nextStepCopy = (() => {\n if (nextStepKind === \"bind\") {\n return {\n title: \"\u4E0B\u4E00\u6B65\uFF1A\u5148\u63A5\u5165\u98DE\u4E66\u673A\u5668\u4EBA\",\n detail: \"\u8FD9\u662F\u552F\u4E00\u5FC5\u987B\u5148\u505A\u7684\u4E8B\u3002\u63A5\u5165\u540E\u518D\u9009\u62E9\u201C\u54EA\u4E9B\u6D88\u606F\u8FDB\u6765\u3001\u4EA4\u7ED9\u54EA\u4E2A\u667A\u80FD\u4F53\u201D\u3002\",\n };\n }\n if (nextStepKind === \"rebind\") {\n const label = appLabel(connectionToFix ?? firstEnabledConnection, profiles.find((profile) => profile.name === connectionToFix?.profileName));\n return {\n title: \"\u4E0B\u4E00\u6B65\uFF1A\u4FEE\u590D\u673A\u5668\u4EBA\u6388\u6743\",\n detail: `\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u6CA1\u6709\u8BFB\u5230\u201C${label}\u201D\u3002\u5148\u5237\u65B0\u5217\u8868\uFF1B\u5982\u679C\u4ECD\u7136\u6CA1\u6709\uFF0C\u5C31\u5728\u5F39\u7A97\u91CC\u91CD\u65B0\u7ED1\u5B9A\u8FD9\u4E2A\u673A\u5668\u4EBA\u3002`,\n };\n }\n if (nextStepKind === \"entry\") {\n return {\n title: \"\u4E0B\u4E00\u6B65\uFF1A\u65B0\u589E\u4E00\u6761\u4E1A\u52A1\u5165\u53E3\",\n detail: \"\u5165\u53E3\u51B3\u5B9A\u201C\u54EA\u4E2A\u98DE\u4E66\u7FA4\u6216\u5173\u952E\u8BCD\u8FDB\u6765\u3001\u7528\u54EA\u4E2A\u673A\u5668\u4EBA\u6536\u3001\u4EA4\u7ED9\u54EA\u4E2A Paperclip \u667A\u80FD\u4F53\u201D\u3002\",\n };\n }\n if (nextStepKind === \"edit-entry\") {\n return {\n title: \"\u4E0B\u4E00\u6B65\uFF1A\u4FEE\u590D\u5165\u53E3\u4F7F\u7528\u7684\u673A\u5668\u4EBA\",\n detail: \"\u6709\u5165\u53E3\u8FD8\u6307\u5411\u4E0D\u53EF\u8FD0\u884C\u7684\u673A\u5668\u4EBA\u3002\u7F16\u8F91\u8FD9\u6761\u5165\u53E3\uFF0C\u6362\u6210\u53EF\u8FD0\u884C\u673A\u5668\u4EBA\uFF0C\u6216\u91CD\u65B0\u7ED1\u5B9A\u539F\u673A\u5668\u4EBA\u3002\",\n };\n }\n if (nextStepKind === \"enable-listen\") {\n return {\n title: \"\u4E0B\u4E00\u6B65\uFF1A\u5F00\u542F\u81EA\u52A8\u76D1\u542C\",\n detail: \"\u4E0D\u5F00\u76D1\u542C\u65F6\uFF0C\u98DE\u4E66\u91CC\u53D1\u6D88\u606F\u4E0D\u4F1A\u81EA\u52A8\u8FDB\u5165 Paperclip\u3002\u5F00\u542F\u540E\u518D\u53BB\u98DE\u4E66\u5B9E\u6D4B\u3002\",\n };\n }\n if (nextStepKind === \"enable-real\") {\n return {\n title: \"\u4E0B\u4E00\u6B65\uFF1A\u5F00\u542F\u771F\u5B9E\u56DE\u590D\",\n detail: \"\u5F53\u524D\u53EA\u662F\u6A21\u62DF\u6A21\u5F0F\u3002\u8981\u770B\u5230\u98DE\u4E66\u91CC\u771F\u5B9E\u56DE\u590D\uFF0C\u9700\u8981\u5F00\u542F\u771F\u5B9E\u53D1\u9001\u3002\",\n };\n }\n return {\n title: \"\u4E0B\u4E00\u6B65\uFF1A\u53BB\u98DE\u4E66\u91CC\u53D1\u4E00\u53E5\u771F\u5B9E\u6D4B\u8BD5\",\n detail: `\u628A\u6D4B\u8BD5\u8BDD\u672F\u53D1\u5230\u76EE\u6807\u4F1A\u8BDD\uFF1A${smokeText}`,\n };\n })();\n const serverDeployConnection = firstRouteConnection ?? preferredConnection ?? firstEnabledConnection;\n const serverDeployCommands = buildServerDeployCommands(serverDeployConnection);\n const activeSubscriberCount = connectorStatus.data?.subscribers\n ?.filter((subscriber) => activeConnections.some((connection) => connection.id === subscriber.connectionId))\n .length ?? 0;\n const capabilityChecks: CheckReportItem[] = [\n {\n tone: hasUsableConnection && !profileError && missingProfileConnections.length === 0\n ? \"success\"\n : hasConnection\n ? \"warning\"\n : \"error\",\n title: \"\u98DE\u4E66\u5E94\u7528\u6388\u6743\",\n detail: hasUsableConnection && !profileError\n ? missingProfileConnections.length > 0\n ? `\u5DF2\u53D1\u73B0 ${profiles.length} \u4E2A lark-cli profile\uFF1B${usableConnections.length} \u4E2A\u673A\u5668\u4EBA\u53EF\u8FD0\u884C\uFF0C${missingProfileConnections.length} \u4E2A\u673A\u5668\u4EBA\u7F3A\u5C11\u5F53\u524D\u73AF\u5883\u6388\u6743\u3002`\n : `\u5DF2\u53D1\u73B0 ${profiles.length} \u4E2A lark-cli profile\uFF0C\u673A\u5668\u4EBA\u6C60 ${usableConnections.length} \u4E2A\u53EF\u8FD0\u884C\u3002`\n : hasConnection\n ? `\u5DF2\u914D\u7F6E\u673A\u5668\u4EBA\uFF0C\u4F46\u8BFB\u53D6 lark-cli profile \u5F02\u5E38\uFF1A${profileError ?? \"\u5F53\u524D\u73AF\u5883\u672A\u8FD4\u56DE\u6388\u6743\u5217\u8868\"}`\n : \"\u8FD8\u6CA1\u6709\u628A\u98DE\u4E66\u673A\u5668\u4EBA\u52A0\u5165\u673A\u5668\u4EBA\u6C60\u3002\",\n },\n {\n tone: isListening && activeSubscriberCount > 0 ? \"success\" : isListening ? \"warning\" : \"warning\",\n title: \"\u63A5\u6536\u98DE\u4E66\u6D88\u606F\",\n detail: isListening\n ? activeSubscriberCount > 0\n ? `\u5DF2\u770B\u5230 ${activeSubscriberCount} \u4E2A\u76D1\u542C\u8FDB\u7A0B\u3002`\n : \"\u76D1\u542C\u5F00\u5173\u5DF2\u5F00\uFF0C\u4F46\u6682\u65F6\u6CA1\u770B\u5230\u76D1\u542C\u8FDB\u7A0B\uFF1B\u4FDD\u5B58\u914D\u7F6E\u6216\u91CD\u542F\u670D\u52A1\u540E\u518D\u68C0\u67E5\u3002\"\n : \"\u76D1\u542C\u5F00\u5173\u672A\u5F00\u542F\uFF0C\u98DE\u4E66\u6D88\u606F\u4E0D\u4F1A\u81EA\u52A8\u8FDB\u5165 Paperclip\u3002\",\n },\n {\n tone: isSendingRealMessages ? \"success\" : \"warning\",\n title: \"\u56DE\u590D\u98DE\u4E66\u6D88\u606F\",\n detail: isSendingRealMessages ? \"\u771F\u5B9E\u56DE\u590D\u5DF2\u5F00\u542F\u3002\" : \"\u5F53\u524D\u662F\u6A21\u62DF\u6A21\u5F0F\uFF0C\u53EA\u9A8C\u8BC1\u6D41\u7A0B\u4E0D\u771F\u6B63\u53D1\u56DE\u98DE\u4E66\u3002\",\n },\n {\n tone: isSendingRealMessages ? \"success\" : \"warning\",\n title: \"\u4E0B\u8F7D\u98DE\u4E66\u9644\u4EF6\",\n detail: isSendingRealMessages\n ? \"\u771F\u5B9E\u4EFB\u52A1\u91CC\u4F1A\u628A\u98DE\u4E66\u56FE\u7247\u3001\u6587\u4EF6\u3001\u97F3\u9891\u548C\u89C6\u9891\u4E0A\u4F20\u6210 Paperclip \u9644\u4EF6\u3002\"\n : \"\u6A21\u62DF\u6A21\u5F0F\u53EA\u8BB0\u5F55\u9644\u4EF6\u540D\u79F0\uFF0C\u4E0D\u4F1A\u4E0B\u8F7D\u4E0A\u4F20\u3002\",\n },\n {\n tone: directoryCatalog.error || directoryCatalog.data?.chatError || directoryCatalog.data?.userError ? \"warning\" : \"success\",\n title: \"\u641C\u7D22\u7FA4\u548C\u8054\u7CFB\u4EBA\",\n detail: directoryCatalog.error || directoryCatalog.data?.chatError || directoryCatalog.data?.userError\n ? \"\u5F53\u524D\u641C\u7D22\u76EE\u5F55\u6709\u62A5\u9519\uFF0C\u53EF\u80FD\u5F71\u54CD\u9009\u62E9\u7FA4/\u8054\u7CFB\u4EBA\u3002\u5DF2\u5EFA\u597D\u7684\u5165\u53E3\u4E0D\u53D7\u5F71\u54CD\u3002\"\n : \"\u53EF\u4EE5\u8BFB\u53D6\u5F53\u524D profile \u53EF\u89C1\u7684\u7FA4\u548C\u8054\u7CFB\u4EBA\uFF0C\u7528\u4E8E\u65B0\u589E\u5165\u53E3\u3002\",\n },\n {\n tone: baseSinks.length > 0 ? \"success\" : \"warning\",\n title: \"\u5199\u5165\u591A\u7EF4\u8868\u683C\",\n detail: baseSinks.length > 0\n ? `\u5DF2\u914D\u7F6E ${baseSinks.length} \u6761\u591A\u7EF4\u8868\u683C\u5199\u5165\u89C4\u5219\u3002`\n : \"\u672A\u914D\u7F6E\u3002\u6CA1\u6709\u9700\u6C42\u6C89\u6DC0\u5230 Base \u7684\u573A\u666F\u65F6\u53EF\u4EE5\u7559\u7A7A\u3002\",\n },\n ];\n const productionMonitor = connectorStatus.data?.monitor;\n const productionMonitorChecks = productionMonitor?.checks ?? [];\n const retryQueue = connectorStatus.data?.retryQueue;\n const primaryRouteSummary = firstEnabledRouteSummary;\n const primaryRouteConnectionLabel = appLabel(firstRouteConnection, firstRouteProfile ?? connectedProfile);\n const setupProgressSteps = [\n {\n done: hasUsableConnection,\n title: \"\u9009\u62E9\u98DE\u4E66\u673A\u5668\u4EBA\",\n detail: hasUsableConnection\n ? `${primaryRouteConnectionLabel} \u53EF\u7528\u4E8E\u6536\u53D1\u98DE\u4E66\u6D88\u606F\u3002`\n : \"\u5148\u7ED1\u5B9A\u4E00\u4E2A\u516C\u53F8\u901A\u7528\u673A\u5668\u4EBA\u6216\u4E1A\u52A1\u4E13\u7528\u673A\u5668\u4EBA\u3002\",\n action: hasUsableConnection ? (\n <button key=\"view-bots\" type=\"button\" style={buttonStyle} onClick={() => selectMainTab(\"robots\")}>\u67E5\u770B\u673A\u5668\u4EBA</button>\n ) : (\n <button key=\"bind-bot\" type=\"button\" style={primaryButtonStyle} onClick={() => openBindPanel(undefined, \"guided\")}>\u7ED1\u5B9A\u673A\u5668\u4EBA</button>\n ),\n },\n {\n done: enabledRouteCount > 0,\n title: \"\u5EFA\u7ACB\u4E1A\u52A1\u5165\u53E3\",\n detail: enabledRouteCount > 0\n ? `${enabledRouteCount} \u6761\u5165\u53E3\u6B63\u5728\u628A\u98DE\u4E66\u6D88\u606F\u4EA4\u7ED9 Paperclip\u3002`\n : \"\u51B3\u5B9A\u54EA\u4E2A\u7FA4\u3001\u5173\u952E\u8BCD\u6216\u8054\u7CFB\u4EBA\u8FDB\u5165\u54EA\u4E2A\u667A\u80FD\u4F53\u3002\",\n action: (\n <button key=\"manage-entry\" type=\"button\" style={enabledRouteCount > 0 ? buttonStyle : primaryButtonStyle} onClick={() => openEntryWizard()}>\n {enabledRouteCount > 0 ? \"\u7BA1\u7406\u5165\u53E3\" : \"\u65B0\u589E\u5165\u53E3\"}\n </button>\n ),\n },\n {\n done: canTryFeishuSmokeTest,\n title: \"\u98DE\u4E66\u91CC\u771F\u5B9E\u6D4B\u8BD5\",\n detail: canTryFeishuSmokeTest\n ? \"\u76D1\u542C\u548C\u771F\u5B9E\u56DE\u590D\u5DF2\u5F00\u542F\uFF0C\u53EF\u4EE5\u53BB\u98DE\u4E66\u53D1\u6D4B\u8BD5\u8BDD\u672F\u3002\"\n : \"\u786E\u8BA4\u76D1\u542C\u3001\u771F\u5B9E\u56DE\u590D\u548C\u5165\u53E3\u673A\u5668\u4EBA\u90FD\u5C31\u7EEA\u540E\u518D\u5B9E\u6D4B\u3002\",\n action: (\n <button key=\"go-test\" type=\"button\" style={canTryFeishuSmokeTest ? primaryButtonStyle : buttonStyle} onClick={() => selectMainTab(\"test\")}>\n \u53BB\u6D4B\u8BD5\n </button>\n ),\n },\n ];\n const realTestPipeline = [\n {\n done: firstRouteConnectionReady,\n label: \"\u673A\u5668\u4EBA\u53EF\u7528\",\n detail: firstRouteConnectionReady ? primaryRouteConnectionLabel : \"\u5F53\u524D\u5165\u53E3\u673A\u5668\u4EBA\u672A\u5728\u8FD0\u884C\u73AF\u5883\u4E2D\u8BFB\u5230\u3002\",\n },\n {\n done: enabledRouteCount > 0,\n label: \"\u5165\u53E3\u5DF2\u5EFA\",\n detail: primaryRouteSummary ? routeTitle(primaryRouteSummary.route, 0) : \"\u8FD8\u6CA1\u6709\u98DE\u4E66\u6D88\u606F\u5165\u53E3\u3002\",\n },\n {\n done: isListening,\n label: \"\u6B63\u5728\u76D1\u542C\",\n detail: isListening ? runtimeStatusLabel : \"\u672A\u5F00\u542F\u76D1\u542C\uFF0C\u98DE\u4E66\u6D88\u606F\u4E0D\u4F1A\u81EA\u52A8\u8FDB\u5165\u3002\",\n },\n {\n done: isSendingRealMessages,\n label: \"\u771F\u5B9E\u56DE\u590D\",\n detail: isSendingRealMessages ? \"\u667A\u80FD\u4F53\u5B8C\u6210\u540E\u4F1A\u56DE\u590D\u98DE\u4E66\u3002\" : \"\u5F53\u524D\u662F\u6A21\u62DF\u6A21\u5F0F\u3002\",\n },\n {\n done: isSendingRealMessages,\n label: \"\u9644\u4EF6\u5165\u5E93\",\n detail: isSendingRealMessages ? \"\u56FE\u7247\u548C\u6587\u4EF6\u4F1A\u4F5C\u4E3A\u4EFB\u52A1\u9644\u4EF6\u3002\" : \"\u6A21\u62DF\u6A21\u5F0F\u4E0D\u4E0B\u8F7D\u9644\u4EF6\u3002\",\n },\n ];\n\n function patchWizardDraft(patch: Partial<EntryWizardDraft>) {\n setWizardDraft((prev) => ({ ...prev, ...patch }));\n setNotice(null);\n }\n\n function selectChatForWizard(chat: DirectoryChatOption) {\n patchWizardDraft({\n matchType: \"chat\",\n chatId: chat.chatId,\n chatName: chat.name,\n });\n setNotice({ tone: \"success\", text: `\u5DF2\u9009\u62E9\u98DE\u4E66\u4F1A\u8BDD\uFF1A${chat.name}` });\n }\n\n function selectUserForWizard(user: DirectoryUserOption) {\n patchWizardDraft({\n matchType: \"user\",\n userOpenId: user.openId,\n userName: user.name,\n });\n setNotice({ tone: \"success\", text: `\u5DF2\u9009\u62E9\u53D1\u6D88\u606F\u4EBA\uFF1A${user.name}` });\n }\n\n function patchConfig(patch: Partial<ConfigRecord>) {\n setConfigJson((prev) => normalizeUiConfig({ ...prev, ...patch }));\n setNotice(null);\n setCheckReportItems([]);\n }\n\n function selectMainTab(tab: MainTabKey) {\n setActiveMainTab(tab);\n if (tab !== \"advanced\") {\n setShowAdvancedSettings(false);\n }\n const hash = mainTabs.find((item) => item.key === tab)?.hash;\n if (hash) {\n window.history.replaceState(null, \"\", `${window.location.pathname}${window.location.search}#${hash}`);\n }\n }\n\n function patchRoute(index: number, patch: Partial<FeishuRouteConfig>) {\n const next = [...routes];\n next[index] = { ...next[index], ...patch } as FeishuRouteConfig;\n patchConfig({ routes: next });\n }\n\n function patchConnectionById(connectionId: string, patch: Partial<FeishuConnectionConfig>) {\n patchConfig({\n connections: connections.map((connection) =>\n connection.id === connectionId\n ? { ...connection, ...patch }\n : connection\n ),\n });\n }\n\n function patchBaseSink(index: number, patch: Partial<FeishuBaseSinkConfig>) {\n const next = [...baseSinks];\n next[index] = { ...next[index], ...patch } as FeishuBaseSinkConfig;\n patchConfig({ baseSinks: next });\n }\n\n function patchCapability(key: string, patch: Partial<FeishuCapabilityConfig>) {\n const current = capabilityOverrides.find((capability) => capability.key === key);\n const nextCapability = { ...current, key, ...patch } as FeishuCapabilityConfig;\n const nextCapabilities = current\n ? capabilityOverrides.map((capability) => capability.key === key ? nextCapability : capability)\n : [...capabilityOverrides, nextCapability];\n patchConfig({ capabilities: nextCapabilities });\n }\n\n function patchCapabilityScope(key: string, scope: FeishuCapabilityScope) {\n patchCapability(key, {\n scope,\n connectionId: scope === \"bot\" ? preferredConnection?.id ?? activeConnections[0]?.id : undefined,\n routeId: scope === \"entry\" ? firstEnabledRouteSummary?.route.id ?? routes[0]?.id : undefined,\n agentId: scope === \"agent\" ? firstEnabledRouteSummary?.agent?.id ?? allAgentOptions[0]?.agent.id : undefined,\n });\n }\n\n async function addProfileToPool(profile: ProfileOption, options: { useForCurrentEntry?: boolean } = {}) {\n const existing = connections.find((connection) => connection.profileName === profile.name);\n const displayName = profileDisplayName(profile);\n const inferredAliases = splitBotAliases(profile.botName ?? displayName).filter((alias) => !isPlaceholderBotName(alias));\n const selected = existing\n ? {\n ...existing,\n enabled: true,\n appId: profile.appId ?? existing.appId,\n name: existing.name && existing.name !== existing.profileName ? existing.name : displayName,\n botAliases: connectionAliasList(existing).length > 0 ? connectionAliasList(existing) : inferredAliases,\n }\n : connectionFromProfile({\n index: connections.length,\n profileName: profile.name,\n appId: profile.appId ?? undefined,\n displayName,\n });\n const firstRouteId = firstEnabledRouteSummary?.route.id;\n const updatedConnections = existing\n ? connections.map((connection) => connection.profileName === profile.name ? selected : connection)\n : [...connections, selected];\n const nextConnections = !firstEnabledConnection || (options.useForCurrentEntry && !firstRouteId)\n ? [\n selected,\n ...updatedConnections.filter((connection) => connection.profileName !== profile.name),\n ]\n : updatedConnections;\n const nextRoutes = firstRouteId\n ? routes.map((route) => options.useForCurrentEntry && route.id === firstRouteId ? { ...route, connectionId: selected.id } : route)\n : routes;\n const nextConfig = normalizeUiConfig({\n ...configJson,\n connections: nextConnections,\n routes: nextRoutes,\n });\n setNotice({\n tone: \"info\",\n text: options.useForCurrentEntry\n ? `\u6B63\u5728\u628A\u6307\u5B9A\u5165\u53E3\u6539\u7528\u201C${appLabel(selected, profile)}\u201D...`\n : `\u6B63\u5728\u628A\u201C${appLabel(selected, profile)}\u201D\u52A0\u5165\u673A\u5668\u4EBA\u6C60...`,\n });\n try {\n await save(nextConfig);\n setConfigJson(nextConfig);\n profileCatalog.refresh();\n setNotice({\n tone: \"success\",\n text: options.useForCurrentEntry && firstRouteId\n ? `\u5DF2\u4FDD\u5B58\uFF1A\u6307\u5B9A\u5165\u53E3\u5DF2\u6539\u7528\u201C${appLabel(selected, profile)}\u201D\u3002\u5176\u4ED6\u98DE\u4E66\u673A\u5668\u4EBA\u4ECD\u7136\u4FDD\u7559\uFF0C\u53EF\u7ED9\u5176\u4ED6\u5165\u53E3\u4F7F\u7528\u3002`\n : `\u5DF2\u4FDD\u5B58\uFF1A\u5DF2\u6DFB\u52A0\u201C${appLabel(selected, profile)}\u201D\u3002\u540E\u7EED\u6BCF\u6761\u98DE\u4E66\u5165\u53E3\u90FD\u53EF\u4EE5\u5355\u72EC\u9009\u62E9\u673A\u5668\u4EBA\u3002`,\n });\n } catch (nextError) {\n setNotice({ tone: \"error\", text: readableError(nextError) });\n }\n }\n\n function addConnectionFromProfile(profile: ProfileOption) {\n void addProfileToPool(profile);\n }\n\n function openBindPanel(connection?: FeishuConnectionConfig, method: BindMethod = \"guided\") {\n const title = connection ? `\u91CD\u65B0\u7ED1\u5B9A\uFF1A${connection.name || connection.profileName}` : \"\u7ED1\u5B9A\u65B0\u7684\u98DE\u4E66\u673A\u5668\u4EBA\";\n setBindForm((prev) => ({\n ...prev,\n displayName: connection?.name || prev.displayName || \"\u98DE\u4E66\u673A\u5668\u4EBA\",\n botAliases: connection ? formatBotAliases(connection) : prev.botAliases,\n profileName: connection?.profileName || prev.profileName || suggestedNewProfileName,\n appId: connection?.appId || prev.appId,\n appSecret: \"\",\n appSecretRef: \"\",\n }));\n setGuidedBindResult(null);\n setBindMethod(method);\n setBindPanelTitle(title);\n setShowBindPanel(true);\n setNotice(null);\n }\n\n function openEntryWizard(connectionId?: string) {\n if (!hasConnection) {\n openBindPanel();\n setNotice({ tone: \"info\", text: \"\u5148\u9009\u62E9\u6216\u7ED1\u5B9A\u4E00\u4E2A\u98DE\u4E66\u673A\u5668\u4EBA\uFF0C\u7136\u540E\u518D\u65B0\u589E\u98DE\u4E66\u5165\u53E3\u3002\" });\n return;\n }\n selectMainTab(\"entries\");\n const existingSummary = routeSummaries.find((summary) => summary.company && summary.agent) ?? null;\n const company = existingSummary?.company ?? companies[0];\n const agent = existingSummary?.agent ?? company?.agents[0];\n const existingConnection = existingSummary?.route.connectionId\n ? connections.find((connection) => connection.id === existingSummary.route.connectionId)\n : null;\n setWizardDraft({\n connectionId: connectionId ?? existingConnection?.id ?? preferredConnection?.id,\n matchType: \"keyword\",\n keyword: \"paperclip\",\n replyMode: \"thread\",\n companyId: company?.id,\n targetAgentId: agent?.id,\n });\n setShowEntryWizard(true);\n setNotice(null);\n }\n\n function openEntryEditor(routeId?: string) {\n const route = routeId\n ? routes.find((item) => item.id === routeId)\n : firstEnabledRouteSummary?.route;\n if (!route) {\n openEntryWizard();\n return;\n }\n selectMainTab(\"entries\");\n setShowEntryWizard(false);\n setExpandedEntryRouteId(route.id);\n setNotice({ tone: \"info\", text: \"\u5DF2\u6253\u5F00\u5165\u53E3\u7F16\u8F91\u533A\uFF0C\u53EF\u4EE5\u6539\u5173\u952E\u8BCD\u3001\u5904\u7406\u4EBA\u6216\u56DE\u590D\u65B9\u5F0F\u3002\" });\n window.setTimeout(() => {\n document.getElementById(`product-entry-${route.id}`)?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }, 30);\n }\n\n function refreshProfilesWithNotice() {\n profileCatalog.refresh();\n setToast({ tone: \"info\", text: \"\u6B63\u5728\u5237\u65B0\u98DE\u4E66\u673A\u5668\u4EBA\u5217\u8868\u3002\" });\n setNotice({ tone: \"info\", text: \"\u6B63\u5728\u5237\u65B0\u98DE\u4E66\u673A\u5668\u4EBA\u5217\u8868\u3002\u6388\u6743\u5B8C\u6210\u540E\uFF0C\u5982\u679C\u8FD9\u91CC\u8FD8\u6CA1\u51FA\u73B0\uFF0C\u901A\u5E38\u662F\u5F53\u524D\u673A\u5668/\u670D\u52A1\u5668\u8FD8\u6CA1\u6709\u5B8C\u6210 lark-cli \u6388\u6743\u3002\" });\n }\n\n function openFeishuTestGuide() {\n selectMainTab(\"test\");\n setShowFeishuTestGuide((value) => !value);\n window.setTimeout(() => {\n document.getElementById(\"feishu-test-guide\")?.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n }, 30);\n }\n\n async function copySmokeText() {\n try {\n await navigator.clipboard.writeText(smokeText);\n setNotice({ tone: \"success\", text: `\u5DF2\u590D\u5236\u6D4B\u8BD5\u8BDD\u672F\uFF1A${smokeText}` });\n } catch {\n setNotice({ tone: \"info\", text: `\u8BF7\u590D\u5236\u8FD9\u53E5\u8BDD\u5230\u98DE\u4E66\u53D1\u9001\uFF1A${smokeText}` });\n }\n }\n\n async function copyServerDeployCommands() {\n try {\n await navigator.clipboard.writeText(serverDeployCommands);\n setNotice({ tone: \"success\", text: \"\u5DF2\u590D\u5236\u670D\u52A1\u5668\u90E8\u7F72\u547D\u4EE4\u3002App Secret \u4ECD\u9700\u5DE5\u7A0B\u5E08\u5728\u670D\u52A1\u5668\u5B89\u5168\u8F93\u5165\u3002\" });\n } catch {\n setNotice({ tone: \"info\", text: \"\u590D\u5236\u5931\u8D25\uFF0C\u8BF7\u5728\u4E91\u670D\u52A1\u5668\u90E8\u7F72\u9762\u677F\u91CC\u624B\u52A8\u590D\u5236\u547D\u4EE4\u3002\" });\n }\n }\n\n function exportedConfigText(): string {\n return JSON.stringify(portableConfig(configJson), null, 2);\n }\n\n async function copyConfigExport() {\n const text = exportedConfigText();\n try {\n await navigator.clipboard.writeText(text);\n setNotice({ tone: \"success\", text: \"\u5DF2\u590D\u5236\u98DE\u4E66\u8FDE\u63A5\u5668\u914D\u7F6E\u3002App Secret \u548C\u8FD0\u884C\u65F6\u6388\u6743 token \u4E0D\u4F1A\u5BFC\u51FA\u3002\" });\n } catch {\n setNotice({ tone: \"info\", text: \"\u590D\u5236\u5931\u8D25\uFF0C\u53EF\u4EE5\u5728\u5BFC\u51FA\u914D\u7F6E\u9762\u677F\u91CC\u624B\u52A8\u9009\u4E2D JSON\u3002\" });\n }\n }\n\n function previewConfigImport() {\n setImportConfigError(null);\n const trimmed = importConfigText.trim();\n if (!trimmed) {\n setImportConfigError(\"\u8BF7\u5148\u7C98\u8D34\u4E00\u6BB5\u914D\u7F6E JSON\u3002\");\n return;\n }\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"\u914D\u7F6E JSON \u5FC5\u987B\u662F\u5BF9\u8C61\u3002\");\n }\n const nextConfig = portableConfig(normalizeUiConfig(parsed as Record<string, unknown>));\n setConfigJson(nextConfig);\n setImportConfigText(JSON.stringify(nextConfig, null, 2));\n setToast({ tone: \"info\", text: \"\u5DF2\u5BFC\u5165\u5230\u9875\u9762\uFF0C\u70B9\u51FB\u201C\u4FDD\u5B58\u914D\u7F6E\u201D\u540E\u751F\u6548\u3002\" });\n setNotice({ tone: \"info\", text: \"\u5DF2\u5BFC\u5165\u5230\u9875\u9762\uFF0C\u70B9\u51FB\u201C\u4FDD\u5B58\u914D\u7F6E\u201D\u540E\u751F\u6548\uFF1BApp Secret \u9700\u8981\u5728\u5F53\u524D\u670D\u52A1\u5668\u91CD\u65B0\u7ED1\u5B9A\u3002\" });\n } catch (nextError) {\n setImportConfigError(readableError(nextError));\n }\n }\n\n function createEntryFromWizard() {\n const company = companies.find((item) => item.id === wizardDraft.companyId) ?? companies[0] ?? null;\n const agent = company?.agents.find((item) => item.id === wizardDraft.targetAgentId) ?? company?.agents[0] ?? null;\n const connection = connections.find((item) => item.id === wizardDraft.connectionId) ?? preferredConnection ?? connections[0] ?? null;\n\n if (!connection) {\n setNotice({ tone: \"error\", text: \"\u8FD8\u6CA1\u6709\u53EF\u7528\u7684\u98DE\u4E66\u673A\u5668\u4EBA\u3002\u8BF7\u5148\u5728\u201C\u98DE\u4E66\u5E94\u7528\u4E0E\u673A\u5668\u4EBA\u7ED1\u5B9A\u201D\u91CC\u7ED1\u5B9A\u6216\u6DFB\u52A0\u673A\u5668\u4EBA\u3002\" });\n return;\n }\n if (!company || !agent) {\n setNotice({ tone: \"error\", text: \"\u8FD8\u6CA1\u6709\u53EF\u7528\u7684 Paperclip \u516C\u53F8\u6216\u667A\u80FD\u4F53\u3002\u8BF7\u5148\u5728\u5B9E\u4F8B\u91CC\u521B\u5EFA\u667A\u80FD\u4F53\uFF0C\u518D\u56DE\u6765\u65B0\u589E\u98DE\u4E66\u5165\u53E3\u3002\" });\n return;\n }\n\n const matchType = wizardDraft.matchType;\n const nextRoute: FeishuRouteConfig = {\n id: `feishu-entry-${Date.now().toString(36)}`,\n connectionId: connection.id,\n enabled: true,\n priority: 10,\n matchType,\n companyId: company.id,\n companyRef: company.issuePrefix ?? company.name,\n targetAgentId: agent.id,\n targetAgentName: agent.name,\n replyMode: wizardDraft.replyMode,\n baseSinkId: wizardDraft.baseSinkId || undefined,\n ...(matchType === \"chat\" ? { chatId: wizardDraft.chatId ?? \"\", chatName: wizardDraft.chatName } : {}),\n ...(matchType === \"user\" ? { userOpenId: wizardDraft.userOpenId ?? \"\", userName: wizardDraft.userName } : {}),\n ...(matchType === \"keyword\" ? { keyword: wizardDraft.keyword || \"paperclip\" } : {}),\n ...(matchType === \"regex\" ? { regex: wizardDraft.regex ?? \"\" } : {}),\n };\n\n patchConfig({ routes: [...routes, nextRoute] });\n setShowEntryWizard(false);\n setNotice({ tone: \"success\", text: \"\u5DF2\u65B0\u589E\u98DE\u4E66\u5165\u53E3\u3002\u4FDD\u5B58\u914D\u7F6E\u540E\uFF0C\u5C31\u53EF\u4EE5\u6309\u8FD9\u4E2A\u5165\u53E3\u63A5\u6536\u98DE\u4E66\u6D88\u606F\u3002\" });\n }\n\n async function fixOldBotKeywordRoute() {\n const routeId = firstEnabledRouteSummary?.route.id;\n if (!routeId) return;\n const routeIndex = routes.findIndex((route) => route.id === routeId);\n if (routeIndex < 0) return;\n const nextRoutes = routes.map((route, index) => index === routeIndex\n ? {\n ...route,\n matchType: \"keyword\" as const,\n keyword: \"paperclip\",\n regex: undefined,\n }\n : route);\n const nextConfig = normalizeUiConfig({ ...configJson, routes: nextRoutes });\n setFixingRouteId(routeId);\n setNotice({ tone: \"info\", text: \"\u6B63\u5728\u628A\u65E7\u89E6\u53D1\u8BCD\u6539\u6210 paperclip...\" });\n try {\n await save(nextConfig);\n setConfigJson(nextConfig);\n setExpandedEntryRouteId(routeId);\n setNotice({ tone: \"success\", text: \"\u5DF2\u4FDD\u5B58\uFF1A\u8FD9\u4E2A\u5165\u53E3\u73B0\u5728\u6309\u5173\u952E\u8BCD paperclip \u89E6\u53D1\u3002\" });\n } catch (nextError) {\n setNotice({ tone: \"error\", text: readableError(nextError) });\n } finally {\n setFixingRouteId(null);\n }\n }\n\n async function startOfficialBindWizard() {\n const profileName = bindForm.profileName.trim() || suggestedNewProfileName;\n setStartingGuidedBind(true);\n setGuidedBindResult(null);\n setNotice(null);\n try {\n const result = await startGuidedBind({\n profileName,\n brand: \"feishu\",\n }) as GuidedBindResult;\n setGuidedBindResult(result);\n setBindForm((prev) => ({ ...prev, profileName }));\n setNotice({\n tone: \"info\",\n text: result.url\n ? \"\u5DF2\u751F\u6210\u98DE\u4E66\u6388\u6743\u94FE\u63A5\u3002\u6253\u5F00\u94FE\u63A5\u5B8C\u6210\u540E\uFF0C\u56DE\u5230\u8FD9\u91CC\u70B9\u201C\u6211\u5DF2\u5B8C\u6210\u6388\u6743\u201D\u3002\"\n : \"\u5DF2\u542F\u52A8\u98DE\u4E66\u5B98\u65B9\u7ED1\u5B9A\u5411\u5BFC\u3002\u5982\u679C\u6CA1\u6709\u770B\u5230\u94FE\u63A5\uFF0C\u8BF7\u67E5\u770B\u4E0B\u65B9\u8F93\u51FA\u6216\u7A0D\u540E\u5237\u65B0\u5DF2\u7ED1\u5B9A\u5E94\u7528\u3002\",\n });\n } catch (nextError) {\n setNotice({ tone: \"error\", text: readableError(nextError) });\n } finally {\n setStartingGuidedBind(false);\n }\n }\n\n async function finishOfficialBindWizard() {\n const profileName = bindForm.profileName.trim() || guidedBindResult?.profileName || suggestedNewProfileName;\n if (!profileName) {\n setNotice({ tone: \"error\", text: \"\u8BF7\u5148\u83B7\u53D6\u98DE\u4E66\u6388\u6743\u94FE\u63A5\u3002\" });\n return;\n }\n\n setFinishingGuidedBind(true);\n setNotice(null);\n try {\n const result = await finishGuidedBind({ profileName }) as FinishGuidedBindResult;\n if (!result.profile?.name) {\n throw new Error(\"\u6CA1\u6709\u8BFB\u53D6\u5230\u521A\u521A\u7ED1\u5B9A\u7684\u98DE\u4E66\u673A\u5668\u4EBA\u3002\u8BF7\u7A0D\u540E\u5237\u65B0\u518D\u8BD5\u3002\");\n }\n await addProfileToPool(result.profile);\n profileCatalog.refresh();\n setShowBindPanel(false);\n setNotice({\n tone: result.warning ? \"info\" : \"success\",\n text: result.warning ?? \"\u98DE\u4E66\u673A\u5668\u4EBA\u5DF2\u786E\u8BA4\u5E76\u52A0\u5165\u5F53\u524D\u914D\u7F6E\u3002\u4E0B\u4E00\u6B65\u53EF\u4EE5\u65B0\u589E\u98DE\u4E66\u5165\u53E3\u3002\",\n });\n } catch (nextError) {\n setNotice({ tone: \"error\", text: readableError(nextError) });\n } finally {\n setFinishingGuidedBind(false);\n }\n }\n\n async function startUserAuthFlow(profileName: string) {\n if (!profileName) {\n setNotice({ tone: \"error\", text: \"\u8BF7\u5148\u9009\u62E9\u4E00\u4E2A\u98DE\u4E66\u673A\u5668\u4EBA\u3002\" });\n return;\n }\n setStartingUserAuthProfileName(profileName);\n setNotice({ tone: \"info\", text: \"\u6B63\u5728\u751F\u6210\u98DE\u4E66\u7528\u6237\u6388\u6743\u94FE\u63A5...\" });\n try {\n const result = await startUserAuth({ profileName }) as UserAuthResult;\n setUserAuthResults((prev) => ({ ...prev, [profileName]: result }));\n setNotice({\n tone: \"info\",\n text: \"\u5DF2\u751F\u6210\u7528\u6237\u6388\u6743\u94FE\u63A5\u3002\u53EA\u6709\u8981\u8BBF\u95EE\u4E2A\u4EBA\u6587\u6863\u3001\u65E5\u5386\u3001\u90AE\u7BB1\u65F6\u624D\u9700\u8981\u8865\uFF1B\u666E\u901A\u673A\u5668\u4EBA\u6536\u53D1\u6D88\u606F\u4E0D\u7528\u8865\u3002\",\n });\n } catch (nextError) {\n setNotice({ tone: \"error\", text: readableError(nextError) });\n } finally {\n setStartingUserAuthProfileName(null);\n }\n }\n\n async function finishUserAuthFlow(profileName: string) {\n if (!profileName) {\n setNotice({ tone: \"error\", text: \"\u8BF7\u5148\u9009\u62E9\u4E00\u4E2A\u98DE\u4E66\u673A\u5668\u4EBA\u3002\" });\n return;\n }\n setFinishingUserAuthProfileName(profileName);\n setNotice({ tone: \"info\", text: \"\u6B63\u5728\u786E\u8BA4\u98DE\u4E66\u7528\u6237\u6388\u6743...\" });\n try {\n const result = await finishUserAuth({ profileName }) as UserAuthResult;\n setUserAuthResults((prev) => {\n const next = { ...prev };\n delete next[profileName];\n return next;\n });\n profileCatalog.refresh();\n const userName = result.profile?.user;\n setNotice({\n tone: userName ? \"success\" : \"info\",\n text: userName\n ? `\u5DF2\u8865\u5145\u7528\u6237\u6388\u6743\uFF1A${userName}\u3002`\n : \"\u5DF2\u786E\u8BA4\u6388\u6743\u6D41\u7A0B\uFF0C\u4F46 lark-cli \u6682\u65F6\u6CA1\u6709\u8FD4\u56DE\u7528\u6237\u59D3\u540D\uFF1B\u673A\u5668\u4EBA\u6536\u53D1\u6D88\u606F\u4E0D\u53D7\u5F71\u54CD\uFF0C\u53EF\u5237\u65B0\u5217\u8868\u518D\u770B\u3002\",\n });\n } catch (nextError) {\n setNotice({ tone: \"error\", text: readableError(nextError) });\n } finally {\n setFinishingUserAuthProfileName(null);\n }\n }\n\n async function bindNewFeishuApp() {\n const profileName = bindForm.profileName.trim() || suggestedNewProfileName;\n const displayName = bindForm.displayName.trim() || \"\u98DE\u4E66\u673A\u5668\u4EBA\";\n const botAliases = splitBotAliases(bindForm.botAliases || displayName).filter((alias) => !isPlaceholderBotName(alias));\n const appId = bindForm.appId.trim();\n const appSecret = bindForm.appSecret.trim();\n const appSecretRef = bindForm.appSecretRef.trim();\n if (!appId || (!appSecret && !appSecretRef)) {\n setNotice({ tone: \"error\", text: \"\u8BF7\u586B\u5199\u98DE\u4E66 App ID\uFF0C\u5E76\u8F93\u5165 App Secret \u6216 Paperclip Secret Ref\u3002\" });\n return;\n }\n\n setBinding(true);\n setNotice(null);\n try {\n const bindResult = await bindProfile({\n profileName,\n appId,\n appSecret: appSecret || undefined,\n appSecretRef: appSecret ? undefined : appSecretRef,\n brand: \"feishu\",\n }) as BindProfileResult;\n\n const resolvedProfileName = bindResult.profileName?.trim() || profileName;\n const resolvedAppId = bindResult.appId?.trim() || appId;\n const existingConnection = connections.find((connection) =>\n connection.profileName === resolvedProfileName || connection.appId === resolvedAppId\n );\n const nextConnection = existingConnection\n ? {\n ...existingConnection,\n profileName: resolvedProfileName,\n appId: resolvedAppId,\n name: displayName,\n botAliases,\n enabled: true,\n }\n : connectionFromProfile({\n index: connections.length,\n profileName: resolvedProfileName,\n appId: resolvedAppId,\n displayName,\n });\n nextConnection.botAliases = botAliases;\n const nextConfig = normalizeUiConfig({\n ...configJson,\n connections: existingConnection\n ? connections.map((connection) => connection.id === existingConnection.id ? nextConnection : connection)\n : [...connections, nextConnection],\n });\n await save(nextConfig);\n setConfigJson(nextConfig);\n profileCatalog.refresh();\n setBindForm({\n displayName: \"\u98DE\u4E66\u673A\u5668\u4EBA\",\n botAliases: \"\",\n profileName: \"\",\n appId: \"\",\n appSecret: \"\",\n appSecretRef: \"\",\n });\n setShowBindPanel(false);\n setNotice({\n tone: \"success\",\n text: bindResult.reusedExistingProfile\n ? `\u8FD9\u4E2A App ID \u5DF2\u7ECF\u7ED1\u5B9A\u8FC7\uFF0C\u5DF2\u590D\u7528\u300C${resolvedProfileName}\u300D\u5E76\u66F4\u65B0\u673A\u5668\u4EBA\u914D\u7F6E\u3002\u4E0B\u4E00\u6B65\u914D\u7F6E\u63A5\u6536\u89C4\u5219\u5373\u53EF\u6D4B\u8BD5\u3002`\n : \"\u98DE\u4E66\u5E94\u7528\u5DF2\u7ED1\u5B9A\uFF0C\u5E76\u5DF2\u6DFB\u52A0\u5230\u201C\u98DE\u4E66\u673A\u5668\u4EBA\u201D\u3002\u4E0B\u4E00\u6B65\u914D\u7F6E\u63A5\u6536\u89C4\u5219\u5373\u53EF\u6D4B\u8BD5\u3002\",\n });\n } catch (nextError) {\n setNotice({ tone: \"error\", text: readableError(nextError) });\n } finally {\n setBinding(false);\n }\n }\n\n async function saveCurrentConfig(options: { successText?: string; routeId?: string } = {}) {\n setNotice(null);\n try {\n await save(configJson);\n connectorStatus.refresh();\n const text = options.successText ?? \"\u5DF2\u4FDD\u5B58\u3002\u65B0\u7684\u98DE\u4E66\u76D1\u542C\u914D\u7F6E\u4F1A\u81EA\u52A8\u751F\u6548\u3002\";\n if (options.routeId) {\n setSavedEntry({ routeId: options.routeId, at: new Date().toLocaleTimeString() });\n }\n setToast({ tone: \"success\", text });\n setNotice({ tone: \"success\", text });\n } catch (nextError) {\n const text = readableError(nextError);\n setToast({ tone: \"error\", text });\n setNotice({ tone: \"error\", text });\n }\n }\n\n async function patchRuntimeAndSave(patch: Partial<ConfigRecord>, successText: string) {\n const nextConfig = normalizeUiConfig({ ...configJson, ...patch });\n setNotice(null);\n try {\n await save(nextConfig);\n setConfigJson(nextConfig);\n connectorStatus.refresh();\n setToast({ tone: \"success\", text: successText });\n setNotice({ tone: \"success\", text: successText });\n } catch (nextError) {\n const text = readableError(nextError);\n setToast({ tone: \"error\", text });\n setNotice({ tone: \"error\", text });\n }\n }\n\n function buildCheckReport(result: { valid: boolean; message?: string }): CheckReportItem[] {\n const activeSubscriberCount = connectorStatus.data?.subscribers\n ?.filter((subscriber) => activeConnections.some((connection) => connection.id === subscriber.connectionId))\n .length ?? 0;\n const latestRecord = connectorStatus.data?.recentRecords?.[0];\n const selectedProfileName = firstRouteConnection?.profileName ?? firstEnabledConnection?.profileName ?? \"\";\n const selectedProfile = firstEnabledRouteSummary ? firstRouteProfile : connectedProfile;\n const selectedConnectionLabel = appLabel(firstRouteConnection ?? firstEnabledConnection, selectedProfile);\n const routeTargetReady = Boolean(firstEnabledRouteSummary?.company && firstEnabledRouteSummary.agent && firstRouteConnectionReady);\n const items: CheckReportItem[] = [\n {\n tone: result.valid ? \"success\" : \"error\",\n title: \"Paperclip \u914D\u7F6E\",\n detail: result.valid ? \"\u57FA\u7840\u914D\u7F6E\u683C\u5F0F\u6B63\u5E38\uFF0C\u53EF\u4EE5\u7EE7\u7EED\u68C0\u67E5\u98DE\u4E66\u94FE\u8DEF\u3002\" : result.message ?? \"\u914D\u7F6E\u683C\u5F0F\u68C0\u67E5\u672A\u901A\u8FC7\u3002\",\n },\n ];\n\n if (!hasConnection) {\n items.push({\n tone: \"error\",\n title: \"\u98DE\u4E66\u673A\u5668\u4EBA\",\n detail: \"\u8FD8\u6CA1\u6709\u9009\u62E9\u98DE\u4E66\u673A\u5668\u4EBA\u3002\u5148\u70B9\u201C\u66F4\u6362\u201D\u6216\u201C\u7ED1\u5B9A\u65B0\u7684\u201D\u3002\",\n });\n } else if (profileError) {\n items.push({\n tone: \"error\",\n title: \"\u98DE\u4E66\u673A\u5668\u4EBA\",\n detail: `lark-cli \u8BFB\u53D6\u5931\u8D25\uFF1A${profileError}`,\n });\n } else if (!selectedProfile) {\n items.push({\n tone: \"warning\",\n title: \"\u98DE\u4E66\u673A\u5668\u4EBA\",\n detail: `\u5F53\u524D\u5165\u53E3\u4F7F\u7528\u201C${selectedConnectionLabel}\u201D\uFF08${selectedProfileName || \"\u672A\u914D\u7F6E profile\"}\uFF09\uFF0C\u4F46\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u6CA1\u6709\u8BFB\u5230\u5B83\u3002\u8BF7\u6362\u6210\u53EF\u8FD0\u884C\u673A\u5668\u4EBA\uFF0C\u6216\u91CD\u65B0\u7ED1\u5B9A\u8FD9\u4E2A\u673A\u5668\u4EBA\u3002`,\n });\n } else if (!selectedProfile.botName && selectedConnectionLabel !== \"\u98DE\u4E66\u5E94\u7528\" && selectedConnectionLabel !== selectedProfile.name) {\n items.push({\n tone: \"success\",\n title: \"\u98DE\u4E66\u673A\u5668\u4EBA\",\n detail: `\u5DF2\u770B\u5230 ${selectedProfileName}\uFF0C\u9875\u9762\u663E\u793A\u4E3A\u201C${selectedConnectionLabel}\u201D\u3002\u98DE\u4E66\u672A\u8FD4\u56DE\u5B98\u65B9\u673A\u5668\u4EBA\u540D\u65F6\u5148\u7528\u9875\u9762\u540D\u79F0\u5C55\u793A\uFF0C\u4E0D\u5F71\u54CD\u6536\u53D1\u6D88\u606F\u3002`,\n });\n } else if (!selectedProfile.botName) {\n items.push({\n tone: \"warning\",\n title: \"\u98DE\u4E66\u673A\u5668\u4EBA\",\n detail: `\u5DF2\u770B\u5230 ${selectedProfileName}\uFF0C\u4F46\u6CA1\u6709\u8BFB\u5230\u98DE\u4E66\u673A\u5668\u4EBA\u663E\u793A\u540D\u3002App \u6743\u9650\u6216 token \u53EF\u80FD\u9700\u8981\u786E\u8BA4\u3002`,\n });\n } else {\n items.push({\n tone: \"success\",\n title: \"\u98DE\u4E66\u673A\u5668\u4EBA\",\n detail: `\u5DF2\u7ED1\u5B9A ${activeConnections.length} \u4E2A\u673A\u5668\u4EBA\uFF1B\u7B2C\u4E00\u6761\u5165\u53E3\u4F7F\u7528\u201C${selectedProfile.botName}\u201D\u3002App ID\uFF1A${maskTechnicalId(selectedProfile.appId ?? firstRouteConnection?.appId)}`,\n });\n }\n\n if (enabledRouteCount === 0) {\n items.push({\n tone: \"error\",\n title: \"\u6D88\u606F\u5165\u53E3\",\n detail: \"\u8FD8\u6CA1\u6709\u542F\u7528\u7684\u5165\u53E3\uFF0C\u98DE\u4E66\u6D88\u606F\u4E0D\u4F1A\u8FDB\u5165 Paperclip\u3002\",\n });\n } else {\n items.push({\n tone: routeTargetReady ? \"success\" : \"warning\",\n title: \"\u6D88\u606F\u5165\u53E3\",\n detail: !firstRouteConnectionReady\n ? \"\u5165\u53E3\u5B58\u5728\uFF0C\u4F46\u5B83\u7ED1\u5B9A\u7684\u98DE\u4E66\u673A\u5668\u4EBA\u5F53\u524D\u4E0D\u53EF\u8FD0\u884C\u3002\u8BF7\u5148\u70B9\u5165\u53E3\u7684\u201C\u7F16\u8F91\u201D\uFF0C\u628A\u673A\u5668\u4EBA\u6362\u6210\u53EF\u8FD0\u884C\u7684\uFF0C\u6216\u91CD\u65B0\u7ED1\u5B9A\u7F3A\u5931\u673A\u5668\u4EBA\u3002\"\n : routeTargetReady\n ? `${routeTitle(firstEnabledRouteSummary!.route, 0)} \u4F1A\u4EA4\u7ED9 ${routeTargetLabel(firstEnabledRouteSummary!.company, firstEnabledRouteSummary!.agent)}\u3002`\n : \"\u5165\u53E3\u5B58\u5728\uFF0C\u4F46\u516C\u53F8\u6216\u667A\u80FD\u4F53\u6CA1\u6709\u5B8C\u5168\u5339\u914D\u5230\u3002\u8BF7\u70B9\u201C\u7F16\u8F91\u5165\u53E3\u201D\u786E\u8BA4\u5904\u7406\u4EBA\u3002\",\n });\n }\n\n items.push({\n tone: routeUsesOldBotKeyword ? \"warning\" : \"success\",\n title: \"\u89E6\u53D1\u8BCD\",\n detail: routeUsesOldBotKeyword\n ? \"\u5165\u53E3\u91CC\u8FD8\u6709\u65E7\u89E6\u53D1\u8BCD\u201C\u9510\u601D\u201D\u3002\u5EFA\u8BAE\u70B9\u201C\u4E00\u952E\u6539\u6210 paperclip\u201D\uFF0C\u907F\u514D\u8BEF\u4EE5\u4E3A\u673A\u5668\u4EBA\u6CA1\u6362\u6210\u529F\u3002\"\n : \"\u89E6\u53D1\u8BCD\u548C\u5F53\u524D\u673A\u5668\u4EBA\u663E\u793A\u6CA1\u6709\u660E\u663E\u51B2\u7A81\u3002\",\n });\n\n if (!isListening) {\n items.push({\n tone: \"warning\",\n title: \"\u76D1\u542C\u98DE\u4E66\u6D88\u606F\",\n detail: \"\u76D1\u542C\u5F00\u5173\u672A\u5F00\u542F\u3002\u98DE\u4E66\u91CC\u53D1\u6D88\u606F\u4E0D\u4F1A\u81EA\u52A8\u8FDB\u5165 Paperclip\u3002\",\n });\n } else if (activeSubscriberCount > 0) {\n items.push({\n tone: \"success\",\n title: \"\u76D1\u542C\u98DE\u4E66\u6D88\u606F\",\n detail: `\u76D1\u542C\u5DF2\u5F00\u542F\uFF0C\u5F53\u524D\u770B\u5230 ${activeSubscriberCount} \u4E2A\u76D1\u542C\u8FDB\u7A0B\u3002`,\n });\n } else {\n items.push({\n tone: \"warning\",\n title: \"\u76D1\u542C\u98DE\u4E66\u6D88\u606F\",\n detail: \"\u76D1\u542C\u5F00\u5173\u5DF2\u5F00\u542F\uFF0C\u4F46\u6682\u65F6\u6CA1\u6709\u770B\u5230\u8FD0\u884C\u4E2D\u7684\u76D1\u542C\u8FDB\u7A0B\u3002\u4FDD\u5B58\u914D\u7F6E\u6216\u91CD\u542F\u670D\u52A1\u540E\u518D\u68C0\u67E5\u3002\",\n });\n }\n\n items.push({\n tone: isSendingRealMessages ? \"success\" : \"warning\",\n title: \"\u771F\u5B9E\u56DE\u590D\u98DE\u4E66\",\n detail: isSendingRealMessages\n ? \"\u5F53\u524D\u4F1A\u771F\u5B9E\u8C03\u7528 lark-cli \u56DE\u590D\u98DE\u4E66\u3002\"\n : \"\u5F53\u524D\u662F\u6A21\u62DF\u6A21\u5F0F\uFF0C\u53EA\u4F1A\u5728\u9875\u9762\u91CC\u9A8C\u8BC1\uFF0C\u4E0D\u4F1A\u771F\u7684\u56DE\u98DE\u4E66\u3002\",\n });\n\n items.push({\n tone: isSendingRealMessages ? \"success\" : \"warning\",\n title: \"\u98DE\u4E66\u9644\u4EF6\u5165\u5E93\",\n detail: isSendingRealMessages\n ? \"\u98DE\u4E66\u56FE\u7247\u3001\u6587\u4EF6\u3001\u97F3\u9891\u548C\u89C6\u9891\u4F1A\u4E0B\u8F7D\u5E76\u4F5C\u4E3A Paperclip \u4EFB\u52A1\u9644\u4EF6\u4EA4\u7ED9\u667A\u80FD\u4F53\u3002\"\n : \"\u6A21\u62DF\u6A21\u5F0F\u53EA\u4F1A\u8BB0\u5F55\u9644\u4EF6\u540D\u79F0\uFF0C\u4E0D\u4F1A\u771F\u6B63\u4E0B\u8F7D\u6216\u4E0A\u4F20\u9644\u4EF6\u3002\",\n });\n\n items.push({\n tone: canTryFeishuSmokeTest ? \"success\" : \"warning\",\n title: \"\u98DE\u4E66\u7AEF\u5B9E\u6D4B\",\n detail: canTryFeishuSmokeTest\n ? `\u53BB\u76EE\u6807\u98DE\u4E66\u4F1A\u8BDD\u53D1\u9001\uFF1A${smokeText}`\n : \"\u673A\u5668\u4EBA\u3001\u5165\u53E3\u3001\u76D1\u542C\u3001\u771F\u5B9E\u56DE\u590D\u5168\u90E8\u5C31\u7EEA\u540E\uFF0C\u518D\u53BB\u98DE\u4E66\u91CC\u505A\u771F\u5B9E\u6D4B\u8BD5\u3002\",\n });\n\n if (connectorStatus.error) {\n items.push({\n tone: \"warning\",\n title: \"\u8FD0\u884C\u65E5\u5FD7\",\n detail: `\u72B6\u6001\u8BFB\u53D6\u5931\u8D25\uFF1A${connectorStatus.error.message}`,\n });\n } else if (latestRecord) {\n items.push({\n tone: latestRecord.level === \"error\" ? \"error\" : latestRecord.level === \"warning\" ? \"warning\" : \"success\",\n title: \"\u6700\u8FD1\u4E8B\u4EF6\",\n detail: latestRecord.message,\n });\n } else {\n items.push({\n tone: \"success\",\n title: \"\u6700\u8FD1\u4E8B\u4EF6\",\n detail: \"\u6682\u65F6\u6CA1\u6709\u5F02\u5E38\u8BB0\u5F55\u3002\",\n });\n }\n\n return items;\n }\n\n function buildConnectionCheckReport(\n connection: FeishuConnectionConfig,\n result?: { valid: boolean; message?: string },\n ): CheckReportItem[] {\n const profile = profiles.find((item) => item.name === connection.profileName) ?? null;\n const routeCount = connectionUsageCounts.get(connection.id) ?? 0;\n const subscriber = connectorStatus.data?.subscribers?.find((item) => item.connectionId === connection.id);\n const appId = profile?.appId ?? connection.appId;\n const displayName = appLabel(connection, profile);\n const hasReadableDisplayName = Boolean(displayName && displayName !== \"\u98DE\u4E66\u5E94\u7528\" && displayName !== profile?.name);\n const items: CheckReportItem[] = [];\n\n if (result && !result.valid) {\n items.push({\n tone: \"error\",\n title: \"Paperclip \u914D\u7F6E\",\n detail: result.message ?? \"\u5F53\u524D\u914D\u7F6E\u683C\u5F0F\u6CA1\u6709\u901A\u8FC7\u68C0\u67E5\u3002\",\n });\n }\n\n if (profileError) {\n items.push({\n tone: \"error\",\n title: \"\u6388\u6743\u4FE1\u606F\",\n detail: `\u8BFB\u53D6\u98DE\u4E66\u673A\u5668\u4EBA\u5931\u8D25\uFF1A${profileError}`,\n });\n } else if (!profile) {\n items.push({\n tone: \"warning\",\n title: \"\u6388\u6743\u4FE1\u606F\",\n detail: missingProfileHelp(connection),\n });\n } else {\n items.push({\n tone: \"success\",\n title: \"\u6388\u6743\u4FE1\u606F\",\n detail: `\u5DF2\u8BFB\u5230\u201C${appLabel(connection, profile)}\u201D\u3002${appId ? `App ID\uFF1A${maskTechnicalId(appId)}` : \"\u98DE\u4E66\u6CA1\u6709\u8FD4\u56DE App ID\u3002\"}`\n });\n }\n\n if (profile?.botName) {\n items.push({\n tone: \"success\",\n title: \"\u673A\u5668\u4EBA\u540D\u79F0\",\n detail: `\u98DE\u4E66\u8FD4\u56DE\u7684\u673A\u5668\u4EBA\u540D\u79F0\u662F\u201C${profile.botName}\u201D\u3002`,\n });\n } else if (profile && hasReadableDisplayName) {\n items.push({\n tone: \"success\",\n title: \"\u673A\u5668\u4EBA\u540D\u79F0\",\n detail: `\u5F53\u524D\u9875\u9762\u663E\u793A\u4E3A\u201C${displayName}\u201D\u3002\u98DE\u4E66\u6CA1\u6709\u8FD4\u56DE\u5B98\u65B9\u673A\u5668\u4EBA\u540D\u65F6\uFF0C\u4F1A\u5148\u7528\u8FD9\u4E2A\u9875\u9762\u540D\u79F0\u5C55\u793A\uFF1B\u4E0D\u5F71\u54CD\u6536\u6D88\u606F\u548C\u56DE\u6D88\u606F\u3002`,\n });\n } else {\n items.push({\n tone: \"warning\",\n title: \"\u673A\u5668\u4EBA\u540D\u79F0\",\n detail: missingBotNameHelp(connection),\n });\n }\n\n items.push({\n tone: routeCount > 0 ? \"success\" : \"warning\",\n title: \"\u4E1A\u52A1\u5165\u53E3\",\n detail: routeCount > 0\n ? `\u5F53\u524D\u6709 ${routeCount} \u6761\u5165\u53E3\u4F7F\u7528\u8FD9\u4E2A\u673A\u5668\u4EBA\u3002`\n : \"\u5F53\u524D\u8FD8\u6CA1\u6709\u5165\u53E3\u4F7F\u7528\u8FD9\u4E2A\u673A\u5668\u4EBA\u3002\u5B83\u5728\u6C60\u5B50\u91CC\uFF0C\u4F46\u4E0D\u4F1A\u5904\u7406\u4EFB\u4F55\u98DE\u4E66\u6D88\u606F\u3002\",\n });\n\n if (!isListening) {\n items.push({\n tone: \"warning\",\n title: \"\u76D1\u542C\u72B6\u6001\",\n detail: \"\u5168\u5C40\u76D1\u542C\u672A\u5F00\u542F\uFF0C\u98DE\u4E66\u65B0\u6D88\u606F\u4E0D\u4F1A\u81EA\u52A8\u8FDB\u5165 Paperclip\u3002\",\n });\n } else if (subscriber) {\n items.push({\n tone: \"success\",\n title: \"\u76D1\u542C\u72B6\u6001\",\n detail: `\u5DF2\u770B\u5230\u8FD9\u4E2A\u673A\u5668\u4EBA\u7684\u76D1\u542C\u8FDB\u7A0B${subscriber.pid ? `\uFF0CPID ${subscriber.pid}` : \"\"}\u3002`,\n });\n } else {\n items.push({\n tone: \"warning\",\n title: \"\u76D1\u542C\u72B6\u6001\",\n detail: \"\u5168\u5C40\u76D1\u542C\u5DF2\u5F00\u542F\uFF0C\u4F46\u6682\u65F6\u6CA1\u770B\u5230\u8FD9\u4E2A\u673A\u5668\u4EBA\u7684\u76D1\u542C\u8FDB\u7A0B\u3002\u4FDD\u5B58\u914D\u7F6E\u6216\u91CD\u542F\u670D\u52A1\u540E\u518D\u68C0\u67E5\u3002\",\n });\n }\n\n items.push({\n tone: isSendingRealMessages ? \"success\" : \"warning\",\n title: \"\u771F\u5B9E\u56DE\u590D\",\n detail: isSendingRealMessages\n ? \"\u771F\u5B9E\u56DE\u590D\u5DF2\u5F00\u542F\uFF0C\u667A\u80FD\u4F53\u5B8C\u6210\u540E\u4F1A\u56DE\u5230\u98DE\u4E66\u3002\"\n : \"\u5F53\u524D\u662F\u9875\u9762\u6A21\u62DF\u6A21\u5F0F\uFF0C\u4E0D\u4F1A\u771F\u5B9E\u56DE\u590D\u98DE\u4E66\u3002\",\n });\n\n items.push({\n tone: isSendingRealMessages ? \"success\" : \"warning\",\n title: \"\u9644\u4EF6\u5165\u5E93\",\n detail: isSendingRealMessages\n ? \"\u98DE\u4E66\u6587\u4EF6\u548C\u56FE\u7247\u4F1A\u4F5C\u4E3A Paperclip \u4EFB\u52A1\u9644\u4EF6\u4E0A\u4F20\u3002\"\n : \"\u6A21\u62DF\u6A21\u5F0F\u4E0D\u4F1A\u771F\u6B63\u4E0B\u8F7D\u98DE\u4E66\u9644\u4EF6\u3002\",\n });\n\n return items;\n }\n\n async function checkConnection(connection: FeishuConnectionConfig) {\n setCheckingConnectionId(connection.id);\n setNotice({ tone: \"info\", text: `\u6B63\u5728\u68C0\u67E5\u201C${appLabel(connection, profiles.find((item) => item.name === connection.profileName))}\u201D...` });\n try {\n const result = await test(configJson);\n profileCatalog.refresh();\n connectorStatus.refresh();\n const items = buildConnectionCheckReport(connection, result);\n setConnectionCheckResults((prev) => ({\n ...prev,\n [connection.id]: {\n checkedAt: new Date().toLocaleTimeString(),\n items,\n },\n }));\n const hasError = items.some((item) => item.tone === \"error\");\n const hasWarning = items.some((item) => item.tone === \"warning\");\n setNotice({\n tone: hasError ? \"error\" : hasWarning ? \"info\" : \"success\",\n text: hasError\n ? \"\u8FD9\u4E2A\u673A\u5668\u4EBA\u8FD8\u6709\u963B\u585E\u9879\u3002\"\n : hasWarning\n ? \"\u8FD9\u4E2A\u673A\u5668\u4EBA\u57FA\u672C\u53EF\u7528\uFF0C\u4F46\u8FD8\u6709\u9700\u8981\u786E\u8BA4\u7684\u9879\u76EE\u3002\"\n : \"\u8FD9\u4E2A\u673A\u5668\u4EBA\u68C0\u67E5\u901A\u8FC7\uFF0C\u53EF\u4EE5\u7528\u4E8E\u98DE\u4E66\u5165\u53E3\u3002\",\n });\n } catch (nextError) {\n setNotice({ tone: \"error\", text: readableError(nextError) });\n } finally {\n setCheckingConnectionId(null);\n }\n }\n\n async function testCurrentConfig() {\n setChecking(true);\n setLastCheckAt(null);\n setNotice({ tone: \"info\", text: \"\u6B63\u5728\u68C0\u67E5\u673A\u5668\u4EBA\u3001\u6D88\u606F\u5165\u53E3\u548C\u8FD0\u884C\u5F00\u5173...\" });\n try {\n const result = await test(configJson);\n profileCatalog.refresh();\n connectorStatus.refresh();\n const nextReport = buildCheckReport(result);\n setCheckReportItems(nextReport);\n setLastCheckAt(new Date().toLocaleTimeString());\n setNotice({\n tone: nextReport.some((item) => item.tone === \"error\") ? \"error\" : nextReport.some((item) => item.tone === \"warning\") ? \"info\" : \"success\",\n text: nextReport.some((item) => item.tone === \"error\")\n ? \"\u68C0\u67E5\u53D1\u73B0\u963B\u585E\u9879\uFF0C\u6309\u4E0B\u65B9\u4F53\u68C0\u62A5\u544A\u5904\u7406\u3002\"\n : nextReport.some((item) => item.tone === \"warning\")\n ? \"\u57FA\u7840\u94FE\u8DEF\u53EF\u7528\uFF1B\u4E0B\u65B9\u63D0\u9192\u6309\u573A\u666F\u786E\u8BA4\u5373\u53EF\u3002\"\n : \"\u68C0\u67E5\u901A\u8FC7\u3002\u4E0B\u4E00\u6B65\u53BB\u98DE\u4E66\u91CC\u53D1\u9001\u6D4B\u8BD5\u8BDD\u672F\u786E\u8BA4\u771F\u5B9E\u6548\u679C\u3002\",\n });\n } catch (nextError) {\n setNotice({ tone: \"error\", text: readableError(nextError) });\n } finally {\n setChecking(false);\n }\n }\n\n async function testEntryRoute(route: FeishuRouteConfig) {\n setTestingRouteId(route.id);\n setNotice(null);\n setRouteTestResults((prev) => {\n const next = { ...prev };\n delete next[route.id];\n return next;\n });\n try {\n const result = await testRoute({ routeId: route.id }) as RouteTestResult;\n const text = result.message\n ? `${result.message}${result.sampleText ? ` \u6D4B\u8BD5\u6D88\u606F\uFF1A${result.sampleText}` : \"\"}`\n : \"\u5165\u53E3\u6D4B\u8BD5\u5B8C\u6210\u3002\";\n setRouteTestResults((prev) => ({\n ...prev,\n [route.id]: {\n tone: result.ok ? \"success\" : \"error\",\n text,\n },\n }));\n setNotice({ tone: result.ok ? \"success\" : \"error\", text });\n } catch (nextError) {\n const text = readableError(nextError);\n setRouteTestResults((prev) => ({\n ...prev,\n [route.id]: { tone: \"error\", text },\n }));\n setNotice({ tone: \"error\", text });\n } finally {\n setTestingRouteId(null);\n }\n }\n\n async function runPermissionCheck() {\n setCheckingPermissions(true);\n setPermissionCheck(null);\n setNotice({ tone: \"info\", text: \"\u6B63\u5728\u7528 lark-cli \u6821\u9A8C\u5F53\u524D profile \u7684\u98DE\u4E66\u6743\u9650...\" });\n try {\n const result = await checkPermissions({\n connectionId: firstRouteConnection?.id ?? preferredConnection?.id,\n }) as PermissionCheckResult;\n setPermissionCheck(result);\n setNotice({\n tone: result.ok ? \"success\" : \"info\",\n text: result.message ?? (result.ok ? \"\u6743\u9650\u68C0\u67E5\u901A\u8FC7\u3002\" : \"\u6743\u9650\u68C0\u67E5\u5B8C\u6210\uFF0C\u4ECD\u6709\u7F3A\u5931\u9879\u3002\"),\n });\n } catch (nextError) {\n const text = readableError(nextError);\n setPermissionCheck({ ok: false, message: text });\n setNotice({ tone: \"error\", text });\n } finally {\n setCheckingPermissions(false);\n }\n }\n\n async function runRetryQueue() {\n setRetryingQueue(true);\n setNotice({ tone: \"info\", text: \"\u6B63\u5728\u91CD\u8BD5\u98DE\u4E66\u5931\u8D25\u6295\u9012...\" });\n try {\n const result = await retryFailedDeliveries({}) as {\n attemptedCount?: number;\n successCount?: number;\n failedCount?: number;\n };\n connectorStatus.refresh();\n setNotice({\n tone: (result.failedCount ?? 0) > 0 ? \"info\" : \"success\",\n text: `\u91CD\u8BD5\u5B8C\u6210\uFF1A\u5C1D\u8BD5 ${result.attemptedCount ?? 0} \u6761\uFF0C\u6210\u529F ${result.successCount ?? 0} \u6761\uFF0C\u5931\u8D25 ${result.failedCount ?? 0} \u6761\u3002`,\n });\n } catch (nextError) {\n setNotice({ tone: \"error\", text: readableError(nextError) });\n } finally {\n setRetryingQueue(false);\n }\n }\n\n if (loading) return <div style={helpStyle}>\u6B63\u5728\u8BFB\u53D6\u98DE\u4E66\u8FDE\u63A5\u5668\u914D\u7F6E...</div>;\n\n return (\n <div style={pageStyle}>\n <nav key=\"local-tabs\" style={tabNavStyle} aria-label=\"\u98DE\u4E66\u8FDE\u63A5\u5668\u9875\u9762\u5BFC\u822A\">\n {mainTabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n style={activeMainTab === tab.key ? activeTabLinkStyle : tabLinkStyle}\n onClick={() => selectMainTab(tab.key)}\n >\n <span key=\"label\">{tab.label}</span>\n <span key=\"detail\" style={tabDetailStyle}>{tab.detail}</span>\n </button>\n ))}\n </nav>\n {showBindPanel ? (\n <div\n key=\"bind-modal\"\n style={modalBackdropStyle}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={bindPanelTitle}\n onClick={() => setShowBindPanel(false)}\n >\n <div key=\"panel\" style={modalPanelStyle} onClick={(event) => event.stopPropagation()}>\n <div key=\"head\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 900, fontSize: \"18px\" }}>{bindPanelTitle}</div>\n <div key=\"help\" style={helpStyle}>\n \u652F\u6301\u4E24\u79CD\u65B9\u5F0F\uFF1A\u666E\u901A\u7528\u6237\u4F18\u5148\u7528\u98DE\u4E66\u6388\u6743\u94FE\u63A5\uFF1B\u7BA1\u7406\u5458\u4E5F\u53EF\u4EE5\u76F4\u63A5\u586B App ID \u548C App Secret\uFF0C\u6216\u586B Paperclip Secret Ref\u3002App Secret \u53EA\u4EA4\u7ED9 lark-cli \u5EFA\u7ACB profile\uFF0C\u4E0D\u4F1A\u4FDD\u5B58\u5230\u63D2\u4EF6\u914D\u7F6E\u91CC\u3002\n </div>\n </div>\n <button key=\"close\" type=\"button\" style={buttonStyle} onClick={() => setShowBindPanel(false)}>\n \u5173\u95ED\n </button>\n </div>\n <div key=\"method\" style={gridTwoStyle}>\n <button\n key=\"guided\"\n type=\"button\"\n style={bindMethod === \"guided\" ? primaryButtonStyle : buttonStyle}\n onClick={() => {\n setBindMethod(\"guided\");\n setNotice(null);\n }}\n >\n \u7528\u98DE\u4E66\u6388\u6743\u94FE\u63A5\u7ED1\u5B9A\n </button>\n <button\n key=\"secret\"\n type=\"button\"\n style={bindMethod === \"secret\" ? primaryButtonStyle : buttonStyle}\n onClick={() => {\n setBindMethod(\"secret\");\n setGuidedBindResult(null);\n setNotice(null);\n }}\n >\n \u7528 App ID / Secret \u7ED1\u5B9A\n </button>\n </div>\n <div key=\"fields\" style={gridTwoStyle}>\n <Field key=\"displayName\" label=\"\u7ED9\u8FD9\u4E2A\u673A\u5668\u4EBA\u8D77\u4E2A\u540D\u5B57\" help=\"\u7ED9\u4EBA\u770B\u7684\u540D\u5B57\uFF0C\u4F8B\u5982\u201C\u8001\u677F\u8D44\u8BAF\u673A\u5668\u4EBA\u201D\u3002\">\n <input style={inputStyle} value={bindForm.displayName} onChange={(event) => setBindForm((prev) => ({ ...prev, displayName: event.target.value }))} />\n </Field>\n <Field key=\"botAliases\" label=\"\u98DE\u4E66\u91CC @ \u5B83\u7684\u540D\u5B57\" help=\"\u7528\u4E8E\u9632\u6B62 @\u5C0F\u9510 \u65F6\u9510\u601D\u4E5F\u54CD\u5E94\u3002\u53EF\u586B\u591A\u4E2A\uFF0C\u7528\u9017\u53F7\u9694\u5F00\uFF0C\u4F8B\u5982\u201C\u5C0F\u9510, \u9510\u601D\u201D\u3002\">\n <input style={inputStyle} value={bindForm.botAliases} placeholder=\"\u4F8B\u5982\uFF1A\u5C0F\u9510\" onChange={(event) => setBindForm((prev) => ({ ...prev, botAliases: event.target.value }))} />\n </Field>\n <Field key=\"profileName\" label=\"\u5DE5\u7A0B\u6392\u969C\u4EE3\u53F7\uFF08\u53EF\u4E0D\u586B\uFF09\" help=\"\u9ED8\u8BA4\u81EA\u52A8\u751F\u6210\uFF1B\u666E\u901A\u7528\u6237\u4E0D\u7528\u6539\u3002\">\n <input style={inputStyle} value={bindForm.profileName || suggestedNewProfileName} onChange={(event) => setBindForm((prev) => ({ ...prev, profileName: event.target.value }))} />\n </Field>\n </div>\n {bindMethod === \"guided\" ? (\n <Fragment key=\"guided-bind-flow\">\n <div key=\"steps\" style={checklistGridStyle}>\n <ChecklistItem key=\"one\" done={Boolean(guidedBindResult?.url)} title=\"1 \u83B7\u53D6\u6388\u6743\u94FE\u63A5\" detail=\"\u6253\u5F00\u98DE\u4E66\u5B98\u65B9\u9875\u9762\u5B8C\u6210\u5E94\u7528\u6388\u6743\u3002\" />\n <ChecklistItem key=\"two\" done={Boolean(guidedBindResult?.url)} title=\"2 \u56DE\u5230\u8FD9\u91CC\u786E\u8BA4\" detail=\"\u6388\u6743\u5B8C\u6210\u540E\u70B9\u201C\u6211\u5DF2\u5B8C\u6210\u6388\u6743\uFF0C\u663E\u793A\u5230\u5217\u8868\u201D\u3002\" />\n <ChecklistItem key=\"three\" done={false} title=\"3 \u9009\u62E9\u5165\u53E3\u4F7F\u7528\" detail=\"\u6BCF\u6761\u4E1A\u52A1\u5165\u53E3\u53EF\u4EE5\u5355\u72EC\u9009\u62E9\u8FD9\u4E2A\u673A\u5668\u4EBA\u3002\" />\n </div>\n <div key=\"guided-visual\" style={heroCommandStyle}>\n <div key=\"title\" style={{ fontWeight: 900 }}>\u666E\u901A\u7528\u6237\u63A8\u8350\uFF1A\u7528\u98DE\u4E66\u5B98\u65B9\u6388\u6743\u94FE\u63A5</div>\n <div key=\"body\" style={helpStyle}>\n \u4F60\u4E0D\u9700\u8981\u8BB0 App ID\uFF0C\u4E5F\u4E0D\u9700\u8981\u770B\u5230 App Secret\u3002\u70B9\u51FB\u4E0B\u9762\u7684\u201C\u83B7\u53D6\u98DE\u4E66\u6388\u6743\u94FE\u63A5\u201D\uFF0C\u5728\u98DE\u4E66\u9875\u9762\u5B8C\u6210\u6388\u6743\uFF0C\u518D\u56DE\u5230\u8FD9\u91CC\u786E\u8BA4\u5373\u53EF\u3002\n </div>\n <div key=\"flow\" style={flowGridStyle}>\n <FlowStep key=\"link\" title=\"1. Paperclip \u751F\u6210\u94FE\u63A5\" value={guidedBindResult?.url ? \"\u5DF2\u751F\u6210\" : \"\u5F85\u751F\u6210\"} detail=\"\u94FE\u63A5\u7531\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u7684 lark-cli \u521B\u5EFA\u3002\" />\n <FlowStep key=\"feishu\" title=\"2. \u53BB\u98DE\u4E66\u786E\u8BA4\" value=\"\u626B\u7801\u6216\u6253\u5F00\u94FE\u63A5\" detail=\"\u5982\u679C\u98DE\u4E66\u8981\u6C42\u7BA1\u7406\u5458\u5BA1\u6279\uFF0C\u9700\u8981\u5148\u5B8C\u6210\u5BA1\u6279\u3002\" />\n <FlowStep key=\"back\" title=\"3. \u56DE\u5230 Paperclip\" value=\"\u663E\u793A\u5230\u673A\u5668\u4EBA\u6C60\" detail=\"\u65B0\u673A\u5668\u4EBA\u51FA\u73B0\u540E\uFF0C\u5C31\u53EF\u4EE5\u88AB\u4E0D\u540C\u5165\u53E3\u5206\u522B\u9009\u62E9\u3002\" />\n </div>\n </div>\n {guidedBindResult?.url ? (\n <div key=\"url-box\" style={successBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u6388\u6743\u94FE\u63A5\u5DF2\u751F\u6210</div>\n <div key=\"help\" style={helpStyle}>\u5982\u679C\u98DE\u4E66\u9875\u9762\u5DF2\u7ECF\u5B8C\u6210\u6388\u6743\uFF0C\u5C31\u70B9\u4E0B\u9762\u7684\u786E\u8BA4\u6309\u94AE\u3002</div>\n <a key=\"url\" href={guidedBindResult.url} target=\"_blank\" rel=\"noreferrer\" style={{ ...linkButtonStyle, marginTop: \"10px\" }}>\n \u6253\u5F00\u98DE\u4E66\u6388\u6743\u94FE\u63A5\n </a>\n </div>\n ) : null}\n <div key=\"bind-troubleshooting\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u5982\u679C\u5B8C\u6210\u6388\u6743\u540E\u5217\u8868\u91CC\u6CA1\u51FA\u73B0</div>\n <div key=\"help\" style={helpStyle}>\n \u5148\u70B9\u201C\u5237\u65B0\u673A\u5668\u4EBA\u5217\u8868\u201D\u3002\u5982\u679C\u8FD8\u662F\u6CA1\u6709\uFF0C\u901A\u5E38\u662F\u98DE\u4E66\u6388\u6743\u6CA1\u6709\u70B9\u5B8C\u3001lark-cli \u6CA1\u628A profile \u5199\u5230\u5F53\u524D\u8FD0\u884C\u73AF\u5883\uFF0C\u6216\u672C\u5730\u6D4B\u8BD5\u548C\u4E91\u670D\u52A1\u5668\u4E0D\u662F\u540C\u4E00\u53F0\u673A\u5668\u3002\n </div>\n </div>\n <div key=\"actions\" style={rowStyle}>\n <button key=\"start\" type=\"button\" style={primaryButtonStyle} disabled={startingGuidedBind} onClick={() => void startOfficialBindWizard()}>\n {startingGuidedBind ? \"\u6B63\u5728\u751F\u6210...\" : \"\u83B7\u53D6\u98DE\u4E66\u6388\u6743\u94FE\u63A5\"}\n </button>\n <button key=\"finish\" type=\"button\" style={buttonStyle} disabled={finishingGuidedBind} onClick={() => void finishOfficialBindWizard()}>\n {finishingGuidedBind ? \"\u6B63\u5728\u786E\u8BA4...\" : \"\u6211\u5DF2\u5B8C\u6210\u6388\u6743\uFF0C\u663E\u793A\u5230\u5217\u8868\"}\n </button>\n <button key=\"refresh\" type=\"button\" style={buttonStyle} onClick={refreshProfilesWithNotice}>\n \u5237\u65B0\u673A\u5668\u4EBA\u5217\u8868\n </button>\n <button key=\"cancel\" type=\"button\" style={buttonStyle} onClick={() => setShowBindPanel(false)}>\n \u53D6\u6D88\n </button>\n </div>\n </Fragment>\n ) : (\n <div key=\"secret-flow\" style={{ display: \"grid\", gap: \"12px\" }}>\n <div key=\"secret-help\" style={recommendedBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u7BA1\u7406\u5458\u76F4\u63A5\u7ED1\u5B9A</div>\n <div key=\"body\" style={helpStyle}>\n App ID \u548C App Secret \u5728\u98DE\u4E66\u5F00\u653E\u5E73\u53F0\u7684\u201C\u51ED\u8BC1\u4E0E\u57FA\u7840\u4FE1\u606F\u201D\u91CC\u3002\u4E91\u7AEF\u5EFA\u8BAE\u5148\u628A App Secret \u5B58\u5165 Paperclip Secret/Vault\uFF0C\u518D\u5728\u8FD9\u91CC\u586B Secret Ref\uFF1B\u4FDD\u5B58\u5B8C\u6210\u540E\u63D2\u4EF6\u53EA\u8BB0\u5F55\u673A\u5668\u4EBA\u663E\u793A\u540D\u548C profile \u4EE3\u53F7\uFF0C\u4E0D\u4FDD\u5B58 Secret \u660E\u6587\u3002\n </div>\n <a key=\"platform\" href=\"https://open.feishu.cn/app\" target=\"_blank\" rel=\"noreferrer\" style={{ ...linkButtonStyle, marginTop: \"10px\" }}>\n \u6253\u5F00\u98DE\u4E66\u5F00\u653E\u5E73\u53F0\n </a>\n </div>\n <div key=\"secret-fields\" style={gridTwoStyle}>\n <Field key=\"appId\" label=\"\u98DE\u4E66 App ID\" help=\"\u901A\u5E38\u4EE5 cli_ \u5F00\u5934\u3002\">\n <input style={inputStyle} value={bindForm.appId} placeholder=\"cli_xxxxxxxxxxxxx\" onChange={(event) => setBindForm((prev) => ({ ...prev, appId: event.target.value }))} />\n </Field>\n <Field key=\"appSecret\" label=\"\u98DE\u4E66 App Secret\" help=\"\u53EA\u5728\u672C\u6B21\u7ED1\u5B9A\u65F6\u53D1\u9001\u7ED9 lark-cli\u3002\u4E0D\u8981\u622A\u56FE\u5916\u53D1\u3002\">\n <input style={inputStyle} type=\"password\" autoComplete=\"off\" value={bindForm.appSecret} placeholder=\"\u8F93\u5165 App Secret\" onChange={(event) => setBindForm((prev) => ({ ...prev, appSecret: event.target.value }))} />\n </Field>\n <Field key=\"appSecretRef\" label=\"Paperclip Secret Ref\" help=\"\u5982\u679C App Secret \u5DF2\u5728 Paperclip/Vault \u91CC\u6258\u7BA1\uFF0C\u586B\u8FD9\u4E2A\u5F15\u7528\u5373\u53EF\uFF1B\u4E0E\u660E\u6587 Secret \u4E8C\u9009\u4E00\u3002\">\n <input style={inputStyle} value={bindForm.appSecretRef} placeholder=\"\u4F8B\u5982\uFF1Afeishu/app-secret\" onChange={(event) => setBindForm((prev) => ({ ...prev, appSecretRef: event.target.value }))} />\n </Field>\n </div>\n <div key=\"actions\" style={rowStyle}>\n <button key=\"bind\" type=\"button\" style={primaryButtonStyle} disabled={binding} onClick={() => void bindNewFeishuApp()}>\n {binding ? \"\u6B63\u5728\u7ED1\u5B9A...\" : \"\u7ACB\u5373\u7ED1\u5B9A\u5E76\u52A0\u5165\u673A\u5668\u4EBA\u6C60\"}\n </button>\n <button key=\"cancel\" type=\"button\" style={buttonStyle} onClick={() => setShowBindPanel(false)}>\n \u53D6\u6D88\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n ) : null}\n {toast ? (\n <div key=\"toast\" style={floatingToastStyle}>\n <NoticeBanner notice={toast} />\n </div>\n ) : null}\n {notice && activeMainTab !== \"overview\" ? (\n <NoticeBanner\n key=\"tab-notice\"\n notice={notice}\n meta={lastCheckAt ? `\u6700\u8FD1\u68C0\u67E5\u65F6\u95F4\uFF1A${lastCheckAt}` : null}\n />\n ) : null}\n {activeMainTab === \"overview\" ? (\n <div id=\"feishu-overview\" key=\"intro\" style={heroStyle}>\n <div key=\"top\" style={actionBarStyle}>\n <div key=\"copy\">\n <div key=\"intro-title\" style={{ fontWeight: 800, marginBottom: \"6px\", fontSize: \"18px\" }}>\n {overviewTitle}\n </div>\n <div key=\"intro-body\" style={helpStyle}>\n {statusTitle}\u3002\u591A\u4E2A\u98DE\u4E66\u673A\u5668\u4EBA\u53EF\u4EE5\u540C\u65F6\u5B58\u5728\uFF1B\u6BCF\u6761\u4E1A\u52A1\u5165\u53E3\u5355\u72EC\u9009\u62E9\u673A\u5668\u4EBA\u3001\u516C\u53F8\u548C\u667A\u80FD\u4F53\u3002\n </div>\n </div>\n <div key=\"actions\" style={rowStyle}>\n <button key=\"add-entry\" type=\"button\" style={primaryButtonStyle} onClick={() => openEntryWizard()}>\n \u65B0\u589E\u5165\u53E3\n </button>\n <button key=\"test\" type=\"button\" style={buttonStyle} disabled={saving || checking} onClick={() => void testCurrentConfig()}>\n {checking ? \"\u6B63\u5728\u68C0\u67E5...\" : \"\u68C0\u67E5\u8FDE\u63A5\"}\n </button>\n <button key=\"copy\" type=\"button\" style={buttonStyle} onClick={() => void copySmokeText()}>\n \u590D\u5236\u6D4B\u8BD5\u8BDD\u672F\n </button>\n </div>\n </div>\n {notice ? (\n <NoticeBanner\n key=\"top-notice\"\n notice={notice}\n meta={lastCheckAt ? `\u6700\u8FD1\u68C0\u67E5\u65F6\u95F4\uFF1A${lastCheckAt}` : null}\n />\n ) : null}\n {checkReportItems.length > 0 ? (\n <CheckReport key=\"check-report\" items={checkReportItems} />\n ) : null}\n <div key=\"next-step\" style={nextStepStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 900, fontSize: \"16px\" }}>{nextStepCopy.title}</div>\n <div key=\"detail\" style={helpStyle}>{nextStepCopy.detail}</div>\n </div>\n <div key=\"actions\" style={rowStyle}>\n {nextStepKind === \"bind\" ? (\n <button key=\"bind\" type=\"button\" style={primaryButtonStyle} onClick={() => openBindPanel()}>\n \u63A5\u5165\u98DE\u4E66\u673A\u5668\u4EBA\n </button>\n ) : null}\n {nextStepKind === \"rebind\" ? (\n <Fragment key=\"next-rebind-actions\">\n <button key=\"rebind\" type=\"button\" style={primaryButtonStyle} onClick={() => openBindPanel(connectionToFix ?? firstEnabledConnection)}>\n \u91CD\u65B0\u7ED1\u5B9A\u673A\u5668\u4EBA\n </button>\n <button key=\"refresh\" type=\"button\" style={buttonStyle} onClick={refreshProfilesWithNotice}>\n \u5237\u65B0\u673A\u5668\u4EBA\u5217\u8868\n </button>\n </Fragment>\n ) : null}\n {nextStepKind === \"entry\" ? (\n <button key=\"entry\" type=\"button\" style={primaryButtonStyle} onClick={() => openEntryWizard()}>\n \u65B0\u589E\u4E1A\u52A1\u5165\u53E3\n </button>\n ) : null}\n {nextStepKind === \"edit-entry\" ? (\n <Fragment key=\"next-edit-entry-actions\">\n <button key=\"edit\" type=\"button\" style={primaryButtonStyle} onClick={() => openEntryEditor(firstMissingRouteSummary?.route.id)}>\n \u7F16\u8F91\u8FD9\u6761\u5165\u53E3\n </button>\n <button key=\"rebind\" type=\"button\" style={buttonStyle} onClick={() => openBindPanel(connectionToFix ?? undefined)}>\n \u91CD\u65B0\u7ED1\u5B9A\u673A\u5668\u4EBA\n </button>\n </Fragment>\n ) : null}\n {nextStepKind === \"enable-listen\" ? (\n <button key=\"listen\" type=\"button\" style={primaryButtonStyle} disabled={saving} onClick={() => void patchRuntimeAndSave({ enableEventSubscriber: true }, \"\u5DF2\u5F00\u542F\u98DE\u4E66\u6D88\u606F\u76D1\u542C\u5E76\u4FDD\u5B58\u3002\u73B0\u5728\u53EF\u4EE5\u53BB\u98DE\u4E66\u91CC\u53D1\u6D4B\u8BD5\u8BDD\u672F\u3002\")}>\n \u5F00\u542F\u76D1\u542C\u5E76\u4FDD\u5B58\n </button>\n ) : null}\n {nextStepKind === \"enable-real\" ? (\n <button key=\"real\" type=\"button\" style={primaryButtonStyle} disabled={saving} onClick={() => void patchRuntimeAndSave({ dryRunCli: false }, \"\u5DF2\u5F00\u542F\u771F\u5B9E\u98DE\u4E66\u56DE\u590D\u5E76\u4FDD\u5B58\u3002\u4E0B\u4E00\u6B65\u53BB\u98DE\u4E66\u5B9E\u6D4B\u3002\")}>\n \u5F00\u542F\u771F\u5B9E\u56DE\u590D\u5E76\u4FDD\u5B58\n </button>\n ) : null}\n {nextStepKind === \"test\" ? (\n <Fragment key=\"next-test-actions\">\n <button key=\"copy\" type=\"button\" style={primaryButtonStyle} onClick={() => void copySmokeText()}>\n \u590D\u5236\u98DE\u4E66\u6D4B\u8BD5\u8BDD\u672F\n </button>\n <button key=\"check\" type=\"button\" style={buttonStyle} disabled={checking} onClick={() => void testCurrentConfig()}>\n {checking ? \"\u68C0\u67E5\u4E2D...\" : \"\u68C0\u67E5\u8FDE\u63A5\"}\n </button>\n </Fragment>\n ) : null}\n </div>\n </div>\n <div key=\"metric-grid\" style={metricGridStyle}>\n <div key=\"metric-bots\" style={metricCardStyle}>\n <div key=\"label\" style={metricHeaderStyle}>\n <span key=\"icon\" style={{ ...metricIconStyle, background: \"color-mix(in oklab, #2563eb 14%, var(--background))\", color: \"#2563eb\" }}>\u673A</span>\n <span key=\"text\">\u673A\u5668\u4EBA\u6C60</span>\n </div>\n <div key=\"value\" style={{ fontWeight: 900, fontSize: \"22px\" }}>\n {missingProfileConnections.length > 0\n ? `${usableConnections.length} \u4E2A\u53EF\u8FD0\u884C / ${activeConnections.length} \u4E2A\u5DF2\u914D\u7F6E`\n : `${activeConnections.length} \u4E2A\u53EF\u7528`}\n </div>\n <div key=\"detail\" style={helpStyle}>{activeConnectionLabels.join(\"\u3001\") || \"\u5C1A\u672A\u7ED1\u5B9A\u673A\u5668\u4EBA\"}</div>\n </div>\n <div key=\"metric-routes\" style={metricCardStyle}>\n <div key=\"label\" style={metricHeaderStyle}>\n <span key=\"icon\" style={{ ...metricIconStyle, background: \"color-mix(in oklab, #16a34a 14%, var(--background))\", color: \"#16a34a\" }}>\u5165</span>\n <span key=\"text\">\u4E1A\u52A1\u5165\u53E3</span>\n </div>\n <div key=\"value\" style={{ fontWeight: 900, fontSize: \"22px\" }}>{routes.length} \u6761\u5165\u53E3</div>\n <div key=\"detail\" style={helpStyle}>\n {routeSummaries.slice(0, 3).map(({ route }, index) => routeTitle(route, index)).join(\" / \") || \"\u8FD8\u6CA1\u6709\u4E1A\u52A1\u5165\u53E3\"}\n </div>\n </div>\n <div key=\"metric-runtime\" style={metricCardStyle}>\n <div key=\"label\" style={metricHeaderStyle}>\n <span key=\"icon\" style={{ ...metricIconStyle, background: \"color-mix(in oklab, #22c55e 14%, var(--background))\", color: \"#16a34a\" }}>\u542C</span>\n <span key=\"text\">\u8FD0\u884C\u72B6\u6001</span>\n </div>\n <div key=\"value\" style={{ fontWeight: 900, fontSize: \"22px\" }}>{runtimeStatusLabel}</div>\n <div key=\"detail\" style={helpStyle}>{runtimeStatusDetail}</div>\n </div>\n </div>\n <div key=\"event-diagnostics\" style={subtleBoxStyle}>\n <div key=\"header\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 900, fontSize: \"16px\" }}>\u6700\u8FD1\u98DE\u4E66\u4E8B\u4EF6\u8BCA\u65AD</div>\n <div key=\"body\" style={helpStyle}>\n {latestFeishuEvent\n ? \"\u8FD9\u91CC\u663E\u793A\u6700\u8FD1\u6536\u5230\u7684\u98DE\u4E66\u6D88\u606F\u3001\u547D\u4E2D\u7684\u5165\u53E3\u548C\u672A\u547D\u4E2D\u539F\u56E0\u3002\"\n : \"\u5982\u679C\u4F60\u521A\u5728\u98DE\u4E66\u91CC\u53D1\u4E86\u6D4B\u8BD5\u6D88\u606F\uFF0C\u4F46\u8FD9\u91CC\u6CA1\u6709\u65B0\u8BB0\u5F55\uFF0C\u8BF4\u660E\u6D88\u606F\u6CA1\u6709\u8FDB\u5165\u5F53\u524D\u63D2\u4EF6\u76D1\u542C\u7684\u98DE\u4E66\u673A\u5668\u4EBA\u3002\"}\n </div>\n </div>\n <button key=\"refresh\" type=\"button\" style={buttonStyle} onClick={() => connectorStatus.refresh()}>\n \u5237\u65B0\n </button>\n </div>\n <RecentEventList\n key=\"events\"\n records={feishuEventRecords.slice(0, 3)}\n emptyText={feishuEventEmptyText}\n />\n {!latestFeishuEvent && latestOperationalRecord ? (\n <div key=\"latest-operational-record\" style={{ ...helpStyle, marginTop: \"8px\" }}>\n \u63D2\u4EF6\u6700\u8FD1\u72B6\u6001\uFF1A{latestOperationalRecord.message}\uFF08{latestOperationalRecord.createdAt}\uFF09\u3002\n </div>\n ) : null}\n </div>\n <div key=\"setup-progress\" style={heroCommandStyle}>\n <div key=\"header\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 900, fontSize: \"16px\" }}>\u63A5\u5165\u8FDB\u5EA6</div>\n <div key=\"body\" style={helpStyle}>\n \u65B0\u7528\u6237\u53EA\u770B\u8FD9\u91CC\u5C31\u591F\u4E86\uFF1A\u5148\u9009\u673A\u5668\u4EBA\uFF0C\u518D\u5EFA\u4E1A\u52A1\u5165\u53E3\uFF0C\u6700\u540E\u5230\u98DE\u4E66\u91CC\u771F\u5B9E\u6D4B\u8BD5\u3002\u66F4\u591A\u5DE5\u7A0B\u914D\u7F6E\u653E\u5728\u201C\u9AD8\u7EA7\u201D\u9875\u3002\n </div>\n </div>\n <div key=\"actions\" style={rowStyle}>\n <button key=\"guided\" type=\"button\" style={buttonStyle} onClick={() => openBindPanel(undefined, \"guided\")}>\n \u7ED1\u5B9A\u673A\u5668\u4EBA\n </button>\n <button key=\"secret\" type=\"button\" style={buttonStyle} onClick={() => openBindPanel(undefined, \"secret\")}>\n \u7BA1\u7406\u5458\u7ED1\u5B9A\n </button>\n </div>\n </div>\n <div key=\"steps\" style={stepGridStyle}>\n {setupProgressSteps.map((step, index) => (\n <SetupStep\n key={step.title}\n index={index + 1}\n done={step.done}\n title={step.title}\n detail={step.detail}\n action={step.action}\n />\n ))}\n </div>\n </div>\n </div>\n ) : null}\n\n {activeMainTab === \"entries\" ? (\n <Fragment key=\"entries-list-tab\">\n <section id=\"feishu-entries\" key=\"product-entries\" style={productSectionStyle}>\n <div key=\"header\" style={sectionHeaderStyle}>\n <h3 key=\"title\" style={{ margin: 0, fontSize: \"18px\" }}>\u4E1A\u52A1\u5165\u53E3</h3>\n <button key=\"add\" type=\"button\" style={buttonStyle} onClick={() => openEntryWizard()}>\n \u65B0\u589E\u4E1A\u52A1\u5165\u53E3\n </button>\n </div>\n <div key=\"list\" style={{ display: \"grid\", gap: \"12px\" }}>\n {routeSummaries.length === 0 ? (\n <div key=\"empty\" style={productEntryStyle}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u8FD8\u6CA1\u6709\u4E1A\u52A1\u5165\u53E3</div>\n <div key=\"body\" style={helpStyle}>\u5148\u5EFA\u4E00\u6761\u201C\u5305\u542B paperclip \u7684\u98DE\u4E66\u6D88\u606F \u2192 \u6307\u5B9A\u667A\u80FD\u4F53\u201D\u7684\u6D4B\u8BD5\u5165\u53E3\u3002</div>\n </div>\n ) : null}\n {routeSummaries.map(({ route, company, agent }, index) => {\n const routeIndex = routes.findIndex((item) => item.id === route.id);\n const connection = connections.find((item) => item.id === route.connectionId) ?? preferredConnection;\n const profile = profiles.find((item) => item.name === connection?.profileName) ?? null;\n const testResult = routeTestResults[route.id];\n const agents = company?.agents ?? [];\n const matchType = route.matchType ?? \"keyword\";\n return (\n <div id={`product-entry-${route.id}`} key={`product-entry-${route.id}`} style={productEntryStyle}>\n <div key=\"top\" style={sectionHeaderStyle}>\n <div key=\"copy\" style={{ minWidth: 0 }}>\n <div key=\"title-row\" style={rowStyle}>\n <strong key=\"title\" style={{ fontSize: \"16px\" }}>{routeTitle(route, index)}</strong>\n <StatusBadge key=\"status\" tone={route.enabled === false ? \"neutral\" : \"success\"}>\n {route.enabled === false ? \"\u5DF2\u6682\u505C\" : \"\u542F\u7528\u4E2D\"}\n </StatusBadge>\n </div>\n <div key=\"meta\" style={{ ...helpStyle, marginTop: \"6px\" }}>\n \u6765\u6E90\uFF1A{routeSourceLabel(route)} \u2192 \u673A\u5668\u4EBA\uFF1A{appLabel(connection, profile)} \u2192 \u516C\u53F8\uFF1A{company ? companyLabel(company) : \"\u672A\u9009\u62E9\"} \u2192 \u667A\u80FD\u4F53\uFF1A{agent ? agentLabel(agent) : \"\u672A\u9009\u62E9\"}\n </div>\n </div>\n <div key=\"actions\" style={rowStyle}>\n <button key=\"test\" type=\"button\" style={buttonStyle} disabled={testingRouteId === route.id} onClick={() => void testEntryRoute(route)}>\n {testingRouteId === route.id ? \"\u6D4B\u8BD5\u4E2D...\" : \"\u6D4B\u8BD5\"}\n </button>\n <button key=\"edit\" type=\"button\" style={buttonStyle} onClick={() => openEntryEditor(route.id)}>\n \u7F16\u8F91\n </button>\n <button key=\"pause\" type=\"button\" style={buttonStyle} onClick={() => routeIndex >= 0 && patchRoute(routeIndex, { enabled: route.enabled === false })}>\n {route.enabled === false ? \"\u542F\u7528\" : \"\u6682\u505C\"}\n </button>\n </div>\n </div>\n <div key=\"chips\" style={rowStyle}>\n <span key=\"source\" style={compactPillStyle}>\u89E6\u53D1\u6761\u4EF6\u3000{routeSourceLabel(route)}</span>\n <span key=\"reply\" style={compactPillStyle}>\u56DE\u590D\u65B9\u5F0F\u3000{replyModeLabels[route.replyMode ?? \"thread\"]}</span>\n {route.baseSinkId ? <span key=\"base\" style={compactPillStyle}>\u5199\u5165\u591A\u7EF4\u8868\u683C</span> : null}\n </div>\n {testResult ? (\n <div key=\"result\" style={{ ...helpStyle, color: testResult.tone === \"success\" ? \"var(--foreground)\" : \"var(--destructive)\" }}>\n {testResult.text}\n </div>\n ) : null}\n {expandedEntryRouteId === route.id && routeIndex >= 0 ? (\n <div key=\"editor\" style={productEntryEditorStyle}>\n <div key=\"editor-head\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 800 }}>\u7F16\u8F91\u8FD9\u4E2A\u5165\u53E3</div>\n <div key=\"help\" style={helpStyle}>\u53EA\u6539\u8FD9\u6761\u4E1A\u52A1\u5165\u53E3\uFF0C\u4E0D\u5F71\u54CD\u5176\u4ED6\u98DE\u4E66\u673A\u5668\u4EBA\u548C\u5176\u4ED6\u516C\u53F8\u3002</div>\n </div>\n <button key=\"close\" type=\"button\" style={buttonStyle} onClick={() => setExpandedEntryRouteId(null)}>\n \u6536\u8D77\n </button>\n </div>\n <div key=\"editor-fields\" style={gridTwoStyle}>\n <Field key=\"connectionId\" label=\"\u4F7F\u7528\u54EA\u4E2A\u98DE\u4E66\u673A\u5668\u4EBA\">\n <select\n style={selectStyle}\n value={route.connectionId ?? preferredConnection?.id ?? \"\"}\n onChange={(event) => patchRoute(routeIndex, { connectionId: event.target.value })}\n >\n {connectionOptionNodes(connections, `product-route-${routeIndex}`, undefined, profiles)}\n </select>\n </Field>\n <Field key=\"matchType\" label=\"\u54EA\u4E9B\u6D88\u606F\u8FDB\u5165 Paperclip\">\n <select\n style={selectStyle}\n value={matchType}\n onChange={(event) => patchRoute(routeIndex, { matchType: event.target.value as FeishuRouteConfig[\"matchType\"] })}\n >\n {Object.entries(matchTypeLabels).map(([value, label], optionIndex) => (\n <option key={`product-match-${routeIndex}-${optionIndex}-${value}`} value={value}>{label}</option>\n ))}\n </select>\n </Field>\n {matchType === \"keyword\" ? (\n <Field key=\"keyword\" label=\"\u5173\u952E\u8BCD\uFF08\u4E0D\u533A\u5206\u5927\u5C0F\u5199\uFF09\" help=\"\u4E0D\u662F\u5FC5\u987B\u586B paperclip\u3002\u53EF\u4EE5\u586B\u201C\u5C0F\u601D\u201D\u201C\u627E\u4EBA\u201D\u201C\u8D44\u8BAF\u201D\u7B49\u4E1A\u52A1\u8BCD\uFF1B\u6D88\u606F\u91CC\u5305\u542B\u5B83\u5C31\u4F1A\u8FDB\u5165 Paperclip\u3002\">\n <input style={inputStyle} value={route.keyword ?? \"\"} onChange={(event) => patchRoute(routeIndex, { keyword: event.target.value })} />\n </Field>\n ) : null}\n {matchType === \"regex\" ? (\n <Field key=\"regex\" label=\"\u9AD8\u7EA7\u89C4\u5219\">\n <input style={inputStyle} value={route.regex ?? \"\"} onChange={(event) => patchRoute(routeIndex, { regex: event.target.value })} />\n </Field>\n ) : null}\n <Field key=\"company\" label=\"Paperclip \u516C\u53F8\">\n <select\n style={selectStyle}\n value={company?.id ?? \"\"}\n onChange={(event) => {\n const nextCompany = companies.find((item) => item.id === event.target.value);\n const nextAgent = nextCompany?.agents[0];\n patchRoute(routeIndex, {\n companyId: nextCompany?.id,\n companyRef: nextCompany?.issuePrefix ?? nextCompany?.name,\n targetAgentId: nextAgent?.id,\n targetAgentName: nextAgent?.name,\n });\n }}\n >\n {companyOptionNodes(companies, `product-route-${routeIndex}`)}\n </select>\n </Field>\n <Field key=\"agent\" label=\"\u4EA4\u7ED9\u54EA\u4E2A\u667A\u80FD\u4F53\">\n <select\n style={selectStyle}\n value={agent?.id ?? \"\"}\n disabled={!company}\n onChange={(event) => {\n const nextAgent = agents.find((item) => item.id === event.target.value);\n patchRoute(routeIndex, {\n targetAgentId: nextAgent?.id,\n targetAgentName: nextAgent?.name,\n });\n }}\n >\n {agentOptionNodes(agents, `product-route-${routeIndex}`)}\n </select>\n </Field>\n <Field key=\"replyMode\" label=\"\u56DE\u590D\u65B9\u5F0F\">\n <select\n style={selectStyle}\n value={route.replyMode ?? \"thread\"}\n onChange={(event) => patchRoute(routeIndex, { replyMode: event.target.value as FeishuRouteConfig[\"replyMode\"] })}\n >\n {Object.entries(replyModeLabels).map(([value, label], optionIndex) => (\n <option key={`product-reply-${routeIndex}-${optionIndex}-${value}`} value={value}>{label}</option>\n ))}\n </select>\n </Field>\n </div>\n <div key=\"editor-actions\" style={rowStyle}>\n <button\n key=\"save\"\n type=\"button\"\n style={primaryButtonStyle}\n disabled={saving}\n onClick={() => void saveCurrentConfig({\n routeId: route.id,\n successText: `\u5DF2\u4FDD\u5B58\u5165\u53E3\u201C${routeTitle(route, routeIndex)}\u201D\u3002\u65B0\u7684\u98DE\u4E66\u6D88\u606F\u4F1A\u6309\u8FD9\u4E2A\u5165\u53E3\u5904\u7406\u3002`,\n })}\n >\n {saving ? \"\u6B63\u5728\u4FDD\u5B58...\" : \"\u4FDD\u5B58\u8FD9\u4E2A\u5165\u53E3\"}\n </button>\n <button key=\"test\" type=\"button\" style={buttonStyle} disabled={testingRouteId === route.id} onClick={() => void testEntryRoute(route)}>\n {testingRouteId === route.id ? \"\u6D4B\u8BD5\u4E2D...\" : \"\u6D4B\u8BD5\u8FD9\u4E2A\u5165\u53E3\"}\n </button>\n </div>\n {savedEntry?.routeId === route.id ? (\n <div key=\"entry-save-ok\" style={{ ...successBoxStyle, marginTop: \"2px\" }}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u8FD9\u4E2A\u5165\u53E3\u5DF2\u4FDD\u5B58</div>\n <div key=\"detail\" style={helpStyle}>\n \u4FDD\u5B58\u65F6\u95F4\uFF1A{savedEntry.at}\u3002\u73B0\u5728\u98DE\u4E66\u6D88\u606F\u4F1A\u4EA4\u7ED9 {routeTargetLabel(company, agent)} \u5904\u7406\u3002\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n })}\n </div>\n </section>\n </Fragment>\n ) : null}\n\n {activeMainTab === \"robots\" ? (\n <section id=\"feishu-robots\" key=\"product-robots\" style={productSectionStyle}>\n <div key=\"header\" style={sectionHeaderStyle}>\n <h3 key=\"title\" style={{ margin: 0, fontSize: \"18px\" }}>\u673A\u5668\u4EBA\u6C60</h3>\n <button key=\"bind\" type=\"button\" style={buttonStyle} onClick={() => openBindPanel()}>\n \u7ED1\u5B9A\u65B0\u673A\u5668\u4EBA\n </button>\n </div>\n <div key=\"cards\" style={gridTwoStyle}>\n {activeConnections.length === 0 ? (\n <div key=\"empty\" style={productEntryStyle}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u8FD8\u6CA1\u6709\u53EF\u7528\u673A\u5668\u4EBA</div>\n <div key=\"body\" style={helpStyle}>\u7ED1\u5B9A\u516C\u53F8\u901A\u7528\u673A\u5668\u4EBA\u540E\uFF0C\u518D\u4E3A\u4E1A\u52A1\u5165\u53E3\u9009\u62E9\u5B83\u3002</div>\n </div>\n ) : null}\n {activeConnections.map((connection, index) => {\n const profile = profiles.find((item) => item.name === connection.profileName) ?? null;\n const routeCount = connectionUsageCounts.get(connection.id) ?? 0;\n const connectionCheck = connectionCheckResults[connection.id];\n const authResult = userAuthResults[connection.profileName];\n const isStartingUserAuth = startingUserAuthProfileName === connection.profileName;\n const isFinishingUserAuth = finishingUserAuthProfileName === connection.profileName;\n const aliasText = formatBotAliases(connection);\n return (\n <div key={`product-bot-${connection.id}-${index}`} style={productEntryStyle}>\n <div key=\"top\" style={{ display: \"flex\", gap: \"14px\", alignItems: \"center\" }}>\n <div key=\"icon\" style={{ ...botIconStyle, background: index % 2 === 0 ? \"#2563eb\" : \"#5b21b6\", color: \"#fff\" }}>\n \u98DE\n </div>\n <div key=\"copy\" style={{ minWidth: 0 }}>\n <div key=\"name\" style={{ ...rowStyle, marginBottom: \"4px\" }}>\n <strong key=\"label\" style={{ fontSize: \"16px\" }}>{appLabel(connection, profile)}</strong>\n <StatusBadge key=\"status\" tone={profile ? \"success\" : \"warning\"}>{profile ? \"\u5DF2\u542F\u7528\" : \"\u9700\u91CD\u65B0\u7ED1\u5B9A\"}</StatusBadge>\n <span key=\"count\" style={compactPillStyle}>{routeCount} \u6761\u5165\u53E3\u4F7F\u7528</span>\n </div>\n <div key=\"appid\" style={helpStyle}>App ID\uFF1A{maskTechnicalId(connection.appId ?? profile?.appId)}</div>\n <div key=\"user\" style={helpStyle}>\n {profile ? profileAuthLabel(profile) : \"\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u672A\u8BFB\u5230\u8FD9\u4E2A\u673A\u5668\u4EBA profile\"}\n </div>\n <div key=\"auth-detail\" style={helpStyle}>\n {profile\n ? profileAuthDetail(profile)\n : missingProfileHelp(connection)}\n </div>\n <div key=\"aliases\" style={{ display: \"grid\", gap: \"6px\", marginTop: \"8px\" }}>\n <label key=\"label\" style={{ fontWeight: 700 }}>\u98DE\u4E66\u91CC @ \u5B83\u7684\u540D\u5B57</label>\n <div key=\"row\" style={{ ...rowStyle, alignItems: \"stretch\" }}>\n <input\n key=\"input\"\n style={{ ...inputStyle, minWidth: \"220px\" }}\n value={aliasText}\n placeholder={`\u4F8B\u5982\uFF1A${profile?.botName || appLabel(connection, profile)}`}\n onChange={(event) => patchConnectionById(connection.id, { botAliases: splitBotAliases(event.target.value) })}\n />\n <button key=\"save-alias\" type=\"button\" style={buttonStyle} disabled={saving} onClick={() => void saveCurrentConfig({ successText: \"\u5DF2\u4FDD\u5B58\u673A\u5668\u4EBA @ \u540D\u79F0\u3002\u4E4B\u540E\u4F1A\u7528\u5B83\u5224\u65AD\u662F\u4E0D\u662F @ \u4E86\u5F53\u524D\u673A\u5668\u4EBA\u3002\" })}>\n \u4FDD\u5B58 @ \u540D\u79F0\n </button>\n </div>\n <div key=\"help\" style={helpStyle}>\u586B\u5199\u98DE\u4E66\u91CC @ \u5B83\u65F6\u770B\u5230\u7684\u540D\u5B57\uFF0C\u4F8B\u5982\u201C\u5C0F\u9510\u201D\u3002\u5982\u679C\u98DE\u4E66\u6CA1\u6709\u8FD4\u56DE\u5B98\u65B9\u673A\u5668\u4EBA\u540D\uFF0C\u8FD9\u4E2A\u540D\u5B57\u4F1A\u7528\u6765\u9632\u6B62 @\u5C0F\u9510 \u65F6\u9510\u601D\u4E5F\u54CD\u5E94\u3002</div>\n </div>\n <div key=\"state\" style={helpStyle}>\u72B6\u6001\uFF1A{profile ? \"\u53EF\u53D1\u9001 / \u53EF\u76D1\u542C\" : \"\u5F53\u524D\u4E0D\u53EF\u8FD0\u884C\uFF0C\u5148\u91CD\u65B0\u7ED1\u5B9A\u6216\u6362\u7528\u5176\u4ED6\u673A\u5668\u4EBA\"}</div>\n </div>\n </div>\n <div key=\"actions\" style={rowStyle}>\n <button key=\"entries\" type=\"button\" style={buttonStyle} onClick={() => selectMainTab(\"entries\")}>\n \u67E5\u770B\u5165\u53E3\n </button>\n <button key=\"check\" type=\"button\" style={buttonStyle} disabled={checkingConnectionId === connection.id} onClick={() => void checkConnection(connection)}>\n {checkingConnectionId === connection.id ? \"\u68C0\u67E5\u4E2D...\" : \"\u68C0\u67E5\u8FD9\u4E2A\u673A\u5668\u4EBA\"}\n </button>\n {profile && !profile.user ? (\n <button key=\"user-auth\" type=\"button\" style={buttonStyle} disabled={isStartingUserAuth} onClick={() => void startUserAuthFlow(connection.profileName)}>\n {isStartingUserAuth ? \"\u751F\u6210\u4E2D...\" : \"\u8BBF\u95EE\u4E2A\u4EBA\u8D44\u6E90\u65F6\u6388\u6743\"}\n </button>\n ) : null}\n {!profile ? (\n <button key=\"refresh\" type=\"button\" style={buttonStyle} onClick={refreshProfilesWithNotice}>\n \u5237\u65B0\u673A\u5668\u4EBA\u5217\u8868\n </button>\n ) : null}\n {!profile ? (\n <button key=\"rebind\" type=\"button\" style={buttonStyle} onClick={() => openBindPanel(connection)}>\n \u91CD\u65B0\u7ED1\u5B9A\n </button>\n ) : null}\n </div>\n {authResult?.url ? (\n <div key=\"user-auth-result\" style={successBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u9700\u8981\u8BBF\u95EE\u4E2A\u4EBA\u8D44\u6E90\u65F6\uFF0C\u6253\u5F00\u8FD9\u4E2A\u94FE\u63A5\u6388\u6743</div>\n <div key=\"help\" style={helpStyle}>\n \u6536\u53D1\u98DE\u4E66\u6D88\u606F\u4E0D\u9700\u8981\u8FD9\u4E00\u6B65\u3002\u53EA\u6709\u8BA9\u673A\u5668\u4EBA\u8BBF\u95EE\u4F60\u7684\u4E2A\u4EBA\u4E91\u6587\u6863\u3001\u65E5\u5386\u3001\u90AE\u7BB1\u7B49\u8D44\u6E90\u65F6\u624D\u9700\u8981\u4E2A\u4EBA\u6388\u6743\u3002\n </div>\n <div key=\"actions\" style={{ ...rowStyle, marginTop: \"10px\" }}>\n <a key=\"open\" href={authResult.url} target=\"_blank\" rel=\"noreferrer\" style={linkButtonStyle}>\n \u6253\u5F00\u6388\u6743\u94FE\u63A5\n </a>\n <button key=\"finish\" type=\"button\" style={buttonStyle} disabled={isFinishingUserAuth} onClick={() => void finishUserAuthFlow(connection.profileName)}>\n {isFinishingUserAuth ? \"\u786E\u8BA4\u4E2D...\" : \"\u6211\u5DF2\u5B8C\u6210\u6388\u6743\uFF0C\u5237\u65B0\u72B6\u6001\"}\n </button>\n </div>\n </div>\n ) : null}\n {connectionCheck ? (\n <InlineCheckReport key=\"check-result\" items={connectionCheck.items} checkedAt={connectionCheck.checkedAt} />\n ) : null}\n </div>\n );\n })}\n </div>\n <div key=\"hint\" style={helpStyle}>\u673A\u5668\u4EBA\u53EA\u662F\u8D26\u53F7\u6C60\uFF1B\u771F\u6B63\u7528\u54EA\u4E2A\u673A\u5668\u4EBA\uFF0C\u5728\u6BCF\u6761\u5165\u53E3\u91CC\u9009\u62E9\u3002</div>\n </section>\n ) : null}\n\n {activeMainTab === \"entries\" ? (\n <Fragment key=\"entries-wizard-tab\">\n <section id=\"feishu-entry-wizard\" key=\"product-wizard\" style={productSectionStyle}>\n <div key=\"header\" style={sectionHeaderStyle}>\n <h3 key=\"title\" style={{ margin: 0, fontSize: \"18px\" }}>\u65B0\u589E\u4E1A\u52A1\u5165\u53E3</h3>\n <button key=\"toggle\" type=\"button\" style={buttonStyle} onClick={() => showEntryWizard ? setShowEntryWizard(false) : openEntryWizard()}>\n {showEntryWizard ? \"\u6536\u8D77\" : \"\u6253\u5F00\u5411\u5BFC\"}\n </button>\n </div>\n {!showEntryWizard ? (\n <div key=\"collapsed\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u9700\u8981\u65B0\u589E\u5165\u53E3\u65F6\u518D\u6253\u5F00\u5411\u5BFC</div>\n <div key=\"help\" style={helpStyle}>\n \u73B0\u6709\u5165\u53E3\u5DF2\u7ECF\u5728\u4E0A\u9762\u5C55\u793A\u3002\u65B0\u589E\u5165\u53E3\u4F1A\u8BA9\u53E6\u4E00\u7C7B\u98DE\u4E66\u6D88\u606F\u8FDB\u5165 Paperclip\uFF0C\u5E76\u6307\u5B9A\u673A\u5668\u4EBA\u3001\u516C\u53F8\u3001\u667A\u80FD\u4F53\u548C\u56DE\u590D\u65B9\u5F0F\u3002\n </div>\n </div>\n ) : null}\n <div key=\"steps\" style={{ ...wizardStepperStyle, display: showEntryWizard ? \"grid\" : \"none\" }}>\n <FlowStep key=\"source\" title=\"1 \u9009\u62E9\u6D88\u606F\u6765\u6E90\" value={matchTypeLabels[wizardDraft.matchType]} detail=\"\u7FA4/\u5355\u804A/\u53D1\u6D88\u606F\u4EBA/\u5173\u952E\u8BCD\" />\n <FlowStep key=\"bot\" title=\"2 \u9009\u62E9\u673A\u5668\u4EBA\" value={appLabel(connections.find((connection) => connection.id === wizardDraft.connectionId) ?? preferredConnection, profiles.find((profile) => profile.name === (connections.find((connection) => connection.id === wizardDraft.connectionId) ?? preferredConnection)?.profileName))} detail=\"\u4ECE\u673A\u5668\u4EBA\u6C60\u91CC\u6311\u9009\" />\n <FlowStep key=\"agent\" title=\"3 \u9009\u62E9 Paperclip \u516C\u53F8\u548C\u667A\u80FD\u4F53\" value={(() => {\n const company = companies.find((item) => item.id === wizardDraft.companyId)\n ?? firstEnabledRouteSummary?.company\n ?? companies[0]\n ?? null;\n const agent = company?.agents.find((item) => item.id === wizardDraft.targetAgentId)\n ?? (company?.id === firstEnabledRouteSummary?.company?.id ? firstEnabledRouteSummary.agent : null)\n ?? company?.agents[0]\n ?? null;\n return routeTargetLabel(company, agent);\n })()} detail=\"\u6307\u5B9A\u516C\u53F8\u4E0E\u667A\u80FD\u4F53\u5904\u7406\" />\n <FlowStep key=\"reply\" title=\"4 \u56DE\u590D\u4E0E\u6C89\u6DC0\" value={replyModeLabels[wizardDraft.replyMode]} detail=\"\u56DE\u590D\u65B9\u5F0F\u4E0E\u5199\u5165\u89C4\u5219\" />\n </div>\n <div key=\"compact-fields\" style={{ display: showEntryWizard ? \"grid\" : \"none\", gridTemplateColumns: \"repeat(auto-fit, minmax(150px, 1fr))\", gap: \"10px\" }}>\n <Field key=\"matchType\" label=\"\u6D88\u606F\u6765\u6E90\">\n <select style={selectStyle} value={wizardDraft.matchType} onChange={(event) => patchWizardDraft({ matchType: event.target.value as FeishuRouteConfig[\"matchType\"] })}>\n {Object.entries(matchTypeLabels).map(([value, label], optionIndex) => (\n <option key={`product-wizard-match-${optionIndex}-${value}`} value={value}>{label}</option>\n ))}\n </select>\n </Field>\n <Field key=\"connection\" label=\"\u98DE\u4E66\u673A\u5668\u4EBA\">\n <select style={selectStyle} value={wizardDraft.connectionId ?? preferredConnection?.id ?? \"\"} onChange={(event) => patchWizardDraft({ connectionId: event.target.value })}>\n {connectionOptionNodes(activeConnections.length > 0 ? activeConnections : connections, \"product-wizard-connection\", undefined, profiles)}\n </select>\n </Field>\n <Field key=\"company\" label=\"Paperclip \u516C\u53F8\">\n <select\n style={selectStyle}\n value={(companies.find((item) => item.id === wizardDraft.companyId) ?? firstEnabledRouteSummary?.company ?? companies[0])?.id ?? \"\"}\n onChange={(event) => {\n const nextCompany = companies.find((item) => item.id === event.target.value);\n const nextAgent = nextCompany?.agents[0];\n patchWizardDraft({ companyId: nextCompany?.id, targetAgentId: nextAgent?.id });\n }}\n >\n {companyOptionNodes(companies, \"product-wizard-company\")}\n </select>\n </Field>\n <Field key=\"agent\" label=\"\u667A\u80FD\u4F53\">\n {(() => {\n const company = companies.find((item) => item.id === wizardDraft.companyId)\n ?? firstEnabledRouteSummary?.company\n ?? companies[0]\n ?? null;\n const agents = company?.agents ?? [];\n const agent = agents.find((item) => item.id === wizardDraft.targetAgentId)\n ?? (company?.id === firstEnabledRouteSummary?.company?.id ? firstEnabledRouteSummary.agent : null)\n ?? agents[0]\n ?? null;\n return (\n <select style={selectStyle} value={agent?.id ?? \"\"} disabled={!company} onChange={(event) => patchWizardDraft({ targetAgentId: event.target.value })}>\n {agentOptionNodes(agents, \"product-wizard-agent\")}\n </select>\n );\n })()}\n </Field>\n <Field key=\"reply\" label=\"\u56DE\u590D\u65B9\u5F0F\">\n <select style={selectStyle} value={wizardDraft.replyMode} onChange={(event) => patchWizardDraft({ replyMode: event.target.value as NonNullable<FeishuRouteConfig[\"replyMode\"]> })}>\n {Object.entries(replyModeLabels).map(([value, label], optionIndex) => (\n <option key={`product-wizard-reply-${optionIndex}-${value}`} value={value}>{label}</option>\n ))}\n </select>\n </Field>\n </div>\n {showEntryWizard ? (\n <div key=\"detail-fields\" style={gridTwoStyle}>\n {wizardDraft.matchType === \"keyword\" ? (\n <Field key=\"keyword\" label=\"\u5173\u952E\u8BCD\uFF08\u4E0D\u533A\u5206\u5927\u5C0F\u5199\uFF09\" help=\"\u4E0D\u662F\u5FC5\u987B\u586B paperclip\u3002\u53EF\u4EE5\u586B\u201C\u5C0F\u601D\u201D\u201C\u627E\u4EBA\u201D\u201C\u8D44\u8BAF\u201D\u7B49\u4E1A\u52A1\u8BCD\uFF1B\u6D88\u606F\u91CC\u5305\u542B\u5B83\u5C31\u4F1A\u8FDB\u5165 Paperclip\u3002\">\n <input style={inputStyle} value={wizardDraft.keyword ?? \"\"} onChange={(event) => patchWizardDraft({ keyword: event.target.value })} />\n </Field>\n ) : null}\n {wizardDraft.matchType === \"regex\" ? (\n <Field key=\"regex\" label=\"\u9AD8\u7EA7\u89C4\u5219\" help=\"\u5DE5\u7A0B\u5E08\u7528\u3002\u666E\u901A\u573A\u666F\u5EFA\u8BAE\u4F18\u5148\u9009\u62E9\u5173\u952E\u8BCD\u6216\u6307\u5B9A\u7FA4\u3002\">\n <input style={inputStyle} value={wizardDraft.regex ?? \"\"} onChange={(event) => patchWizardDraft({ regex: event.target.value })} />\n </Field>\n ) : null}\n {showEntryWizard && wizardDraft.matchType === \"chat\" ? (\n <Field key=\"chat\" label=\"\u9009\u62E9\u98DE\u4E66\u7FA4\u6216\u5355\u804A\">\n <ChatSearchControl\n query={chatSearchQuery}\n onQueryChange={setChatSearchQuery}\n chats={directoryCatalog.data?.chats ?? []}\n loading={directoryCatalog.loading}\n error={directoryCatalog.data?.chatError ?? directoryCatalog.error?.message}\n currentChatId={wizardDraft.chatId}\n currentChatName={wizardDraft.chatName}\n profileName={directoryCatalog.data?.profileName ?? directoryProfileName}\n onSelect={selectChatForWizard}\n />\n </Field>\n ) : null}\n {showEntryWizard && wizardDraft.matchType === \"user\" ? (\n <Field key=\"user\" label=\"\u9009\u62E9\u53D1\u6D88\u606F\u4EBA\">\n <UserSearchControl\n query={userSearchQuery}\n onQueryChange={setUserSearchQuery}\n users={directoryCatalog.data?.users ?? []}\n loading={directoryCatalog.loading}\n error={directoryCatalog.data?.userError ?? directoryCatalog.error?.message}\n currentUserOpenId={wizardDraft.userOpenId}\n currentUserName={wizardDraft.userName}\n profileName={directoryCatalog.data?.profileName ?? directoryProfileName}\n onSelect={selectUserForWizard}\n />\n </Field>\n ) : null}\n </div>\n ) : null}\n {showEntryWizard ? (\n <div key=\"actions\" style={rowStyle}>\n <button key=\"create\" type=\"button\" style={primaryButtonStyle} onClick={createEntryFromWizard}>\n \u521B\u5EFA\u5165\u53E3\n </button>\n <span key=\"hint\" style={helpStyle}>\u521B\u5EFA\u540E\u4FDD\u5B58\u914D\u7F6E\uFF0C\u518D\u5230\u673A\u5668\u4EBA\u5355\u804A\u6216\u6D4B\u8BD5\u4F1A\u8BDD\u53D1\u9001\u6D4B\u8BD5\u8BDD\u672F\u3002</span>\n </div>\n ) : null}\n </section>\n </Fragment>\n ) : null}\n\n {activeMainTab === \"test\" ? (\n <section id=\"feishu-test\" key=\"product-test\" style={productSectionStyle}>\n <h3 key=\"title\" style={{ margin: 0, fontSize: \"18px\" }}>4. \u771F\u5B9E\u6D4B\u8BD5</h3>\n <Field key=\"smoke\" label=\"\u6D4B\u8BD5\u8BDD\u672F\uFF08\u4F18\u5148\u53D1\u7ED9\u673A\u5668\u4EBA\u5355\u804A\u6216\u6D4B\u8BD5\u4F1A\u8BDD\uFF09\">\n <div key=\"copy-row\" style={{ display: \"grid\", gridTemplateColumns: \"minmax(0, 1fr) auto\", gap: \"10px\" }}>\n <code key=\"text\" style={{ ...codeStyle, fontSize: \"14px\", padding: \"11px 12px\" }}>{smokeText}</code>\n <button key=\"copy\" type=\"button\" style={buttonStyle} onClick={() => void copySmokeText()}>\n \u590D\u5236\n </button>\n </div>\n <div key=\"quick-hint\" style={helpStyle}>\n \u9875\u9762\u6A21\u62DF\u53EA\u9A8C\u8BC1\u5165\u53E3\u89C4\u5219\uFF0C\u4F1A\u4F7F\u7528\u8FDE\u901A\u6027\u53E3\u4EE4\uFF1A{quickSmokeText}\u3002\u771F\u5B9E\u98DE\u4E66\u9A8C\u6536\u4F18\u5148\u53D1\u7ED9\u673A\u5668\u4EBA\u5355\u804A\u6216\u53EA\u5305\u542B\u6D4B\u8BD5\u4EBA\u5458\u7684\u4F1A\u8BDD\uFF0C\u591A\u4EBA\u7FA4\u53EA\u505A\u6700\u7EC8\u6F14\u793A\u786E\u8BA4\u3002\n </div>\n </Field>\n <div key=\"real-test-pipeline\" style={heroCommandStyle}>\n <div key=\"header\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 900, fontSize: \"16px\" }}>\u771F\u5B9E\u6D4B\u8BD5\u94FE\u8DEF</div>\n <div key=\"help\" style={helpStyle}>\n \u8FD9\u4E9B\u90FD\u53D8\u6210\u201C\u5B8C\u6210\u201D\u540E\uFF0C\u518D\u53BB\u98DE\u4E66\u53D1\u6D4B\u8BD5\u6D88\u606F\u3002\u4F18\u5148\u7528\u673A\u5668\u4EBA\u5355\u804A\u6216\u6D4B\u8BD5\u4F1A\u8BDD\u9A8C\u8BC1\uFF0C\u6700\u7EC8\u4EE5\u98DE\u4E66\u4F1A\u8BDD\u91CC\u7684\u771F\u5B9E\u56DE\u590D\u4E3A\u51C6\u3002\n </div>\n </div>\n <button key=\"check\" type=\"button\" style={buttonStyle} disabled={checking} onClick={() => void testCurrentConfig()}>\n {checking ? \"\u68C0\u67E5\u4E2D...\" : \"\u68C0\u67E5\u8FDE\u63A5\"}\n </button>\n </div>\n <div key=\"pipeline\" style={pipelineStyle}>\n {realTestPipeline.map((step) => (\n <PipelineStep key={step.label} done={step.done} label={step.label} detail={step.detail} />\n ))}\n </div>\n </div>\n <div key=\"checks\" style={checklistGridStyle}>\n <ChecklistItem\n key=\"bot\"\n done={firstRouteConnectionReady}\n title=\"\u5F53\u524D\u5165\u53E3\u673A\u5668\u4EBA\u53EF\u8FD0\u884C\"\n detail={firstRouteConnectionReady\n ? \"\u6D4B\u8BD5\u5165\u53E3\u7ED1\u5B9A\u7684\u673A\u5668\u4EBA\u5728\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u53EF\u7528\u3002\"\n : hasUsableConnection\n ? \"\u6709\u5176\u4ED6\u673A\u5668\u4EBA\u53EF\u7528\uFF0C\u4F46\u5F53\u524D\u5165\u53E3\u7ED1\u5B9A\u7684\u673A\u5668\u4EBA\u4E0D\u53EF\u8FD0\u884C\u3002\u8BF7\u5148\u7F16\u8F91\u5165\u53E3\u6362\u673A\u5668\u4EBA\u3002\"\n : hasConnection\n ? \"\u914D\u7F6E\u91CC\u6709\u673A\u5668\u4EBA\uFF0C\u4F46\u5F53\u524D lark-cli \u6CA1\u6709\u8BFB\u5230\u5BF9\u5E94 profile\u3002\"\n : \"\u5148\u7ED1\u5B9A\u673A\u5668\u4EBA\u3002\"}\n />\n <ChecklistItem key=\"event\" done={isListening} title=\"\u76D1\u542C\u5F00\u5173\u5DF2\u5F00\u542F\" detail={isListening ? \"\u76D1\u542C\u5DF2\u5F00\u542F\u3002\" : \"\u6253\u5F00\u76D1\u542C\u540E\u518D\u5B9E\u6D4B\u3002\"} />\n <ChecklistItem key=\"listen\" done={isListening} title=\"\u76D1\u542C\u8FDB\u7A0B\u8FD0\u884C\u4E2D\" detail={runtimeStatusLabel} />\n <ChecklistItem key=\"send\" done={isSendingRealMessages} title=\"\u771F\u5B9E\u56DE\u590D\u5F00\u542F\" detail={isSendingRealMessages ? \"\u4F1A\u56DE\u5230\u98DE\u4E66\u3002\" : \"\u5F53\u524D\u662F\u6D4B\u8BD5\u6A21\u5F0F\u3002\"} />\n <ChecklistItem key=\"attachments\" done={isSendingRealMessages} title=\"\u9644\u4EF6\u8FDB\u5165\u4EFB\u52A1\" detail={isSendingRealMessages ? \"\u98DE\u4E66\u56FE\u7247/\u6587\u4EF6\u4F1A\u4F5C\u4E3A\u4EFB\u52A1\u9644\u4EF6\u3002\" : \"\u6D4B\u8BD5\u6A21\u5F0F\u53EA\u8BB0\u5F55\u9644\u4EF6\u540D\u3002\"} />\n </div>\n <CheckReport key=\"capability-checks\" title=\"\u80FD\u529B\u4F53\u68C0\" items={capabilityChecks} />\n {productionMonitor ? (\n <CheckReport\n key=\"production-monitor\"\n title={`\u8FD0\u884C\u63D0\u9192\uFF1A${friendlyMonitorMessage(productionMonitor.message)}`}\n items={productionMonitorChecks}\n />\n ) : null}\n <div key=\"actions\" style={rowStyle}>\n <button\n key=\"test\"\n type=\"button\"\n style={primaryButtonStyle}\n disabled={!firstEnabledRouteSummary || testingRouteId === firstEnabledRouteSummary.route.id}\n onClick={() => firstEnabledRouteSummary && void testEntryRoute(firstEnabledRouteSummary.route)}\n >\n {firstEnabledRouteSummary && testingRouteId === firstEnabledRouteSummary.route.id ? \"\u6D4B\u8BD5\u4E2D...\" : \"\u8FD0\u884C\u9875\u9762\u6A21\u62DF\u6D4B\u8BD5\"}\n </button>\n <button key=\"doc\" type=\"button\" style={buttonStyle} onClick={openFeishuTestGuide}>\n {showFeishuTestGuide ? \"\u6536\u8D77\u6D4B\u8BD5\u8BF4\u660E\" : \"\u67E5\u770B\u98DE\u4E66\u6D4B\u8BD5\u8BF4\u660E\"}\n </button>\n </div>\n {showFeishuTestGuide ? (\n <div id=\"feishu-test-guide\" key=\"guide\" style={successBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"8px\" }}>\u98DE\u4E66\u91CC\u600E\u4E48\u786E\u8BA4\u771F\u7684\u751F\u6548</div>\n <div key=\"steps\" style={flowGridStyle}>\n <FlowStep key=\"step-1\" title=\"1. \u5148\u770B\u76EE\u6807\u4F1A\u8BDD\" value=\"\u673A\u5668\u4EBA\u5728\u5355\u804A\u6216\u6D4B\u8BD5\u4F1A\u8BDD\u91CC\" detail=\"\u5982\u679C\u76EE\u6807\u4F1A\u8BDD\u91CC\u6CA1\u6709\u8FD9\u4E2A\u673A\u5668\u4EBA\uFF0C\u98DE\u4E66\u4E0D\u4F1A\u628A\u6D88\u606F\u4EA4\u7ED9\u5B83\u3002\" />\n <FlowStep key=\"step-2\" title=\"2. \u590D\u5236\u8BDD\u672F\" value={smokeText} detail=\"\u4F18\u5148\u7C98\u8D34\u5230\u673A\u5668\u4EBA\u5355\u804A\u6216\u6D4B\u8BD5\u4F1A\u8BDD\u91CC\u53D1\u9001\u3002\" />\n <FlowStep key=\"step-3\" title=\"3. \u53EF\u5E26\u4E00\u4E2A\u9644\u4EF6\" value=\"\u56FE\u7247\u6216\u6587\u4EF6\u4F1A\u8FDB\u4EFB\u52A1\u9644\u4EF6\" detail=\"\u771F\u5B9E\u53D1\u9001\u65F6\uFF0C\u9644\u4EF6\u4F1A\u4E0B\u8F7D\u5230 Paperclip \u4EFB\u52A1\u91CC\uFF0C\u667A\u80FD\u4F53\u80FD\u770B\u5230\u9644\u4EF6\u540D\u79F0\u548C\u4E0A\u4F20\u7ED3\u679C\u3002\" />\n <FlowStep key=\"step-4\" title=\"4. \u56DE\u6765\u770B Paperclip\" value=\"\u4F1A\u751F\u6210\u4EFB\u52A1\u6216\u663E\u793A\u6D4B\u8BD5\u7ED3\u679C\" detail=\"\u9875\u9762\u6A21\u62DF\u901A\u8FC7\u53EA\u8BC1\u660E\u89C4\u5219\u80FD\u5339\u914D\uFF0C\u771F\u5B9E\u6548\u679C\u4EE5\u98DE\u4E66\u6D88\u606F\u4E3A\u51C6\u3002\" />\n <FlowStep key=\"step-5\" title=\"5. \u6CA1\u56DE\u590D\u65F6\" value=\"\u5148\u68C0\u67E5\u673A\u5668\u4EBA\u5361\u7247\" detail=\"\u770B\u6388\u6743\u3001\u5165\u53E3\u3001\u76D1\u542C\u3001\u771F\u5B9E\u56DE\u590D\u56DB\u9879\u662F\u5426\u90FD\u901A\u8FC7\u3002\" />\n </div>\n <div key=\"actions\" style={{ ...rowStyle, marginTop: \"12px\" }}>\n <button key=\"copy\" type=\"button\" style={primaryButtonStyle} onClick={() => void copySmokeText()}>\n \u590D\u5236\u6D4B\u8BD5\u8BDD\u672F\n </button>\n <button key=\"check\" type=\"button\" style={buttonStyle} disabled={checking} onClick={() => void testCurrentConfig()}>\n {checking ? \"\u68C0\u67E5\u4E2D...\" : \"\u68C0\u67E5\u6574\u4F53\u8FDE\u63A5\"}\n </button>\n </div>\n </div>\n ) : null}\n </section>\n ) : null}\n\n {activeMainTab === \"advanced\" ? (\n <section id=\"feishu-advanced\" key=\"product-advanced-links\" style={productSectionStyle}>\n <div key=\"header\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <h3 key=\"title\" style={{ margin: 0, fontSize: \"18px\" }}>\u9AD8\u7EA7\u8BBE\u7F6E\uFF08\u5DE5\u7A0B\u5E08\uFF09</h3>\n <div key=\"help\" style={helpStyle}>\n \u65E5\u5E38\u4E0D\u7528\u6253\u5F00\u3002\u8FD9\u91CC\u6309\u4E3B\u9898\u62C6\u5F00\uFF0C\u70B9\u54EA\u4E00\u9879\u53EA\u770B\u54EA\u4E00\u9879\uFF0C\u4E0D\u518D\u51FA\u73B0\u6574\u9875\u539F\u59CB\u914D\u7F6E\u3002\n </div>\n </div>\n <div key=\"actions\" style={rowStyle}>\n <button key=\"save\" type=\"button\" style={primaryButtonStyle} disabled={saving} onClick={() => void saveCurrentConfig()}>\n {saving ? \"\u6B63\u5728\u4FDD\u5B58...\" : \"\u4FDD\u5B58\u914D\u7F6E\"}\n </button>\n <button key=\"check\" type=\"button\" style={buttonStyle} disabled={saving || checking} onClick={() => void testCurrentConfig()}>\n {checking ? \"\u6B63\u5728\u68C0\u67E5...\" : \"\u68C0\u67E5\u8FDE\u63A5\"}\n </button>\n </div>\n </div>\n\n <div key=\"advanced-links\" style={settingsShellStyle}>\n {[\n { key: \"auth\" as const, label: \"\u98DE\u4E66\u5E94\u7528\u6388\u6743\u4E0E App Secret\", detail: `${profiles.length} \u4E2A lark-cli profile\uFF0C${activeConnections.length} \u4E2A\u5DF2\u52A0\u5165\u673A\u5668\u4EBA\u6C60` },\n { key: \"capabilities\" as const, label: \"\u80FD\u529B\u4E2D\u5FC3\", detail: capabilityCenter.loading ? \"\u6B63\u5728\u8BFB\u53D6\u80FD\u529B\u76EE\u5F55\" : `${enabledCapabilityCount} \u9879\u5DF2\u5F00\u542F \u00B7 lark-* skills \u4E0D\u81EA\u52A8\u540C\u6B65` },\n { key: \"deploy\" as const, label: \"\u672C\u5730\u6D4B\u8BD5 / \u4E91\u670D\u52A1\u5668\u90E8\u7F72\", detail: `${runningOnLocalhost ? \"\u5F53\u524D\u5728\u672C\u5730\u6D4B\u8BD5\" : \"\u5F53\u524D\u5728\u670D\u52A1\u5668\u8FD0\u884C\"} \u00B7 profile ${serverProfileName(serverDeployConnection)}` },\n { key: \"runtime\" as const, label: \"lark-cli \u8FD0\u884C\u73AF\u5883\", detail: `${isSendingRealMessages ? \"\u771F\u5B9E\u53D1\u9001\" : \"\u6A21\u62DF\u53D1\u9001\"} \u00B7 ${isListening ? \"\u76D1\u542C\u5DF2\u5F00\u542F\" : \"\u76D1\u542C\u672A\u5F00\u542F\"}` },\n { key: \"events\" as const, label: \"\u4E8B\u4EF6\u8BA2\u9605\u4E0E\u65E5\u5FD7\", detail: `${connectorStatus.data?.subscribers?.length ?? 0} \u4E2A\u76D1\u542C\u8FDB\u7A0B \u00B7 \u6700\u8FD1\u4E8B\u4EF6 ${connectorStatus.data?.recentRecords?.length ?? 0} \u6761` },\n { key: \"base\" as const, label: \"\u591A\u7EF4\u8868\u683C\u540C\u6B65\", detail: baseSinks.length > 0 ? `${baseSinks.length} \u6761\u5199\u5165\u89C4\u5219` : \"\u672A\u914D\u7F6E\uFF0C\u53EF\u7559\u7A7A\" },\n { key: \"config\" as const, label: \"\u5BFC\u5165 / \u5BFC\u51FA\u914D\u7F6E\", detail: \"\u8FC1\u79FB\u5165\u53E3\u548C\u673A\u5668\u4EBA\u6C60\uFF0C\u4E0D\u5BFC\u51FA App Secret\" },\n ].map((item) => (\n <button\n key={item.key}\n type=\"button\"\n style={{\n ...buttonStyle,\n height: \"auto\",\n minHeight: \"52px\",\n justifyContent: \"space-between\",\n textAlign: \"left\",\n width: \"100%\",\n display: \"flex\",\n padding: \"10px 12px\",\n border: showAdvancedSettings && activeAdvancedPanel === item.key ? \"1px solid var(--foreground)\" : buttonStyle.border,\n background: showAdvancedSettings && activeAdvancedPanel === item.key ? \"var(--muted)\" : buttonStyle.background,\n }}\n onClick={() => {\n setShowAdvancedSettings(true);\n setActiveAdvancedPanel(item.key);\n }}\n >\n <span key=\"label\" style={{ display: \"grid\", gap: \"2px\" }}>\n <strong key=\"title\">{item.label}</strong>\n <span key=\"detail\" style={helpStyle}>{item.detail}</span>\n </span>\n <span key=\"chevron\" aria-hidden=\"true\">\u203A</span>\n </button>\n ))}\n </div>\n\n {showAdvancedSettings ? (\n <div key=\"advanced-panel\" style={productEntryEditorStyle}>\n <div key=\"advanced-panel-head\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 800 }}>\n {activeAdvancedPanel === \"auth\" ? \"\u98DE\u4E66\u5E94\u7528\u6388\u6743\u4E0E App Secret\" : null}\n {activeAdvancedPanel === \"capabilities\" ? \"\u80FD\u529B\u4E2D\u5FC3\" : null}\n {activeAdvancedPanel === \"deploy\" ? \"\u672C\u5730\u6D4B\u8BD5 / \u4E91\u670D\u52A1\u5668\u90E8\u7F72\" : null}\n {activeAdvancedPanel === \"runtime\" ? \"lark-cli \u8FD0\u884C\u73AF\u5883\" : null}\n {activeAdvancedPanel === \"events\" ? \"\u4E8B\u4EF6\u8BA2\u9605\u4E0E\u65E5\u5FD7\" : null}\n {activeAdvancedPanel === \"base\" ? \"\u591A\u7EF4\u8868\u683C\u540C\u6B65\" : null}\n {activeAdvancedPanel === \"config\" ? \"\u5BFC\u5165 / \u5BFC\u51FA\u914D\u7F6E\" : null}\n </div>\n <div key=\"help\" style={helpStyle}>\n {activeAdvancedPanel === \"auth\" ? \"\u666E\u901A\u7528\u6237\u53EA\u9700\u8981\u786E\u8BA4\u673A\u5668\u4EBA\u53EF\u7528\uFF1BApp Secret \u4E0D\u5728\u9875\u9762\u5C55\u793A\uFF0C\u907F\u514D\u8BEF\u622A\u56FE\u6CC4\u9732\u3002\" : null}\n {activeAdvancedPanel === \"capabilities\" ? \"\u8FD9\u91CC\u5C55\u793A Agent \u53EF\u4EE5\u901A\u8FC7\u63D2\u4EF6\u8C03\u7528\u54EA\u4E9B\u98DE\u4E66\u80FD\u529B\uFF0C\u4EE5\u53CA\u5B83\u4EEC\u548C lark-cli\u3001lark-* skills \u7684\u5173\u7CFB\u3002\" : null}\n {activeAdvancedPanel === \"deploy\" ? \"\u672C\u5730\u80FD\u8DD1\u901A\u4E0D\u7B49\u4E8E\u4E91\u7AEF\u5DF2\u7ECF\u53EF\u7528\uFF1B\u4E91\u670D\u52A1\u5668\u4E5F\u8981\u7ED1\u5B9A\u540C\u4E00\u4E2A\u98DE\u4E66\u5E94\u7528\uFF0C\u5E76\u4E14\u53EA\u4FDD\u7559\u4E00\u4E2A\u6B63\u5F0F\u76D1\u542C\u5B9E\u4F8B\u3002\" : null}\n {activeAdvancedPanel === \"runtime\" ? \"\u63A7\u5236\u662F\u5426\u76D1\u542C\u98DE\u4E66\u6D88\u606F\u3001\u662F\u5426\u771F\u5B9E\u56DE\u590D\uFF0C\u4EE5\u53CA\u672C\u673A lark-cli \u8DEF\u5F84\u3002\" : null}\n {activeAdvancedPanel === \"events\" ? \"\u770B\u76D1\u542C\u662F\u5426\u5728\u8DD1\uFF0C\u4EE5\u53CA\u6700\u8FD1\u6709\u6CA1\u6709\u9519\u8BEF\u3002\u8FD9\u91CC\u4E0D\u8981\u6C42\u666E\u901A\u7528\u6237\u586B\u5199\u4EFB\u4F55\u5185\u90E8 ID\u3002\" : null}\n {activeAdvancedPanel === \"base\" ? \"\u9700\u8981\u628A\u9700\u6C42\u6C89\u6DC0\u5230\u98DE\u4E66\u591A\u7EF4\u8868\u683C\u65F6\u518D\u914D\u7F6E\uFF1B\u4E0D\u9700\u8981\u5C31\u4FDD\u6301\u4E3A\u7A7A\u3002\" : null}\n {activeAdvancedPanel === \"config\" ? \"\u7528\u4E8E\u628A\u5165\u53E3\u3001\u673A\u5668\u4EBA\u6C60\u548C\u80FD\u529B\u5F00\u5173\u8FC1\u79FB\u5230\u53E6\u4E00\u5957 Paperclip\uFF1B\u5BFC\u5165\u540E\u4ECD\u9700\u70B9\u51FB\u4FDD\u5B58\u914D\u7F6E\u3002\" : null}\n </div>\n </div>\n <button key=\"close\" type=\"button\" style={buttonStyle} onClick={() => setShowAdvancedSettings(false)}>\n \u56DE\u5230\u9AD8\u7EA7\u5217\u8868\n </button>\n </div>\n\n {activeAdvancedPanel === \"auth\" ? (\n <div key=\"auth-panel\" style={{ display: \"grid\", gap: \"12px\" }}>\n <div key=\"first-install-checklist\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"8px\" }}>\u9996\u88C5\u68C0\u67E5\u6E05\u5355</div>\n <div key=\"steps\" style={checklistGridStyle}>\n <ChecklistItem key=\"create-app\" done={profiles.length > 0 || activeConnections.length > 0} title=\"1. \u521B\u5EFA\u6216\u9009\u62E9\u98DE\u4E66\u5E94\u7528\" detail=\"\u666E\u901A\u7528\u6237\u9009\u5DF2\u6709\u516C\u53F8\u673A\u5668\u4EBA\uFF1B\u7BA1\u7406\u5458\u53EF\u4EE5\u65B0\u5EFA\u98DE\u4E66\u673A\u5668\u4EBA\u5E94\u7528\u3002\" />\n <ChecklistItem key=\"bot-enabled\" done={activeConnections.length > 0} title=\"2. \u5F00\u542F\u673A\u5668\u4EBA\u80FD\u529B\" detail=\"\u98DE\u4E66\u5E94\u7528\u5FC5\u987B\u6709\u673A\u5668\u4EBA\u80FD\u529B\uFF0C\u5E76\u52A0\u5165\u76EE\u6807\u7FA4\u804A\u3002\" />\n <ChecklistItem key=\"permissions\" done={enabledCapabilityCount > 0} title=\"3. \u5BFC\u5165\u63A8\u8350\u6743\u9650\" detail=\"\u5230\u80FD\u529B\u4E2D\u5FC3\u590D\u5236\u63A8\u8350\u6743\u9650 JSON\uFF1B\u5DF2\u63A5\u5165\u80FD\u529B\u9ED8\u8BA4\u6309\u98DE\u4E66\u5E94\u7528\u6388\u6743\u5F00\u653E\uFF0C\u4E0D\u9700\u8981\u9010\u9879\u786E\u8BA4\u3002\" />\n <ChecklistItem key=\"publish\" done={false} title=\"4. \u53D1\u5E03\u98DE\u4E66\u5E94\u7528\" detail=\"\u98DE\u4E66\u53EF\u80FD\u9700\u8981\u7BA1\u7406\u5458\u786E\u8BA4\u3001\u53D1\u5E03\u7248\u672C\u3001\u914D\u7F6E\u4E8B\u4EF6\u8BA2\u9605\u548C\u53EF\u89C1\u8303\u56F4\u3002\" />\n <ChecklistItem key=\"paperclip-check\" done={hasUsableConnection} title=\"5. \u56DE\u5230 Paperclip \u68C0\u67E5\u8FDE\u63A5\" detail=\"\u5237\u65B0\u673A\u5668\u4EBA\u5217\u8868\u540E\u70B9\u201C\u68C0\u67E5\u8FDE\u63A5\u201D\uFF0C\u518D\u53BB\u98DE\u4E66\u7FA4\u91CC\u53D1\u6D4B\u8BD5\u8BDD\u672F\u3002\" />\n </div>\n </div>\n <div key=\"auth-actions\" style={rowStyle}>\n <button key=\"refresh\" type=\"button\" style={buttonStyle} onClick={refreshProfilesWithNotice}>\n \u5237\u65B0\u673A\u5668\u4EBA\u5217\u8868\n </button>\n <button key=\"bind\" type=\"button\" style={primaryButtonStyle} onClick={() => openBindPanel()}>\n \u7ED1\u5B9A\u65B0\u7684\u98DE\u4E66\u673A\u5668\u4EBA\n </button>\n <a key=\"platform\" href=\"https://open.feishu.cn/app\" target=\"_blank\" rel=\"noreferrer\" style={linkButtonStyle}>\n \u6253\u5F00\u98DE\u4E66\u5F00\u653E\u5E73\u53F0\n </a>\n </div>\n <div key=\"profiles\" style={gridTwoStyle}>\n {profiles.length === 0 ? (\n <div key=\"empty\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 700 }}>\u8FD8\u6CA1\u6709\u53D1\u73B0\u98DE\u4E66\u673A\u5668\u4EBA</div>\n <div key=\"help\" style={helpStyle}>\u70B9\u51FB\u201C\u7ED1\u5B9A\u65B0\u7684\u98DE\u4E66\u673A\u5668\u4EBA\u201D\uFF0C\u6309\u5B98\u65B9\u94FE\u63A5\u5B8C\u6210\u6388\u6743\u540E\u518D\u5237\u65B0\u3002</div>\n </div>\n ) : null}\n {profiles.map((profile, index) => {\n const connection = connections.find((item) => item.profileName === profile.name);\n const enabled = connection?.enabled !== false && Boolean(connection);\n const authResult = userAuthResults[profile.name];\n const isStartingUserAuth = startingUserAuthProfileName === profile.name;\n const isFinishingUserAuth = finishingUserAuthProfileName === profile.name;\n return (\n <div key={`${profile.name}-${index}`} style={guideCardStyle}>\n <div key=\"title\" style={{ fontWeight: 800 }}>{appLabel(connection, profile)}</div>\n <div key=\"meta\" style={helpStyle}>{profileLabel(profile)}</div>\n <div key=\"state\" style={helpStyle}>App ID\uFF1A{maskTechnicalId(profile.appId ?? connection?.appId)}</div>\n <div key=\"auth-detail\" style={helpStyle}>{profileAuthDetail(profile)}</div>\n <div key=\"actions\" style={rowStyle}>\n <StatusBadge key=\"status\" tone={enabled ? \"success\" : \"warning\"}>\n {enabled ? \"\u5DF2\u52A0\u5165\u673A\u5668\u4EBA\u6C60\" : \"\u672A\u52A0\u5165\u673A\u5668\u4EBA\u6C60\"}\n </StatusBadge>\n {!enabled ? (\n <button key=\"add\" type=\"button\" style={buttonStyle} onClick={() => addConnectionFromProfile(profile)}>\n \u52A0\u5165\u673A\u5668\u4EBA\u6C60\n </button>\n ) : null}\n {!profile.user ? (\n <button key=\"user-auth\" type=\"button\" style={buttonStyle} disabled={isStartingUserAuth} onClick={() => void startUserAuthFlow(profile.name)}>\n {isStartingUserAuth ? \"\u751F\u6210\u4E2D...\" : \"\u8BBF\u95EE\u4E2A\u4EBA\u8D44\u6E90\u65F6\u6388\u6743\"}\n </button>\n ) : null}\n </div>\n {authResult?.url ? (\n <div key=\"user-auth-result\" style={{ ...successBoxStyle, marginTop: \"10px\" }}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u5DF2\u751F\u6210\u7528\u6237\u6388\u6743\u94FE\u63A5</div>\n <div key=\"help\" style={helpStyle}>\u6388\u6743\u540E\u8FD9\u91CC\u4F1A\u663E\u793A\u6388\u6743\u7528\u6237\u59D3\u540D\uFF1B\u4E0D\u8865\u4E5F\u4E0D\u5F71\u54CD\u673A\u5668\u4EBA\u6536\u53D1\u6D88\u606F\u3002</div>\n <div key=\"actions\" style={{ ...rowStyle, marginTop: \"10px\" }}>\n <a key=\"open\" href={authResult.url} target=\"_blank\" rel=\"noreferrer\" style={linkButtonStyle}>\n \u6253\u5F00\u6388\u6743\u94FE\u63A5\n </a>\n <button key=\"finish\" type=\"button\" style={buttonStyle} disabled={isFinishingUserAuth} onClick={() => void finishUserAuthFlow(profile.name)}>\n {isFinishingUserAuth ? \"\u786E\u8BA4\u4E2D...\" : \"\u6211\u5DF2\u5B8C\u6210\u6388\u6743\uFF0C\u5237\u65B0\u72B6\u6001\"}\n </button>\n </div>\n </div>\n ) : null}\n </div>\n );\n })}\n </div>\n {!showBindPanel && !profileCatalog.loading && !profileError && profiles.length === 0 ? (\n <div key=\"bind-panel\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"8px\" }}>\u8FD8\u6CA1\u6709\u53D1\u73B0\u98DE\u4E66\u673A\u5668\u4EBA</div>\n <div key=\"bind-help\" style={{ ...helpStyle, marginBottom: \"10px\" }}>\n \u70B9\u51FB\u201C\u7ED1\u5B9A\u65B0\u7684\u98DE\u4E66\u673A\u5668\u4EBA\u201D\u4F1A\u5F39\u51FA\u7ED1\u5B9A\u7A97\u53E3\uFF0C\u4E0D\u9700\u8981\u5728\u8FD9\u91CC\u624B\u586B App ID \u6216 App Secret\u3002\n </div>\n <button key=\"open\" type=\"button\" style={primaryButtonStyle} onClick={() => openBindPanel()}>\n \u7ED1\u5B9A\u65B0\u7684\u98DE\u4E66\u673A\u5668\u4EBA\n </button>\n </div>\n ) : null}\n </div>\n ) : null}\n\n {activeAdvancedPanel === \"capabilities\" ? (\n <div key=\"capabilities-panel\" style={{ display: \"grid\", gap: \"12px\" }}>\n {capabilityCenter.loading ? (\n <div key=\"loading\" style={subtleBoxStyle}>\u6B63\u5728\u8BFB\u53D6\u98DE\u4E66\u80FD\u529B\u4E2D\u5FC3...</div>\n ) : capabilityCenter.error ? (\n <div key=\"error\" style={{ ...subtleBoxStyle, color: \"var(--destructive)\" }}>\n \u80FD\u529B\u4E2D\u5FC3\u8BFB\u53D6\u5931\u8D25\uFF1A{capabilityCenter.error.message}\n </div>\n ) : (\n <Fragment key=\"capability-content\">\n <div key=\"summary\" style={successBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 900 }}>Agent \u8C03\u7528\u7684\u662F\u63D2\u4EF6\u53D7\u63A7\u5DE5\u5177\uFF0C\u4E0D\u662F\u88F8\u8DD1 lark-cli</div>\n <div key=\"body\" style={{ ...helpStyle, marginTop: \"6px\" }}>\n {capabilityCenter.data?.summary}\n </div>\n </div>\n <div key=\"default-policy\" style={subtleBoxStyle}>\n <div key=\"label\" style={helpStyle}>\u9ED8\u8BA4\u5F00\u653E\u7B56\u7565</div>\n <div key=\"value\" style={{ fontWeight: 800 }}>\n {capabilityCenter.data?.defaultPolicy?.mode === \"conservative\" ? \"\u4FDD\u5B88\u6A21\u5F0F\" : \"\u6309\u98DE\u4E66\u5E94\u7528\u6388\u6743\u5F00\u653E\"}\n </div>\n <div key=\"detail\" style={{ ...helpStyle, marginTop: \"6px\" }}>\n {capabilityCenter.data?.defaultPolicy?.text}\n </div>\n </div>\n <div key=\"relationship\" style={gridTwoStyle}>\n <div key=\"cli\" style={subtleBoxStyle}>\n <div key=\"label\" style={helpStyle}>lark-cli</div>\n <div key=\"value\" style={{ fontWeight: 800 }}>\u8FD0\u884C\u65F6 API \u5BA2\u6237\u7AEF</div>\n <div key=\"detail\" style={helpStyle}>\u4E91\u7AEF\u63D2\u4EF6\u5305\u4F1A\u5E26 CLI\uFF1Bprofile\u3001App Secret \u548C\u6743\u9650\u4ECD\u5C5E\u4E8E\u670D\u52A1\u5668\u8FD0\u884C\u73AF\u5883\u3002</div>\n </div>\n <div key=\"skills\" style={subtleBoxStyle}>\n <div key=\"label\" style={helpStyle}>lark-* skills</div>\n <div key=\"value\" style={{ fontWeight: 800 }}>\u672C\u5730 Agent \u4F7F\u7528\u8BF4\u660E</div>\n <div key=\"detail\" style={helpStyle}>{capabilityCenter.data?.syncPolicy.text}</div>\n </div>\n </div>\n <div key=\"schema-discovery\" style={subtleBoxStyle}>\n <div key=\"head\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 800 }}>lark-cli schema / skills \u540C\u6B65\u72B6\u6001</div>\n <div key=\"detail\" style={{ ...helpStyle, marginTop: \"6px\" }}>\n {capabilityCenter.data?.schemaDiscovery.summary}\n </div>\n </div>\n <StatusBadge key=\"status\" tone={capabilityCenter.data?.schemaDiscovery.checked ? \"success\" : \"warning\"}>\n {capabilityCenter.data?.schemaDiscovery.checked ? \"\u5DF2\u626B\u63CF\" : \"\u672A\u626B\u63CF\"}\n </StatusBadge>\n </div>\n {capabilityCenter.data?.schemaDiscovery.reason ? (\n <div key=\"reason\" style={{ ...helpStyle, marginTop: \"8px\" }}>\n {capabilityCenter.data.schemaDiscovery.reason}\n </div>\n ) : null}\n {capabilityCenter.data?.schemaDiscovery.updateNotice?.message ? (\n <div key=\"update\" style={{ ...subtleBoxStyle, marginTop: \"10px\", background: \"var(--background)\" }}>\n {capabilityCenter.data.schemaDiscovery.updateNotice.message}\n </div>\n ) : null}\n <div key=\"services\" style={{ ...rowStyle, marginTop: \"10px\" }}>\n {(capabilityCenter.data?.schemaDiscovery.services ?? []).slice(0, 8).map((service) => (\n <span key={service.name} style={compactPillStyle}>\n {service.name}\uFF1A{service.available ? `${service.methodCount} \u4E2A\u63A5\u53E3 / ${service.scopeCount} \u4E2A scope` : \"\u4E0D\u53EF\u7528\"}\n </span>\n ))}\n </div>\n </div>\n <div key=\"permission\" style={subtleBoxStyle}>\n <div key=\"head\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 800 }}>\u6743\u9650\u68C0\u67E5\u7B56\u7565</div>\n <div key=\"detail\" style={{ ...helpStyle, marginTop: \"6px\" }}>{capabilityCenter.data?.permissionStrategy}</div>\n </div>\n <button key=\"check\" type=\"button\" style={buttonStyle} disabled={checkingPermissions} onClick={() => void runPermissionCheck()}>\n {checkingPermissions ? \"\u68C0\u67E5\u4E2D...\" : \"\u68C0\u67E5\u5F53\u524D\u6743\u9650\"}\n </button>\n </div>\n {permissionCheck ? (\n <div key=\"permission-result\" style={{ ...subtleBoxStyle, marginTop: \"10px\", background: \"var(--background)\" }}>\n <div key=\"state\" style={{ ...rowStyle, marginBottom: \"6px\" }}>\n <StatusBadge key=\"status\" tone={permissionCheck.ok ? \"success\" : \"warning\"}>\n {permissionCheck.ok ? \"\u6743\u9650\u8986\u76D6\u63A8\u8350\u6E05\u5355\" : \"\u6709\u6743\u9650\u7F3A\u53E3\"}\n </StatusBadge>\n {permissionCheck.profileName ? <span key=\"profile\" style={compactPillStyle}>profile\uFF1A{permissionCheck.profileName}</span> : null}\n {permissionCheck.identity ? <span key=\"identity\" style={compactPillStyle}>\u8EAB\u4EFD\uFF1A{permissionCheck.identity}</span> : null}\n </div>\n <div key=\"message\" style={helpStyle}>{permissionCheck.message}</div>\n {permissionCheck.missingScopes?.length ? (\n <div key=\"missing\" style={{ ...helpStyle, marginTop: \"8px\", overflowWrap: \"anywhere\" }}>\n \u7F3A\u5931\u6743\u9650\uFF1A{permissionCheck.missingScopes.join(\"\u3001\")}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n <div key=\"permission-json\" style={subtleBoxStyle}>\n <div key=\"head\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 800 }}>\u63A8\u8350\u6743\u9650 JSON</div>\n <div key=\"detail\" style={helpStyle}>{capabilityCenter.data?.recommendedPermissionJson.note}</div>\n </div>\n </div>\n <code key=\"json\" style={{ ...codeStyle, marginTop: \"10px\" }}>\n {JSON.stringify(capabilityCenter.data?.recommendedPermissionJson ?? {}, null, 2)}\n </code>\n </div>\n {(capabilityCenter.data?.groups ?? []).map((group) => (\n <div key={group.name} style={productEntryStyle}>\n <div key=\"group-title\" style={{ fontWeight: 900, fontSize: \"16px\" }}>{group.name}</div>\n <div key=\"items\" style={{ display: \"grid\", gap: \"10px\" }}>\n {group.capabilities.map((capability) => {\n const override = capabilityOverrides.find((item) => item.key === capability.key);\n const checked = override?.enabled ?? capability.enabled;\n const selectedScope = override?.scope ?? capability.scope ?? \"instance\";\n const selectedConnectionId = override?.connectionId ?? capability.connectionId ?? preferredConnection?.id ?? activeConnections[0]?.id ?? \"\";\n const selectedRouteId = override?.routeId ?? capability.routeId ?? firstEnabledRouteSummary?.route.id ?? routes[0]?.id ?? \"\";\n const selectedAgentId = override?.agentId ?? capability.agentId ?? firstEnabledRouteSummary?.agent?.id ?? allAgentOptions[0]?.agent.id ?? \"\";\n const statusTone = !checked\n ? \"neutral\"\n : capability.implemented\n ? capability.recommendedScopes.length > 0 ? \"warning\" : \"success\"\n : \"warning\";\n return (\n <div key={capability.key} style={subtleBoxStyle}>\n <div key=\"head\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title-row\" style={rowStyle}>\n <strong key=\"title\">{capability.title}</strong>\n <StatusBadge key=\"status\" tone={statusTone}>{checked ? capability.statusLabel : \"\u672A\u5F00\u542F\"}</StatusBadge>\n <span key=\"scope\" style={compactPillStyle}>{capability.scopeLabel}</span>\n </div>\n <div key=\"desc\" style={{ ...helpStyle, marginTop: \"6px\" }}>{capability.description}</div>\n </div>\n <button\n key=\"toggle\"\n type=\"button\"\n style={checked ? buttonStyle : primaryButtonStyle}\n onClick={() => patchCapability(capability.key, { enabled: !checked })}\n >\n {checked ? \"\u5173\u95ED\" : \"\u5F00\u542F\"}\n </button>\n </div>\n <div key=\"scope-controls\" style={{ ...gridTwoStyle, marginTop: \"10px\" }}>\n <Field key=\"scope\" label=\"\u5F00\u542F\u8303\u56F4\">\n <select\n style={selectStyle}\n value={selectedScope}\n onChange={(event) => patchCapabilityScope(capability.key, event.target.value as FeishuCapabilityScope)}\n >\n <option value=\"instance\">\u5168\u5B9E\u4F8B\u5F00\u542F</option>\n <option value=\"bot\">\u67D0\u4E2A\u673A\u5668\u4EBA\u5F00\u542F</option>\n <option value=\"entry\">\u67D0\u4E2A\u5165\u53E3\u5F00\u542F</option>\n <option value=\"agent\">\u67D0\u4E2A Agent \u5F00\u542F</option>\n </select>\n </Field>\n {selectedScope === \"bot\" ? (\n <Field key=\"bot-target\" label=\"\u76EE\u6807\u673A\u5668\u4EBA\">\n <select\n style={selectStyle}\n value={selectedConnectionId}\n onChange={(event) => patchCapability(capability.key, {\n scope: \"bot\",\n connectionId: event.target.value,\n routeId: undefined,\n agentId: undefined,\n })}\n >\n {activeConnections.map((connection) => (\n <option key={connection.id} value={connection.id}>\n {appLabel(connection, profiles.find((profile) => profile.name === connection.profileName))}\n </option>\n ))}\n </select>\n </Field>\n ) : null}\n {selectedScope === \"entry\" ? (\n <Field key=\"entry-target\" label=\"\u76EE\u6807\u5165\u53E3\">\n <select\n style={selectStyle}\n value={selectedRouteId}\n onChange={(event) => patchCapability(capability.key, {\n scope: \"entry\",\n routeId: event.target.value,\n connectionId: undefined,\n agentId: undefined,\n })}\n >\n {routeSummaries.map(({ route }, routeIndex) => (\n <option key={route.id} value={route.id}>\n {routeTitle(route, routeIndex)}\n </option>\n ))}\n </select>\n </Field>\n ) : null}\n {selectedScope === \"agent\" ? (\n <Field key=\"agent-target\" label=\"\u76EE\u6807 Agent\">\n <select\n style={selectStyle}\n value={selectedAgentId}\n onChange={(event) => patchCapability(capability.key, {\n scope: \"agent\",\n agentId: event.target.value,\n connectionId: undefined,\n routeId: undefined,\n })}\n >\n {allAgentOptions.map(({ company, agent }) => (\n <option key={`${company.id}-${agent.id}`} value={agent.id}>\n {agentLabel(agent)}\uFF08{companyLabel(company)}\uFF09\n </option>\n ))}\n </select>\n </Field>\n ) : null}\n </div>\n <div key=\"meta\" style={{ ...rowStyle, marginTop: \"10px\" }}>\n {capability.toolName ? <span key=\"tool\" style={compactPillStyle}>{capability.toolName}</span> : null}\n {capability.legacyToolName ? <span key=\"legacy\" style={compactPillStyle}>\u517C\u5BB9\uFF1A{capability.legacyToolName}</span> : null}\n {capability.larkCliCommands.map((command) => (\n <span key={`cmd-${command}`} style={compactPillStyle}>lark-cli {command}</span>\n ))}\n {capability.relatedSkills.map((skill) => (\n <span key={`skill-${skill}`} style={compactPillStyle}>{skill}</span>\n ))}\n </div>\n {capability.schemaCommands?.length ? (\n <div key=\"schema\" style={{ ...helpStyle, marginTop: \"8px\" }}>\n CLI \u53D1\u73B0\uFF1A{capability.schemaCommands.map((command) => `${command.command}\uFF1A${\n command.status === \"schema_backed\"\n ? \"schema \u8986\u76D6\"\n : command.status === \"cli_help_backed\"\n ? \"CLI help \u8986\u76D6\"\n : \"\u672A\u53D1\u73B0\"\n }`).join(\"\uFF1B\")}\n </div>\n ) : null}\n {capability.recommendedScopes.length > 0 ? (\n <div key=\"scopes\" style={{ ...helpStyle, marginTop: \"8px\" }}>\n \u63A8\u8350\u6743\u9650\uFF1A{capability.recommendedScopes.join(\"\u3001\")}\n </div>\n ) : null}\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </Fragment>\n )}\n </div>\n ) : null}\n\n {activeAdvancedPanel === \"deploy\" ? (\n <div key=\"deploy-panel\" style={{ display: \"grid\", gap: \"12px\" }}>\n <div key=\"runtime-position\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"6px\" }}>\u5F53\u524D\u8FD0\u884C\u4F4D\u7F6E</div>\n <div key=\"hint\" style={helpStyle}>{runtimeHint}</div>\n <div key=\"mode\" style={{ ...rowStyle, marginTop: \"10px\" }}>\n <StatusBadge key=\"mode-badge\" tone={runningOnLocalhost ? \"warning\" : \"success\"}>\n {runningOnLocalhost ? \"\u672C\u5730\u6D4B\u8BD5\u73AF\u5883\" : \"\u4E91\u7AEF\u6B63\u5F0F\u73AF\u5883\"}\n </StatusBadge>\n <span key=\"profile\" style={compactPillStyle}>profile\uFF1A{serverProfileName(serverDeployConnection)}</span>\n </div>\n </div>\n\n <div key=\"deploy-cards\" style={gridTwoStyle}>\n <div key=\"local\" style={guideCardStyle}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u672C\u5730\u6D4B\u8BD5</div>\n <div key=\"body\" style={helpStyle}>\n \u9002\u5408\u73B0\u5728\u9A8C\u8BC1\u98DE\u4E66\u662F\u5426\u80FD\u6536\u6D88\u606F\u3001\u56DE\u6D88\u606F\u3001\u521B\u5EFA\u4EFB\u52A1\u548C\u4E0A\u4F20\u9644\u4EF6\u3002\u8BFB\u53D6\u7684\u662F\u8FD9\u53F0 Mac \u4E0A\u7684 lark-cli profile\u3002\n </div>\n </div>\n <div key=\"server\" style={guideCardStyle}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u4E91\u7AEF\u6B63\u5F0F\u90E8\u7F72</div>\n <div key=\"body\" style={helpStyle}>\n Paperclip \u8DD1\u5230\u670D\u52A1\u5668\u540E\uFF0C\u63D2\u4EF6\u4F1A\u4F18\u5148\u4F7F\u7528\u4E91\u7AEF\u63D2\u4EF6\u5305\u81EA\u5E26\u7684 lark-cli\uFF0C\u4F46 profile \u548C App \u6388\u6743\u4ECD\u5C5E\u4E8E\u670D\u52A1\u5668\u8FD0\u884C\u73AF\u5883\u3002\u4E1A\u52A1\u5165\u53E3\u914D\u7F6E\u53EF\u4EE5\u6CBF\u7528\uFF0C\u98DE\u4E66\u5E94\u7528\u6388\u6743\u5FC5\u987B\u5728\u670D\u52A1\u5668\u4E0A\u4E5F\u5B8C\u6210\u4E00\u6B21\u3002\n </div>\n </div>\n </div>\n\n <div key=\"checklist\" style={checklistGridStyle}>\n <ChecklistItem key=\"same-profile\" done={hasConnection} title=\"\u540C\u540D profile\" detail={`\u670D\u52A1\u5668\u4E0A\u4E5F\u8981\u6709 ${serverProfileName(serverDeployConnection)}`} />\n <ChecklistItem key=\"secret\" done={true} title=\"App Secret \u4E0D\u8FDB\u9875\u9762\" detail=\"\u53EA\u5728\u670D\u52A1\u5668\u6216\u5BC6\u94A5\u7CFB\u7EDF\u91CC\u8F93\u5165\uFF0C\u4E0D\u622A\u56FE\u3001\u4E0D\u53D1\u804A\u5929\u3002\" />\n <ChecklistItem key=\"single-listener\" done={(connectorStatus.data?.subscribers?.length ?? 0) <= activeConnections.length} title=\"\u53EA\u4FDD\u7559\u6B63\u5F0F\u76D1\u542C\" detail=\"\u4E0A\u4E91\u540E\u4E0D\u8981\u8BA9\u672C\u673A\u548C\u670D\u52A1\u5668\u540C\u65F6\u76D1\u542C\u540C\u4E00\u4E2A\u673A\u5668\u4EBA\u3002\" />\n <ChecklistItem key=\"recheck\" done={!runningOnLocalhost} title=\"\u670D\u52A1\u5668\u4E0A\u91CD\u65B0\u68C0\u67E5\" detail={runningOnLocalhost ? \"\u90E8\u7F72\u5230\u670D\u52A1\u5668\u540E\uFF0C\u518D\u5728\u670D\u52A1\u5668\u9875\u9762\u70B9\u68C0\u67E5\u8FDE\u63A5\u3002\" : \"\u5F53\u524D\u9875\u9762\u5DF2\u5728\u670D\u52A1\u5668\u73AF\u5883\u3002\"} />\n </div>\n\n <div key=\"commands\" style={subtleBoxStyle}>\n <div key=\"head\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 800 }}>\u7ED9\u5DE5\u7A0B\u5E08\u7684\u670D\u52A1\u5668\u7ED1\u5B9A\u547D\u4EE4</div>\n <div key=\"help\" style={helpStyle}>\n \u5728 Paperclip \u670D\u52A1\u5668\u4E0A\u6267\u884C\u3002\u547D\u4EE4\u91CC\u7684 App Secret \u5360\u4F4D\u7B26\u5FC5\u987B\u7531\u7BA1\u7406\u5458\u5728\u670D\u52A1\u5668\u5B89\u5168\u8F93\u5165\u3002\n </div>\n </div>\n <button key=\"copy\" type=\"button\" style={buttonStyle} onClick={() => void copyServerDeployCommands()}>\n \u590D\u5236\u547D\u4EE4\n </button>\n </div>\n <code key=\"code\" style={{ ...codeStyle, marginTop: \"10px\" }}>{serverDeployCommands}</code>\n </div>\n\n <div key=\"after-deploy\" style={successBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"6px\" }}>\u4E0A\u4E91\u540E\u600E\u4E48\u786E\u8BA4\u771F\u7684\u751F\u6548</div>\n <div key=\"body\" style={helpStyle}>\n \u5728\u670D\u52A1\u5668\u9875\u9762\u5237\u65B0\u673A\u5668\u4EBA\u5217\u8868\uFF0C\u786E\u8BA4\u673A\u5668\u4EBA\u6C60\u91CC\u80FD\u770B\u5230\u540C\u540D\u673A\u5668\u4EBA\uFF1B\u4FDD\u5B58\u914D\u7F6E\uFF1B\u6253\u5F00\u201C\u81EA\u52A8\u76D1\u542C\u98DE\u4E66\u65B0\u6D88\u606F\u201D\u548C\u201C\u6B63\u5F0F\u53D1\u9001\u98DE\u4E66\u6D88\u606F\u201D\uFF1B\u6700\u540E\u4F18\u5148\u5728\u673A\u5668\u4EBA\u5355\u804A\u6216\u6D4B\u8BD5\u4F1A\u8BDD\u53D1\u9001\u771F\u5B9E\u6D4B\u8BD5\u8BDD\u672F\u3002\n </div>\n </div>\n </div>\n ) : null}\n\n {activeAdvancedPanel === \"runtime\" ? (\n <div key=\"runtime-panel\" style={gridTwoStyle}>\n <ToggleField key=\"dryRunCli\" label=\"\u6B63\u5F0F\u53D1\u9001\u98DE\u4E66\u6D88\u606F\" checked={configJson.dryRunCli !== true} onChange={(checked) => patchConfig({ dryRunCli: !checked })} help=\"\u5173\u95ED\u65F6\u53EA\u662F\u9875\u9762\u6A21\u62DF\uFF0C\u4E0D\u4F1A\u771F\u7684\u56DE\u590D\u98DE\u4E66\u3002\" />\n <ToggleField key=\"enableEventSubscriber\" label=\"\u81EA\u52A8\u76D1\u542C\u98DE\u4E66\u65B0\u6D88\u606F\" checked={configJson.enableEventSubscriber === true} onChange={(checked) => patchConfig({ enableEventSubscriber: checked })} help=\"\u672C\u5730\u6D4B\u8BD5\u53EF\u4EE5\u6253\u5F00\uFF1B\u4E0A\u4E91\u540E\u53EA\u4FDD\u7559\u670D\u52A1\u5668\u76D1\u542C\u3002\" />\n <ToggleField key=\"ackOnInbound\" label=\"\u6536\u5230\u9700\u6C42\u540E\u5148\u56DE\u201C\u5DF2\u6536\u5230\u201D\" checked={configJson.ackOnInbound === true} onChange={(checked) => patchConfig({ ackOnInbound: checked })} />\n <ToggleField key=\"enableQuickReply\" label=\"\u6D4B\u8BD5\u53E3\u4EE4\u201C\u53EA\u56DE\u590D ok\u201D\" checked={configJson.enableQuickReply !== false} onChange={(checked) => patchConfig({ enableQuickReply: checked })} />\n <Field key=\"larkCliBin\" label=\"lark-cli \u547D\u4EE4\u8DEF\u5F84\" help=\"\u666E\u901A\u7528\u6237\u4E0D\u7528\u6539\u3002\u7559\u7A7A\u6216\u4FDD\u6301 lark-cli \u65F6\uFF0C\u63D2\u4EF6\u4F1A\u4F18\u5148\u4F7F\u7528\u5305\u5185\u81EA\u5E26 CLI\uFF1B\u9700\u8981\u5F3A\u5236\u8D70\u670D\u52A1\u5668\u56FA\u5B9A\u8DEF\u5F84\u65F6\u624D\u586B\u5199\u5B8C\u6574\u8DEF\u5F84\u3002\">\n <input style={inputStyle} value={configJson.larkCliBin ?? DEFAULT_CONFIG.larkCliBin} onChange={(event) => patchConfig({ larkCliBin: event.target.value })} />\n </Field>\n <Field key=\"paperclipBaseUrl\" label=\"Paperclip \u5185\u90E8\u8BBF\u95EE\u5730\u5740\" help=\"\u53EF\u9009\u3002\u586B\u4E91\u7AEF\u57DF\u540D\u540E\uFF0C\u98DE\u4E66\u91CC\u4F1A\u9644\u5E26\u5185\u90E8\u4EFB\u52A1\u94FE\u63A5\uFF1B\u6CA1\u6709 Paperclip \u8D26\u53F7\u7684\u4EBA\u6253\u4E0D\u5F00\u3002\">\n <input style={inputStyle} value={configJson.paperclipBaseUrl ?? \"\"} placeholder=\"https://paperclip.company.com\" onChange={(event) => patchConfig({ paperclipBaseUrl: event.target.value })} />\n </Field>\n <Field key=\"completionMessageTemplate\" label=\"\u667A\u80FD\u4F53\u5B8C\u6210\u540E\u7684\u98DE\u4E66\u56DE\u590D\">\n <input style={inputStyle} value={configJson.completionMessageTemplate ?? DEFAULT_CONFIG.completionMessageTemplate} onChange={(event) => patchConfig({ completionMessageTemplate: event.target.value })} />\n </Field>\n </div>\n ) : null}\n\n {activeAdvancedPanel === \"events\" ? (\n <div key=\"events-panel\" style={{ display: \"grid\", gap: \"12px\" }}>\n {productionMonitor ? (\n <div key=\"monitor-summary\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"8px\" }}>\u751F\u4EA7\u76D1\u63A7</div>\n <div key=\"body\" style={helpStyle}>\n {productionMonitor.message}\u3002\u76D1\u542C\u8FDB\u7A0B {productionMonitor.activeSubscriberCount}/{productionMonitor.expectedSubscriberCount}\uFF0C\n \u6700\u8FD1 30 \u5206\u949F\u9519\u8BEF {productionMonitor.recentErrorCount} \u6761\u3001\u63D0\u9192 {productionMonitor.recentWarningCount} \u6761\u3002\n {productionMonitor.lastWatchdogAt ? ` \u6700\u8FD1\u81EA\u68C0\uFF1A${productionMonitor.lastWatchdogAt}` : \" \u81EA\u68C0\u4F1A\u5728\u670D\u52A1\u8FD0\u884C\u540E\u81EA\u52A8\u5F00\u59CB\u3002\"}\n </div>\n </div>\n ) : null}\n {productionMonitorChecks.length > 0 ? (\n <CheckReport key=\"monitor-checks\" title=\"\u76D1\u63A7\u68C0\u67E5\u9879\" items={productionMonitorChecks} />\n ) : null}\n <div key=\"webhook-security\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"8px\" }}>\u516C\u7F51\u56DE\u8C03\u5B89\u5168</div>\n <div key=\"help\" style={{ ...helpStyle, marginBottom: \"10px\" }}>\n \u4E91\u7AEF webhook \u5EFA\u8BAE\u914D\u7F6E\u98DE\u4E66\u4E8B\u4EF6\u8BA2\u9605\u91CC\u7684 Verification Token \u548C Encrypt Key\u3002\u8FD9\u91CC\u586B\u5199 Paperclip Secret/Vault \u5F15\u7528\uFF0C\u63D2\u4EF6\u4E0D\u4F1A\u4FDD\u5B58\u5BC6\u94A5\u660E\u6587\u3002\n </div>\n <div key=\"fields\" style={gridTwoStyle}>\n <Field key=\"verification\" label=\"Verification Token Secret Ref\">\n <input\n style={inputStyle}\n value={configJson.eventVerificationTokenRef ?? \"\"}\n placeholder=\"\u4F8B\u5982\uFF1Afeishu/event-verification-token\"\n onChange={(event) => patchConfig({ eventVerificationTokenRef: event.target.value })}\n />\n </Field>\n <Field key=\"encrypt\" label=\"Encrypt Key Secret Ref\">\n <input\n style={inputStyle}\n value={configJson.eventEncryptKeyRef ?? \"\"}\n placeholder=\"\u4F8B\u5982\uFF1Afeishu/event-encrypt-key\"\n onChange={(event) => patchConfig({ eventEncryptKeyRef: event.target.value })}\n />\n </Field>\n </div>\n <label key=\"signature\" style={{ ...rowStyle, marginTop: \"10px\", justifyContent: \"flex-start\" }}>\n <input\n type=\"checkbox\"\n checked={configJson.eventRequireSignature === true}\n onChange={(event) => patchConfig({ eventRequireSignature: event.target.checked })}\n />\n <span>\u516C\u7F51\u56DE\u8C03\u5FC5\u987B\u6821\u9A8C x-lark-signature</span>\n </label>\n </div>\n <div key=\"retry-queue\" style={subtleBoxStyle}>\n <div key=\"head\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title-row\" style={rowStyle}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u91CD\u8BD5\u961F\u5217</div>\n <StatusBadge key=\"status\" tone={(retryQueue?.pendingCount ?? 0) > 0 ? \"warning\" : \"success\"}>\n {(retryQueue?.pendingCount ?? 0) > 0 ? `${retryQueue?.pendingCount ?? 0} \u6761\u5F85\u91CD\u8BD5` : \"\u6CA1\u6709\u5F85\u91CD\u8BD5\u6295\u9012\"}\n </StatusBadge>\n </div>\n <div key=\"detail\" style={helpStyle}>\n \u98DE\u4E66\u56DE\u6267\u3001\u591A\u7EF4\u8868\u683C\u5199\u5165\u5931\u8D25\u65F6\u4F1A\u5148\u5165\u961F\uFF1B\u6743\u9650\u6216\u7F51\u7EDC\u6062\u590D\u540E\uFF0C\u53EF\u4EE5\u5728\u8FD9\u91CC\u91CD\u8BD5\u3002\n </div>\n </div>\n <button\n key=\"retry\"\n type=\"button\"\n style={buttonStyle}\n disabled={retryingQueue || (retryQueue?.pendingCount ?? 0) === 0}\n onClick={() => void runRetryQueue()}\n >\n {retryingQueue ? \"\u91CD\u8BD5\u4E2D...\" : \"\u91CD\u8BD5\u5931\u8D25\u6295\u9012\"}\n </button>\n </div>\n {(retryQueue?.items ?? []).length > 0 ? (\n <div key=\"items\" style={{ display: \"grid\", gap: \"8px\", marginTop: \"10px\" }}>\n {(retryQueue?.items ?? []).slice(0, 3).map((item) => (\n <div key={item.id} style={{ ...helpStyle, overflowWrap: \"anywhere\" }}>\n {item.status === \"succeeded\" ? \"\u5DF2\u6210\u529F\" : item.status === \"failed\" ? \"\u5931\u8D25\" : \"\u5F85\u91CD\u8BD5\"}\uFF1A\n {item.reason} \u00B7 {item.profileName} \u00B7 \u5C1D\u8BD5 {item.attemptCount} \u6B21\n {item.lastError ? ` \u00B7 ${item.lastError}` : \"\"}\n </div>\n ))}\n </div>\n ) : null}\n </div>\n <div key=\"state\" style={checklistGridStyle}>\n <ChecklistItem key=\"listener\" done={isListening} title=\"\u76D1\u542C\u5F00\u5173\" detail={isListening ? \"\u5DF2\u5F00\u542F\" : \"\u672A\u5F00\u542F\"} />\n <ChecklistItem key=\"subscriber\" done={(connectorStatus.data?.subscribers?.length ?? 0) > 0} title=\"\u76D1\u542C\u8FDB\u7A0B\" detail={`${connectorStatus.data?.subscribers?.length ?? 0} \u4E2A`} />\n <ChecklistItem key=\"reply\" done={isSendingRealMessages} title=\"\u771F\u5B9E\u56DE\u590D\" detail={isSendingRealMessages ? \"\u5DF2\u5F00\u542F\" : \"\u6A21\u62DF\u6A21\u5F0F\"} />\n <ChecklistItem key=\"attachment-upload\" done={isSendingRealMessages} title=\"\u9644\u4EF6\u4E0A\u4F20\" detail={isSendingRealMessages ? \"\u771F\u5B9E\u4E0B\u8F7D\u5E76\u6302\u5230\u4EFB\u52A1\" : \"\u53EA\u505A\u9644\u4EF6\u6A21\u62DF\u8BB0\u5F55\"} />\n </div>\n <div key=\"logs\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"8px\" }}>\u6700\u8FD1\u4E8B\u4EF6</div>\n <RecentEventList\n records={(connectorStatus.data?.recentRecords ?? []).slice(0, 8)}\n emptyText=\"\u6682\u65E0\u4E8B\u4EF6\u65E5\u5FD7\u3002\"\n />\n </div>\n </div>\n ) : null}\n\n {activeAdvancedPanel === \"base\" ? (\n <div key=\"base-panel\" style={{ display: \"grid\", gap: \"12px\" }}>\n <div key=\"header\" style={sectionHeaderStyle}>\n <div key=\"copy\" style={helpStyle}>\u6CA1\u6709\u9700\u6C42\u6C60\u6C89\u6DC0\u8981\u6C42\u65F6\u53EF\u4EE5\u4E0D\u914D\u3002\u9700\u8981\u65F6\u65B0\u589E\u4E00\u5F20\u98DE\u4E66\u591A\u7EF4\u8868\u683C\u5199\u5165\u89C4\u5219\u3002</div>\n <button\n key=\"add\"\n type=\"button\"\n style={buttonStyle}\n onClick={() => patchConfig({\n baseSinks: [\n ...baseSinks,\n {\n id: baseSinks.length === 0 ? \"feishu-base\" : `feishu-base-${baseSinks.length + 1}`,\n connectionId: preferredConnection?.id,\n enabled: true,\n baseToken: \"\",\n tableIdOrName: \"\u9700\u6C42\u6C60\",\n identity: \"bot\",\n fieldMap: {},\n },\n ],\n })}\n >\n \u6DFB\u52A0\u591A\u7EF4\u8868\u683C\u89C4\u5219\n </button>\n </div>\n {baseSinks.length === 0 ? <div key=\"empty\" style={subtleBoxStyle}>\u5F53\u524D\u6CA1\u6709\u914D\u7F6E\u591A\u7EF4\u8868\u683C\u540C\u6B65\u3002</div> : null}\n {baseSinks.map((sink, index) => (\n <div key={`${sink.id}-${index}`} style={subtleBoxStyle}>\n <div key=\"fields\" style={gridTwoStyle}>\n <Field key=\"id\" label=\"\u89C4\u5219\u540D\u79F0\">\n <input style={inputStyle} value={sink.id ?? \"\"} onChange={(event) => patchBaseSink(index, { id: event.target.value })} />\n </Field>\n <Field key=\"baseToken\" label=\"Base Token\">\n <input style={inputStyle} value={sink.baseToken ?? \"\"} onChange={(event) => patchBaseSink(index, { baseToken: event.target.value })} />\n </Field>\n <Field key=\"tableIdOrName\" label=\"\u6570\u636E\u8868\u540D\u79F0\u6216 ID\">\n <input style={inputStyle} value={sink.tableIdOrName ?? \"\"} onChange={(event) => patchBaseSink(index, { tableIdOrName: event.target.value })} />\n </Field>\n <Field key=\"connectionId\" label=\"\u4F7F\u7528\u54EA\u4E2A\u98DE\u4E66\u673A\u5668\u4EBA\">\n <select style={selectStyle} value={sink.connectionId ?? preferredConnection?.id ?? \"\"} onChange={(event) => patchBaseSink(index, { connectionId: event.target.value })}>\n {connectionOptionNodes(connections, `base-sink-${index}`, undefined, profiles)}\n </select>\n </Field>\n </div>\n </div>\n ))}\n </div>\n ) : null}\n\n {activeAdvancedPanel === \"config\" ? (\n <div key=\"config-panel\" style={{ display: \"grid\", gap: \"12px\" }}>\n <div key=\"summary\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"6px\" }}>\u53EF\u8FC1\u79FB\u5185\u5BB9</div>\n <div key=\"body\" style={helpStyle}>\n \u4F1A\u5BFC\u51FA\u5165\u53E3\u3001\u673A\u5668\u4EBA\u6C60\u3001\u80FD\u529B\u5F00\u5173\u3001\u591A\u7EF4\u8868\u683C\u89C4\u5219\u548C\u8FD0\u884C\u5F00\u5173\u3002App Secret\u3001\u8BBF\u95EE token\u3001\u4E8B\u4EF6\u5BC6\u94A5\u660E\u6587\u4E0D\u4F1A\u5BFC\u51FA\uFF1BSecret Ref \u4F1A\u4FDD\u7559\uFF0CBase Token \u4F1A\u968F\u591A\u7EF4\u8868\u683C\u89C4\u5219\u5BFC\u51FA\u3002\n </div>\n </div>\n <div key=\"export\" style={subtleBoxStyle}>\n <div key=\"head\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 800 }}>\u5BFC\u51FA\u5F53\u524D\u914D\u7F6E</div>\n <div key=\"detail\" style={helpStyle}>\u9002\u5408\u8FC1\u79FB\u5230\u4E91\u7AEF\u6216\u53D1\u7ED9\u5DE5\u7A0B\u5E08\u590D\u73B0\u5165\u53E3\u89C4\u5219\u3002</div>\n </div>\n <button key=\"copy\" type=\"button\" style={buttonStyle} onClick={() => void copyConfigExport()}>\n \u590D\u5236\u914D\u7F6E JSON\n </button>\n </div>\n <code key=\"json\" style={{ ...codeStyle, marginTop: \"10px\", maxHeight: \"260px\", overflow: \"auto\" }}>\n {exportedConfigText()}\n </code>\n </div>\n <div key=\"import\" style={subtleBoxStyle}>\n <div key=\"head\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 800 }}>\u5BFC\u5165\u914D\u7F6E JSON</div>\n <div key=\"detail\" style={helpStyle}>\u5BFC\u5165\u53EA\u66F4\u65B0\u5F53\u524D\u9875\u9762\u72B6\u6001\uFF1B\u786E\u8BA4\u65E0\u8BEF\u540E\u518D\u70B9\u51FB\u9876\u90E8\u201C\u4FDD\u5B58\u914D\u7F6E\u201D\u3002</div>\n </div>\n <button key=\"preview\" type=\"button\" style={buttonStyle} onClick={previewConfigImport}>\n \u5BFC\u5165\u5230\u9875\u9762\n </button>\n </div>\n <textarea\n key=\"textarea\"\n style={{\n ...inputStyle,\n height: \"180px\",\n marginTop: \"10px\",\n padding: \"10px 12px\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n resize: \"vertical\",\n lineHeight: 1.45,\n }}\n value={importConfigText}\n placeholder={\"{\\n \\\"connections\\\": [],\\n \\\"routes\\\": []\\n}\"}\n onChange={(event) => {\n setImportConfigText(event.target.value);\n setImportConfigError(null);\n }}\n />\n {importConfigError ? (\n <div key=\"error\" style={{ ...helpStyle, color: \"var(--destructive)\", marginTop: \"8px\" }}>\n \u5BFC\u5165\u5931\u8D25\uFF1A{importConfigError}\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {error ? <div key=\"error\" style={{ ...subtleBoxStyle, color: \"var(--destructive)\" }}>{error}</div> : null}\n </div>\n ) : (\n <div key=\"advanced-empty\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"6px\" }}>\u70B9\u5F00\u4E00\u9879\u518D\u770B\u7EC6\u8282</div>\n <div key=\"help\" style={helpStyle}>\n \u666E\u901A\u7528\u6237\u901A\u5E38\u4E0D\u7528\u8FDB\u5165\u8FD9\u91CC\u3002\u9700\u8981\u5904\u7406 App Secret\u3001\u670D\u52A1\u5668\u90E8\u7F72\u3001\u76D1\u542C\u65E5\u5FD7\u6216\u591A\u7EF4\u8868\u683C\u540C\u6B65\u65F6\uFF0C\u518D\u9009\u62E9\u5BF9\u5E94\u9879\u76EE\u3002\n </div>\n </div>\n )}\n </section>\n ) : null}\n\n </div>\n );\n}\n\nexport function DashboardWidget(_props: PluginWidgetProps) {\n const { data, loading, error } = usePluginData<ConnectorStatus>(DATA_KEYS.status);\n\n if (loading) return <div>\u6B63\u5728\u8BFB\u53D6\u98DE\u4E66\u8FDE\u63A5\u5668\u72B6\u6001...</div>;\n if (error) return <div>\u98DE\u4E66\u8FDE\u63A5\u5668\u72B6\u6001\u8BFB\u53D6\u5931\u8D25\uFF1A{error.message}</div>;\n\n const latest = data?.recentRecords?.[0];\n const health = connectorHealthLabel(data);\n const listenerCount = data?.subscribers?.filter((subscriber) => subscriber.running !== false && !subscriber.killed).length ?? 0;\n return (\n <div style={cardStyle}>\n <strong>\u98DE\u4E66\u8FDE\u63A5\u5668</strong>\n <div style={rowStyle}>\n <Badge>{health}</Badge>\n <Badge>{data?.dryRunCli ? \"\u6A21\u62DF\u56DE\u590D\" : \"\u771F\u5B9E\u56DE\u590D\"}</Badge>\n <Badge>{`${data?.connectionCount ?? 0} \u4E2A\u673A\u5668\u4EBA`}</Badge>\n <Badge>{`${data?.routeCount ?? 0} \u6761\u5165\u53E3`}</Badge>\n </div>\n <div>\u63A5\u6536\u98DE\u4E66\u6D88\u606F\uFF1A{data?.eventSubscriberEnabled ? `\u5DF2\u5F00\u542F\uFF08${listenerCount} \u4E2A\u76D1\u542C\uFF09` : \"\u672A\u5F00\u542F\"}</div>\n {latest ? <div>\u6700\u8FD1\u52A8\u6001\uFF1A{friendlyMonitorMessage(latest.message)}</div> : <div>\u6682\u65E0\u98DE\u4E66\u4E8B\u4EF6\u3002</div>}\n </div>\n );\n}\n\nexport function FeishuSidebarLink(props: PluginSidebarProps & PluginInstanceProps) {\n const { data } = usePluginData<ConnectorStatus>(DATA_KEYS.status);\n const health = data?.monitor?.health;\n const toneColor = health === \"error\"\n ? \"var(--destructive)\"\n : health === \"warning\"\n ? \"color-mix(in oklab, var(--primary) 62%, #b45309)\"\n : \"var(--primary)\";\n return (\n <a\n href={pluginSettingsHref(props)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n padding: \"8px 12px\",\n color: \"var(--foreground)\",\n textDecoration: \"none\",\n fontSize: \"13px\",\n fontWeight: 600,\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"999px\",\n background: toneColor,\n flex: \"0 0 auto\",\n }}\n />\n <span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\u98DE\u4E66\u8FDE\u63A5\u5668</span>\n {data ? (\n <span style={{ marginLeft: \"auto\", color: \"var(--muted-foreground)\", fontSize: \"11px\" }}>\n {data.routeCount}\n </span>\n ) : null}\n </a>\n );\n}\n\nexport function FeishuSidebarPanel(props: PluginInstanceProps = {}) {\n const { data, loading, error } = usePluginData<ConnectorStatus>(DATA_KEYS.status);\n if (loading) return <div style={helpStyle}>\u98DE\u4E66\u72B6\u6001\u8BFB\u53D6\u4E2D...</div>;\n if (error) return <div style={{ ...helpStyle, color: \"var(--destructive)\" }}>\u98DE\u4E66\u72B6\u6001\u8BFB\u53D6\u5931\u8D25</div>;\n const monitor = data?.monitor;\n const nextHint = monitor?.message\n ? friendlyMonitorMessage(monitor.message)\n : data?.connectionCount\n ? \"\u98DE\u4E66\u8FDE\u63A5\u5668\u5DF2\u914D\u7F6E\u3002\"\n : \"\u8FD8\u6CA1\u6709\u7ED1\u5B9A\u98DE\u4E66\u673A\u5668\u4EBA\u3002\";\n return (\n <div style={{ display: \"grid\", gap: \"8px\", fontSize: \"12px\" }}>\n <div style={{ fontWeight: 800 }}>\u98DE\u4E66\u8FDE\u63A5\u5668</div>\n <div style={{ display: \"grid\", gap: \"4px\", color: \"var(--muted-foreground)\" }}>\n <div>\u673A\u5668\u4EBA\uFF1A{data?.connectionCount ?? 0} \u4E2A</div>\n <div>\u5165\u53E3\uFF1A{data?.routeCount ?? 0} \u6761</div>\n <div>\u72B6\u6001\uFF1A{connectorHealthLabel(data)}</div>\n </div>\n <div style={{ lineHeight: 1.45 }}>{nextHint}</div>\n <a href={pluginSettingsHref(props)} style={{ color: \"var(--primary)\", textDecoration: \"none\", fontWeight: 700 }}>\n \u6253\u5F00\u914D\u7F6E\n </a>\n </div>\n );\n}\n\nexport function FeishuCommentReplyAction({ context }: PluginCommentContextMenuItemProps) {\n const replyIssueCommentToFeishu = usePluginAction(ACTION_KEYS.replyIssueCommentToFeishu);\n const [busy, setBusy] = useState(false);\n const [done, setDone] = useState(false);\n\n async function replyComment() {\n setBusy(true);\n setDone(false);\n try {\n await replyIssueCommentToFeishu({\n issueId: context.parentEntityId,\n commentId: context.entityId,\n });\n setDone(true);\n window.setTimeout(() => setDone(false), 2400);\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <button\n type=\"button\"\n onClick={() => void replyComment()}\n disabled={busy}\n style={{\n border: \"1px solid var(--border)\",\n borderRadius: \"999px\",\n padding: \"2px 8px\",\n background: \"var(--background)\",\n color: done ? \"var(--primary)\" : \"var(--muted-foreground)\",\n fontSize: \"12px\",\n cursor: busy ? \"default\" : \"pointer\",\n }}\n title=\"\u628A\u8FD9\u6761 Paperclip \u8BC4\u8BBA\u56DE\u590D\u5230\u539F\u98DE\u4E66\u7EBF\u7A0B\"\n >\n {busy ? \"\u56DE\u98DE\u4E66\u4E2D...\" : done ? \"\u5DF2\u56DE\u98DE\u4E66\" : \"\u56DE\u98DE\u4E66\"}\n </button>\n );\n}\n\nexport function FeishuIssueTab({ context }: PluginDetailTabProps) {\n const { data, loading, error, refresh } = usePluginData<IssueSourceData>(DATA_KEYS.issueSource, {\n issueId: context.entityId,\n });\n const replyIssueSourceThread = usePluginAction(ACTION_KEYS.replyIssueSourceThread);\n const downloadIssueAttachments = usePluginAction(ACTION_KEYS.downloadIssueAttachments);\n const writeIssueBaseRecord = usePluginAction(ACTION_KEYS.writeIssueBaseRecord);\n const lookupIssueRequester = usePluginAction(ACTION_KEYS.lookupIssueRequester);\n const replyIssueCommentToFeishu = usePluginAction(ACTION_KEYS.replyIssueCommentToFeishu);\n const sendMessage = usePluginAction(ACTION_KEYS.sendMessage);\n const [replyText, setReplyText] = useState(\"\");\n const [busyAction, setBusyAction] = useState<string | null>(null);\n const [actionNotice, setActionNotice] = useState<{ tone: \"success\" | \"error\" | \"info\"; text: string } | null>(null);\n\n async function runIssueAction(label: string, fn: () => Promise<unknown>) {\n setBusyAction(label);\n setActionNotice(null);\n try {\n const result = await fn() as { content?: string; error?: string; message?: string } | null;\n if (result?.error) {\n setActionNotice({ tone: \"error\", text: result.error });\n return;\n }\n setActionNotice({ tone: \"success\", text: result?.content ?? result?.message ?? `${label}\u5DF2\u6267\u884C\u3002` });\n } catch (caught) {\n setActionNotice({ tone: \"error\", text: caught instanceof Error ? caught.message : String(caught) });\n } finally {\n setBusyAction(null);\n }\n }\n\n const issueId = data?.issueId ?? context.entityId;\n\n if (loading) return <div style={helpStyle}>\u6B63\u5728\u8BFB\u53D6\u98DE\u4E66\u6765\u6E90...</div>;\n if (error) return <div style={{ ...subtleBoxStyle, color: \"var(--destructive)\" }}>\u98DE\u4E66\u6765\u6E90\u8BFB\u53D6\u5931\u8D25\uFF1A{error.message}</div>;\n if (!data?.found) {\n return (\n <div style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800 }}>\u8FD9\u4E2A Issue \u4E0D\u662F\u7531\u98DE\u4E66\u8FDE\u63A5\u5668\u521B\u5EFA\u7684\u3002</div>\n <div key=\"detail\" style={helpStyle}>\u5982\u679C\u5B83\u786E\u5B9E\u6765\u81EA\u98DE\u4E66\uFF0C\u5237\u65B0\u540E\u4ECD\u672A\u663E\u793A\u6765\u6E90\uFF0C\u901A\u5E38\u662F\u5386\u53F2\u4EFB\u52A1\u8FD8\u6CA1\u6709\u5199\u5165\u98DE\u4E66\u6D88\u606F\u6620\u5C04\u3002</div>\n </div>\n );\n }\n\n const conversationDisplay = issueSourceValue(\n issueSourceDisplayName(data.conversationName)\n ?? issueSourceDisplayName(data.conversationLabel)\n ?? (data.chatId ? \"\u5DF2\u8BB0\u5F55\uFF0C\u540D\u79F0\u5F85\u540C\u6B65\" : null),\n );\n const requesterDisplay = issueSourceValue(\n issueSourceDisplayName(data.requesterName) ?? (data.requesterOpenId ? \"\u5DF2\u8BB0\u5F55\uFF0C\u540D\u79F0\u5F85\u540C\u6B65\" : null),\n );\n const originalMessageDisplay = issueSourceValue(\n data.messageId ? \"\u5DF2\u8BB0\u5F55\uFF0C\u53EF\u56DE\u539F\u7EBF\u7A0B\" : null,\n );\n const hasDebugInfo = Boolean(data.chatId || data.rootMessageId || data.threadId || data.lastRunId || data.updatedAt);\n\n const detailRows = [\n [\"\u5165\u53E3\", issueSourceValue(data.entryName)],\n [\"\u673A\u5668\u4EBA\", issueSourceValue(data.botName)],\n [\"\u4F1A\u8BDD\", conversationDisplay],\n [\"\u63D0\u51FA\u4EBA\", requesterDisplay],\n [\"\u539F\u6D88\u606F\", originalMessageDisplay],\n [\"\u9644\u4EF6\", `${data.attachmentCount ?? data.attachments?.length ?? 0} \u4E2A`],\n [\"\u56DE\u590D\u65B9\u5F0F\", issueReplyModeLabel(data.replyMode)],\n ];\n const recentComments = data.recentComments ?? [];\n\n return (\n <div style={{ ...productSectionStyle, maxWidth: \"920px\" }}>\n <div key=\"header\" style={sectionHeaderStyle}>\n <div key=\"copy\">\n <div key=\"title\" style={{ fontWeight: 900, fontSize: \"18px\" }}>\u98DE\u4E66\u6765\u6E90</div>\n <div key=\"subtitle\" style={helpStyle}>\n {issueSourceValue(data.issueIdentifier, \"\u5F53\u524D\u4EFB\u52A1\")} \u6765\u81EA\u98DE\u4E66\uFF0C\u4F1A\u6309\u5165\u53E3\u914D\u7F6E\u56DE\u5230\u539F\u4F1A\u8BDD\u3002\n </div>\n </div>\n <button key=\"refresh\" type=\"button\" style={buttonStyle} onClick={refresh}>\n \u5237\u65B0\n </button>\n </div>\n\n <div key=\"summary\" style={successBoxStyle}>\n <div key=\"headline\" style={{ fontWeight: 900 }}>\n \u6765\u6E90\uFF1A\u98DE\u4E66\n </div>\n <div key=\"meta\" style={{ ...helpStyle, marginTop: \"4px\" }}>\n {issueSourceValue(data.entryName)} \u00B7 {issueSourceValue(data.botName)} \u00B7 {issueReplyModeLabel(data.replyMode)}\n </div>\n </div>\n\n <div key=\"details\" style={gridTwoStyle}>\n {detailRows.map(([label, value]) => (\n <div key={label} style={subtleBoxStyle}>\n <div key=\"label\" style={helpStyle}>{label}</div>\n <div key=\"value\" style={{ fontWeight: 800, marginTop: \"4px\", overflowWrap: \"anywhere\" }}>{value}</div>\n </div>\n ))}\n </div>\n\n <div key=\"technical\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"8px\" }}>\u98DE\u4E66\u64CD\u4F5C\u533A</div>\n <textarea\n key=\"reply-text\"\n style={{\n ...inputStyle,\n height: \"96px\",\n padding: \"10px 12px\",\n resize: \"vertical\",\n lineHeight: 1.45,\n }}\n value={replyText}\n placeholder=\"\u628A\u8981\u53D1\u56DE\u98DE\u4E66\u7684\u5185\u5BB9\u5199\u5728\u8FD9\u91CC\"\n onChange={(event) => setReplyText(event.target.value)}\n />\n <div key=\"actions\" style={{ ...rowStyle, marginTop: \"10px\" }}>\n <button\n key=\"reply\"\n type=\"button\"\n style={primaryButtonStyle}\n disabled={busyAction !== null || replyText.trim().length === 0}\n onClick={() => void runIssueAction(\"\u56DE\u590D\u539F\u98DE\u4E66\u7EBF\u7A0B\", async () => {\n const result = await replyIssueSourceThread({ issueId, text: replyText.trim() });\n setReplyText(\"\");\n return result;\n })}\n >\n {busyAction === \"\u56DE\u590D\u539F\u98DE\u4E66\u7EBF\u7A0B\" ? \"\u56DE\u590D\u4E2D...\" : \"\u56DE\u590D\u539F\u98DE\u4E66\u7EBF\u7A0B\"}\n </button>\n <button\n key=\"send\"\n type=\"button\"\n style={buttonStyle}\n disabled={busyAction !== null || replyText.trim().length === 0 || !data.chatId}\n onClick={() => void runIssueAction(\"\u8F6C\u53D1\u5230\u98DE\u4E66\", async () => {\n const result = await sendMessage({\n connectionId: data.connectionId,\n chatId: data.chatId,\n text: replyText.trim(),\n });\n setReplyText(\"\");\n return { content: result && typeof result === \"object\" && \"dryRun\" in result ? \"\u98DE\u4E66\u6D88\u606F\u5DF2\u63D0\u4EA4\u53D1\u9001\u3002\" : \"\u98DE\u4E66\u6D88\u606F\u5DF2\u63D0\u4EA4\u53D1\u9001\u3002\" };\n })}\n >\n {busyAction === \"\u8F6C\u53D1\u5230\u98DE\u4E66\" ? \"\u53D1\u9001\u4E2D...\" : `\u7528${issueSourceValue(data.botName, \"\u673A\u5668\u4EBA\")}\u53D1\u9001`}\n </button>\n <button\n key=\"download\"\n type=\"button\"\n style={buttonStyle}\n disabled={busyAction !== null}\n onClick={() => void runIssueAction(\"\u4E0B\u8F7D\u539F\u6D88\u606F\u9644\u4EF6\", () => downloadIssueAttachments({ issueId }))}\n >\n {busyAction === \"\u4E0B\u8F7D\u539F\u6D88\u606F\u9644\u4EF6\" ? \"\u4E0B\u8F7D\u4E2D...\" : \"\u4E0B\u8F7D\u539F\u6D88\u606F\u9644\u4EF6\"}\n </button>\n <button\n key=\"base\"\n type=\"button\"\n style={buttonStyle}\n disabled={busyAction !== null}\n onClick={() => void runIssueAction(\"\u5199\u5165\u591A\u7EF4\u8868\u683C\", () => writeIssueBaseRecord({ issueId, record: { \"\u5904\u7406\u72B6\u6001\": \"\u5DF2\u4ECE Issue \u64CD\u4F5C\u533A\u540C\u6B65\" } }))}\n >\n {busyAction === \"\u5199\u5165\u591A\u7EF4\u8868\u683C\" ? \"\u5199\u5165\u4E2D...\" : \"\u5199\u5165\u591A\u7EF4\u8868\u683C\"}\n </button>\n <button\n key=\"lookup\"\n type=\"button\"\n style={buttonStyle}\n disabled={busyAction !== null}\n onClick={() => void runIssueAction(\"\u67E5\u8BE2\u63D0\u51FA\u4EBA\", () => lookupIssueRequester({ issueId }))}\n >\n {busyAction === \"\u67E5\u8BE2\u63D0\u51FA\u4EBA\" ? \"\u67E5\u8BE2\u4E2D...\" : \"\u67E5\u8BE2\u63D0\u51FA\u4EBA\"}\n </button>\n </div>\n {actionNotice ? (\n <div\n key=\"action-notice\"\n style={{\n ...(actionNotice.tone === \"success\" ? successBoxStyle : subtleBoxStyle),\n marginTop: \"10px\",\n color: actionNotice.tone === \"error\" ? \"var(--destructive)\" : undefined,\n }}\n >\n {actionNotice.text}\n </div>\n ) : null}\n <div key=\"detail\" style={{ ...helpStyle, marginTop: \"8px\" }}>\n \u8FD9\u4E9B\u64CD\u4F5C\u4F1A\u8D70\u63D2\u4EF6\u53D7\u63A7\u52A8\u4F5C\u548C\u80FD\u529B\u4E2D\u5FC3\u5F00\u5173\uFF1B\u5F53\u524D\u4E3A\u6D4B\u8BD5\u6A21\u5F0F\u65F6\u53EA\u751F\u6210\u547D\u4EE4\uFF0C\u4E0D\u4F1A\u771F\u5B9E\u53D1\u98DE\u4E66\u3002\n </div>\n </div>\n\n {data.attachments?.length ? (\n <div key=\"attachments\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"8px\" }}>\u539F\u6D88\u606F\u9644\u4EF6</div>\n <div key=\"list\" style={{ display: \"grid\", gap: \"6px\" }}>\n {data.attachments.map((attachment) => (\n <div key={`${attachment.resourceType}:${attachment.resourceKey}`} style={{ ...helpStyle, overflowWrap: \"anywhere\" }}>\n {issueSourceDisplayName(attachment.filename) ?? \"\u672A\u547D\u540D\u98DE\u4E66\u9644\u4EF6\"}\uFF08{attachment.resourceType}\uFF09\n </div>\n ))}\n </div>\n </div>\n ) : null}\n\n {recentComments.length > 0 ? (\n <div key=\"comment-actions\" style={subtleBoxStyle}>\n <div key=\"title\" style={{ fontWeight: 800, marginBottom: \"8px\" }}>\u8BC4\u8BBA\u5FEB\u6377\u64CD\u4F5C</div>\n <div key=\"list\" style={{ display: \"grid\", gap: \"10px\" }}>\n {recentComments.map((comment, index) => (\n <div\n key={comment.id}\n style={{\n display: \"grid\",\n gap: \"8px\",\n paddingTop: index === 0 ? 0 : \"10px\",\n borderTop: index === 0 ? \"0\" : \"1px solid var(--border)\",\n }}\n >\n <div\n key=\"body\"\n style={{\n color: \"var(--foreground)\",\n lineHeight: 1.5,\n overflowWrap: \"anywhere\",\n whiteSpace: \"pre-wrap\",\n }}\n >\n {comment.body}\n </div>\n <div key=\"meta\" style={{ ...rowStyle, justifyContent: \"space-between\" }}>\n <span key=\"time\" style={helpStyle}>{comment.createdAt ? `\u8BC4\u8BBA\u65F6\u95F4\uFF1A${comment.createdAt}` : \"Paperclip \u8BC4\u8BBA\"}</span>\n <button\n key=\"reply\"\n type=\"button\"\n style={buttonStyle}\n disabled={busyAction !== null}\n onClick={() => void runIssueAction(\"\u56DE\u590D\u8BC4\u8BBA\u5230\u98DE\u4E66\", () => replyIssueCommentToFeishu({ issueId, commentId: comment.id }))}\n >\n {busyAction === \"\u56DE\u590D\u8BC4\u8BBA\u5230\u98DE\u4E66\" ? \"\u56DE\u590D\u4E2D...\" : \"\u56DE\u590D\u8FD9\u6761\u8BC4\u8BBA\u5230\u98DE\u4E66\"}\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n\n <div key=\"issue-links\" style={{ display: \"grid\", gap: \"8px\" }}>\n {data.issueUrl ? (\n <a key=\"issue-url\" href={data.issueUrl} target=\"_blank\" rel=\"noreferrer\" style={linkButtonStyle}>\n \u6253\u5F00 Paperclip \u4EFB\u52A1\u94FE\u63A5\n </a>\n ) : null}\n {hasDebugInfo ? (\n <details key=\"debug\" style={helpStyle}>\n <summary style={{ cursor: \"pointer\", fontWeight: 700 }}>\u6392\u969C\u4FE1\u606F\uFF08\u5DE5\u7A0B\u5E08\uFF09</summary>\n <div key=\"debug-items\" style={{ display: \"grid\", gap: \"4px\", marginTop: \"8px\", overflowWrap: \"anywhere\" }}>\n {data.chatId ? <span key=\"chat\">\u4F1A\u8BDD ID\uFF1A{data.chatId}</span> : null}\n {data.rootMessageId ? <span key=\"root\">\u6839\u6D88\u606F\uFF1A{data.rootMessageId}</span> : null}\n {data.threadId ? <span key=\"thread\">\u7EBF\u7A0B\uFF1A{data.threadId}</span> : null}\n {data.lastRunId ? <span key=\"run\">\u6700\u8FD1\u6267\u884C\uFF1A{data.lastRunId}{data.lastRunStatus ? `\uFF08${data.lastRunStatus}\uFF09` : \"\"}</span> : null}\n {data.updatedAt ? <span key=\"updated\">\u6700\u8FD1\u66F4\u65B0\uFF1A{data.updatedAt}</span> : null}\n </div>\n </details>\n ) : null}\n </div>\n </div>\n );\n}\n", "export const PLUGIN_ID = \"paperclipai.feishu-connector\";\nexport const PLUGIN_VERSION = \"0.3.1-connector-feishu\";\n\nexport const DATA_KEYS = {\n status: \"status\",\n catalog: \"catalog\",\n profiles: \"profiles\",\n directory: \"directory\",\n issueSource: \"issue-source\",\n capabilities: \"capabilities\",\n} as const;\n\nexport const ACTION_KEYS = {\n simulateInboundMessage: \"simulate-inbound-message\",\n sendMessage: \"send-message\",\n writeBaseRecord: \"write-base-record\",\n bindProfile: \"bind-profile\",\n startGuidedBind: \"start-guided-bind\",\n finishGuidedBind: \"finish-guided-bind\",\n startUserAuth: \"start-user-auth\",\n finishUserAuth: \"finish-user-auth\",\n testRoute: \"test-route\",\n checkPermissions: \"check-permissions\",\n retryFailedDeliveries: \"retry-failed-deliveries\",\n replyIssueSourceThread: \"reply-issue-source-thread\",\n downloadIssueAttachments: \"download-issue-attachments\",\n writeIssueBaseRecord: \"write-issue-base-record\",\n lookupIssueRequester: \"lookup-issue-requester\",\n replyIssueCommentToFeishu: \"reply-issue-comment-to-feishu\",\n} as const;\n\nexport const API_ROUTE_KEYS = {\n simulateInboundMessage: \"simulate-inbound-message\",\n} as const;\n\nexport const TOOL_NAMES = {\n sendMessage: \"feishu.send_message\",\n sendCard: \"feishu.send_card\",\n writeBaseRecord: \"feishu.write_base_record\",\n downloadAttachments: \"feishu.download_attachments\",\n replyOriginalThread: \"feishu.reply_original_thread\",\n replySourceThread: \"feishu.reply_source_thread\",\n askClarification: \"feishu.ask_clarification\",\n lookupUser: \"feishu.lookup_user\",\n fetchDoc: \"feishu.fetch_doc\",\n runLarkCliCapability: \"feishu.run_lark_cli_capability\",\n} as const;\n\nexport const UI_EXPORTS = {\n dashboardWidget: \"DashboardWidget\",\n sidebarLink: \"FeishuSidebarLink\",\n sidebarPanel: \"FeishuSidebarPanel\",\n settingsPage: \"FeishuSettingsPage\",\n issueTab: \"FeishuIssueTab\",\n commentReplyAction: \"FeishuCommentReplyAction\",\n} as const;\n\nexport const WEBHOOK_KEYS = {\n feishuEvents: \"feishu-events\",\n} as const;\n\nexport const LEGACY_ACK_TEMPLATE = \"\u5DF2\u6536\u5230\uFF0C\u6211\u4F1A\u4EA4\u7ED9 {{agent_name}} \u5904\u7406\u3002\";\nexport const LEGACY_COMPLETION_TEMPLATE = \"\u4EFB\u52A1\u5DF2\u5B8C\u6210\uFF1A{{issue_title}}\";\nexport const DEFAULT_ACK_TEMPLATE = \"\u5DF2\u6536\u5230\uFF0C\u4EA4\u7ED9 {{agent_name}} \u5904\u7406\u3002\\n\u4EFB\u52A1\uFF1A{{issue_ref}}\";\nexport const DEFAULT_COMPLETION_TEMPLATE = \"\u5904\u7406\u5B8C\u6210\uFF1A{{issue_title}}\";\nexport const DEFAULT_ACK_CARD_TITLE = \"\uD83D\uDCCB \u5DF2\u6536\u5230\u4EFB\u52A1\";\nexport const DEFAULT_ACK_CARD_TEMPLATE = \"blue\";\nexport const DEFAULT_COMPLETION_CARD_TITLE = \"\u2705 \u4EFB\u52A1\u5B8C\u6210\";\nexport const DEFAULT_COMPLETION_CARD_TEMPLATE = \"green\";\nexport const DEFAULT_PROGRESS_CARD_TITLE = \"\u23F3 \u8FDB\u5EA6\u66F4\u65B0\";\nexport const DEFAULT_PROGRESS_CARD_TEMPLATE = \"indigo\";\nexport const DEFAULT_BLOCKED_CARD_TITLE = \"\uD83D\uDD04 \u5DF2\u8F6C\u4EA4\u5904\u7406\";\nexport const DEFAULT_BLOCKED_CARD_TEMPLATE = \"yellow\";\nexport const DEFAULT_FAILURE_CARD_TITLE = \"\u274C \u5904\u7406\u5931\u8D25\";\nexport const DEFAULT_FAILURE_CARD_TEMPLATE = \"red\";\nexport const DEFAULT_ACK_CARD_FOOTER = \"\u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u56DE\u5230\u8FD9\u91CC\u3002\";\nexport const DEFAULT_ESTIMATED_DURATION_LABEL = \"3-8 \u5206\u949F\";\nexport const DEFAULT_QUICK_REPLY_REGEX = \"^(\u53EA\u56DE\u590D\\\\s*ok|\u56DE\u590D\\\\s*ok|ping)$\";\nexport const DEFAULT_QUICK_REPLY_TEXT = \"ok\";\n", "import {\n DEFAULT_ACK_TEMPLATE,\n DEFAULT_COMPLETION_TEMPLATE,\n DEFAULT_QUICK_REPLY_REGEX,\n DEFAULT_QUICK_REPLY_TEXT,\n} from \"./constants.js\";\nimport type {\n FeishuBaseSinkConfig,\n FeishuCapabilityConfig,\n FeishuCapabilityScope,\n FeishuConnectionConfig,\n FeishuConnectorConfig,\n FeishuRouteConfig,\n} from \"./types.js\";\n\nconst optionalStringKeys = [\n \"eventVerificationTokenRef\",\n \"eventEncryptKeyRef\",\n] as const;\n\nexport const DEFAULT_CONFIG: Required<Pick<\n FeishuConnectorConfig,\n \"larkCliBin\" | \"dryRunCli\" | \"capabilityDefaultPolicy\" | \"paperclipBaseUrl\" | \"enableEventSubscriber\" | \"eventTypes\" | \"ackOnInbound\" | \"ackMessageTemplate\" | \"completionMessageTemplate\"\n | \"eventRequireSignature\" | \"enableQuickReply\" | \"quickReplyRegex\" | \"quickReplyText\"\n>> = {\n larkCliBin: \"lark-cli\",\n dryRunCli: true,\n capabilityDefaultPolicy: \"authorized\",\n paperclipBaseUrl: \"\",\n enableEventSubscriber: false,\n eventTypes: \"im.message.receive_v1\",\n eventRequireSignature: false,\n ackOnInbound: false,\n ackMessageTemplate: DEFAULT_ACK_TEMPLATE,\n completionMessageTemplate: DEFAULT_COMPLETION_TEMPLATE,\n enableQuickReply: true,\n quickReplyRegex: DEFAULT_QUICK_REPLY_REGEX,\n quickReplyText: DEFAULT_QUICK_REPLY_TEXT,\n};\n\nfunction asArray<T>(value: unknown): T[] {\n return Array.isArray(value) ? value as T[] : [];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeStringList(value: unknown): string[] {\n const values = Array.isArray(value)\n ? value\n : typeof value === \"string\"\n ? value.split(/[,\uFF0C\u3001\\n]/g)\n : [];\n return [...new Set(values\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter(Boolean))];\n}\n\nfunction normalizeCapabilityScope(value: unknown): FeishuCapabilityScope {\n return value === \"bot\" || value === \"entry\" || value === \"agent\" ? value : \"instance\";\n}\n\nexport function normalizeConfig(input: Record<string, unknown> | null | undefined): FeishuConnectorConfig {\n const source = isRecord(input) ? input : {};\n const optionalStrings = Object.fromEntries(optionalStringKeys\n .map((key) => [key, typeof source[key] === \"string\" ? source[key].trim() : undefined])\n .filter(([, value]) => typeof value === \"string\" && value.length > 0));\n return {\n ...DEFAULT_CONFIG,\n ...optionalStrings,\n larkCliBin: typeof source.larkCliBin === \"string\" && source.larkCliBin.trim()\n ? source.larkCliBin.trim()\n : DEFAULT_CONFIG.larkCliBin,\n dryRunCli: typeof source.dryRunCli === \"boolean\"\n ? source.dryRunCli\n : DEFAULT_CONFIG.dryRunCli,\n capabilityDefaultPolicy: source.capabilityDefaultPolicy === \"conservative\"\n ? \"conservative\"\n : DEFAULT_CONFIG.capabilityDefaultPolicy,\n paperclipBaseUrl: typeof source.paperclipBaseUrl === \"string\"\n ? source.paperclipBaseUrl.trim()\n : DEFAULT_CONFIG.paperclipBaseUrl,\n enableEventSubscriber: source.enableEventSubscriber === true,\n eventTypes: typeof source.eventTypes === \"string\" && source.eventTypes.trim()\n ? source.eventTypes.trim()\n : DEFAULT_CONFIG.eventTypes,\n eventRequireSignature: source.eventRequireSignature === true,\n ackOnInbound: source.ackOnInbound === true,\n ackMessageTemplate: typeof source.ackMessageTemplate === \"string\"\n ? source.ackMessageTemplate\n : DEFAULT_CONFIG.ackMessageTemplate,\n completionMessageTemplate: typeof source.completionMessageTemplate === \"string\"\n ? source.completionMessageTemplate\n : DEFAULT_CONFIG.completionMessageTemplate,\n enableQuickReply: source.enableQuickReply !== false,\n quickReplyRegex: typeof source.quickReplyRegex === \"string\" && source.quickReplyRegex.trim()\n ? source.quickReplyRegex.trim()\n : DEFAULT_CONFIG.quickReplyRegex,\n quickReplyText: typeof source.quickReplyText === \"string\"\n ? source.quickReplyText\n : DEFAULT_CONFIG.quickReplyText,\n connections: asArray<FeishuConnectionConfig>(source.connections)\n .filter((connection) =>\n typeof connection?.id === \"string\" &&\n typeof connection?.profileName === \"string\"\n )\n .map((connection) => ({\n ...connection,\n botAliases: normalizeStringList(connection.botAliases),\n })),\n routes: asArray<FeishuRouteConfig>(source.routes).filter((route) =>\n typeof route?.id === \"string\" &&\n (typeof route?.companyId === \"string\" || typeof route?.companyRef === \"string\") &&\n typeof route?.matchType === \"string\"\n ),\n baseSinks: asArray<FeishuBaseSinkConfig>(source.baseSinks).filter((sink) =>\n typeof sink?.id === \"string\" &&\n typeof sink?.baseToken === \"string\" &&\n typeof sink?.tableIdOrName === \"string\"\n ),\n capabilities: asArray<FeishuCapabilityConfig>(source.capabilities)\n .filter((capability) => typeof capability?.key === \"string\")\n .map((capability) => ({\n ...capability,\n key: capability.key.trim(),\n scope: normalizeCapabilityScope(capability.scope),\n }))\n .filter((capability) => capability.key.length > 0),\n };\n}\n\nexport function getEnabledConnections(config: FeishuConnectorConfig): FeishuConnectionConfig[] {\n return (config.connections ?? []).filter((connection) => connection.enabled !== false);\n}\n\nexport function resolveConnection(\n config: FeishuConnectorConfig,\n connectionId?: string,\n): FeishuConnectionConfig | null {\n const enabled = getEnabledConnections(config);\n if (connectionId) {\n return enabled.find((connection) => connection.id === connectionId) ?? null;\n }\n return enabled[0] ?? null;\n}\n\nexport function resolveBaseSink(\n config: FeishuConnectorConfig,\n sinkId?: string,\n): FeishuBaseSinkConfig | null {\n if (!sinkId) return null;\n return (config.baseSinks ?? []).find((sink) => sink.id === sinkId && sink.enabled !== false) ?? null;\n}\n", "import type {\n FeishuBaseSinkConfig,\n FeishuConnectorConfig,\n FeishuInboundAttachment,\n FeishuInboundMessage,\n FeishuMention,\n FeishuRouteConfig,\n} from \"./types.js\";\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null;\n}\n\nfunction readString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim().length > 0) return value.trim();\n }\n return undefined;\n}\n\nfunction parseJsonRecord(value: unknown): Record<string, unknown> | null {\n if (typeof value !== \"string\") return asRecord(value);\n try {\n return asRecord(JSON.parse(value));\n } catch {\n return null;\n }\n}\n\nfunction collectAttachments(value: unknown, out: FeishuInboundAttachment[] = []): FeishuInboundAttachment[] {\n if (Array.isArray(value)) {\n for (const item of value) collectAttachments(item, out);\n return out;\n }\n\n const record = asRecord(value);\n if (!record) return out;\n\n const imageKey = readString(record.image_key, record.imageKey);\n if (imageKey) {\n out.push({\n resourceKey: imageKey,\n resourceType: \"image\",\n filename: readString(record.file_name, record.fileName, record.name, record.title),\n });\n }\n\n const fileKey = readString(record.file_key, record.fileKey);\n if (fileKey) {\n out.push({\n resourceKey: fileKey,\n resourceType: \"file\",\n filename: readString(record.file_name, record.fileName, record.name, record.title),\n });\n }\n\n const audioKey = readString(record.audio_key, record.audioKey);\n if (audioKey) {\n out.push({\n resourceKey: audioKey,\n resourceType: \"audio\",\n filename: readString(record.file_name, record.fileName, record.name, record.title),\n });\n }\n\n const videoKey = readString(record.video_key, record.videoKey);\n if (videoKey) {\n out.push({\n resourceKey: videoKey,\n resourceType: \"video\",\n filename: readString(record.file_name, record.fileName, record.name, record.title),\n });\n }\n\n for (const child of Object.values(record)) collectAttachments(child, out);\n return out;\n}\n\nfunction parsePlaceholderAttachments(text: string): FeishuInboundAttachment[] {\n const attachments: FeishuInboundAttachment[] = [];\n const patterns: Array<[RegExp, FeishuInboundAttachment[\"resourceType\"]]> = [\n [/\\[Image:\\s*([^\\]\\s]+)\\]/gi, \"image\"],\n [/\\[File:\\s*([^\\]\\s]+)\\]/gi, \"file\"],\n [/\\[Audio:\\s*([^\\]\\s]+)\\]/gi, \"audio\"],\n [/\\[Video:\\s*([^\\]\\s]+)\\]/gi, \"video\"],\n [/<(image|file|audio|video)\\s+key=[\"']?([^\"'\\s>]+)[\"']?[^>]*>/gi, \"file\"],\n ];\n for (const [pattern, fallbackType] of patterns) {\n for (const match of text.matchAll(pattern)) {\n const xmlType = match[1]?.toLowerCase();\n const key = match[2] ?? match[1];\n if (!key) continue;\n const resourceType = xmlType === \"image\" || xmlType === \"file\" || xmlType === \"audio\" || xmlType === \"video\"\n ? xmlType\n : fallbackType;\n attachments.push({ resourceKey: key, resourceType });\n }\n }\n return attachments;\n}\n\nfunction dedupeAttachments(attachments: FeishuInboundAttachment[]): FeishuInboundAttachment[] {\n const seen = new Set<string>();\n const out: FeishuInboundAttachment[] = [];\n for (const attachment of attachments) {\n const key = `${attachment.resourceType}:${attachment.resourceKey}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(attachment);\n }\n return out;\n}\n\nfunction parseMention(value: unknown): FeishuMention | null {\n const record = asRecord(value);\n if (!record) return null;\n const id = asRecord(record.id) ?? asRecord(record.user_id) ?? asRecord(record.userId) ?? {};\n const mention: FeishuMention = {\n name: readString(record.name, record.display_name, record.displayName, record.text),\n openId: readString(record.open_id, record.openId, id.open_id, id.openId),\n userId: readString(record.user_id, record.userId, id.user_id, id.userId),\n appId: readString(record.app_id, record.appId, id.app_id, id.appId),\n key: readString(record.key),\n };\n return mention.name || mention.openId || mention.userId || mention.appId || mention.key ? mention : null;\n}\n\nfunction collectMentions(value: unknown, out: FeishuMention[] = []): FeishuMention[] {\n if (Array.isArray(value)) {\n for (const item of value) collectMentions(item, out);\n return out;\n }\n const mention = parseMention(value);\n if (mention) out.push(mention);\n return out;\n}\n\nfunction dedupeMentions(mentions: FeishuMention[]): FeishuMention[] {\n const seen = new Set<string>();\n const out: FeishuMention[] = [];\n for (const mention of mentions) {\n const key = [\n mention.name,\n mention.openId,\n mention.userId,\n mention.appId,\n mention.key,\n ].filter(Boolean).join(\":\");\n if (!key || seen.has(key)) continue;\n seen.add(key);\n out.push(mention);\n }\n return out;\n}\n\nfunction extractTextFromContent(content: unknown): string | undefined {\n if (typeof content !== \"string\") return readString(content);\n const parsed = parseJsonRecord(content);\n if (!parsed) return content;\n const text = readString(parsed.text, parsed.content, parsed.title);\n if (text) return text;\n return undefined;\n}\n\nfunction attachmentSummary(attachments: FeishuInboundAttachment[]): string {\n if (attachments.length === 0) return \"\";\n return attachments.map((attachment) => {\n const label = attachment.resourceType === \"image\"\n ? \"\u56FE\u7247\"\n : attachment.resourceType === \"audio\"\n ? \"\u97F3\u9891\"\n : attachment.resourceType === \"video\"\n ? \"\u89C6\u9891\"\n : \"\u6587\u4EF6\";\n return `[${label}\uFF1A${attachment.filename ?? attachment.resourceKey}]`;\n }).join(\" \");\n}\n\nexport function extractInboundMessage(raw: unknown, fallbackConnectionId?: string): FeishuInboundMessage {\n const root = asRecord(raw) ?? {};\n const event = asRecord(root.event) ?? root;\n const header = asRecord(root.header) ?? {};\n const message = asRecord(event.message) ?? asRecord(root.message) ?? root;\n const sender = asRecord(event.sender) ?? asRecord(root.sender) ?? {};\n const senderId = asRecord(sender.sender_id) ?? asRecord(sender.senderId) ?? sender;\n\n const eventId = readString(root.event_id, root.eventId, header.event_id, header.eventId);\n const messageId = readString(root.message_id, root.messageId, message.message_id, message.messageId);\n if (!messageId) {\n throw new Error(\"\u98DE\u4E66\u6D88\u606F\u4E8B\u4EF6\u7F3A\u5C11 message_id\uFF0C\u65E0\u6CD5\u8BC6\u522B\u662F\u54EA\u6761\u6D88\u606F\u3002\");\n }\n\n const rawText = readString(\n root.text,\n root.message_text,\n root.messageText,\n message.text,\n extractTextFromContent(message.content),\n ) ?? \"\";\n const contentRecord = parseJsonRecord(message.content);\n const attachments = dedupeAttachments([\n ...collectAttachments(contentRecord ?? message.content),\n ...parsePlaceholderAttachments(rawText),\n ]);\n const mentions = dedupeMentions([\n ...collectMentions(root.mentions),\n ...collectMentions(event.mentions),\n ...collectMentions(message.mentions),\n ...collectMentions(contentRecord?.mentions),\n ]);\n const text = rawText || attachmentSummary(attachments);\n\n return {\n connectionId: readString(root.connectionId, fallbackConnectionId),\n eventId,\n messageId,\n messageType: readString(root.message_type, root.messageType, message.message_type, message.messageType),\n chatId: readString(root.chat_id, root.chatId, message.chat_id, message.chatId),\n chatName: readString(root.chat_name, root.chatName, event.chat_name, event.chatName, message.chat_name, message.chatName),\n threadId: readString(root.thread_id, root.threadId, message.thread_id, message.threadId),\n rootMessageId: readString(root.root_id, root.rootId, message.root_id, message.rootId),\n senderOpenId: readString(root.sender_open_id, root.senderOpenId, senderId.open_id, senderId.openId),\n senderUserId: readString(root.sender_user_id, root.senderUserId, senderId.user_id, senderId.userId),\n senderName: readString(root.sender_name, root.senderName, sender.name, sender.sender_name),\n senderType: readString(root.sender_type, root.senderType, sender.sender_type, sender.senderType, sender.type),\n senderAppId: readString(root.sender_app_id, root.senderAppId, senderId.app_id, senderId.appId, sender.app_id, sender.appId),\n text,\n mentions,\n attachments,\n raw,\n };\n}\n\nexport function buildSessionKey(message: FeishuInboundMessage, connectionId: string): string {\n const chat = message.chatId ?? \"direct\";\n const root = message.threadId ?? message.rootMessageId ?? message.messageId;\n return `feishu:${connectionId}:${chat}:root:${root}`;\n}\n\nfunction routeMatches(route: FeishuRouteConfig, message: FeishuInboundMessage, connectionId: string): boolean {\n if (route.enabled === false) return false;\n if (route.connectionId && route.connectionId !== connectionId) return false;\n if (route.matchType === \"chat\") return !!route.chatId && route.chatId === message.chatId;\n if (route.matchType === \"user\") return !!route.userOpenId && route.userOpenId === message.senderOpenId;\n if (route.matchType === \"keyword\") {\n const keyword = route.keyword?.trim();\n return !!keyword && message.text.toLocaleLowerCase().includes(keyword.toLocaleLowerCase());\n }\n if (route.matchType === \"regex\") {\n if (!route.regex) return false;\n try {\n return new RegExp(route.regex, \"i\").test(message.text);\n } catch {\n return false;\n }\n }\n return route.matchType === \"default\";\n}\n\nexport function resolveRoute(\n config: FeishuConnectorConfig,\n message: FeishuInboundMessage,\n connectionId: string,\n): FeishuRouteConfig | null {\n return resolveMatchingRoutes(config, message, connectionId)[0] ?? null;\n}\n\nexport function resolveMatchingRoutes(\n config: FeishuConnectorConfig,\n message: FeishuInboundMessage,\n connectionId: string,\n): FeishuRouteConfig[] {\n const routes = [...(config.routes ?? [])].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n return routes.filter((route) => routeMatches(route, message, connectionId));\n}\n\nexport function createIssueTitle(message: FeishuInboundMessage): string {\n const text = message.text.replace(/\\s+/g, \" \").trim();\n if (!text) return \"\u98DE\u4E66\u9700\u6C42\";\n return text.length > 80 ? `${text.slice(0, 77)}...` : text;\n}\n\nexport function describeRouteTrigger(route: FeishuRouteConfig): string {\n if (route.matchType === \"chat\") {\n return route.chatName ? `\u6307\u5B9A\u98DE\u4E66\u4F1A\u8BDD\u300C${route.chatName}\u300D` : \"\u6307\u5B9A\u98DE\u4E66\u4F1A\u8BDD\";\n }\n if (route.matchType === \"user\") {\n return route.userName ? `\u6307\u5B9A\u63D0\u51FA\u4EBA\u300C${route.userName}\u300D` : \"\u6307\u5B9A\u63D0\u51FA\u4EBA\";\n }\n if (route.matchType === \"keyword\") {\n return route.keyword ? `\u5305\u542B\u300C${route.keyword}\u300D\u7684\u98DE\u4E66\u6D88\u606F` : \"\u5305\u542B\u5173\u952E\u8BCD\u7684\u98DE\u4E66\u6D88\u606F\";\n }\n if (route.matchType === \"regex\") {\n return \"\u5339\u914D\u9AD8\u7EA7\u89C4\u5219\u7684\u98DE\u4E66\u6D88\u606F\";\n }\n return \"\u9ED8\u8BA4\u5165\u53E3\";\n}\n\nexport function isLikelyInternalRouteName(value?: string | null): boolean {\n const normalized = (value ?? \"\").trim().toLocaleLowerCase();\n if (!normalized) return false;\n if (/[\\u4e00-\\u9fff\\s]/.test(normalized)) return false;\n if (/^(chat|team|keyword|regex|default|route|entry|inbound)[_-]/.test(normalized)) return true;\n if (/[_-](to|agent|bot|team|chat|keyword|regex|route|entry|inbound)([_-]|$)/.test(normalized)) return true;\n return /^[a-z0-9]+([_-][a-z0-9]+){2,}$/.test(normalized);\n}\n\nexport function describeRouteEntry(route: FeishuRouteConfig): string {\n const explicitName = route.name?.trim();\n if (explicitName && !isLikelyInternalRouteName(explicitName)) return explicitName;\n const trigger = describeRouteTrigger(route);\n const agentName = route.targetAgentName?.trim();\n return agentName ? `${trigger} \u2192 ${agentName}` : trigger;\n}\n\nexport function describeRouteForHumans(route: FeishuRouteConfig): string {\n return describeRouteEntry(route);\n}\n\nexport function describeFeishuConversation(\n message: FeishuInboundMessage,\n route?: FeishuRouteConfig,\n): string {\n const name = message.chatName ?? route?.chatName ?? route?.userName;\n if (name && message.chatId) return `${name}\uFF08${message.chatId}\uFF09`;\n if (name) return name;\n if (message.chatId) return message.chatId;\n if (message.senderName) return `\u6765\u81EA ${message.senderName} \u7684\u5355\u804A`;\n return \"\u672A\u77E5\u98DE\u4E66\u4F1A\u8BDD\";\n}\n\nfunction isLikelyFeishuInternalId(value?: string | null): boolean {\n const normalized = (value ?? \"\").trim();\n if (!normalized) return false;\n return /^(?:oc|ou|om|on|od|of|cli)_[a-z0-9][a-z0-9_-]{5,}$/i.test(normalized);\n}\n\nfunction feishuDisplayText(value?: string | null): string | null {\n const trimmed = (value ?? \"\").trim();\n if (!trimmed || isLikelyFeishuInternalId(trimmed)) return null;\n return trimmed;\n}\n\nexport function describeFeishuConversationForDisplay(\n message: FeishuInboundMessage,\n route?: FeishuRouteConfig,\n): string {\n return feishuDisplayText(message.chatName)\n ?? feishuDisplayText(route?.chatName)\n ?? feishuDisplayText(route?.userName)\n ?? (feishuDisplayText(message.senderName) ? `\u6765\u81EA ${feishuDisplayText(message.senderName)} \u7684\u5355\u804A` : null)\n ?? \"\u5DF2\u8BB0\u5F55\uFF0C\u540D\u79F0\u5F85\u540C\u6B65\";\n}\n\nexport function describeFeishuRequesterForDisplay(message: FeishuInboundMessage): string {\n return feishuDisplayText(message.senderName) ?? \"\u5DF2\u8BB0\u5F55\uFF0C\u540D\u79F0\u5F85\u540C\u6B65\";\n}\n\nfunction describeFeishuAttachmentForDisplay(attachment: FeishuInboundAttachment): string {\n const filename = feishuDisplayText(attachment.filename);\n return `${filename ?? \"\u672A\u547D\u540D\u98DE\u4E66\u9644\u4EF6\"}\uFF08${attachment.resourceType}\uFF09`;\n}\n\nexport function feishuContextLines(\n message: FeishuInboundMessage,\n route?: FeishuRouteConfig,\n): string[] {\n const lines = [\n \"\u6765\u6E90\uFF1A\u98DE\u4E66\",\n route ? `\u63A5\u6536\u5165\u53E3\uFF1A${describeRouteEntry(route)}` : undefined,\n `\u98DE\u4E66\u4F1A\u8BDD\uFF1A${describeFeishuConversationForDisplay(message, route)}`,\n `\u63D0\u51FA\u4EBA\uFF1A${describeFeishuRequesterForDisplay(message)}`,\n \"\u539F\u6D88\u606F\uFF1A\u5DF2\u8BB0\u5F55\uFF0C\u53EF\u56DE\u539F\u7EBF\u7A0B\",\n ];\n if (message.rootMessageId && message.rootMessageId !== message.messageId) {\n lines.push(\"\u98DE\u4E66\u8BDD\u9898\uFF1A\u5DF2\u8BB0\u5F55\");\n }\n if (\n message.threadId &&\n message.threadId !== message.messageId &&\n message.threadId !== message.rootMessageId\n ) {\n lines.push(\"\u98DE\u4E66\u7EBF\u7A0B\uFF1A\u5DF2\u8BB0\u5F55\");\n }\n return lines.filter((line): line is string => typeof line === \"string\" && line.length > 0);\n}\n\nexport function createIssueDescription(message: FeishuInboundMessage, route: FeishuRouteConfig): string {\n const lines = [\n message.text.trim() || \"\uFF08\u7A7A\u98DE\u4E66\u6D88\u606F\uFF09\",\n \"\",\n \"---\",\n ...feishuContextLines(message, route),\n ];\n if (message.attachments.length > 0) {\n lines.push(\"\");\n lines.push(\"\u9644\u4EF6\uFF1A\");\n for (const attachment of message.attachments) {\n lines.push(`- ${describeFeishuAttachmentForDisplay(attachment)}`);\n }\n }\n return lines.join(\"\\n\");\n}\n\nexport function createCommentBody(message: FeishuInboundMessage, route?: FeishuRouteConfig): string {\n const lines = [\n `\u98DE\u4E66\u540E\u7EED\u6D88\u606F\uFF0C\u6765\u81EA ${describeFeishuRequesterForDisplay(message)}\uFF1A`,\n \"\",\n message.text.trim() || \"\uFF08\u7A7A\u98DE\u4E66\u6D88\u606F\uFF09\",\n \"\",\n ...feishuContextLines(message, route),\n ];\n if (message.attachments.length > 0) {\n lines.push(\"\", \"\u9644\u4EF6\uFF1A\");\n for (const attachment of message.attachments) {\n lines.push(`- ${describeFeishuAttachmentForDisplay(attachment)}`);\n }\n }\n return lines.join(\"\\n\");\n}\n\nexport interface TemplateContext {\n message: FeishuInboundMessage;\n route?: FeishuRouteConfig;\n issueId?: string;\n issueRef?: string;\n issueUrl?: string;\n issueTitle?: string;\n agentName?: string;\n runId?: string;\n runStatus?: string;\n estimatedDuration?: string;\n}\n\nexport function renderTemplate(template: string, context: TemplateContext): string {\n const values: Record<string, string> = {\n \"message.text\": context.message.text,\n \"message.id\": context.message.messageId,\n \"message.chat_id\": context.message.chatId ?? \"\",\n \"message.chat_name\": context.message.chatName ?? \"\",\n \"sender.open_id\": context.message.senderOpenId ?? \"\",\n \"sender.name\": context.message.senderName ?? context.message.senderOpenId ?? \"\",\n \"route.id\": context.route?.id ?? \"\",\n \"route.entry\": context.route ? describeRouteEntry(context.route) : \"\",\n \"route.trigger\": context.route ? describeRouteTrigger(context.route) : \"\",\n \"issue_id\": context.issueId ?? \"\",\n \"issue_ref\": context.issueRef ?? context.issueId ?? \"\",\n \"issue_url\": context.issueUrl ?? \"\",\n \"issue_title\": context.issueTitle ?? \"\",\n \"agent_name\": context.agentName ?? context.route?.targetAgentName ?? \"agent\",\n \"run_id\": context.runId ?? \"\",\n \"run_status\": context.runStatus ?? \"\",\n \"eta\": context.estimatedDuration ?? \"\",\n \"estimated_duration\": context.estimatedDuration ?? \"\",\n };\n return template.replace(/\\{\\{\\s*([^}]+?)\\s*\\}\\}/g, (_match, key: string) => values[key.trim()] ?? \"\");\n}\n\nexport function buildBaseRecord(\n sink: FeishuBaseSinkConfig,\n context: TemplateContext,\n): Record<string, string> {\n const defaultMap: Record<string, string> = {\n \"\u9700\u6C42\u6807\u9898\": \"{{issue_title}}\",\n \"\u539F\u59CB\u9700\u6C42\": \"{{message.text}}\",\n \"\u63D0\u51FA\u4EBA\": \"{{sender.name}}\",\n \"\u63D0\u51FA\u4EBA open_id\": \"{{sender.open_id}}\",\n \"\u98DE\u4E66\u4F1A\u8BDD\": \"{{message.chat_name}}\",\n \"\u63A5\u6536\u5165\u53E3\": \"{{route.entry}}\",\n \"\u98DE\u4E66 chat_id\": \"{{message.chat_id}}\",\n \"\u98DE\u4E66 message_id\": \"{{message.id}}\",\n \"Paperclip issue_id\": \"{{issue_id}}\",\n \"\u7ED1\u5B9A agent\": \"{{agent_name}}\",\n \"\u72B6\u6001\": \"\u5F85\u5904\u7406\",\n \"\u6765\u6E90\": \"\u98DE\u4E66\",\n };\n const fieldMap = sink.fieldMap && Object.keys(sink.fieldMap).length > 0 ? sink.fieldMap : defaultMap;\n return Object.fromEntries(\n Object.entries(fieldMap).map(([field, template]) => [field, renderTemplate(template, context)]),\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["activeSubscriberCount"]
|
|
7
|
+
}
|