@zhin.js/adapter-icqq 2.0.12 → 2.0.14

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/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @zhin.js/adapter-icqq
2
2
 
3
+ ## 2.0.14
4
+
5
+ ### Patch Changes
6
+
7
+ - e28fd7c: fix: 重新发版
8
+ - Updated dependencies [e28fd7c]
9
+ - @zhin.js/client@1.0.18
10
+ - @zhin.js/core@1.1.14
11
+ - zhin.js@1.0.72
12
+ - @zhin.js/console@2.0.13
13
+ - @zhin.js/http@1.0.65
14
+
15
+ ## 2.0.13
16
+
17
+ ### Patch Changes
18
+
19
+ - Updated dependencies [60b1a4d]
20
+ - @zhin.js/console@2.0.12
21
+
3
22
  ## 2.0.12
4
23
 
5
24
  ### Patch Changes
package/client/index.tsx CHANGED
@@ -1,11 +1,11 @@
1
- import { addPage } from '@zhin.js/client'
2
- import { Bot } from 'lucide-react'
1
+ import type { PluginRegisterHostApi } from '@zhin.js/console-types'
3
2
  import ICQQManagement from './ICQQManagement'
4
3
 
5
- addPage({
6
- key: 'icqq-management',
7
- path: '/icqq',
8
- title: 'ICQQ管理',
9
- icon: <Bot className="w-5 h-5" />,
10
- element: <ICQQManagement/>
11
- })
4
+ export function register(api: PluginRegisterHostApi) {
5
+ api.addRoute({
6
+ path: '/console/icqq',
7
+ name: 'ICQQ管理',
8
+ element: api.React.createElement(ICQQManagement, { hostReact: api.React }),
9
+ })
10
+ api.addTool({ id: 'icqq', name: 'ICQQ', path: '/console/icqq' })
11
+ }
package/lib/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import type { Router } from "@zhin.js/http";
2
- import type { WebServer } from "@zhin.js/console";
2
+ import { PageManager } from "@zhin.js/console";
3
3
  import { IcqqAdapter } from "./adapter.js";
4
4
  declare module "zhin.js" {
5
5
  namespace Plugin {
6
6
  interface Contexts {
7
- web: WebServer;
7
+ web: PageManager;
8
8
  router: Router;
9
9
  }
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAK3C,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,MAAM,CAAC;QACf,UAAU,QAAQ;YAChB,GAAG,EAAE,SAAS,CAAC;YACf,MAAM,EAAE,MAAM,CAAC;SAChB;KACF;IACD,UAAU,QAAQ;QAChB,IAAI,EAAE,WAAW,CAAC;KACnB;CACF;AAED,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAK3C,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,MAAM,CAAC;QACf,UAAU,QAAQ;YAChB,GAAG,EAAE,WAAW,CAAC;YACjB,MAAM,EAAE,MAAM,CAAC;SAChB;KACF;IACD,UAAU,QAAQ;QAChB,IAAI,EAAE,WAAW,CAAC;KACnB;CACF;AAED,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
package/lib/index.js CHANGED
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import path from "path";
5
5
  import { usePlugin } from "zhin.js";
6
+ import { PageManager } from "@zhin.js/console";
6
7
  import { IcqqAdapter } from "./adapter.js";
7
8
  import { registerCommands } from "./commands/index.js";
8
9
  import { registerTools } from "./tools/index.js";
@@ -34,8 +35,13 @@ useContext("tool", "icqq", (toolService, icqq) => {
34
35
  return registerTools(toolService, icqq, plugin.name);
35
36
  });
36
37
  // ── Web 控制台入口 ─────────────────────────────────────────────────
37
- useContext("web", (web) => {
38
- return web.addEntry(path.resolve(import.meta.dirname, "../client/index.tsx"));
38
+ useContext("web", () => {
39
+ PageManager.addEntry({
40
+ id: "icqq",
41
+ development: path.resolve(import.meta.dirname, "../client/index.tsx"),
42
+ production: path.resolve(import.meta.dirname, "../dist/index.js"),
43
+ meta: { name: "ICQQ" },
44
+ });
39
45
  });
40
46
  // ── HTTP 路由 ──────────────────────────────────────────────────────
41
47
  useContext("router", "icqq", async (router, icqq) => {
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAiC,MAAM,SAAS,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAc7C,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;AAEzD,iEAAiE;AACjE,OAAO,CAAC;IACN,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,cAAc;IAC3B,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAoB,EAAE,EAAE;QACtC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;CACK,CAAC,CAAC;AAEV,kEAAkE;AAClE,UAAU,CAAC,MAAM,EAAE,CAAC,IAAiB,EAAE,EAAE;IACvC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,kEAAkE;AAClE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,WAAwB,EAAE,IAAiB,EAAE,EAAE;IACzE,OAAO,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,iEAAiE;AACjE,UAAU,CAAC,KAAK,EAAE,CAAC,GAAc,EAAE,EAAE;IACnC,OAAO,GAAG,CAAC,QAAQ,CACjB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CACzD,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,oEAAoE;AACpE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAc,EAAE,IAAiB,EAAE,EAAE;IACvE,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAiC,MAAM,SAAS,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAc7C,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;AAEzD,iEAAiE;AACjE,OAAO,CAAC;IACN,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,cAAc;IAC3B,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAoB,EAAE,EAAE;QACtC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;CACK,CAAC,CAAC;AAEV,kEAAkE;AAClE,UAAU,CAAC,MAAM,EAAE,CAAC,IAAiB,EAAE,EAAE;IACvC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,kEAAkE;AAClE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,WAAwB,EAAE,IAAiB,EAAE,EAAE;IACzE,OAAO,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,iEAAiE;AACjE,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE;IACrB,WAAW,CAAC,QAAQ,CAAC;QACnB,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC;QACrE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC;QACjE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KACvB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,oEAAoE;AACpE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAc,EAAE,IAAiB,EAAE,EAAE;IACvE,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/adapter-icqq",
3
- "version": "2.0.12",
3
+ "version": "2.0.14",
4
4
  "description": "Zhin.js adapter for ICQQ (QQ Bot)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -46,20 +46,20 @@
46
46
  "dependencies": {},
47
47
  "devDependencies": {
48
48
  "@radix-ui/themes": "^3.2.1",
49
- "@types/react": "^19.2.2",
49
+ "@types/react": "^19.2.14",
50
50
  "@types/react-dom": "^19.2.1",
51
- "lucide-react": "^0.469.0",
51
+ "lucide-react": "^1.11.0",
52
52
  "radix-ui": "^1.4.3",
53
- "typescript": "^6.0.0",
54
- "@zhin.js/console": "2.0.11",
55
- "zhin.js": "1.0.71"
53
+ "typescript": "^6.0.3",
54
+ "@zhin.js/console": "2.0.13",
55
+ "zhin.js": "1.0.72"
56
56
  },
57
57
  "peerDependencies": {
58
- "@zhin.js/client": "1.0.17",
59
- "@zhin.js/console": "2.0.11",
60
- "@zhin.js/core": "1.1.13",
61
- "@zhin.js/http": "1.0.64",
62
- "zhin.js": "1.0.71"
58
+ "@zhin.js/client": "1.0.18",
59
+ "@zhin.js/console": "2.0.13",
60
+ "@zhin.js/core": "1.1.14",
61
+ "@zhin.js/http": "1.0.65",
62
+ "zhin.js": "1.0.72"
63
63
  },
64
64
  "peerDependenciesMeta": {
65
65
  "@zhin.js/client": {
package/src/index.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  import path from "path";
5
5
  import { usePlugin, type Plugin, type ToolFeature } from "zhin.js";
6
6
  import type { Router } from "@zhin.js/http";
7
- import type { WebServer } from "@zhin.js/console";
7
+ import { PageManager } from "@zhin.js/console";
8
8
  import { IcqqAdapter } from "./adapter.js";
9
9
  import { registerCommands } from "./commands/index.js";
10
10
  import { registerTools } from "./tools/index.js";
@@ -13,7 +13,7 @@ import { registerRoutes } from "./routes.js";
13
13
  declare module "zhin.js" {
14
14
  namespace Plugin {
15
15
  interface Contexts {
16
- web: WebServer;
16
+ web: PageManager;
17
17
  router: Router;
18
18
  }
19
19
  }
@@ -54,10 +54,13 @@ useContext("tool", "icqq", (toolService: ToolFeature, icqq: IcqqAdapter) => {
54
54
  });
55
55
 
56
56
  // ── Web 控制台入口 ─────────────────────────────────────────────────
57
- useContext("web", (web: WebServer) => {
58
- return web.addEntry(
59
- path.resolve(import.meta.dirname, "../client/index.tsx"),
60
- );
57
+ useContext("web", () => {
58
+ PageManager.addEntry({
59
+ id: "icqq",
60
+ development: path.resolve(import.meta.dirname, "../client/index.tsx"),
61
+ production: path.resolve(import.meta.dirname, "../dist/index.js"),
62
+ meta: { name: "ICQQ" },
63
+ });
61
64
  });
62
65
 
63
66
  // ── HTTP 路由 ──────────────────────────────────────────────────────
package/dist/index.js DELETED
@@ -1 +0,0 @@
1
- import{addPage as e}from"@zhin.js/client";import{Activity as t,AlertCircle as n,Bot as r,Loader2 as i,LogIn as a,MessageSquare as o,MousePointer as s,QrCode as c,RefreshCw as l,Smartphone as u,Users as d,Wifi as f,WifiOff as p,X as m}from"lucide-react";import{useCallback as h,useEffect as g,useRef as _,useState as v}from"react";import{Fragment as y,jsx as b,jsxs as x}from"react/jsx-runtime";var S="zhin_api_token";function C(){return localStorage.getItem(S)}async function w(e2,t2){let n2=C(),r2=new Headers(t2?.headers);n2&&r2.set("Authorization",`Bearer ${n2}`);let i2=await fetch(e2,{...t2,headers:r2});return i2.status===401&&(localStorage.removeItem(S),window.dispatchEvent(new CustomEvent("zhin:auth-required"))),i2}var T=2e3,E=15e3,D={qrcode:{icon:b(c,{className:"w-4 h-4"}),label:"扫码登录"},sms:{icon:b(o,{className:"w-4 h-4"}),label:"短信验证码"},device:{icon:b(u,{className:"w-4 h-4"}),label:"设备验证"},slider:{icon:b(s,{className:"w-4 h-4"}),label:"滑块验证"}};function O(){let[e2,t2]=v([]),[r2,o2]=v(true),[s2,c2]=v(null),[l2,u2]=v({}),[d2,f2]=v({}),p2=_(0),y2=_(),S2=h(async()=>{try{let e3=await w("/api/login-assist/pending");if(!e3.ok)throw Error("获取待办失败");let n2=await e3.json(),r3=(Array.isArray(n2)?n2:[]).filter(e4=>e4.adapter==="icqq");t2(r3),c2(null),p2.current=r3.length>0?0:p2.current+1}catch(e3){c2(e3.message),p2.current++}finally{o2(false)}},[]),C2=h(()=>{let e3=Math.min(T*1.5**p2.current,E);y2.current=setTimeout(async()=>{await S2(),C2()},e3)},[S2]);g(()=>(S2().then(C2),()=>clearTimeout(y2.current)),[S2,C2]);let O2=async(e3,t3)=>{u2(t4=>({...t4,[e3]:true}));try{if(!(await w("/api/login-assist/submit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:e3,value:t3})})).ok)throw Error("提交失败");f2(t4=>{let n2={...t4};return delete n2[e3],n2}),p2.current=0,await S2()}catch(e4){c2(e4.message)}finally{u2(t4=>({...t4,[e3]:false}))}},k2=async e3=>{try{(await w("/api/login-assist/cancel",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:e3})})).ok&&await S2()}catch{}};return r2&&e2.length===0?b("div",{className:"flex justify-center py-12",children:b(i,{className:"w-6 h-6 animate-spin text-blue-500"})}):x("div",{className:"space-y-4",children:[b("p",{className:"text-sm text-muted-foreground",children:"扫码、短信或滑块等验证会出现在下方;刷新页面后仍可继续处理(仅 ICQQ 待办)。"}),s2&&x("div",{className:"flex items-center gap-2 p-3 rounded border border-red-200 bg-red-50 text-red-600 text-sm dark:bg-red-900/20 dark:text-red-400 dark:border-red-800",children:[b(n,{className:"w-4 h-4 shrink-0"}),b("span",{children:s2}),b("button",{onClick:()=>c2(null),className:"ml-auto",children:b(m,{className:"w-3.5 h-3.5"})})]}),e2.length===0?x("div",{className:"border rounded-lg bg-card p-12 text-center",children:[b(a,{className:"w-16 h-16 mx-auto mb-4 opacity-25"}),b("h3",{className:"text-lg font-semibold mb-1",children:"暂无待办"}),b("p",{className:"text-sm text-muted-foreground",children:"机器人需要验证时,待办将显示在此处"})]}):b("div",{className:"space-y-4",children:e2.map(e3=>{let t3=D[e3.type]??{icon:b(a,{className:"w-4 h-4"}),label:e3.type};return x("div",{className:"border rounded-lg bg-card p-4 shadow-sm",children:[x("div",{className:"flex items-start justify-between flex-wrap gap-2 mb-2",children:[x("div",{className:"flex items-center gap-2 font-semibold",children:[t3.icon," ",t3.label]}),x("div",{className:"flex gap-1 text-xs",children:[b("span",{className:"px-2 py-0.5 rounded border",children:e3.adapter}),b("span",{className:"px-2 py-0.5 rounded bg-muted",children:e3.botId})]})]}),e3.payload?.message&&b("p",{className:"text-sm text-muted-foreground mb-3",children:e3.payload.message}),e3.type==="qrcode"&&e3.payload?.image&&b("div",{className:"flex justify-center p-4 bg-muted/30 rounded-lg mb-3",children:b("img",{src:String(e3.payload.image),alt:"登录二维码",className:"max-w-[200px] w-full h-auto"})}),e3.type==="slider"&&e3.payload?.url&&x("p",{className:"text-sm break-all mb-3",children:[b("span",{className:"text-muted-foreground",children:"滑块链接:"})," ",b("a",{href:String(e3.payload.url),target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",children:String(e3.payload.url)})]}),(e3.type==="sms"||e3.type==="device"||e3.type==="slider")&&x("div",{className:"flex flex-wrap gap-2 items-center",children:[b("input",{className:"h-9 px-3 rounded-md border border-input bg-background text-sm max-w-[18rem] flex-1",placeholder:e3.type==="slider"?"输入 ticket":"输入验证码",value:d2[e3.id]??"",onChange:t4=>f2(n2=>({...n2,[e3.id]:t4.target.value})),onKeyDown:t4=>{if(t4.key==="Enter"){let t5=d2[e3.id]?.trim();t5&&O2(e3.id,e3.type==="slider"?{ticket:t5}:t5)}}}),b("button",{className:"h-9 px-4 rounded-md bg-primary text-primary-foreground text-sm disabled:opacity-50",disabled:l2[e3.id]||!d2[e3.id]?.trim(),onClick:()=>{let t4=d2[e3.id]?.trim();t4&&O2(e3.id,e3.type==="slider"?{ticket:t4}:t4)},children:l2[e3.id]?"提交中…":"提交"})]}),e3.type==="qrcode"&&x("div",{className:"flex gap-2 mt-3",children:[b("button",{className:"h-9 px-4 rounded-md bg-primary text-primary-foreground text-sm disabled:opacity-50",disabled:!!l2[e3.id],onClick:()=>void O2(e3.id,{done:true}),children:l2[e3.id]?"提交中…":"我已扫码"}),b("button",{className:"h-9 px-4 rounded-md border text-sm hover:bg-accent transition-colors",onClick:()=>void k2(e3.id),children:"取消"})]})]},e3.id)})})]})}function k(){let[e2,n2]=v("overview"),[o2,s2]=v([]),[c2,u2]=v(true),[m2,_2]=v(null),S2=h(async()=>{u2(true),_2(null);try{let e3=await w("/api/icqq/bots"),t2=await e3.json();if(!e3.ok||!t2.success)throw Error(t2.message||"加载失败");s2(Array.isArray(t2.data)?t2.data:[])}catch(e3){_2(e3.message),s2([])}finally{u2(false)}},[]);return g(()=>{e2==="overview"&&S2()},[e2,S2]),x("div",{className:"p-6 max-w-5xl mx-auto space-y-5",children:[x("div",{className:"flex items-center justify-between",children:[x("div",{children:[x("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[b(r,{className:"w-6 h-6"})," ICQQ 管理"]}),b("p",{className:"text-sm text-muted-foreground mt-1",children:"机器人概览与登录辅助(扫码 / 验证码 / 滑块)"})]}),e2==="overview"&&x("button",{onClick:S2,disabled:c2,className:"flex items-center gap-1 px-3 py-1.5 rounded bg-blue-500 text-white hover:bg-blue-600 disabled:opacity-50 text-sm",children:[b(l,{className:`w-4 h-4 ${c2?"animate-spin":""}`})," 刷新"]})]}),x("div",{className:"flex gap-1 border-b",children:[b("button",{onClick:()=>n2("overview"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${e2==="overview"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:x("span",{className:"flex items-center gap-1.5",children:[b(r,{className:"w-4 h-4"})," 概览"]})}),b("button",{onClick:()=>n2("login"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${e2==="login"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:x("span",{className:"flex items-center gap-1.5",children:[b(a,{className:"w-4 h-4"})," 登录辅助"]})})]}),e2==="overview"&&x(y,{children:[m2&&b("div",{className:"p-3 bg-red-50 text-red-600 rounded border border-red-200 text-sm dark:bg-red-900/20 dark:text-red-400 dark:border-red-800",children:m2}),c2?b("div",{className:"flex justify-center py-12",children:b(i,{className:"w-6 h-6 animate-spin text-blue-500"})}):o2.length===0?b("div",{className:"text-center text-muted-foreground py-12",children:"暂无 ICQQ 机器人实例"}):b("div",{className:"grid gap-4 md:grid-cols-2",children:o2.map(e3=>x("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[x("div",{className:"flex items-center justify-between mb-3",children:[b("span",{className:"font-medium text-lg",children:e3.name}),e3.connected?x("span",{className:"flex items-center gap-1 text-green-600 text-sm",children:[b(f,{className:"w-4 h-4"})," 在线"]}):x("span",{className:"flex items-center gap-1 text-gray-400 text-sm",children:[b(p,{className:"w-4 h-4"})," 离线"]})]}),x("div",{className:"space-y-2 text-sm text-muted-foreground",children:[x("div",{className:"flex items-center gap-1.5",children:[b(d,{className:"w-3.5 h-3.5"}),"群 ",e3.groupCount," · 好友 ",e3.friendCount]}),x("div",{className:"flex items-center gap-1.5",children:[b(t,{className:"w-3.5 h-3.5"}),"登录方式 ",e3.loginMode," · ",e3.status]})]})]},e3.name))})]}),e2==="login"&&b(O,{})]})}e({key:"icqq-management",path:"/icqq",title:"ICQQ管理",icon:b(r,{className:"w-5 h-5"}),element:b(k,{})});