nextclaw 0.9.8 → 0.9.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/cli/index.js +14 -11
  2. package/package.json +4 -3
  3. package/ui-dist/assets/ChannelsList-CrQ3OXby.js +1 -0
  4. package/ui-dist/assets/ChatPage-Def8_fbf.js +34 -0
  5. package/ui-dist/assets/{DocBrowser-DvU-iUeB.js → DocBrowser-Dg-b4Atq.js} +1 -1
  6. package/ui-dist/assets/LogoBadge-uiBOKAEe.js +1 -0
  7. package/ui-dist/assets/{MarketplacePage--wFfsNH0.js → MarketplacePage-BwMsA6VY.js} +1 -1
  8. package/ui-dist/assets/{ModelConfig-cY5UsbfA.js → ModelConfig-DVsQVvIt.js} +1 -1
  9. package/ui-dist/assets/ProvidersList-BSJGEhJe.js +1 -0
  10. package/ui-dist/assets/{RuntimeConfig-BY2Axlte.js → RuntimeConfig-CZpxTqCn.js} +1 -1
  11. package/ui-dist/assets/{SecretsConfig-B25P3J7V.js → SecretsConfig-BLZW7-5k.js} +2 -2
  12. package/ui-dist/assets/SessionsConfig-H_gq5Wtk.js +2 -0
  13. package/ui-dist/assets/{card-CCSDsedj.js → card-BoxPL3fs.js} +1 -1
  14. package/ui-dist/assets/index-Cwtv_w6q.js +2 -0
  15. package/ui-dist/assets/index-DcxYzrFm.css +1 -0
  16. package/ui-dist/assets/{label-BxzAKPzU.js → label-BdIFsV9G.js} +1 -1
  17. package/ui-dist/assets/{page-layout-DaLNSFKw.js → page-layout-BdhEwv_X.js} +1 -1
  18. package/ui-dist/assets/session-run-status-DJ7s-TnE.js +5 -0
  19. package/ui-dist/assets/{switch-DHOCEi5L.js → switch-DD9iXp2E.js} +1 -1
  20. package/ui-dist/assets/{tabs-custom-zdFy3fnK.js → tabs-custom-DPMQcAvE.js} +1 -1
  21. package/ui-dist/assets/useConfig-BiE7PGOv.js +6 -0
  22. package/ui-dist/assets/{useConfirmDialog-D3ZVa92J.js → useConfirmDialog-D0WoeDcH.js} +1 -1
  23. package/ui-dist/assets/{vendor-Dj2ULvht.js → vendor-CzIVZvq9.js} +1 -1
  24. package/ui-dist/index.html +3 -3
  25. package/ui-dist/assets/ChannelsList-VqzbAMCc.js +0 -1
  26. package/ui-dist/assets/ChatPage-CjZqsBmn.js +0 -34
  27. package/ui-dist/assets/ProvidersList-qZwaFoFt.js +0 -1
  28. package/ui-dist/assets/SessionsConfig-CxA9gIBw.js +0 -2
  29. package/ui-dist/assets/chat-message-pw9oafI4.js +0 -5
  30. package/ui-dist/assets/index-CD8a2KMH.js +0 -2
  31. package/ui-dist/assets/index-DKOXGZc8.css +0 -1
  32. package/ui-dist/assets/logos-C3oHQ9kv.js +0 -1
  33. package/ui-dist/assets/useConfig-CDl9UK5m.js +0 -6
package/dist/cli/index.js CHANGED
@@ -567,12 +567,13 @@ import {
567
567
  loadConfig,
568
568
  saveConfig,
569
569
  getWorkspacePath,
570
- PROVIDERS,
571
570
  expandHome
572
571
  } from "@nextclaw/core";
572
+ import { builtinProviderIds } from "@nextclaw/runtime";
573
573
  import { createInterface } from "readline";
574
574
  import { existsSync as existsSync4 } from "fs";
575
575
  import { resolve as resolve5 } from "path";
576
+ var RESERVED_PROVIDER_IDS = builtinProviderIds();
576
577
  function loadPluginRegistry(config2, workspaceDir) {
577
578
  return loadOpenClawPlugins({
578
579
  config: config2,
@@ -597,7 +598,7 @@ function loadPluginRegistry(config2, workspaceDir) {
597
598
  "cron"
598
599
  ],
599
600
  reservedChannelIds: [],
600
- reservedProviderIds: PROVIDERS.map((provider) => provider.name),
601
+ reservedProviderIds: RESERVED_PROVIDER_IDS,
601
602
  reservedEngineKinds: ["native"],
602
603
  logger: {
603
604
  info: (message) => console.log(message),
@@ -692,7 +693,7 @@ var PluginCommands = class {
692
693
  config: config2,
693
694
  workspaceDir,
694
695
  reservedChannelIds: [],
695
- reservedProviderIds: PROVIDERS.map((provider) => provider.name),
696
+ reservedProviderIds: RESERVED_PROVIDER_IDS,
696
697
  reservedEngineKinds: ["native"]
697
698
  });
698
699
  const list = opts.enabled ? report.plugins.filter((plugin) => plugin.status === "loaded") : report.plugins;
@@ -753,7 +754,7 @@ var PluginCommands = class {
753
754
  config: config2,
754
755
  workspaceDir,
755
756
  reservedChannelIds: [],
756
- reservedProviderIds: PROVIDERS.map((provider) => provider.name),
757
+ reservedProviderIds: RESERVED_PROVIDER_IDS,
757
758
  reservedEngineKinds: ["native"]
758
759
  });
759
760
  const plugin = report.plugins.find((entry) => entry.id === id || entry.name === id);
@@ -838,7 +839,7 @@ var PluginCommands = class {
838
839
  config: config2,
839
840
  workspaceDir,
840
841
  reservedChannelIds: [],
841
- reservedProviderIds: PROVIDERS.map((provider) => provider.name),
842
+ reservedProviderIds: RESERVED_PROVIDER_IDS,
842
843
  reservedEngineKinds: ["native"]
843
844
  });
844
845
  const keepFiles = Boolean(opts.keepFiles || opts.keepConfig);
@@ -1021,7 +1022,7 @@ var PluginCommands = class {
1021
1022
  config: config2,
1022
1023
  workspaceDir,
1023
1024
  reservedChannelIds: [],
1024
- reservedProviderIds: PROVIDERS.map((provider) => provider.name),
1025
+ reservedProviderIds: RESERVED_PROVIDER_IDS,
1025
1026
  reservedEngineKinds: ["native"]
1026
1027
  });
1027
1028
  const pluginErrors = report.plugins.filter((plugin) => plugin.status === "error");
@@ -1712,7 +1713,8 @@ var SecretsCommands = class {
1712
1713
 
1713
1714
  // src/cli/commands/channels.ts
1714
1715
  import { spawnSync as spawnSync3 } from "child_process";
1715
- import { BUILTIN_CHANNEL_PLUGIN_IDS, getWorkspacePath as getWorkspacePath2, loadConfig as loadConfig4, saveConfig as saveConfig4, PROVIDERS as PROVIDERS2 } from "@nextclaw/core";
1716
+ import { getWorkspacePath as getWorkspacePath2, loadConfig as loadConfig4, saveConfig as saveConfig4 } from "@nextclaw/core";
1717
+ import { BUILTIN_CHANNEL_PLUGIN_IDS, builtinProviderIds as builtinProviderIds2 } from "@nextclaw/runtime";
1716
1718
  import { buildPluginStatusReport as buildPluginStatusReport2, enablePluginInConfig as enablePluginInConfig2, getPluginChannelBindings } from "@nextclaw/openclaw-compat";
1717
1719
  var CHANNEL_LABELS = {
1718
1720
  telegram: "Telegram",
@@ -1726,6 +1728,7 @@ var CHANNEL_LABELS = {
1726
1728
  slack: "Slack",
1727
1729
  qq: "QQ"
1728
1730
  };
1731
+ var RESERVED_PROVIDER_IDS2 = builtinProviderIds2();
1729
1732
  var ChannelCommands = class {
1730
1733
  constructor(deps) {
1731
1734
  this.deps = deps;
@@ -1744,7 +1747,7 @@ var ChannelCommands = class {
1744
1747
  config: config2,
1745
1748
  workspaceDir,
1746
1749
  reservedChannelIds: [],
1747
- reservedProviderIds: PROVIDERS2.map((provider) => provider.name)
1750
+ reservedProviderIds: RESERVED_PROVIDER_IDS2
1748
1751
  });
1749
1752
  const pluginChannels = report.plugins.filter((plugin) => plugin.status === "loaded" && plugin.channelIds.length > 0);
1750
1753
  if (pluginChannels.length > 0) {
@@ -1908,9 +1911,9 @@ import {
1908
1911
  getDataDir as getDataDir4,
1909
1912
  getWorkspacePath as getWorkspacePath3,
1910
1913
  hasSecretRef,
1911
- loadConfig as loadConfig5,
1912
- PROVIDERS as PROVIDERS3
1914
+ loadConfig as loadConfig5
1913
1915
  } from "@nextclaw/core";
1916
+ import { listBuiltinProviders } from "@nextclaw/runtime";
1914
1917
  var DiagnosticsCommands = class {
1915
1918
  constructor(deps) {
1916
1919
  this.deps = deps;
@@ -2091,7 +2094,7 @@ var DiagnosticsCommands = class {
2091
2094
  const managedHealth = running && managedApiUrl ? await this.probeApiHealth(`${managedApiUrl}/health`) : { state: "unreachable", detail: "service not running" };
2092
2095
  const configuredHealth = await this.probeApiHealth(`${configuredApiUrl}/health`, 900);
2093
2096
  const orphanSuspected = !running && configuredHealth.state === "ok";
2094
- const providers = PROVIDERS3.map((spec) => {
2097
+ const providers = listBuiltinProviders().map((spec) => {
2095
2098
  const provider = config2.providers[spec.name];
2096
2099
  const apiKeyRefSet = hasSecretRef(config2, `providers.${spec.name}.apiKey`);
2097
2100
  if (!provider) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nextclaw",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
4
4
  "description": "Lightweight personal AI assistant with CLI, multi-provider routing, and channel integrations.",
5
5
  "private": false,
6
6
  "type": "module",
@@ -38,8 +38,9 @@
38
38
  "dependencies": {
39
39
  "chokidar": "^3.6.0",
40
40
  "commander": "^12.1.0",
41
- "@nextclaw/core": "^0.7.0",
42
- "@nextclaw/server": "^0.6.2",
41
+ "@nextclaw/core": "^0.7.1",
42
+ "@nextclaw/runtime": "^0.1.1",
43
+ "@nextclaw/server": "^0.6.3",
43
44
  "@nextclaw/openclaw-compat": "^0.2.0"
44
45
  },
45
46
  "devDependencies": {
@@ -0,0 +1 @@
1
+ import{r as v,j as a,at as Z,v as ee,aG as T,K as ae,a5 as te,aJ as se,aK as ne,aL as le,q as re,Y as oe,as as ce,n as ie}from"./vendor-CzIVZvq9.js";import{u as q,a as $,b as K,x as me,y as pe,I as D}from"./useConfig-BiE7PGOv.js";import{B as E,P as de,a as be}from"./page-layout-BdhEwv_X.js";import{L as ue}from"./label-BdIFsV9G.js";import{S as xe}from"./switch-DD9iXp2E.js";import{t as e,c as I,h as ye,S as ge,a as he,b as fe,d as we,e as ve}from"./index-Cwtv_w6q.js";import{C as je,a as ke,L as H,S as J,c as Se,b as Ce}from"./LogoBadge-uiBOKAEe.js";import{h as _}from"./config-hints-CApS3K_7.js";import{T as Ne}from"./tabs-custom-DPMQcAvE.js";function Pe({value:t,onChange:m,className:i,placeholder:r=""}){const[o,u]=v.useState(""),d=x=>{x.key==="Enter"&&o.trim()?(x.preventDefault(),m([...t,o.trim()]),u("")):x.key==="Backspace"&&!o&&t.length>0&&m(t.slice(0,-1))},g=x=>{m(t.filter((j,h)=>h!==x))};return a.jsxs("div",{className:I("flex flex-wrap gap-2 p-2 border rounded-md min-h-[42px]",i),children:[t.map((x,j)=>a.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 bg-primary text-primary-foreground rounded text-sm",children:[x,a.jsx("button",{type:"button",onClick:()=>g(j),className:"hover:text-red-300 transition-colors",children:a.jsx(Z,{className:"h-3 w-3"})})]},j)),a.jsx("input",{type:"text",value:o,onChange:x=>u(x.target.value),onKeyDown:d,className:"flex-1 outline-none min-w-[100px] bg-transparent text-sm",placeholder:r||e("enterTag")})]})}function z(t){var r,o;const m=ye();return((r=t.tutorialUrls)==null?void 0:r[m])||((o=t.tutorialUrls)==null?void 0:o.default)||t.tutorialUrl}const Ie={telegram:"telegram.svg",slack:"slack.svg",discord:"discord.svg",whatsapp:"whatsapp.svg",qq:"qq.svg",feishu:"feishu.svg",dingtalk:"dingtalk.svg",wecom:"wecom.svg",mochat:"mochat.svg",email:"email.svg"};function Fe(t,m){const i=m.toLowerCase(),r=t[i];return r?`/logos/${r}`:null}function Y(t){return Fe(Ie,t)}const B=[{value:"pairing",label:"pairing"},{value:"allowlist",label:"allowlist"},{value:"open",label:"open"},{value:"disabled",label:"disabled"}],G=[{value:"open",label:"open"},{value:"allowlist",label:"allowlist"},{value:"disabled",label:"disabled"}],Te=[{value:"off",label:"off"},{value:"partial",label:"partial"},{value:"block",label:"block"},{value:"progress",label:"progress"}],De=t=>t.includes("token")||t.includes("secret")||t.includes("password")?a.jsx(ae,{className:"h-3.5 w-3.5 text-gray-500"}):t.includes("url")||t.includes("host")?a.jsx(te,{className:"h-3.5 w-3.5 text-gray-500"}):t.includes("email")||t.includes("mail")?a.jsx(se,{className:"h-3.5 w-3.5 text-gray-500"}):t.includes("id")||t.includes("from")?a.jsx(ne,{className:"h-3.5 w-3.5 text-gray-500"}):t==="enabled"||t==="consentGranted"?a.jsx(le,{className:"h-3.5 w-3.5 text-gray-500"}):a.jsx(re,{className:"h-3.5 w-3.5 text-gray-500"});function R(){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:B},{name:"groupPolicy",type:"select",label:e("groupPolicy"),options:G},{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:Te},{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:B},{name:"groupPolicy",type:"select",label:e("groupPolicy"),options:G},{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")}]}}function A(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function V(t,m){const i={...t};for(const[r,o]of Object.entries(m)){const u=i[r];if(A(u)&&A(o)){i[r]=V(u,o);continue}i[r]=o}return i}function Ae(t,m){const i=t.split("."),r={};let o=r;for(let u=0;u<i.length-1;u+=1){const d=i[u];o[d]={},o=o[d]}return o[i[i.length-1]]=m,r}function Le({channelName:t}){var O,U;const{data:m}=q(),{data:i}=$(),{data:r}=K(),o=me(),u=pe(),[d,g]=v.useState({}),[x,j]=v.useState({}),[h,f]=v.useState(null),k=t?m==null?void 0:m.channels[t]:null,w=t?R()[t]??[]:[],c=r==null?void 0:r.uiHints,p=t?`channels.${t}`:null,S=((O=r==null?void 0:r.actions)==null?void 0:O.filter(s=>s.scope===p))??[],C=t&&(((U=_(`channels.${t}`,c))==null?void 0:U.label)??t),P=i==null?void 0:i.channels.find(s=>s.name===t),F=P?z(P):void 0;v.useEffect(()=>{if(k){g({...k});const s={};(t?R()[t]??[]:[]).filter(l=>l.type==="json").forEach(l=>{const y=k[l.name];s[l.name]=JSON.stringify(y??{},null,2)}),j(s)}else g({}),j({})},[k,t]);const N=(s,n)=>{g(l=>({...l,[s]:n}))},L=s=>{if(s.preventDefault(),!t)return;const n={...d};for(const l of w){if(l.type!=="password")continue;const y=n[l.name];(typeof y!="string"||y.length===0)&&delete n[l.name]}for(const l of w){if(l.type!=="json")continue;const y=x[l.name]??"";try{n[l.name]=y.trim()?JSON.parse(y):{}}catch{T.error(`${e("invalidJson")}: ${l.name}`);return}}o.mutate({channel:t,data:n})},Q=s=>{if(!s||!t)return;const n=s.channels;if(!A(n))return;const l=n[t];A(l)&&g(y=>V(y,l))},W=async s=>{if(!(!t||!p)){f(s.id);try{let n={...d};s.saveBeforeRun&&(n={...n,...s.savePatch??{}},g(n),await o.mutateAsync({channel:t,data:n}));const l=await u.mutateAsync({actionId:s.id,data:{scope:p,draftConfig:Ae(p,n)}});Q(l.patch),l.ok?T.success(l.message||e("success")):T.error(l.message||e("error"))}catch(n){const l=n instanceof Error?n.message:String(n);T.error(`${e("error")}: ${l}`)}finally{f(null)}}};if(!t||!P||!k)return a.jsx("div",{className:je,children:a.jsxs("div",{children:[a.jsx("h3",{className:"text-base font-semibold text-gray-900",children:e("channelsSelectTitle")}),a.jsx("p",{className:"mt-2 text-sm text-gray-500",children:e("channelsSelectDescription")})]})});const M=!!k.enabled;return a.jsxs("div",{className:ke,children:[a.jsx("div",{className:"border-b border-gray-100 px-6 py-5",children:a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[a.jsxs("div",{className:"min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(H,{name:t,src:Y(t),className:I("h-9 w-9 rounded-lg border",M?"border-primary/30 bg-white":"border-gray-200/70 bg-white"),imgClassName:"h-5 w-5 object-contain",fallback:a.jsx("span",{className:"text-sm font-semibold uppercase text-gray-500",children:t[0]})}),a.jsx("h3",{className:"truncate text-lg font-semibold text-gray-900 capitalize",children:C})]}),a.jsx("p",{className:"mt-2 text-sm text-gray-500",children:e("channelsFormDescription")}),F&&a.jsxs("a",{href:F,className:"mt-2 inline-flex items-center gap-1.5 text-xs text-primary transition-colors hover:text-primary-hover",children:[a.jsx(ee,{className:"h-3.5 w-3.5"}),e("channelsGuideTitle")]})]}),a.jsx(J,{status:M?"active":"inactive",label:M?e("statusActive"):e("statusInactive")})]})}),a.jsxs("form",{onSubmit:L,className:"flex min-h-0 flex-1 flex-col",children:[a.jsx("div",{className:"min-h-0 flex-1 space-y-6 overflow-y-auto overscroll-contain px-6 py-5",children:w.map(s=>{const n=t?_(`channels.${t}.${s.name}`,c):void 0,l=(n==null?void 0:n.label)??s.label,y=n==null?void 0:n.placeholder;return a.jsxs("div",{className:"space-y-2.5",children:[a.jsxs(ue,{htmlFor:s.name,className:"flex items-center gap-2 text-sm font-medium text-gray-900",children:[De(s.name),l]}),s.type==="boolean"&&a.jsxs("div",{className:"flex items-center justify-between rounded-xl bg-gray-50 p-3",children:[a.jsx("span",{className:"text-sm text-gray-500",children:d[s.name]?e("enabled"):e("disabled")}),a.jsx(xe,{id:s.name,checked:d[s.name]||!1,onCheckedChange:b=>N(s.name,b),className:"data-[state=checked]:bg-emerald-500"})]}),(s.type==="text"||s.type==="email")&&a.jsx(D,{id:s.name,type:s.type,value:d[s.name]||"",onChange:b=>N(s.name,b.target.value),placeholder:y,className:"rounded-xl"}),s.type==="password"&&a.jsx(D,{id:s.name,type:"password",value:d[s.name]||"",onChange:b=>N(s.name,b.target.value),placeholder:y??e("leaveBlankToKeepUnchanged"),className:"rounded-xl"}),s.type==="number"&&a.jsx(D,{id:s.name,type:"number",value:d[s.name]||0,onChange:b=>N(s.name,parseInt(b.target.value,10)||0),placeholder:y,className:"rounded-xl"}),s.type==="tags"&&a.jsx(Pe,{value:d[s.name]||[],onChange:b=>N(s.name,b)}),s.type==="select"&&a.jsxs(ge,{value:d[s.name]||"",onValueChange:b=>N(s.name,b),children:[a.jsx(he,{className:"rounded-xl",children:a.jsx(fe,{})}),a.jsx(we,{children:(s.options??[]).map(b=>a.jsx(ve,{value:b.value,children:b.label},b.value))})]}),s.type==="json"&&a.jsx("textarea",{id:s.name,value:x[s.name]??"{}",onChange:b=>j(X=>({...X,[s.name]:b.target.value})),className:"min-h-[120px] w-full resize-none rounded-lg border border-gray-200 bg-white px-3 py-2 text-xs font-mono"})]},s.name)})}),a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 border-t border-gray-100 px-6 py-4",children:[a.jsx("div",{className:"flex flex-wrap items-center gap-2",children:S.filter(s=>s.trigger==="manual").map(s=>a.jsx(E,{type:"button",onClick:()=>W(s),disabled:o.isPending||!!h,variant:"secondary",children:h===s.id?e("connecting"):s.title},s.id))}),a.jsx(E,{type:"submit",disabled:o.isPending||!!h,children:o.isPending?e("saving"):e("save")})]})]})]})}const Me={telegram:"channelDescTelegram",slack:"channelDescSlack",email:"channelDescEmail",webhook:"channelDescWebhook",discord:"channelDescDiscord",feishu:"channelDescFeishu"};function Ke(){const{data:t}=q(),{data:m}=$(),{data:i}=K(),[r,o]=v.useState("enabled"),[u,d]=v.useState(),[g,x]=v.useState(""),j=i==null?void 0:i.uiHints,h=m==null?void 0:m.channels,f=t==null?void 0:t.channels,k=[{id:"enabled",label:e("channelsTabEnabled"),count:(h??[]).filter(c=>{var p;return(p=f==null?void 0:f[c.name])==null?void 0:p.enabled}).length},{id:"all",label:e("channelsTabAll"),count:(h??[]).length}],w=v.useMemo(()=>{const c=g.trim().toLowerCase();return(h??[]).filter(p=>{var C;const S=((C=f==null?void 0:f[p.name])==null?void 0:C.enabled)||!1;return r==="enabled"?S:!0}).filter(p=>c?(p.displayName||p.name).toLowerCase().includes(c)||p.name.toLowerCase().includes(c):!0)},[r,f,h,g]);return v.useEffect(()=>{if(w.length===0){d(void 0);return}w.some(p=>p.name===u)||d(w[0].name)},[w,u]),!t||!m?a.jsx("div",{className:"p-8 text-gray-400",children:e("channelsLoading")}):a.jsxs(de,{className:"xl:flex xl:h-full xl:min-h-0 xl:flex-col xl:pb-0",children:[a.jsx(be,{title:e("channelsPageTitle"),description:e("channelsPageDescription")}),a.jsxs("div",{className:I(Ce,"xl:min-h-0 xl:flex-1"),children:[a.jsxs("section",{className:Se,children:[a.jsx("div",{className:"border-b border-gray-100 px-4 pt-4",children:a.jsx(Ne,{tabs:k,activeTab:r,onChange:o,className:"mb-0"})}),a.jsx("div",{className:"border-b border-gray-100 px-4 py-3",children:a.jsxs("div",{className:"relative",children:[a.jsx(oe,{className:"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400"}),a.jsx(D,{value:g,onChange:c=>x(c.target.value),placeholder:e("channelsFilterPlaceholder"),className:"h-10 rounded-xl pl-9"})]})}),a.jsxs("div",{className:"min-h-0 flex-1 space-y-2 overflow-y-auto overscroll-contain p-3",children:[w.map(c=>{const p=t.channels[c.name],S=(p==null?void 0:p.enabled)||!1,C=_(`channels.${c.name}`,j),P=z(c),F=(C==null?void 0:C.help)||e(Me[c.name]||"channelDescriptionDefault"),N=u===c.name;return a.jsx("button",{type:"button",onClick:()=>d(c.name),className:I("w-full rounded-xl border p-2.5 text-left transition-all",N?"border-primary/30 bg-primary-50/40 shadow-sm":"border-gray-200/70 bg-white hover:border-gray-300 hover:bg-gray-50/70"),children:a.jsxs("div",{className:"flex items-start justify-between gap-3",children:[a.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[a.jsx(H,{name:c.name,src:Y(c.name),className:I("h-10 w-10 rounded-lg border",S?"border-primary/30 bg-white":"border-gray-200/70 bg-white"),imgClassName:"h-5 w-5 object-contain",fallback:a.jsx("span",{className:"text-sm font-semibold uppercase text-gray-500",children:c.name[0]})}),a.jsxs("div",{className:"min-w-0",children:[a.jsx("p",{className:"truncate text-sm font-semibold text-gray-900",children:c.displayName||c.name}),a.jsx("p",{className:"line-clamp-1 text-[11px] text-gray-500",children:F})]})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[P&&a.jsx("a",{href:P,onClick:L=>L.stopPropagation(),className:"inline-flex h-7 w-7 items-center justify-center rounded-md text-gray-300 transition-colors hover:bg-gray-100/70 hover:text-gray-500",title:e("channelsGuideTitle"),children:a.jsx(ce,{className:"h-3.5 w-3.5"})}),a.jsx(J,{status:S?"active":"inactive",label:S?e("statusActive"):e("statusInactive"),className:"min-w-[56px] justify-center"})]})]})},c.name)}),w.length===0&&a.jsxs("div",{className:"flex h-full min-h-[220px] flex-col items-center justify-center rounded-xl border border-dashed border-gray-200 bg-gray-50/70 py-10 text-center",children:[a.jsx("div",{className:"mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-white",children:a.jsx(ie,{className:"h-5 w-5 text-gray-300"})}),a.jsx("p",{className:"text-sm font-medium text-gray-700",children:e("channelsNoMatch")})]})]})]}),a.jsx(Le,{channelName:u})]})]})}export{Ke as ChannelsList};