nextclaw 0.8.31 → 0.8.33
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/dist/cli/index.js +27 -2
- package/package.json +2 -2
- package/templates/USAGE.md +18 -0
- package/ui-dist/assets/ChannelsList-TFFw4Cem.js +1 -0
- package/ui-dist/assets/ChatPage-BUm3UPap.js +32 -0
- package/ui-dist/assets/CronConfig-9dYfTRJl.js +1 -0
- package/ui-dist/assets/{DocBrowser-j7niXd-r.js → DocBrowser-BIV0vpA0.js} +1 -1
- package/ui-dist/assets/{MarketplacePage-wwHgdVC2.js → MarketplacePage-2Zi0JSVi.js} +1 -1
- package/ui-dist/assets/{ModelConfig-DYsAYZmK.js → ModelConfig-h21P5rV0.js} +1 -1
- package/ui-dist/assets/ProvidersList-DEaK1a3y.js +1 -0
- package/ui-dist/assets/RuntimeConfig-DXMzf-gF.js +1 -0
- package/ui-dist/assets/SessionsConfig-SdXvn_9E.js +2 -0
- package/ui-dist/assets/{action-link-idlbumT9.js → action-link-C9xMkxl2.js} +1 -1
- package/ui-dist/assets/{card-D-p-as8W.js → card-Cnqfntk5.js} +1 -1
- package/ui-dist/assets/chat-message-B7oqvJ2d.js +3 -0
- package/ui-dist/assets/dialog-DJs630RE.js +5 -0
- package/ui-dist/assets/index-CrUDzcei.js +2 -0
- package/ui-dist/assets/index-Zy7fAOe1.css +1 -0
- package/ui-dist/assets/{label-DyVIs28I.js → label-CXGuE6Oa.js} +1 -1
- package/ui-dist/assets/{page-layout-BuYR443L.js → page-layout-BVZlyPFt.js} +1 -1
- package/ui-dist/assets/{switch-QRLVAehj.js → switch-BLF45eI3.js} +1 -1
- package/ui-dist/assets/{tabs-custom-tbDoqtk2.js → tabs-custom-DQ0GpEV5.js} +1 -1
- package/ui-dist/assets/useConfig-vFQvF4kn.js +1 -0
- package/ui-dist/assets/{useConfirmDialog-Dj945N0Y.js → useConfirmDialog-CK7KAyDf.js} +1 -1
- package/ui-dist/assets/{vendor-Bhv7yx8z.js → vendor-RXIbhDBC.js} +95 -60
- package/ui-dist/index.html +3 -3
- package/ui-dist/assets/ChannelsList-B7XLKy6l.js +0 -1
- package/ui-dist/assets/CronConfig-CDv1eiLK.js +0 -1
- package/ui-dist/assets/ProvidersList-DcojGhjs.js +0 -1
- package/ui-dist/assets/RuntimeConfig-Cyitquqb.js +0 -1
- package/ui-dist/assets/SessionsConfig-2RYUIeki.js +0 -2
- package/ui-dist/assets/dialog-DJSdVlnI.js +0 -5
- package/ui-dist/assets/index-DFfB9XKS.js +0 -2
- package/ui-dist/assets/index-DdpR1fdj.css +0 -1
- package/ui-dist/assets/useConfig-DgIVFToQ.js +0 -1
package/dist/cli/index.js
CHANGED
|
@@ -2692,7 +2692,7 @@ var ServiceCommands = class {
|
|
|
2692
2692
|
} else {
|
|
2693
2693
|
console.log("Warning: No channels enabled");
|
|
2694
2694
|
}
|
|
2695
|
-
this.startUiIfEnabled(uiConfig, uiStaticDir, cron2);
|
|
2695
|
+
this.startUiIfEnabled(uiConfig, uiStaticDir, cron2, runtimePool);
|
|
2696
2696
|
const cronStatus = cron2.status();
|
|
2697
2697
|
if (cronStatus.jobs > 0) {
|
|
2698
2698
|
console.log(`\u2713 Cron: ${cronStatus.jobs} scheduled jobs`);
|
|
@@ -3064,7 +3064,7 @@ var ServiceCommands = class {
|
|
|
3064
3064
|
console.log(`Public UI (if firewall/NAT allows): ${publicBase}`);
|
|
3065
3065
|
console.log(`Public API (if firewall/NAT allows): ${publicBase}/api`);
|
|
3066
3066
|
}
|
|
3067
|
-
startUiIfEnabled(uiConfig, uiStaticDir, cronService) {
|
|
3067
|
+
startUiIfEnabled(uiConfig, uiStaticDir, cronService, runtimePool) {
|
|
3068
3068
|
if (!uiConfig.enabled) {
|
|
3069
3069
|
return;
|
|
3070
3070
|
}
|
|
@@ -3084,6 +3084,31 @@ var ServiceCommands = class {
|
|
|
3084
3084
|
uninstallPlugin: (id) => this.uninstallMarketplacePlugin(id),
|
|
3085
3085
|
uninstallSkill: (slug) => this.uninstallMarketplaceSkill(slug)
|
|
3086
3086
|
}
|
|
3087
|
+
},
|
|
3088
|
+
chatRuntime: {
|
|
3089
|
+
processTurn: async (params) => {
|
|
3090
|
+
const sessionKey = typeof params.sessionKey === "string" && params.sessionKey.trim().length > 0 ? params.sessionKey.trim() : `ui:${Date.now().toString(36)}:${Math.random().toString(36).slice(2, 8)}`;
|
|
3091
|
+
const inferredAgentId = typeof params.agentId === "string" && params.agentId.trim().length > 0 ? params.agentId.trim() : parseAgentScopedSessionKey2(sessionKey)?.agentId;
|
|
3092
|
+
const model = typeof params.model === "string" && params.model.trim().length > 0 ? params.model.trim() : void 0;
|
|
3093
|
+
const metadata = params.metadata && typeof params.metadata === "object" && !Array.isArray(params.metadata) ? { ...params.metadata } : {};
|
|
3094
|
+
if (model) {
|
|
3095
|
+
metadata.model = model;
|
|
3096
|
+
}
|
|
3097
|
+
const reply = await runtimePool.processDirect({
|
|
3098
|
+
content: params.message,
|
|
3099
|
+
sessionKey,
|
|
3100
|
+
channel: typeof params.channel === "string" && params.channel.trim().length > 0 ? params.channel : "ui",
|
|
3101
|
+
chatId: typeof params.chatId === "string" && params.chatId.trim().length > 0 ? params.chatId : "web-ui",
|
|
3102
|
+
agentId: inferredAgentId,
|
|
3103
|
+
metadata
|
|
3104
|
+
});
|
|
3105
|
+
return {
|
|
3106
|
+
reply,
|
|
3107
|
+
sessionKey,
|
|
3108
|
+
...inferredAgentId ? { agentId: inferredAgentId } : {},
|
|
3109
|
+
...model ? { model } : {}
|
|
3110
|
+
};
|
|
3111
|
+
}
|
|
3087
3112
|
}
|
|
3088
3113
|
});
|
|
3089
3114
|
const uiUrl = `http://${uiServer.host}:${uiServer.port}`;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nextclaw",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.33",
|
|
4
4
|
"description": "Lightweight personal AI assistant with CLI, multi-provider routing, and channel integrations.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"chokidar": "^3.6.0",
|
|
40
40
|
"commander": "^12.1.0",
|
|
41
41
|
"@nextclaw/core": "^0.6.34",
|
|
42
|
-
"@nextclaw/server": "^0.5.
|
|
42
|
+
"@nextclaw/server": "^0.5.17",
|
|
43
43
|
"@nextclaw/openclaw-compat": "^0.1.28"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
package/templates/USAGE.md
CHANGED
|
@@ -352,6 +352,24 @@ NextClaw UI now provides an OpenClaw-aligned session operations panel (**Session
|
|
|
352
352
|
|
|
353
353
|
This is useful when running multi-agent routing and channel operations long term, because you can clean or retarget problematic sessions without hand-editing files.
|
|
354
354
|
|
|
355
|
+
## Agent chat in UI
|
|
356
|
+
|
|
357
|
+
NextClaw UI includes a first-class **Chat** tab so you can talk to your agent directly from browser:
|
|
358
|
+
|
|
359
|
+
- create/switch/delete sessions from the left panel
|
|
360
|
+
- inspect complete session history in the thread panel
|
|
361
|
+
- choose target agent before sending message
|
|
362
|
+
- send messages with Enter (Shift+Enter for newline)
|
|
363
|
+
- keep using the same session for multi-turn context
|
|
364
|
+
- render assistant replies as Markdown (tables/code blocks/links)
|
|
365
|
+
- show tool calls/results as structured tool cards
|
|
366
|
+
- merge consecutive same-role messages into grouped chat blocks for better readability
|
|
367
|
+
|
|
368
|
+
Notes:
|
|
369
|
+
|
|
370
|
+
- if provider credentials are missing, chat API will return a clear runtime error telling you to configure provider keys first
|
|
371
|
+
- session data is persisted in the same session store used by runtime/channels
|
|
372
|
+
|
|
355
373
|
---
|
|
356
374
|
|
|
357
375
|
## Workspace
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as v,j as a,ac as ae,M as S,ad as M,ae as N,aa as te,_ as ne,ab as le,af as se,ag as oe,n as H,ah as re,ai as ce,aj as ie}from"./vendor-RXIbhDBC.js";import{u as _,a as q,i as me,j as pe,I as D,g as de}from"./useConfig-vFQvF4kn.js";import{t as e,c as G,u as J,S as be,b as ue,d as ge,e as ye,g as xe}from"./index-CrUDzcei.js";import{D as he,a as fe,b as we,c as je,d as ve,e as ke}from"./dialog-DJs630RE.js";import{B as F,P as Ce,a as Pe}from"./page-layout-BVZlyPFt.js";import{L as Ne}from"./label-CXGuE6Oa.js";import{S as Se}from"./switch-BLF45eI3.js";import{h as T}from"./config-hints-CApS3K_7.js";import{T as Ie}from"./tabs-custom-DQ0GpEV5.js";import{C as De,a as Fe,L as Te,d as Me,S as Ae,b as Le,c as Ue,A as Ee}from"./action-link-C9xMkxl2.js";function Be({value:n,onChange:d,className:i,placeholder:m=""}){const[c,y]=v.useState(""),b=u=>{u.key==="Enter"&&c.trim()?(u.preventDefault(),d([...n,c.trim()]),y("")):u.key==="Backspace"&&!c&&n.length>0&&d(n.slice(0,-1))},f=u=>{d(n.filter((o,g)=>g!==u))};return a.jsxs("div",{className:G("flex flex-wrap gap-2 p-2 border rounded-md min-h-[42px]",i),children:[n.map((u,o)=>a.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 bg-primary text-primary-foreground rounded text-sm",children:[u,a.jsx("button",{type:"button",onClick:()=>f(o),className:"hover:text-red-300 transition-colors",children:a.jsx(ae,{className:"h-3 w-3"})})]},o)),a.jsx("input",{type:"text",value:c,onChange:u=>y(u.target.value),onKeyDown:b,className:"flex-1 outline-none min-w-[100px] bg-transparent text-sm",placeholder:m||e("enterTag")})]})}const U=[{value:"pairing",label:"pairing"},{value:"allowlist",label:"allowlist"},{value:"open",label:"open"},{value:"disabled",label:"disabled"}],E=[{value:"open",label:"open"},{value:"allowlist",label:"allowlist"},{value:"disabled",label:"disabled"}],Oe=[{value:"off",label:"off"},{value:"partial",label:"partial"},{value:"block",label:"block"},{value:"progress",label:"progress"}],$e=n=>n.includes("token")||n.includes("secret")||n.includes("password")?a.jsx(te,{className:"h-3.5 w-3.5 text-gray-500"}):n.includes("url")||n.includes("host")?a.jsx(ne,{className:"h-3.5 w-3.5 text-gray-500"}):n.includes("email")||n.includes("mail")?a.jsx(M,{className:"h-3.5 w-3.5 text-gray-500"}):n.includes("id")||n.includes("from")?a.jsx(le,{className:"h-3.5 w-3.5 text-gray-500"}):n==="enabled"||n==="consentGranted"?a.jsx(se,{className:"h-3.5 w-3.5 text-gray-500"}):a.jsx(oe,{className:"h-3.5 w-3.5 text-gray-500"});function B(){return{telegram:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"token",type:"password",label:e("botToken")},{name:"allowFrom",type:"tags",label:e("allowFrom")},{name:"proxy",type:"text",label:e("proxy")},{name:"accountId",type:"text",label:e("accountId")},{name:"dmPolicy",type:"select",label:e("dmPolicy"),options:U},{name:"groupPolicy",type:"select",label:e("groupPolicy"),options:E},{name:"groupAllowFrom",type:"tags",label:e("groupAllowFrom")},{name:"requireMention",type:"boolean",label:e("requireMention")},{name:"mentionPatterns",type:"tags",label:e("mentionPatterns")},{name:"groups",type:"json",label:e("groupRulesJson")}],discord:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"token",type:"password",label:e("botToken")},{name:"allowBots",type:"boolean",label:e("allowBotMessages")},{name:"allowFrom",type:"tags",label:e("allowFrom")},{name:"gatewayUrl",type:"text",label:e("gatewayUrl")},{name:"intents",type:"number",label:e("intents")},{name:"proxy",type:"text",label:e("proxy")},{name:"mediaMaxMb",type:"number",label:e("attachmentMaxSizeMb")},{name:"streaming",type:"select",label:e("streamingMode"),options:Oe},{name:"draftChunk",type:"json",label:e("draftChunkingJson")},{name:"textChunkLimit",type:"number",label:e("textChunkLimit")},{name:"accountId",type:"text",label:e("accountId")},{name:"dmPolicy",type:"select",label:e("dmPolicy"),options:U},{name:"groupPolicy",type:"select",label:e("groupPolicy"),options:E},{name:"groupAllowFrom",type:"tags",label:e("groupAllowFrom")},{name:"requireMention",type:"boolean",label:e("requireMention")},{name:"mentionPatterns",type:"tags",label:e("mentionPatterns")},{name:"groups",type:"json",label:e("groupRulesJson")}],whatsapp:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"bridgeUrl",type:"text",label:e("bridgeUrl")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],feishu:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"appId",type:"text",label:e("appId")},{name:"appSecret",type:"password",label:e("appSecret")},{name:"encryptKey",type:"password",label:e("encryptKey")},{name:"verificationToken",type:"password",label:e("verificationToken")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],dingtalk:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"clientId",type:"text",label:e("clientId")},{name:"clientSecret",type:"password",label:e("clientSecret")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],wecom:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"corpId",type:"text",label:e("corpId")},{name:"agentId",type:"text",label:e("agentId")},{name:"secret",type:"password",label:e("secret")},{name:"token",type:"password",label:e("token")},{name:"callbackPort",type:"number",label:e("callbackPort")},{name:"callbackPath",type:"text",label:e("callbackPath")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],slack:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"mode",type:"text",label:e("mode")},{name:"webhookPath",type:"text",label:e("webhookPath")},{name:"allowBots",type:"boolean",label:e("allowBotMessages")},{name:"botToken",type:"password",label:e("botToken")},{name:"appToken",type:"password",label:e("appToken")}],email:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"consentGranted",type:"boolean",label:e("consentGranted")},{name:"imapHost",type:"text",label:e("imapHost")},{name:"imapPort",type:"number",label:e("imapPort")},{name:"imapUsername",type:"text",label:e("imapUsername")},{name:"imapPassword",type:"password",label:e("imapPassword")},{name:"fromAddress",type:"email",label:e("fromAddress")}],mochat:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"baseUrl",type:"text",label:e("baseUrl")},{name:"clawToken",type:"password",label:e("clawToken")},{name:"agentUserId",type:"text",label:e("agentUserId")},{name:"allowFrom",type:"tags",label:e("allowFrom")}],qq:[{name:"enabled",type:"boolean",label:e("enabled")},{name:"appId",type:"text",label:e("appId")},{name:"secret",type:"password",label:e("appSecret")},{name:"markdownSupport",type:"boolean",label:e("markdownSupport")},{name:"allowFrom",type:"tags",label:e("allowFrom")}]}}const O={telegram:S,slack:S,email:M,default:S},$={telegram:"from-primary-300 to-primary-600",slack:"from-primary-200 to-primary-500",email:"from-primary-100 to-primary-400",default:"from-gray-300 to-gray-500"};function I(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function K(n,d){const i={...n};for(const[m,c]of Object.entries(d)){const y=i[m];if(I(y)&&I(c)){i[m]=K(y,c);continue}i[m]=c}return i}function Re(n,d){const i=n.split("."),m={};let c=m;for(let y=0;y<i.length-1;y+=1){const b=i[y];c[b]={},c=c[b]}return c[i[i.length-1]]=d,m}function He(){var A,L;const{channelModal:n,closeChannelModal:d}=J(),{data:i}=_(),{data:m}=q(),c=me(),y=pe(),[b,f]=v.useState({}),[u,o]=v.useState({}),[g,x]=v.useState(null),l=n.channel,w=l?i==null?void 0:i.channels[l]:null,k=l?B()[l]??[]:[],C=m==null?void 0:m.uiHints,P=l?`channels.${l}`:null,z=((A=m==null?void 0:m.actions)==null?void 0:A.filter(t=>t.scope===P))??[],V=l&&(((L=T(`channels.${l}`,C))==null?void 0:L.label)??l);v.useEffect(()=>{if(w){f({...w});const t={};(l?B()[l]??[]:[]).filter(r=>r.type==="json").forEach(r=>{const h=w[r.name];t[r.name]=JSON.stringify(h??{},null,2)}),o(t)}else f({}),o({})},[w,l]);const j=(t,s)=>{f(r=>({...r,[t]:s}))},Y=t=>{if(t.preventDefault(),!l)return;const s={...b};for(const r of k){if(r.type!=="json")continue;const h=u[r.name]??"";try{s[r.name]=h.trim()?JSON.parse(h):{}}catch{N.error(`${e("invalidJson")}: ${r.name}`);return}}c.mutate({channel:l,data:s},{onSuccess:()=>d()})},W=t=>{if(!t||!l)return;const s=t.channels;if(!I(s))return;const r=s[l];I(r)&&f(h=>K(h,r))},X=async t=>{if(!(!l||!P)){x(t.id);try{let s={...b};t.saveBeforeRun&&(s={...s,...t.savePatch??{}},f(s),await c.mutateAsync({channel:l,data:s}));const r=await y.mutateAsync({actionId:t.id,data:{scope:P,draftConfig:Re(P,s)}});W(r.patch),r.ok?N.success(r.message||e("success")):N.error(r.message||e("error"))}catch(s){const r=s instanceof Error?s.message:String(s);N.error(`${e("error")}: ${r}`)}finally{x(null)}}},Q=O[l||""]||O.default,Z=$[l||""]||$.default;return a.jsx(he,{open:n.open,onOpenChange:d,children:a.jsxs(fe,{className:"sm:max-w-[550px] max-h-[85vh] overflow-hidden flex flex-col",children:[a.jsx(we,{children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:`h-10 w-10 rounded-xl bg-gradient-to-br ${Z} flex items-center justify-center`,children:a.jsx(Q,{className:"h-5 w-5 text-white"})}),a.jsxs("div",{children:[a.jsx(je,{className:"capitalize",children:V}),a.jsx(ve,{children:e("configureMessageChannelParameters")})]})]})}),a.jsxs("form",{onSubmit:Y,className:"flex flex-col flex-1 overflow-hidden",children:[a.jsx("div",{className:"flex-1 overflow-y-auto custom-scrollbar py-2 pr-2 space-y-5",children:k.map(t=>{const s=l?T(`channels.${l}.${t.name}`,C):void 0,r=(s==null?void 0:s.label)??t.label,h=s==null?void 0:s.placeholder;return a.jsxs("div",{className:"space-y-2.5",children:[a.jsxs(Ne,{htmlFor:t.name,className:"text-sm font-medium text-gray-900 flex items-center gap-2",children:[$e(t.name),r]}),t.type==="boolean"&&a.jsxs("div",{className:"flex items-center justify-between p-3 rounded-xl bg-gray-50",children:[a.jsx("span",{className:"text-sm text-gray-500",children:b[t.name]?e("enabled"):e("disabled")}),a.jsx(Se,{id:t.name,checked:b[t.name]||!1,onCheckedChange:p=>j(t.name,p),className:"data-[state=checked]:bg-emerald-500"})]}),(t.type==="text"||t.type==="email")&&a.jsx(D,{id:t.name,type:t.type,value:b[t.name]||"",onChange:p=>j(t.name,p.target.value),placeholder:h,className:"rounded-xl"}),t.type==="password"&&a.jsx(D,{id:t.name,type:"password",value:b[t.name]||"",onChange:p=>j(t.name,p.target.value),placeholder:h??e("leaveBlankToKeepUnchanged"),className:"rounded-xl"}),t.type==="number"&&a.jsx(D,{id:t.name,type:"number",value:b[t.name]||0,onChange:p=>j(t.name,parseInt(p.target.value)||0),placeholder:h,className:"rounded-xl"}),t.type==="tags"&&a.jsx(Be,{value:b[t.name]||[],onChange:p=>j(t.name,p)}),t.type==="select"&&a.jsxs(be,{value:b[t.name]||"",onValueChange:p=>j(t.name,p),children:[a.jsx(ue,{className:"rounded-xl",children:a.jsx(ge,{})}),a.jsx(ye,{children:(t.options??[]).map(p=>a.jsx(xe,{value:p.value,children:p.label},p.value))})]}),t.type==="json"&&a.jsx("textarea",{id:t.name,value:u[t.name]??"{}",onChange:p=>o(ee=>({...ee,[t.name]:p.target.value})),className:"min-h-[120px] w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-xs font-mono"})]},t.name)})}),a.jsxs(ke,{className:"pt-4 flex-shrink-0",children:[a.jsx(F,{type:"button",variant:"outline",onClick:d,children:e("cancel")}),a.jsx(F,{type:"submit",disabled:c.isPending||!!g,children:c.isPending?e("saving"):e("save")}),z.filter(t=>t.trigger==="manual").map(t=>a.jsx(F,{type:"button",onClick:()=>X(t),disabled:c.isPending||!!g,variant:"secondary",children:g===t.id?e("connecting"):t.title},t.id))]})]})]})})}const R={telegram:S,slack:ce,email:M,webhook:re,default:H},_e={telegram:"channelDescTelegram",slack:"channelDescSlack",email:"channelDescEmail",webhook:"channelDescWebhook",discord:"channelDescDiscord",feishu:"channelDescFeishu"};function Ze(){const{data:n}=_(),{data:d}=de(),{data:i}=q(),{openChannelModal:m}=J(),[c,y]=v.useState("active"),b=i==null?void 0:i.uiHints;if(!n||!d)return a.jsx("div",{className:"p-8 text-gray-400",children:e("channelsLoading")});const f=[{id:"active",label:e("channelsTabEnabled"),count:d.channels.filter(o=>{var g;return(g=n.channels[o.name])==null?void 0:g.enabled}).length},{id:"all",label:e("channelsTabAll"),count:d.channels.length}],u=d.channels.filter(o=>{var x;const g=((x=n.channels[o.name])==null?void 0:x.enabled)||!1;return c==="all"||g});return a.jsxs(Ce,{children:[a.jsx(Pe,{title:e("channelsPageTitle")}),a.jsx(Ie,{tabs:f,activeTab:c,onChange:y}),a.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:u.map(o=>{const g=n.channels[o.name],x=(g==null?void 0:g.enabled)||!1,l=R[o.name]||R.default,w=T(`channels.${o.name}`,b),k=(w==null?void 0:w.help)||e(_e[o.name]||"channelDescriptionDefault");return a.jsxs(De,{onClick:()=>m(o.name),children:[a.jsxs(Fe,{children:[a.jsx(Te,{name:o.name,src:Me(o.name),className:G("h-11 w-11 rounded-xl border transition-all",x?"bg-white border-primary/30":"bg-white border-gray-200/60 group-hover:border-gray-300"),imgClassName:"h-5 w-5",fallback:a.jsx(l,{className:"h-5 w-5"})}),a.jsx(Ae,{status:x?"active":"inactive",label:x?e("statusActive"):e("statusInactive")})]}),a.jsx(Le,{title:o.displayName||o.name,description:k}),a.jsxs(Ue,{children:[a.jsx(Ee,{label:x?e("actionConfigure"):e("actionEnable")}),o.tutorialUrl&&a.jsx("a",{href:o.tutorialUrl,target:"_blank",rel:"noreferrer",onClick:C=>C.stopPropagation(),className:"flex items-center justify-center h-6 w-6 rounded-md text-gray-300 hover:text-gray-500 hover:bg-gray-100/60 transition-colors",title:e("channelsGuideTitle"),children:a.jsx(ie,{className:"h-3.5 w-3.5"})})]})]},o.name)})}),u.length===0&&a.jsxs("div",{className:"flex flex-col items-center justify-center py-16 text-center",children:[a.jsx("div",{className:"h-14 w-14 flex items-center justify-center rounded-xl bg-gray-100/80 mb-4",children:a.jsx(H,{className:"h-6 w-6 text-gray-300"})}),a.jsx("h3",{className:"text-[14px] font-semibold text-gray-900 mb-1.5",children:e("channelsEmptyTitle")}),a.jsx("p",{className:"text-[13px] text-gray-400 max-w-sm",children:e("channelsEmptyDescription")})]}),a.jsx(He,{})]})}export{Ze as ChannelsList};
|