nextclaw 0.8.38 → 0.8.41

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 (28) hide show
  1. package/dist/cli/index.js +25 -2
  2. package/package.json +3 -3
  3. package/templates/USAGE.md +1 -1
  4. package/ui-dist/assets/{ChannelsList-D0Wk08Ki.js → ChannelsList-DEr4kE7H.js} +1 -1
  5. package/ui-dist/assets/ChatPage-DI2euxZy.js +32 -0
  6. package/ui-dist/assets/{CronConfig-D-3Y8kWb.js → CronConfig-DAlt-x5i.js} +1 -1
  7. package/ui-dist/assets/{DocBrowser-BSPKhqrK.js → DocBrowser-TrMsdXgx.js} +1 -1
  8. package/ui-dist/assets/{MarketplacePage-Dkm2FTtN.js → MarketplacePage-Dwm527F7.js} +1 -1
  9. package/ui-dist/assets/{ModelConfig-2cpAmvGq.js → ModelConfig-srggzgfA.js} +1 -1
  10. package/ui-dist/assets/{ProvidersList-Dot21pAy.js → ProvidersList-8kFCDiqC.js} +1 -1
  11. package/ui-dist/assets/{RuntimeConfig-BNw_Ms_Y.js → RuntimeConfig-CLbdKAlo.js} +1 -1
  12. package/ui-dist/assets/{SecretsConfig-z8M3PDJP.js → SecretsConfig-DXCdR0Be.js} +1 -1
  13. package/ui-dist/assets/{SessionsConfig-XVHZ-FG5.js → SessionsConfig-iKpz3Sts.js} +1 -1
  14. package/ui-dist/assets/{action-link-CpPJJN-z.js → action-link-w4jS8X9q.js} +1 -1
  15. package/ui-dist/assets/{card-DsZ2Am92.js → card-CVj65Dvi.js} +1 -1
  16. package/ui-dist/assets/chat-message-D0s61C4e.js +5 -0
  17. package/ui-dist/assets/{dialog-BysNu5hM.js → dialog-lK79rlAw.js} +1 -1
  18. package/ui-dist/assets/{index-Bny21Br0.js → index-BXgULtdk.js} +2 -2
  19. package/ui-dist/assets/{label-q6RASlER.js → label-l-fECYi3.js} +1 -1
  20. package/ui-dist/assets/{page-layout-WiVrFc8t.js → page-layout-BghxFaNt.js} +1 -1
  21. package/ui-dist/assets/{switch-DM_YYUgB.js → switch-B4yFzIbc.js} +1 -1
  22. package/ui-dist/assets/{tabs-custom-mlgm-IGH.js → tabs-custom-B4q02QSV.js} +1 -1
  23. package/ui-dist/assets/useConfig-C9k3TmQk.js +6 -0
  24. package/ui-dist/assets/{useConfirmDialog-DamaA60g.js → useConfirmDialog-C20D5SYn.js} +1 -1
  25. package/ui-dist/index.html +1 -1
  26. package/ui-dist/assets/ChatPage-Deg2lBH4.js +0 -32
  27. package/ui-dist/assets/chat-message-Jxa8JFA_.js +0 -9
  28. package/ui-dist/assets/useConfig-BOn-kp8G.js +0 -6
package/dist/cli/index.js CHANGED
@@ -2718,7 +2718,8 @@ var GatewayAgentRuntimePool = class {
2718
2718
  channel: message.channel,
2719
2719
  chatId: message.chatId,
2720
2720
  metadata: message.metadata,
2721
- onAssistantDelta: params.onAssistantDelta
2721
+ onAssistantDelta: params.onAssistantDelta,
2722
+ onSessionEvent: params.onSessionEvent
2722
2723
  });
2723
2724
  }
2724
2725
  async run() {
@@ -3478,6 +3479,28 @@ var ServiceCommands = class {
3478
3479
  return;
3479
3480
  }
3480
3481
  push({ type: "delta", delta });
3482
+ },
3483
+ onSessionEvent: (event) => {
3484
+ const raw = event.data?.message;
3485
+ const messageRecord = raw && typeof raw === "object" && !Array.isArray(raw) ? raw : null;
3486
+ const message = messageRecord && typeof messageRecord.role === "string" ? {
3487
+ role: messageRecord.role,
3488
+ content: messageRecord.content,
3489
+ timestamp: typeof messageRecord.timestamp === "string" ? messageRecord.timestamp : event.timestamp,
3490
+ ...typeof messageRecord.name === "string" ? { name: messageRecord.name } : {},
3491
+ ...typeof messageRecord.tool_call_id === "string" ? { tool_call_id: messageRecord.tool_call_id } : {},
3492
+ ...Array.isArray(messageRecord.tool_calls) ? { tool_calls: messageRecord.tool_calls } : {},
3493
+ ...typeof messageRecord.reasoning_content === "string" ? { reasoning_content: messageRecord.reasoning_content } : {}
3494
+ } : void 0;
3495
+ push({
3496
+ type: "session_event",
3497
+ event: {
3498
+ seq: event.seq,
3499
+ type: event.type,
3500
+ timestamp: event.timestamp,
3501
+ ...message ? { message } : {}
3502
+ }
3503
+ });
3481
3504
  }
3482
3505
  }).then((reply) => {
3483
3506
  push({
@@ -3504,7 +3527,7 @@ var ServiceCommands = class {
3504
3527
  continue;
3505
3528
  }
3506
3529
  yield event;
3507
- if (event.type !== "delta") {
3530
+ if (event.type === "final" || event.type === "error") {
3508
3531
  await run;
3509
3532
  return;
3510
3533
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nextclaw",
3
- "version": "0.8.38",
3
+ "version": "0.8.41",
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,8 @@
38
38
  "dependencies": {
39
39
  "chokidar": "^3.6.0",
40
40
  "commander": "^12.1.0",
41
- "@nextclaw/core": "^0.6.36",
42
- "@nextclaw/server": "^0.5.19",
41
+ "@nextclaw/core": "^0.6.37",
42
+ "@nextclaw/server": "^0.5.20",
43
43
  "@nextclaw/openclaw-compat": "^0.1.28"
44
44
  },
45
45
  "devDependencies": {
@@ -365,7 +365,7 @@ NextClaw UI includes a first-class **Chat** tab so you can talk to your agent di
365
365
  - stream assistant output in real time via UI SSE API (`POST /api/chat/turn/stream`)
366
366
  - render assistant replies as Markdown (tables/code blocks/links)
367
367
  - show tool calls/results as structured tool cards
368
- - merge tool result and its immediate assistant follow-up explanation into one card
368
+ - merge tool result and its immediate assistant follow-up explanation into one card while preserving chronological order
369
369
  - merge consecutive same-role messages into grouped chat blocks for better readability
370
370
  - keep input editable while AI is streaming, and queue additional sends during busy turns
371
371
 
@@ -1 +1 @@
1
- import{r as v,j as a,ac as ae,M as S,ad as M,ae as N,K as te,a0 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-H2M3a_4Z.js";import{u as K,a as _,h as me,i as pe,I as D,f as de}from"./useConfig-BOn-kp8G.js";import{t as e,c as q,u as G,S as be,b as ue,d as ye,e as ge,g as xe}from"./index-Bny21Br0.js";import{D as he,a as fe,b as we,c as je,d as ve,e as ke}from"./dialog-BysNu5hM.js";import{B as F,P as Ce,a as Pe}from"./page-layout-WiVrFc8t.js";import{L as Ne}from"./label-q6RASlER.js";import{S as Se}from"./switch-DM_YYUgB.js";import{h as T}from"./config-hints-CApS3K_7.js";import{T as Ie}from"./tabs-custom-mlgm-IGH.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-CpPJJN-z.js";function Be({value:n,onChange:d,className:i,placeholder:m=""}){const[c,g]=v.useState(""),b=u=>{u.key==="Enter"&&c.trim()?(u.preventDefault(),d([...n,c.trim()]),g("")):u.key==="Backspace"&&!c&&n.length>0&&d(n.slice(0,-1))},f=u=>{d(n.filter((r,y)=>y!==u))};return a.jsxs("div",{className:q("flex flex-wrap gap-2 p-2 border rounded-md min-h-[42px]",i),children:[n.map((u,r)=>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(r),className:"hover:text-red-300 transition-colors",children:a.jsx(ae,{className:"h-3 w-3"})})]},r)),a.jsx("input",{type:"text",value:c,onChange:u=>g(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 J(n,d){const i={...n};for(const[m,c]of Object.entries(d)){const g=i[m];if(I(g)&&I(c)){i[m]=J(g,c);continue}i[m]=c}return i}function Re(n,d){const i=n.split("."),m={};let c=m;for(let g=0;g<i.length-1;g+=1){const b=i[g];c[b]={},c=c[b]}return c[i[i.length-1]]=d,m}function He(){var A,L;const{channelModal:n,closeChannelModal:d}=G(),{data:i}=K(),{data:m}=_(),c=me(),g=pe(),[b,f]=v.useState({}),[u,r]=v.useState({}),[y,h]=v.useState(null),o=n.channel,w=o?i==null?void 0:i.channels[o]:null,k=o?B()[o]??[]:[],C=m==null?void 0:m.uiHints,P=o?`channels.${o}`:null,z=((A=m==null?void 0:m.actions)==null?void 0:A.filter(t=>t.scope===P))??[],V=o&&(((L=T(`channels.${o}`,C))==null?void 0:L.label)??o);v.useEffect(()=>{if(w){f({...w});const t={};(o?B()[o]??[]:[]).filter(s=>s.type==="json").forEach(s=>{const x=w[s.name];t[s.name]=JSON.stringify(x??{},null,2)}),r(t)}else f({}),r({})},[w,o]);const j=(t,l)=>{f(s=>({...s,[t]:l}))},Y=t=>{if(t.preventDefault(),!o)return;const l={...b};for(const s of k){if(s.type!=="password")continue;const x=l[s.name];(typeof x!="string"||x.length===0)&&delete l[s.name]}for(const s of k){if(s.type!=="json")continue;const x=u[s.name]??"";try{l[s.name]=x.trim()?JSON.parse(x):{}}catch{N.error(`${e("invalidJson")}: ${s.name}`);return}}c.mutate({channel:o,data:l},{onSuccess:()=>d()})},W=t=>{if(!t||!o)return;const l=t.channels;if(!I(l))return;const s=l[o];I(s)&&f(x=>J(x,s))},X=async t=>{if(!(!o||!P)){h(t.id);try{let l={...b};t.saveBeforeRun&&(l={...l,...t.savePatch??{}},f(l),await c.mutateAsync({channel:o,data:l}));const s=await g.mutateAsync({actionId:t.id,data:{scope:P,draftConfig:Re(P,l)}});W(s.patch),s.ok?N.success(s.message||e("success")):N.error(s.message||e("error"))}catch(l){const s=l instanceof Error?l.message:String(l);N.error(`${e("error")}: ${s}`)}finally{h(null)}}},Q=O[o||""]||O.default,Z=$[o||""]||$.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 l=o?T(`channels.${o}.${t.name}`,C):void 0,s=(l==null?void 0:l.label)??t.label,x=l==null?void 0:l.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),s]}),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:x,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:x??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:x,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(ye,{})}),a.jsx(ge,{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=>r(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||!!y,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||!!y,variant:"secondary",children:y===t.id?e("connecting"):t.title},t.id))]})]})]})})}const R={telegram:S,slack:ce,email:M,webhook:re,default:H},Ke={telegram:"channelDescTelegram",slack:"channelDescSlack",email:"channelDescEmail",webhook:"channelDescWebhook",discord:"channelDescDiscord",feishu:"channelDescFeishu"};function Ze(){const{data:n}=K(),{data:d}=de(),{data:i}=_(),{openChannelModal:m}=G(),[c,g]=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(r=>{var y;return(y=n.channels[r.name])==null?void 0:y.enabled}).length},{id:"all",label:e("channelsTabAll"),count:d.channels.length}],u=d.channels.filter(r=>{var h;const y=((h=n.channels[r.name])==null?void 0:h.enabled)||!1;return c==="all"||y});return a.jsxs(Ce,{children:[a.jsx(Pe,{title:e("channelsPageTitle")}),a.jsx(Ie,{tabs:f,activeTab:c,onChange:g}),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(r=>{const y=n.channels[r.name],h=(y==null?void 0:y.enabled)||!1,o=R[r.name]||R.default,w=T(`channels.${r.name}`,b),k=(w==null?void 0:w.help)||e(Ke[r.name]||"channelDescriptionDefault");return a.jsxs(De,{onClick:()=>m(r.name),children:[a.jsxs(Fe,{children:[a.jsx(Te,{name:r.name,src:Me(r.name),className:q("h-11 w-11 rounded-xl border transition-all",h?"bg-white border-primary/30":"bg-white border-gray-200/60 group-hover:border-gray-300"),imgClassName:"h-5 w-5",fallback:a.jsx(o,{className:"h-5 w-5"})}),a.jsx(Ae,{status:h?"active":"inactive",label:h?e("statusActive"):e("statusInactive")})]}),a.jsx(Le,{title:r.displayName||r.name,description:k}),a.jsxs(Ue,{children:[a.jsx(Ee,{label:h?e("actionConfigure"):e("actionEnable")}),r.tutorialUrl&&a.jsx("a",{href:r.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"})})]})]},r.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};
1
+ import{r as v,j as a,ac as ae,M as S,ad as M,ae as N,K as te,a0 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-H2M3a_4Z.js";import{u as K,a as _,h as me,i as pe,I as D,f as de}from"./useConfig-C9k3TmQk.js";import{t as e,c as q,u as G,S as be,b as ue,d as ye,e as ge,g as xe}from"./index-BXgULtdk.js";import{D as he,a as fe,b as we,c as je,d as ve,e as ke}from"./dialog-lK79rlAw.js";import{B as F,P as Ce,a as Pe}from"./page-layout-BghxFaNt.js";import{L as Ne}from"./label-l-fECYi3.js";import{S as Se}from"./switch-B4yFzIbc.js";import{h as T}from"./config-hints-CApS3K_7.js";import{T as Ie}from"./tabs-custom-B4q02QSV.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-w4jS8X9q.js";function Be({value:n,onChange:d,className:i,placeholder:m=""}){const[c,g]=v.useState(""),b=u=>{u.key==="Enter"&&c.trim()?(u.preventDefault(),d([...n,c.trim()]),g("")):u.key==="Backspace"&&!c&&n.length>0&&d(n.slice(0,-1))},f=u=>{d(n.filter((r,y)=>y!==u))};return a.jsxs("div",{className:q("flex flex-wrap gap-2 p-2 border rounded-md min-h-[42px]",i),children:[n.map((u,r)=>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(r),className:"hover:text-red-300 transition-colors",children:a.jsx(ae,{className:"h-3 w-3"})})]},r)),a.jsx("input",{type:"text",value:c,onChange:u=>g(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 J(n,d){const i={...n};for(const[m,c]of Object.entries(d)){const g=i[m];if(I(g)&&I(c)){i[m]=J(g,c);continue}i[m]=c}return i}function Re(n,d){const i=n.split("."),m={};let c=m;for(let g=0;g<i.length-1;g+=1){const b=i[g];c[b]={},c=c[b]}return c[i[i.length-1]]=d,m}function He(){var A,L;const{channelModal:n,closeChannelModal:d}=G(),{data:i}=K(),{data:m}=_(),c=me(),g=pe(),[b,f]=v.useState({}),[u,r]=v.useState({}),[y,h]=v.useState(null),o=n.channel,w=o?i==null?void 0:i.channels[o]:null,k=o?B()[o]??[]:[],C=m==null?void 0:m.uiHints,P=o?`channels.${o}`:null,z=((A=m==null?void 0:m.actions)==null?void 0:A.filter(t=>t.scope===P))??[],V=o&&(((L=T(`channels.${o}`,C))==null?void 0:L.label)??o);v.useEffect(()=>{if(w){f({...w});const t={};(o?B()[o]??[]:[]).filter(s=>s.type==="json").forEach(s=>{const x=w[s.name];t[s.name]=JSON.stringify(x??{},null,2)}),r(t)}else f({}),r({})},[w,o]);const j=(t,l)=>{f(s=>({...s,[t]:l}))},Y=t=>{if(t.preventDefault(),!o)return;const l={...b};for(const s of k){if(s.type!=="password")continue;const x=l[s.name];(typeof x!="string"||x.length===0)&&delete l[s.name]}for(const s of k){if(s.type!=="json")continue;const x=u[s.name]??"";try{l[s.name]=x.trim()?JSON.parse(x):{}}catch{N.error(`${e("invalidJson")}: ${s.name}`);return}}c.mutate({channel:o,data:l},{onSuccess:()=>d()})},W=t=>{if(!t||!o)return;const l=t.channels;if(!I(l))return;const s=l[o];I(s)&&f(x=>J(x,s))},X=async t=>{if(!(!o||!P)){h(t.id);try{let l={...b};t.saveBeforeRun&&(l={...l,...t.savePatch??{}},f(l),await c.mutateAsync({channel:o,data:l}));const s=await g.mutateAsync({actionId:t.id,data:{scope:P,draftConfig:Re(P,l)}});W(s.patch),s.ok?N.success(s.message||e("success")):N.error(s.message||e("error"))}catch(l){const s=l instanceof Error?l.message:String(l);N.error(`${e("error")}: ${s}`)}finally{h(null)}}},Q=O[o||""]||O.default,Z=$[o||""]||$.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 l=o?T(`channels.${o}.${t.name}`,C):void 0,s=(l==null?void 0:l.label)??t.label,x=l==null?void 0:l.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),s]}),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:x,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:x??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:x,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(ye,{})}),a.jsx(ge,{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=>r(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||!!y,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||!!y,variant:"secondary",children:y===t.id?e("connecting"):t.title},t.id))]})]})]})})}const R={telegram:S,slack:ce,email:M,webhook:re,default:H},Ke={telegram:"channelDescTelegram",slack:"channelDescSlack",email:"channelDescEmail",webhook:"channelDescWebhook",discord:"channelDescDiscord",feishu:"channelDescFeishu"};function Ze(){const{data:n}=K(),{data:d}=de(),{data:i}=_(),{openChannelModal:m}=G(),[c,g]=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(r=>{var y;return(y=n.channels[r.name])==null?void 0:y.enabled}).length},{id:"all",label:e("channelsTabAll"),count:d.channels.length}],u=d.channels.filter(r=>{var h;const y=((h=n.channels[r.name])==null?void 0:h.enabled)||!1;return c==="all"||y});return a.jsxs(Ce,{children:[a.jsx(Pe,{title:e("channelsPageTitle")}),a.jsx(Ie,{tabs:f,activeTab:c,onChange:g}),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(r=>{const y=n.channels[r.name],h=(y==null?void 0:y.enabled)||!1,o=R[r.name]||R.default,w=T(`channels.${r.name}`,b),k=(w==null?void 0:w.help)||e(Ke[r.name]||"channelDescriptionDefault");return a.jsxs(De,{onClick:()=>m(r.name),children:[a.jsxs(Fe,{children:[a.jsx(Te,{name:r.name,src:Me(r.name),className:q("h-11 w-11 rounded-xl border transition-all",h?"bg-white border-primary/30":"bg-white border-gray-200/60 group-hover:border-gray-300"),imgClassName:"h-5 w-5",fallback:a.jsx(o,{className:"h-5 w-5"})}),a.jsx(Ae,{status:h?"active":"inactive",label:h?e("statusActive"):e("statusInactive")})]}),a.jsx(Le,{title:r.displayName||r.name,description:k}),a.jsxs(Ue,{children:[a.jsx(Ee,{label:h?e("actionConfigure"):e("actionEnable")}),r.tutorialUrl&&a.jsx("a",{href:r.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"})})]})]},r.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};