@entrydesk/cli 1.19.0 → 1.20.0

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 (36) hide show
  1. package/dist/{agents-6IGSCA3S.js → agents-ILNVMFJT.js} +1 -1
  2. package/dist/{billing-SNTQDK4M.js → billing-FWDGBFXX.js} +1 -1
  3. package/dist/{budget-7A4HH6LK.js → budget-HC4RRKBM.js} +1 -1
  4. package/dist/{meeting-I5NQ2V3L.js → chunk-CECPYYET.js} +11 -77
  5. package/dist/chunk-EIX7AV4F.js +4 -0
  6. package/dist/chunk-YBS4DYFH.js +2 -0
  7. package/dist/{config-ZQUW7BQS.js → config-BRLPQW3X.js} +1 -1
  8. package/dist/{config-7SMTGR4C.js → config-Y6VAHJFF.js} +1 -1
  9. package/dist/{config-help-IJ6BGCBY.js → config-help-ZTHSANAW.js} +1 -1
  10. package/dist/connectors-GWHJEIPL.js +39 -0
  11. package/dist/help-RTXIBJ6C.js +4 -0
  12. package/dist/index.js +1 -1
  13. package/dist/{login-NL4DUGVI.js → login-62SHYTYL.js} +1 -1
  14. package/dist/{logout-FVV6V2UU.js → logout-DUDWGSSH.js} +1 -1
  15. package/dist/marketplace-I5CPHCMV.js +38 -0
  16. package/dist/{mcp-6JQHRC5J.js → mcp-42I2ILS7.js} +1 -1
  17. package/dist/meeting-F55223JK.js +68 -0
  18. package/dist/{models-YG7XKIZ2.js → models-5L2J4PIS.js} +1 -1
  19. package/dist/{notifications-NVWXUDN6.js → notifications-GK2XLM5S.js} +1 -1
  20. package/dist/{profile-SYH6PEBO.js → profile-SA5GTVBZ.js} +1 -1
  21. package/dist/recordings-DQUNZHXK.js +42 -0
  22. package/dist/{schedules-GPV52YWB.js → schedules-O25TSYEY.js} +1 -1
  23. package/dist/skills-GMI3HSG6.js +27 -0
  24. package/dist/{status-JGVG5T6F.js → status-J77PC3PX.js} +1 -1
  25. package/dist/{task-O7MFJEU2.js → task-UA3BYLVA.js} +2 -2
  26. package/dist/{tasks-VQ4SIVJG.js → tasks-KOMITUOV.js} +1 -1
  27. package/dist/{tool-RZPDCROT.js → tool-TW2I32SE.js} +1 -1
  28. package/dist/{usage-LVG7HRCR.js → usage-4ZIO6EC5.js} +1 -1
  29. package/dist/{version-4P4L2T22.js → version-7UBQKXV7.js} +1 -1
  30. package/dist/{workflow-KHE2MKD5.js → workflow-U5OA6K4T.js} +1 -1
  31. package/dist/{workspaces-ARL2DBCW.js → workspaces-BWXFSML5.js} +1 -1
  32. package/package.json +1 -1
  33. package/dist/chunk-UXJD5BRR.js +0 -4
  34. package/dist/connectors-C35PPZM3.js +0 -3
  35. package/dist/help-UAGSVZIZ.js +0 -4
  36. package/dist/skills-E2JJSSGW.js +0 -25
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{a as c,b as i,g as a,h as g,j as f,n as p,q as d,t as u}from"./chunk-UXJD5BRR.js";import"./chunk-KURQCTT3.js";async function W(t){try{let o=c.getEffectiveProfileName(),n={model:i.getDefaultModel(),connectors:i.getDefaultConnectorIds()},r=f();if(r){t.json?console.log(JSON.stringify({loggedIn:!0,authSource:r.authSource,profile:o,workspaceId:r.workspaceId,defaults:n})):(console.log(`Profile: ${o}`),console.log(`Authenticated via ${r.label} (no login required)`),console.log(`Workspace ID: ${r.workspaceId}`));return}let e=await a.getAll();if(!e){t.json?console.log(JSON.stringify({loggedIn:!1,profile:o,defaults:n})):(console.log(`Profile: ${o}`),console.log("Not logged in"),console.log("Run `entrydesk login` to authenticate"));return}let l;if(e.workspaceId)try{let s=new g,m=await d(),{workspaces:k}=await s.getWorkspaces(m);l=k.find(I=>I.id===e.workspaceId)?.name}catch(s){if(s instanceof p){t.json?console.log(JSON.stringify({loggedIn:!1,profile:o,defaults:n})):(console.log(`Profile: ${o}`),console.log("Not logged in"),console.log("Run `entrydesk login` to authenticate"));return}}t.json?console.log(JSON.stringify({loggedIn:!0,authSource:"file",profile:o,email:e.email,workspaceId:e.workspaceId,workspaceName:l,defaults:n})):(console.log(`Profile: ${o}`),console.log(`Logged in as ${e.email}`),l&&console.log(`Workspace: ${l}`),e.workspaceId&&console.log(`Workspace ID: ${e.workspaceId}`))}catch(o){u(o)}}export{W as runStatus};
2
+ import{a as c,b as i,g as a,h as g,j as f,n as p,q as d,t as u}from"./chunk-EIX7AV4F.js";import"./chunk-KURQCTT3.js";async function W(t){try{let o=c.getEffectiveProfileName(),n={model:i.getDefaultModel(),connectors:i.getDefaultConnectorIds()},r=f();if(r){t.json?console.log(JSON.stringify({loggedIn:!0,authSource:r.authSource,profile:o,workspaceId:r.workspaceId,defaults:n})):(console.log(`Profile: ${o}`),console.log(`Authenticated via ${r.label} (no login required)`),console.log(`Workspace ID: ${r.workspaceId}`));return}let e=await a.getAll();if(!e){t.json?console.log(JSON.stringify({loggedIn:!1,profile:o,defaults:n})):(console.log(`Profile: ${o}`),console.log("Not logged in"),console.log("Run `entrydesk login` to authenticate"));return}let l;if(e.workspaceId)try{let s=new g,m=await d(),{workspaces:k}=await s.getWorkspaces(m);l=k.find(I=>I.id===e.workspaceId)?.name}catch(s){if(s instanceof p){t.json?console.log(JSON.stringify({loggedIn:!1,profile:o,defaults:n})):(console.log(`Profile: ${o}`),console.log("Not logged in"),console.log("Run `entrydesk login` to authenticate"));return}}t.json?console.log(JSON.stringify({loggedIn:!0,authSource:"file",profile:o,email:e.email,workspaceId:e.workspaceId,workspaceName:l,defaults:n})):(console.log(`Profile: ${o}`),console.log(`Logged in as ${e.email}`),l&&console.log(`Workspace: ${l}`),e.workspaceId&&console.log(`Workspace ID: ${e.workspaceId}`))}catch(o){u(o)}}export{W as runStatus};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{a as ie,b as fe,c as Bt,g as rt,h as pe,n as Je,q as an,r as Me,t as cn}from"./chunk-UXJD5BRR.js";import"./chunk-KURQCTT3.js";import{render as ms}from"ink";import{v4 as uo}from"uuid";import{exec as pn}from"child_process";import ho from"fs";import Oe from"fs/promises";import mn from"os";import Ut from"path";import{promisify as yo}from"util";import{glob as wo}from"glob";var xo=yo(pn),ko=`## Filesystem Tool Instructions
2
+ import{a as ie,b as fe,c as Bt,g as rt,h as pe,n as Je,q as an,r as Me,t as cn}from"./chunk-EIX7AV4F.js";import"./chunk-KURQCTT3.js";import{render as ms}from"ink";import{v4 as uo}from"uuid";import{exec as pn}from"child_process";import ho from"fs";import Oe from"fs/promises";import mn from"os";import Ut from"path";import{promisify as yo}from"util";import{glob as wo}from"glob";var xo=yo(pn),ko=`## Filesystem Tool Instructions
3
3
 
4
4
  You have access to filesystem tools that allow you to interact with the user's local filesystem.
5
5
 
@@ -166,7 +166,7 @@ ID: ${r.id}`)}}}else if(W==="connectors"){let o=Array.from(S);q(o.length>0?o:voi
166
166
  `)||Le.length===0)return;if(Ee===null){st(e);let r=Le.length-1;We(r),t(Le[r]);return}let o=Math.max(0,Ee-1);We(o),t(Le[o]);return}if(f.downArrow){if(e.includes(`
167
167
  `)||Ee===null)return;if(Ee>=Le.length-1){We(null),t(Ft);return}let o=Ee+1;We(o),t(Le[o])}}),{suggestions:K,suggestionIndex:V,showSuggestions:X,argMode:W,argItems:L,argIndex:m,selectedConnectorIds:S,selectedCapabilities:me,deleteConfirmMode:Fe,handleInputChange:ht,handleSubmit:Ot}}import{useCallback as pt,useRef as ss,useState as rs}from"react";function lo({credentials:e,currentModel:t,modelProviders:n,onUploadSuccess:s,onUploadError:l}){let[a,g]=rs([]),y=ss(0),w=pt(b=>{if(!(!Array.isArray(n)||n.length===0)){for(let N of n)if(N.models.some(G=>G.id===b))return N.id;return n[0]?.id}},[n]),h=pt(async b=>{if(!e){l?.(b.filename,"Not logged in");return}if(!Array.isArray(n)||n.length===0){l?.(b.filename,"Model providers not loaded yet. Please wait and try again.");return}let N=t?w(t):n[0]?.id;if(!N){l?.(b.filename,"No model provider available");return}let D=`file-${++y.current}`;g(G=>[...G,{id:D,filename:b.filename,mimeType:b.mimeType,status:"uploading"}]);try{let Q=await new pe().uploadFile(e.accessToken,e.workspaceId,b,N);g(j=>j.map(J=>J.id===D?{...J,status:"uploaded",fileId:Q.id}:J)),s?.(b.filename)}catch(G){let Q=G instanceof Error?G.message:"Upload failed";g(j=>j.map(J=>J.id===D?{...J,status:"error",error:Q}:J)),l?.(b.filename,Q)}},[e,t,w,n,s,l]),O=pt(b=>{g(N=>N.filter(D=>D.id!==b))},[]),$=pt(()=>{g([])},[]),P=pt(()=>a.filter(b=>b.status==="uploaded"&&b.fileId).map(b=>b.fileId),[a]),q=a.some(b=>b.status==="uploading"),T=a.length>0;return{pendingFiles:a,addFile:h,removeFile:O,clearFiles:$,getUploadedFileIds:P,hasUploadingFiles:q,hasFiles:T}}import{jsx as H,jsxs as se}from"react/jsx-runtime";var ls=[" ______ _ ____ _","| ____| | | | _ \\ | |","| |__ _ __ | |_ _ __ _ _ | | | | ___ ___| | __","| __| | '_ \\| __| '__| | | || | | |/ _ \\/ __| |/ /","| |____| | | | |_| | | |_| || |_| | __/\\__ \\ <","|______|_| |_|\\__|_| \\__, ||____/ \\___||___/_|\\_\\"," __/ |"," |___/"],as=[Zt,Zt,Qt,Qt,Ye,Ye,Ye,Ye],ao=ls.map((e,t)=>`${as[t]??Ye}${e}${z}`).join(`
168
168
  `),cs=`${Ye}EntryDesk${z}`,us=500;function ds(e){let t="",n=0;for(;n<e.length;){if(e.charCodeAt(n)===27&&e[n+1]==="["){for(n+=2;n<e.length;){let s=e.charCodeAt(n);if(s>=64&&s<=126){n+=1;break}n+=1}continue}t+=e[n],n+=1}return t}function fs(e){let t=ds(e);return Math.max(...t.split(`
169
- `).map(n=>n.length))}function ps(e){let t=fs(ao);return e>=t?ao:cs}function co({agentId:e,model:t,message:n,taskId:s,taskTitle:l,connectorIds:a,enableFileSystem:g=!0}){let y=process.stdout.columns??80,w=ps(y),h=rn(null),O=Hn(s,l),{state:$,setState:P,messages:q,setMessages:T,input:b,setInput:N,taskId:D,setTaskId:G,currentTaskTitle:Q,setCurrentTaskTitle:j,hasPersistedTask:J,setHasPersistedTask:le,credentials:i,setCredentials:p,currentResponse:E,setCurrentResponse:B,fullOutput:C,setFullOutput:de,addSystemMessage:Y,startNewTask:k}=O,{credentials:I}=Jn(P);Et(()=>{I&&!i&&p(I)},[I,i,p]);let{availableConnectors:U,availableModels:ne,availableAgents:K,modelProviders:ee,loading:V}=Yn(i),{currentModel:oe,setCurrentModel:X,currentAgentId:ce,setCurrentAgentId:W,activeConnectorIds:_,setActiveConnectorIds:L}=eo(t,e,a),v=rn(!1);Et(()=>{if(!v.current){if(v.current=!0,!t&&!e){let c=fe.getDefaultModel();c&&X(c)}if(!a&&!e){let c=fe.getDefaultConnectorIds();c&&L(c.length>0?c:void 0)}}},[t,e,a,X,L]);let{currentAgentDetails:m}=Zn(ce,i),{fileSystem:d,setFileSystem:S,capabilityLabelMap:re}=Qn(g),{pendingFiles:me,addFile:R,removeFile:Re,clearFiles:mt,getUploadedFileIds:_e,hasUploadingFiles:Lt,hasFiles:ve}=lo({credentials:i,currentModel:oe,modelProviders:ee,onUploadSuccess:c=>{Y(`\u2713 Attached: ${c}`)},onUploadError:(c,A)=>{Y(`\u2717 Failed to upload ${c}: ${A}`)}}),{sendMessage:ot}=zn({taskId:D,credentials:i,currentAgentId:ce,currentModel:oe,activeConnectorIds:_,localTools:d,fullOutput:C,setMessages:T,setState:P,setCurrentResponse:B,setCredentials:p,setHasPersistedTask:le,getFileIds:_e,clearFiles:mt}),Le=sn(c=>{k(c),B("")},[k]),[gt,Ee]=is(!1),We=sn(async c=>{let A=c.text.trim(),Z=St(A);if(/^https?:\/\//.test(Z))return;if(await jn(A)&&Un(Z)){let M=await Wn(A);M&&(c.preventDefault(),await R(M))}},[R]),Ft=sn(async()=>{if(!(gt||$.status!=="ready")){if(V||ee.length===0){Y("Please wait for resources to load before pasting images.");return}Y("Reading clipboard..."),Ee(!0);try{let c=await Bn();if(c){let A=`clipboard-${Date.now()}.png`;Y(`Uploading: ${A} (${Math.round(c.buffer.length/1024)}KB)`),await R({buffer:c.buffer,filename:A,mimeType:c.mime})}else Y("No image found in clipboard. Copy an image first.")}catch(c){let A=c instanceof Error?c.message:"Failed to read clipboard";Y(`Clipboard error: ${A}`)}finally{Ee(!1)}}},[R,Y,gt,$.status,V,ee.length]),{suggestions:st,suggestionIndex:ze,showSuggestions:Fe,argMode:xe,argItems:Xe,argIndex:Qe,selectedConnectorIds:ke,selectedCapabilities:Se,deleteConfirmMode:Ne,handleInputChange:He,handleSubmit:ht}=io({input:b,setInput:N,taskId:D,setTaskId:G,currentTaskTitle:Q,setCurrentTaskTitle:j,currentModel:oe,setCurrentModel:X,currentAgentId:ce,setCurrentAgentId:W,currentAgentDetails:m,setCurrentAgentDetails:()=>{},activeConnectorIds:_,setActiveConnectorIds:L,fileSystem:d,setFileSystem:S,availableModels:ne,availableAgents:K,availableConnectors:U,messages:q,hasPersistedTask:J,setHasPersistedTask:le,setMessages:T,addSystemMessage:Y,startNewTask:Le,sendMessage:ot,setFullOutput:de,credentials:i,setCredentials:p,setState:P,defaultCapabilities:{fileSystem:g},capabilityLabelMap:re,hasUploadingFiles:Lt});nn((c,A)=>{(A.ctrl||A.meta)&&c==="v"&&Ft()},{isActive:$.status==="ready"&&!xe}),nn((c,A)=>{if(!A.escape)return;let Z=Date.now(),Te=h.current;h.current=Z,!(!Te||Z-Te>us)&&(xe||Fe||(h.current=null,ve&&mt(),b.length>0&&He("")))},{isActive:$.status==="ready"}),nn((c,A)=>{A.return&&(Le("Started a new task."),P({status:"ready"}))},{isActive:$.status==="error"}),Et(()=>{if(i&&!V&&$.status==="loading")if(!oe&&!ce){let c=fe.getDefaultModel(),A=c&&ne.some(Te=>Te.id===c),Z=A?c:ne[0]?.id;Z?(A||fe.setDefaultModel(Z),X(Z),P({status:"ready"})):K.length===0?P({status:"no-model"}):P({status:"ready"})}else P({status:"ready"})},[i,V,oe,ce,ne,K,$.status,X,P]);let Ze=rn(!1);if(Et(()=>{Ze.current||n&&i&&$.status==="ready"&&(Ze.current=!0,ot(n))},[i,n,$.status,ot]),$.status==="loading")return se(ye,{flexDirection:"column",children:[H(F,{children:w}),se(ye,{children:[H(F,{color:"cyan",children:H(on,{type:"dots"})}),H(F,{children:" Initializing task..."})]})]});if($.status==="not-logged-in")return se(ye,{flexDirection:"column",children:[H(F,{children:w}),H(F,{color:"yellow",children:"Not logged in"}),H(F,{dimColor:!0,children:"Run `entrydesk login` to authenticate first."})]});if($.status==="no-workspace")return se(ye,{flexDirection:"column",children:[H(F,{children:w}),H(F,{color:"yellow",children:"No workspace selected"}),H(F,{dimColor:!0,children:"Run `entrydesk workspaces` to select a workspace first."})]});if($.status==="no-model")return se(ye,{flexDirection:"column",children:[H(F,{children:w}),H(F,{color:"yellow",children:"No model or agent specified"}),s&&H(F,{dimColor:!0,children:"Could not determine the model used in this task."}),H(F,{dimColor:!0,children:"Please specify a model with --model or use an agent with -a."}),H(F,{dimColor:!0,children:"Example: entrydesk task -c 1 -i --model gemini-2.5-flash-lite"})]});if($.status==="error")return se(ye,{flexDirection:"column",children:[H(F,{children:w}),se(F,{color:"red",children:["Error: ",$.message]}),H(F,{dimColor:!0,children:"Press Enter to start a new task, or Ctrl+C to exit"})]});let Ot=ce?m?m.connectors&&m.connectors.length>0?m.connectors.map(c=>c.name).join(", "):"none":"loading...":_&&_.length>0?U.filter(c=>_.includes(c.id)).map(c=>c.name).join(", ")||`${_.length} connector(s)`:"none",x=[];if(ce)if(m?.capabilities)for(let c of m.capabilities)x.push(re.get(c)??c);else x.push("loading...");d&&x.push("FileSystem");let f=ie.getCurrentProfileName(),o=f!=="default",r=(()=>{switch(xe){case"model":return"Select model:";case"agent":return"Select agent:";case"skills":return"Select skill:";case"connectors":return"Select connectors:";case"capabilities":return"Select capabilities:";default:return"Select task:"}})(),u=(()=>{if(xe==="connectors")return ke;if(xe==="capabilities")return Se})();return se(ye,{flexDirection:"column",children:[se(ye,{marginBottom:1,flexDirection:"column",children:[H(F,{children:w}),se(ye,{children:[H(F,{bold:!0,color:"cyan",children:Q?`Continuing: ${Q}`:"EntryDesk CLI"}),se(F,{dimColor:!0,children:[" v","1.19.0"]}),o&&se(F,{color:"magenta",children:[" [",f,"]"]}),H(F,{dimColor:!0,children:" (type /help for commands)"})]})]}),q.map((c,A)=>{let Z=c.parts&&C?Ke(c.parts,!0):c.content,Te=c.role==="user"?"green":c.role==="system"?"yellow":"blue",M=c.role==="user"?"You":c.role==="system"?"System":"Assistant";return se(ye,{flexDirection:"column",marginBottom:1,children:[se(F,{bold:!0,color:Te,children:[M,":"]}),H(Xt,{text:Z})]},A)}),E&&se(ye,{flexDirection:"column",marginBottom:1,children:[H(F,{bold:!0,color:"blue",children:"Assistant:"}),H(Xt,{text:E})]}),$.status==="ready"&&H(Tn,{suggestions:st,activeIndex:ze,visible:Fe}),$.status==="ready"&&xe&&H(kn,{items:Xe,activeIndex:Qe,pageSize:xe==="agent"||xe==="skills"||xe==="model"?5:10,selectedIds:u,multiSelect:xe==="connectors"||xe==="capabilities",visible:!0,title:r}),$.status==="sending"&&!E?se(ye,{children:[H(F,{color:"cyan",children:H(on,{type:"dots"})}),H(F,{children:" Thinking..."})]}):$.status==="ready"&&!xe?se(ye,{flexDirection:"column",children:[Ne&&H(ye,{marginBottom:1,children:H(F,{color:"yellow",children:"\u26A0\uFE0F Delete this task? (y/N) "})}),ve&&!Ne&&se(ye,{marginBottom:1,flexDirection:"row",gap:1,children:[H(F,{dimColor:!0,children:"Attachments:"}),me.map((c,A)=>se(F,{children:[c.status==="uploading"?se(F,{color:"yellow",children:[H(on,{type:"dots"})," ",c.filename]}):c.status==="error"?se(F,{color:"red",children:["\u2717 ",c.filename]}):se(F,{color:"green",children:["\u2713 ",c.filename]}),A<me.length-1&&H(F,{children:", "})]},c.id))]}),se(ye,{children:[H(F,{color:"green",children:"> "}),H(_n,{value:b,onChange:He,onSubmit:ht,onPaste:We,leadingOffset:2,multiline:!0})]})]}):null,se(ye,{marginTop:1,flexDirection:"column",children:[se(ye,{gap:2,children:[se(F,{children:[H(F,{dimColor:!0,children:"Model: "}),H(F,{color:"magenta",children:ce?m?.model?.name||"loading...":ne.find(c=>c.id===oe)?.name||oe||"none"})]}),se(F,{children:[H(F,{dimColor:!0,children:"Connectors: "}),H(F,{color:"cyan",children:Ot})]}),se(F,{children:[H(F,{dimColor:!0,children:"Capabilities: "}),H(F,{color:"green",children:x.length>0?x.join(", "):"none"})]})]}),se(F,{dimColor:!0,children:["Esc Esc: Clear input & attachments | Ctrl+V: Paste image | Ctrl+O: Toggle full output ",C?"(ON)":"(OFF)"," | Ctrl+C: Exit"]})]})]})}import{jsx as xs}from"react/jsx-runtime";function Ri(){console.log(`
169
+ `).map(n=>n.length))}function ps(e){let t=fs(ao);return e>=t?ao:cs}function co({agentId:e,model:t,message:n,taskId:s,taskTitle:l,connectorIds:a,enableFileSystem:g=!0}){let y=process.stdout.columns??80,w=ps(y),h=rn(null),O=Hn(s,l),{state:$,setState:P,messages:q,setMessages:T,input:b,setInput:N,taskId:D,setTaskId:G,currentTaskTitle:Q,setCurrentTaskTitle:j,hasPersistedTask:J,setHasPersistedTask:le,credentials:i,setCredentials:p,currentResponse:E,setCurrentResponse:B,fullOutput:C,setFullOutput:de,addSystemMessage:Y,startNewTask:k}=O,{credentials:I}=Jn(P);Et(()=>{I&&!i&&p(I)},[I,i,p]);let{availableConnectors:U,availableModels:ne,availableAgents:K,modelProviders:ee,loading:V}=Yn(i),{currentModel:oe,setCurrentModel:X,currentAgentId:ce,setCurrentAgentId:W,activeConnectorIds:_,setActiveConnectorIds:L}=eo(t,e,a),v=rn(!1);Et(()=>{if(!v.current){if(v.current=!0,!t&&!e){let c=fe.getDefaultModel();c&&X(c)}if(!a&&!e){let c=fe.getDefaultConnectorIds();c&&L(c.length>0?c:void 0)}}},[t,e,a,X,L]);let{currentAgentDetails:m}=Zn(ce,i),{fileSystem:d,setFileSystem:S,capabilityLabelMap:re}=Qn(g),{pendingFiles:me,addFile:R,removeFile:Re,clearFiles:mt,getUploadedFileIds:_e,hasUploadingFiles:Lt,hasFiles:ve}=lo({credentials:i,currentModel:oe,modelProviders:ee,onUploadSuccess:c=>{Y(`\u2713 Attached: ${c}`)},onUploadError:(c,A)=>{Y(`\u2717 Failed to upload ${c}: ${A}`)}}),{sendMessage:ot}=zn({taskId:D,credentials:i,currentAgentId:ce,currentModel:oe,activeConnectorIds:_,localTools:d,fullOutput:C,setMessages:T,setState:P,setCurrentResponse:B,setCredentials:p,setHasPersistedTask:le,getFileIds:_e,clearFiles:mt}),Le=sn(c=>{k(c),B("")},[k]),[gt,Ee]=is(!1),We=sn(async c=>{let A=c.text.trim(),Z=St(A);if(/^https?:\/\//.test(Z))return;if(await jn(A)&&Un(Z)){let M=await Wn(A);M&&(c.preventDefault(),await R(M))}},[R]),Ft=sn(async()=>{if(!(gt||$.status!=="ready")){if(V||ee.length===0){Y("Please wait for resources to load before pasting images.");return}Y("Reading clipboard..."),Ee(!0);try{let c=await Bn();if(c){let A=`clipboard-${Date.now()}.png`;Y(`Uploading: ${A} (${Math.round(c.buffer.length/1024)}KB)`),await R({buffer:c.buffer,filename:A,mimeType:c.mime})}else Y("No image found in clipboard. Copy an image first.")}catch(c){let A=c instanceof Error?c.message:"Failed to read clipboard";Y(`Clipboard error: ${A}`)}finally{Ee(!1)}}},[R,Y,gt,$.status,V,ee.length]),{suggestions:st,suggestionIndex:ze,showSuggestions:Fe,argMode:xe,argItems:Xe,argIndex:Qe,selectedConnectorIds:ke,selectedCapabilities:Se,deleteConfirmMode:Ne,handleInputChange:He,handleSubmit:ht}=io({input:b,setInput:N,taskId:D,setTaskId:G,currentTaskTitle:Q,setCurrentTaskTitle:j,currentModel:oe,setCurrentModel:X,currentAgentId:ce,setCurrentAgentId:W,currentAgentDetails:m,setCurrentAgentDetails:()=>{},activeConnectorIds:_,setActiveConnectorIds:L,fileSystem:d,setFileSystem:S,availableModels:ne,availableAgents:K,availableConnectors:U,messages:q,hasPersistedTask:J,setHasPersistedTask:le,setMessages:T,addSystemMessage:Y,startNewTask:Le,sendMessage:ot,setFullOutput:de,credentials:i,setCredentials:p,setState:P,defaultCapabilities:{fileSystem:g},capabilityLabelMap:re,hasUploadingFiles:Lt});nn((c,A)=>{(A.ctrl||A.meta)&&c==="v"&&Ft()},{isActive:$.status==="ready"&&!xe}),nn((c,A)=>{if(!A.escape)return;let Z=Date.now(),Te=h.current;h.current=Z,!(!Te||Z-Te>us)&&(xe||Fe||(h.current=null,ve&&mt(),b.length>0&&He("")))},{isActive:$.status==="ready"}),nn((c,A)=>{A.return&&(Le("Started a new task."),P({status:"ready"}))},{isActive:$.status==="error"}),Et(()=>{if(i&&!V&&$.status==="loading")if(!oe&&!ce){let c=fe.getDefaultModel(),A=c&&ne.some(Te=>Te.id===c),Z=A?c:ne[0]?.id;Z?(A||fe.setDefaultModel(Z),X(Z),P({status:"ready"})):K.length===0?P({status:"no-model"}):P({status:"ready"})}else P({status:"ready"})},[i,V,oe,ce,ne,K,$.status,X,P]);let Ze=rn(!1);if(Et(()=>{Ze.current||n&&i&&$.status==="ready"&&(Ze.current=!0,ot(n))},[i,n,$.status,ot]),$.status==="loading")return se(ye,{flexDirection:"column",children:[H(F,{children:w}),se(ye,{children:[H(F,{color:"cyan",children:H(on,{type:"dots"})}),H(F,{children:" Initializing task..."})]})]});if($.status==="not-logged-in")return se(ye,{flexDirection:"column",children:[H(F,{children:w}),H(F,{color:"yellow",children:"Not logged in"}),H(F,{dimColor:!0,children:"Run `entrydesk login` to authenticate first."})]});if($.status==="no-workspace")return se(ye,{flexDirection:"column",children:[H(F,{children:w}),H(F,{color:"yellow",children:"No workspace selected"}),H(F,{dimColor:!0,children:"Run `entrydesk workspaces` to select a workspace first."})]});if($.status==="no-model")return se(ye,{flexDirection:"column",children:[H(F,{children:w}),H(F,{color:"yellow",children:"No model or agent specified"}),s&&H(F,{dimColor:!0,children:"Could not determine the model used in this task."}),H(F,{dimColor:!0,children:"Please specify a model with --model or use an agent with -a."}),H(F,{dimColor:!0,children:"Example: entrydesk task -c 1 -i --model gemini-2.5-flash-lite"})]});if($.status==="error")return se(ye,{flexDirection:"column",children:[H(F,{children:w}),se(F,{color:"red",children:["Error: ",$.message]}),H(F,{dimColor:!0,children:"Press Enter to start a new task, or Ctrl+C to exit"})]});let Ot=ce?m?m.connectors&&m.connectors.length>0?m.connectors.map(c=>c.name).join(", "):"none":"loading...":_&&_.length>0?U.filter(c=>_.includes(c.id)).map(c=>c.name).join(", ")||`${_.length} connector(s)`:"none",x=[];if(ce)if(m?.capabilities)for(let c of m.capabilities)x.push(re.get(c)??c);else x.push("loading...");d&&x.push("FileSystem");let f=ie.getCurrentProfileName(),o=f!=="default",r=(()=>{switch(xe){case"model":return"Select model:";case"agent":return"Select agent:";case"skills":return"Select skill:";case"connectors":return"Select connectors:";case"capabilities":return"Select capabilities:";default:return"Select task:"}})(),u=(()=>{if(xe==="connectors")return ke;if(xe==="capabilities")return Se})();return se(ye,{flexDirection:"column",children:[se(ye,{marginBottom:1,flexDirection:"column",children:[H(F,{children:w}),se(ye,{children:[H(F,{bold:!0,color:"cyan",children:Q?`Continuing: ${Q}`:"EntryDesk CLI"}),se(F,{dimColor:!0,children:[" v","1.20.0"]}),o&&se(F,{color:"magenta",children:[" [",f,"]"]}),H(F,{dimColor:!0,children:" (type /help for commands)"})]})]}),q.map((c,A)=>{let Z=c.parts&&C?Ke(c.parts,!0):c.content,Te=c.role==="user"?"green":c.role==="system"?"yellow":"blue",M=c.role==="user"?"You":c.role==="system"?"System":"Assistant";return se(ye,{flexDirection:"column",marginBottom:1,children:[se(F,{bold:!0,color:Te,children:[M,":"]}),H(Xt,{text:Z})]},A)}),E&&se(ye,{flexDirection:"column",marginBottom:1,children:[H(F,{bold:!0,color:"blue",children:"Assistant:"}),H(Xt,{text:E})]}),$.status==="ready"&&H(Tn,{suggestions:st,activeIndex:ze,visible:Fe}),$.status==="ready"&&xe&&H(kn,{items:Xe,activeIndex:Qe,pageSize:xe==="agent"||xe==="skills"||xe==="model"?5:10,selectedIds:u,multiSelect:xe==="connectors"||xe==="capabilities",visible:!0,title:r}),$.status==="sending"&&!E?se(ye,{children:[H(F,{color:"cyan",children:H(on,{type:"dots"})}),H(F,{children:" Thinking..."})]}):$.status==="ready"&&!xe?se(ye,{flexDirection:"column",children:[Ne&&H(ye,{marginBottom:1,children:H(F,{color:"yellow",children:"\u26A0\uFE0F Delete this task? (y/N) "})}),ve&&!Ne&&se(ye,{marginBottom:1,flexDirection:"row",gap:1,children:[H(F,{dimColor:!0,children:"Attachments:"}),me.map((c,A)=>se(F,{children:[c.status==="uploading"?se(F,{color:"yellow",children:[H(on,{type:"dots"})," ",c.filename]}):c.status==="error"?se(F,{color:"red",children:["\u2717 ",c.filename]}):se(F,{color:"green",children:["\u2713 ",c.filename]}),A<me.length-1&&H(F,{children:", "})]},c.id))]}),se(ye,{children:[H(F,{color:"green",children:"> "}),H(_n,{value:b,onChange:He,onSubmit:ht,onPaste:We,leadingOffset:2,multiline:!0})]})]}):null,se(ye,{marginTop:1,flexDirection:"column",children:[se(ye,{gap:2,children:[se(F,{children:[H(F,{dimColor:!0,children:"Model: "}),H(F,{color:"magenta",children:ce?m?.model?.name||"loading...":ne.find(c=>c.id===oe)?.name||oe||"none"})]}),se(F,{children:[H(F,{dimColor:!0,children:"Connectors: "}),H(F,{color:"cyan",children:Ot})]}),se(F,{children:[H(F,{dimColor:!0,children:"Capabilities: "}),H(F,{color:"green",children:x.length>0?x.join(", "):"none"})]})]}),se(F,{dimColor:!0,children:["Esc Esc: Clear input & attachments | Ctrl+V: Paste image | Ctrl+O: Toggle full output ",C?"(ON)":"(OFF)"," | Ctrl+C: Exit"]})]})]})}import{jsx as xs}from"react/jsx-runtime";function Ri(){console.log(`
170
170
  Usage: entrydesk task [options]
171
171
 
172
172
  Send a message to a model or agent, or start an interactive session.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{h as I,q as A,r as O,t as v}from"./chunk-UXJD5BRR.js";import"./chunk-KURQCTT3.js";var h="\x1B[2m",c="\x1B[0m",p="\x1B[36m",T="\x1B[33m",b="\x1B[32m",R="stream-json";function f(t,n){let r=n===void 0?{event:t}:{event:t,data:n};process.stdout.write(`${JSON.stringify(r)}
2
+ import{h as I,q as A,r as O,t as v}from"./chunk-EIX7AV4F.js";import"./chunk-KURQCTT3.js";var h="\x1B[2m",c="\x1B[0m",p="\x1B[36m",T="\x1B[33m",b="\x1B[32m",R="stream-json";function f(t,n){let r=n===void 0?{event:t}:{event:t,data:n};process.stdout.write(`${JSON.stringify(r)}
3
3
  `)}function S(t){let n=new Date(t),e=new Date().getTime()-n.getTime(),o=Math.floor(e/(1e3*60*60*24));return o===0?n.toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"}):o===1?"Yesterday":o<7?`${o} days ago`:n.toLocaleDateString("en-US",{month:"short",day:"numeric"})}var M="\x1B[1m";function j(t){return t.replace(/<mark>/g,M).replace(/<\/mark>/g,c).replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&amp;/g,"&")}function w(t,n){if(n)return t;let r=t.split(`
4
4
  `);if(r.length<=15)return t;let e=r.slice(0,6),o=r.slice(-4),i=r.length-10;return[...e,`... (${i} lines omitted, use --full-output to see all) ...`,...o].join(`
5
5
  `)}function N(t){if(!t||typeof t!="object")return t;if(Array.isArray(t))return t.map(N);let n={};for(let[r,e]of Object.entries(t))typeof e=="string"&&e.length>200?n[r]=e.slice(0,150)+"... (truncated)":typeof e=="object"&&e!==null?n[r]=N(e):n[r]=e;return n}function J(t){if(!t||typeof t!="object")return String(t);try{return JSON.stringify(t,null,2)}catch{return String(t)}}function E(t,n){if(!t)return"(no result)";if(typeof t!="object")return w(String(t),n);let r=n?t:N(t);if("structuredContent"in r&&r.structuredContent){let e=r.structuredContent,o=[];if(e.stdout&&typeof e.stdout=="string"&&e.stdout.trim()&&o.push(e.stdout.trim()),e.stderr&&typeof e.stderr=="string"&&e.stderr.trim()&&o.push(`${T}[stderr]${c} ${e.stderr.trim()}`),e.urls&&Array.isArray(e.urls)){let i=e.urls;for(let s of i)s.path&&s.url&&o.push(`${s.path}: ${s.url}`)}return o.length===0&&o.push(JSON.stringify(e,null,2)),w(o.join(`
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{c as S,r as _}from"./chunk-UXJD5BRR.js";import"./chunk-KURQCTT3.js";import R from"fs";import{Client as L}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as v}from"@modelcontextprotocol/sdk/client/streamableHttp.js";async function A(e={}){let t=e.apiUrl,n=e.accessToken,o=e.workspaceId;if(!n||!o){let l=await _();n=n||l.accessToken,o=o||l.workspaceId}t||(t=S().apiUrl);let i=new L({name:"entrydesk-cli",version:"1.0.0"}),s=new URL(`${t}/v1/workspaces/${o}/mcp`),r=new v(s,{requestInit:{headers:{Authorization:`Bearer ${n}`}}});return await i.connect(r),i}async function T(){return A()}import h from"fs/promises";import D from"os";import d from"path";var y=!process.env.NO_COLOR&&!!process.stdout.isTTY,p={green:y?"\x1B[32m":"",yellow:y?"\x1B[33m":"",reset:y?"\x1B[0m":""},P=10*1024,O=8*1024,I=2*1024,b=100,M=100;function U(){return d.join(D.homedir(),".entrydesk","tool-results")}function F(e){let t=e.trim().replace(/[/\\:*?"<>|\s]/g,"_").replace(/_+/g,"_").replace(/^[._]+|[._]+$/g,"").slice(0,b);return!t||t==="."||t===".."?"unnamed_tool":t}function J(e){try{return JSON.stringify(e,(t,n)=>typeof n=="bigint"?`${n}n`:typeof n=="function"?"[Function]":typeof n=="symbol"?n.toString():n,2)}catch{return String(e)}}function B(e){let t=new Date,n=[t.getFullYear(),String(t.getMonth()+1).padStart(2,"0"),String(t.getDate()).padStart(2,"0")].join("-")+"_"+[String(t.getHours()).padStart(2,"0"),String(t.getMinutes()).padStart(2,"0"),String(t.getSeconds()).padStart(2,"0")].join("-"),o=F(e);return`${n}_${o}.json`}async function N(e,t){try{return await h.writeFile(e,t,{encoding:"utf8",flag:"wx"}),!0}catch(n){if(n instanceof Error&&"code"in n&&n.code==="EEXIST")return!1;throw n}}async function C(e,t){try{let n=U();await h.mkdir(n,{recursive:!0});let o=B(e),i=d.extname(o),s=o.slice(0,-i.length),r=J(t),l=d.join(n,o);if(await N(l,r))return l;for(let c=1;c<=M;c++){let w=d.join(n,`${s}-${c}${i}`);if(await N(w,r))return w}let u=Math.random().toString(36).slice(2,10),a=d.join(n,`${s}-${u}${i}`);return await h.writeFile(a,r,{encoding:"utf8",flag:"wx"}),a}catch(n){let o=n instanceof Error?n.message:"unknown error";return console.error(`${p.yellow}Warning: Could not save result to file: ${o}${p.reset}`),null}}function k(e,t){let n=Buffer.byteLength(e,"utf8");if(n<=P)return e;let o=e.slice(0,O),i=e.slice(-I),r=((n-O-I)/1024).toFixed(1),l=(n/1024).toFixed(1),u=` ... (skipped ${r}KB of ${l}KB) ...`;return t&&(u+=`
2
+ import{c as S,r as _}from"./chunk-EIX7AV4F.js";import"./chunk-KURQCTT3.js";import R from"fs";import{Client as L}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as v}from"@modelcontextprotocol/sdk/client/streamableHttp.js";async function A(e={}){let t=e.apiUrl,n=e.accessToken,o=e.workspaceId;if(!n||!o){let l=await _();n=n||l.accessToken,o=o||l.workspaceId}t||(t=S().apiUrl);let i=new L({name:"entrydesk-cli",version:"1.0.0"}),s=new URL(`${t}/v1/workspaces/${o}/mcp`),r=new v(s,{requestInit:{headers:{Authorization:`Bearer ${n}`}}});return await i.connect(r),i}async function T(){return A()}import h from"fs/promises";import D from"os";import d from"path";var y=!process.env.NO_COLOR&&!!process.stdout.isTTY,p={green:y?"\x1B[32m":"",yellow:y?"\x1B[33m":"",reset:y?"\x1B[0m":""},P=10*1024,O=8*1024,I=2*1024,b=100,M=100;function U(){return d.join(D.homedir(),".entrydesk","tool-results")}function F(e){let t=e.trim().replace(/[/\\:*?"<>|\s]/g,"_").replace(/_+/g,"_").replace(/^[._]+|[._]+$/g,"").slice(0,b);return!t||t==="."||t===".."?"unnamed_tool":t}function J(e){try{return JSON.stringify(e,(t,n)=>typeof n=="bigint"?`${n}n`:typeof n=="function"?"[Function]":typeof n=="symbol"?n.toString():n,2)}catch{return String(e)}}function B(e){let t=new Date,n=[t.getFullYear(),String(t.getMonth()+1).padStart(2,"0"),String(t.getDate()).padStart(2,"0")].join("-")+"_"+[String(t.getHours()).padStart(2,"0"),String(t.getMinutes()).padStart(2,"0"),String(t.getSeconds()).padStart(2,"0")].join("-"),o=F(e);return`${n}_${o}.json`}async function N(e,t){try{return await h.writeFile(e,t,{encoding:"utf8",flag:"wx"}),!0}catch(n){if(n instanceof Error&&"code"in n&&n.code==="EEXIST")return!1;throw n}}async function C(e,t){try{let n=U();await h.mkdir(n,{recursive:!0});let o=B(e),i=d.extname(o),s=o.slice(0,-i.length),r=J(t),l=d.join(n,o);if(await N(l,r))return l;for(let c=1;c<=M;c++){let w=d.join(n,`${s}-${c}${i}`);if(await N(w,r))return w}let u=Math.random().toString(36).slice(2,10),a=d.join(n,`${s}-${u}${i}`);return await h.writeFile(a,r,{encoding:"utf8",flag:"wx"}),a}catch(n){let o=n instanceof Error?n.message:"unknown error";return console.error(`${p.yellow}Warning: Could not save result to file: ${o}${p.reset}`),null}}function k(e,t){let n=Buffer.byteLength(e,"utf8");if(n<=P)return e;let o=e.slice(0,O),i=e.slice(-I),r=((n-O-I)/1024).toFixed(1),l=(n/1024).toFixed(1),u=` ... (skipped ${r}KB of ${l}KB) ...`;return t&&(u+=`
3
3
  Tip: jq -r '.structuredContent.field' <file> | grep/head/tail`),`${o}
4
4
 
5
5
  ${u}
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{h as d,r as y,t as U}from"./chunk-UXJD5BRR.js";import"./chunk-KURQCTT3.js";import{writeFileSync as S}from"fs";function $(){console.log(`
2
+ import{h as d,r as y,t as U}from"./chunk-EIX7AV4F.js";import"./chunk-KURQCTT3.js";import{writeFileSync as S}from"fs";function $(){console.log(`
3
3
  Usage: entrydesk usage [balance|me|consumptions|export] [options]
4
4
 
5
5
  Commands:
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import"./chunk-KURQCTT3.js";function n(){console.log("entrydesk 1.19.0")}export{n as printVersion};
2
+ import"./chunk-KURQCTT3.js";function n(){console.log("entrydesk 1.20.0")}export{n as printVersion};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{h as u,r as p,t as g}from"./chunk-UXJD5BRR.js";import"./chunk-KURQCTT3.js";import{readFileSync as $}from"fs";var k=262144,x=new Set(["completed","failed","cancelled"]);function f(){console.log(`
2
+ import{h as u,r as p,t as g}from"./chunk-EIX7AV4F.js";import"./chunk-KURQCTT3.js";import{readFileSync as $}from"fs";var k=262144,x=new Set(["completed","failed","cancelled"]);function f(){console.log(`
3
3
  Usage: entrydesk workflow [list|get|create|update|run|runs|run-get|share] [options]
4
4
 
5
5
  Commands:
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{g as a,h as w,q as k}from"./chunk-UXJD5BRR.js";import"./chunk-KURQCTT3.js";function l(){console.log(`
2
+ import{g as a,h as w,q as k}from"./chunk-EIX7AV4F.js";import"./chunk-KURQCTT3.js";function l(){console.log(`
3
3
  Usage: entrydesk workspaces [list|switch|use] [options]
4
4
 
5
5
  Commands:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@entrydesk/cli",
3
- "version": "1.19.0",
3
+ "version": "1.20.0",
4
4
  "description": "EntryDesk CLI - Interact with EntryDesk from your terminal",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- import M from"fs";import y from"fs";import Me from"os";import b from"path";import{HTTPError as _e,TimeoutError as Ue}from"ky";import{HTTPError as xe}from"ky";import we,{TimeoutError as ke,isHTTPError as ve}from"ky";import T from"crypto";import d from"fs";import ue from"path";var de="ENTRYDESK_FORCE_FILE_STORAGE",A="EntryDesk CLI",pe="__entrydesk_keychain_test__",he="profile:",fe=".credentials.key",Q={keychain:!1,permissions:!1,corruptFile:!1,windowsFile:!1};function k(s,e){Q[s]||(Q[s]=!0,console.error(e))}function ye(){return process.env.ENTRYDESK_DEBUG?.toLowerCase()==="true"}function ee(s){if(!s||typeof s!="object")return!1;let e=s;return!(!("accessToken"in e||"refreshToken"in e||"email"in e||"workspaceId"in e)||"accessToken"in e&&typeof e.accessToken!="string"||"refreshToken"in e&&typeof e.refreshToken!="string"||"email"in e&&typeof e.email!="string"||"workspaceId"in e&&typeof e.workspaceId!="string")}function me(s){if(!s||typeof s!="object")return!1;let e=s;return typeof e.getPassword=="function"&&typeof e.setPassword=="function"&&typeof e.deletePassword=="function"}function j(s){return a.getProfileCredentialsFile(s)}var F=class{getKeyFilePath(e){return ue.join(a.getProfileDir(e),fe)}loadEncryptionKey(e){let t=this.getKeyFilePath(e);try{if(!d.existsSync(t))return null;let r=d.readFileSync(t);return r.length!==32?null:(this.ensureSecureFilePermissions(t),r)}catch{return null}}createEncryptionKey(e){a.ensureProfileDir(e);let t=this.getKeyFilePath(e),r=T.randomBytes(32);return d.writeFileSync(t,r,{mode:384}),this.ensureSecureFilePermissions(t),r}getOrCreateEncryptionKey(e){let t=this.loadEncryptionKey(e);return t||this.createEncryptionKey(e)}encrypt(e,t){let r=T.randomBytes(16),n=T.createCipheriv("aes-256-gcm",t,r),i=n.update(e,"utf8","hex");i+=n.final("hex");let o=n.getAuthTag();return`${r.toString("hex")}:${o.toString("hex")}:${i}`}decrypt(e,t){let r=e.split(":");if(r.length!==3)throw new Error("Invalid encrypted data format");let n=Buffer.from(r[0],"hex"),i=Buffer.from(r[1],"hex"),o=r[2],R=T.createDecipheriv("aes-256-gcm",t,n,{authTagLength:16});R.setAuthTag(i);let u=R.update(o,"hex","utf8");return u+=R.final("utf8"),u}tryDecrypt(e,t){try{return this.decrypt(e,t)}catch{return null}}tryParseCredentials(e){try{let t=JSON.parse(e);return ee(t)?t:null}catch{return null}}ensureSecureFilePermissions(e){if(process.platform!=="win32"){try{d.chmodSync(e,384)}catch{k("permissions","Warning: Failed to set secure permissions on credentials file.");return}try{(d.statSync(e).mode&511)!==384&&k("permissions","Warning: Credentials file permissions are too permissive.")}catch{k("permissions","Warning: Failed to verify credentials file permissions.")}}}async getCredentials(e){let t=j(e);try{if(!d.existsSync(t))return null;let r=d.readFileSync(t,"utf-8").trim();if(!r)return null;let n=this.loadEncryptionKey(e),i=n?this.tryDecrypt(r,n):null;if(i){let o=this.tryParseCredentials(i);if(o)return o}return k("corruptFile","Warning: Credentials file is unreadable. Please run `entrydesk login` again."),null}catch{return null}}async setCredentials(e,t){a.ensureProfileDir(e);let r=j(e),n=this.getOrCreateEncryptionKey(e),i=this.encrypt(JSON.stringify(t),n);d.writeFileSync(r,i,{mode:384}),this.ensureSecureFilePermissions(r)}async deleteCredentials(e){let t=j(e);try{d.existsSync(t)&&d.unlinkSync(t)}catch{}}},O=class{keytarModule=null;keytarLoadAttempted=!1;keychainAvailable=null;async getKeytar(){if(this.keytarLoadAttempted)return this.keytarModule;this.keytarLoadAttempted=!0;try{let t=await import("keytar"),r=t&&typeof t=="object"&&"default"in t?t.default:t;this.keytarModule=me(r)?r:null}catch{this.keytarModule=null}return this.keytarModule}getAccount(e){return`${he}${e}`}async checkKeychainAvailability(){if(this.keychainAvailable!==null)return this.keychainAvailable;try{let e=await this.getKeytar();if(!e)return this.keychainAvailable=!1,!1;let t=`${pe}${T.randomBytes(8).toString("hex")}`,r="test";await e.setPassword(A,t,r);let n=await e.getPassword(A,t),i=await e.deletePassword(A,t);return this.keychainAvailable=!!(i&&n===r),this.keychainAvailable}catch{return this.keychainAvailable=!1,!1}}async isAvailable(){return this.checkKeychainAvailability()}async getCredentials(e){if(!await this.checkKeychainAvailability())throw new Error("Keychain is not available");let t=await this.getKeytar();if(!t)throw new Error("Keytar module not available");let r=await t.getPassword(A,this.getAccount(e));if(!r)return null;let n=this.tryParseKeychainPayload(r);return n||k("corruptFile",`Warning: Keychain entry for profile "${e}" is unreadable.`),n}async setCredentials(e,t){if(!await this.checkKeychainAvailability())throw new Error("Keychain is not available");let r=await this.getKeytar();if(!r)throw new Error("Keytar module not available");let n=JSON.stringify(t);await r.setPassword(A,this.getAccount(e),n)}async deleteCredentials(e){if(!await this.checkKeychainAvailability())throw new Error("Keychain is not available");let t=await this.getKeytar();if(!t)throw new Error("Keytar module not available");await t.deletePassword(A,this.getAccount(e))}tryParseKeychainPayload(e){try{let t=JSON.parse(e);return ee(t)?t:null}catch{return null}}},N=class{keychainStorage=null;fileStorage=new F;keychainAvailable=null;initPromise=null;shouldForceFileStorage(){return process.env[de]?.toLowerCase()==="true"}async initializeStorage(){if(this.shouldForceFileStorage()){this.keychainAvailable=!1,this.keychainStorage=null;return}try{let e=new O,t=await e.isAvailable();this.keychainAvailable=t,this.keychainStorage=t?e:null}catch{this.keychainAvailable=!1,this.keychainStorage=null}!this.keychainAvailable&&!this.shouldForceFileStorage()&&(ye()&&k("keychain","Keychain unavailable. Falling back to file-based credentials."),process.platform==="win32"&&k("windowsFile","Warning: File-based credentials on Windows may be readable by other users."))}async ensureInitialized(){if(this.shouldForceFileStorage()){this.keychainAvailable=!1,this.keychainStorage=null;return}this.keychainAvailable===null&&(this.initPromise??=this.initializeStorage(),await this.initPromise)}disableKeychain(){this.shouldForceFileStorage()||k("keychain","Keychain error encountered. Falling back to file-based credentials."),this.keychainAvailable=!1,this.keychainStorage=null}async getKeychainStorage(){return await this.ensureInitialized(),this.shouldForceFileStorage()?null:this.keychainAvailable?this.keychainStorage:null}async getCredentials(e){let t=await this.getKeychainStorage();if(!t)return this.fileStorage.getCredentials(e);try{let n=await t.getCredentials(e);if(n)return n}catch{return this.disableKeychain(),this.fileStorage.getCredentials(e)}let r=await this.fileStorage.getCredentials(e);if(r)try{await t.setCredentials(e,r),await this.fileStorage.deleteCredentials(e)}catch{}return r}async setCredentials(e,t){let r=await this.getKeychainStorage();if(!r){await this.fileStorage.setCredentials(e,t);return}try{await r.setCredentials(e,t),await this.fileStorage.deleteCredentials(e)}catch{this.disableKeychain(),await this.fileStorage.setCredentials(e,t)}}async deleteCredentials(e){let t=await this.getKeychainStorage();if(t)try{await t.deleteCredentials(e)}catch{this.disableKeychain()}await this.fileStorage.deleteCredentials(e)}},l=new N,p={async saveAccessToken(s,e){let t=a.getEffectiveProfileName(e),r=await l.getCredentials(t)??{};r.accessToken=s,await l.setCredentials(t,r)},async getAccessToken(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.accessToken??null},async saveRefreshToken(s,e){let t=a.getEffectiveProfileName(e),r=await l.getCredentials(t)??{};r.refreshToken=s,await l.setCredentials(t,r)},async getRefreshToken(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.refreshToken??null},async saveEmail(s,e){let t=a.getEffectiveProfileName(e),r=await l.getCredentials(t)??{};r.email=s,await l.setCredentials(t,r)},async getEmail(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.email??null},async saveWorkspaceId(s,e){let t=a.getEffectiveProfileName(e),r=await l.getCredentials(t)??{};r.workspaceId=s,await l.setCredentials(t,r)},async getWorkspaceId(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.workspaceId??null},async saveAll(s,e){let t=a.getEffectiveProfileName(e);await l.setCredentials(t,s)},async getAll(s){let e=a.getEffectiveProfileName(s);return l.getCredentials(e)},async clear(s){let e=a.getEffectiveProfileName(s);await l.deleteCredentials(e)},async isLoggedIn(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.accessToken!=null}};var x=class s{client;baseUrl;constructor(e,t){this.baseUrl=e||B(t),K().ignoreSslErrors&&(process.env.NODE_TLS_REJECT_UNAUTHORIZED="0",process.env.DEBUG&&console.log("[DEBUG] ApiClient: SSL certificate validation disabled")),this.client=we.create({baseUrl:this.baseUrl.replace(/\/?$/,"/"),timeout:3e4,retry:{limit:3,methods:["get","put","head","delete","options","trace"],statusCodes:[408,413,429,500,502,503,504]},hooks:{beforeError:[({error:n})=>(ve(n)&&(n.request.headers.delete("authorization"),n.request.headers.delete("Authorization")),n)]}})}getBaseUrl(){return this.baseUrl}async refreshOAuthToken(e){return this.client.post("v1/oauth/token",{json:{grant_type:"refresh_token",refresh_token:e.refreshToken,client_id:e.clientId}}).json()}async revokeOAuthToken(e){await this.client.post("v1/oauth/revoke",{json:{token:e.token,token_type_hint:"refresh_token",client_id:e.clientId}})}async getWorkspaces(e){try{return process.env.DEBUG&&console.log(`[DEBUG] Calling getWorkspaces API: ${this.baseUrl}/v1/workspaces`),await this.client.get("v1/workspaces",{headers:{Authorization:`Bearer ${e}`}}).json()}catch(t){throw process.env.DEBUG&&(console.error("[DEBUG] getWorkspaces error:",t),t instanceof Error&&"cause"in t&&console.error("[DEBUG] Error cause:",t.cause)),t}}async getAgents(e,t,r){let n={limit:r?.limit??100};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),await this.client.get(`v1/workspaces/${t}/availableAgents`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async createAgent(e,t,r){return await this.client.post(`v1/workspaces/${t}/agents`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async updateAgent(e,t,r,n){await this.client.put(`v1/workspaces/${t}/agents/${r}`,{headers:{Authorization:`Bearer ${e}`},json:n})}async deleteAgent(e,t,r){await this.client.delete(`v1/workspaces/${t}/agents/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async getMyAgents(e,t,r){let n={limit:r?.limit??100};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),await this.client.get(`v1/workspaces/${t}/myAgents`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async publishAgent(e,t,r){await this.client.post(`v1/workspaces/${t}/agents/${r}/publish`,{headers:{Authorization:`Bearer ${e}`}})}async getAgentGrants(e,t,r){return await this.client.get(`v1/workspaces/${t}/agents/${r}/grants`,{headers:{Authorization:`Bearer ${e}`}}).json()}async upsertAgentGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/agents/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeAgentGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/agents/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async getMeetings(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),r?.filter&&(n.filter=r.filter),r?.sortBy&&(n.sortBy=r.sortBy),await this.client.get(`v1/workspaces/${t}/meetings`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getMeeting(e,t,r){return await this.client.get(`v1/workspaces/${t}/meetings/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async createMeeting(e,t,r){return await this.client.post(`v1/workspaces/${t}/meetings`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async updateMeeting(e,t,r,n){return await this.client.patch(`v1/workspaces/${t}/meetings/${r}`,{headers:{Authorization:`Bearer ${e}`},json:n}).json()}async deleteMeeting(e,t,r){await this.client.delete(`v1/workspaces/${t}/meetings/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async getMeetingPreviousBrief(e,t,r){return await this.client.get(`v1/workspaces/${t}/meetings/${r}/previous`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getRecording(e,t,r){return await this.client.get(`v1/workspaces/${t}/recordings/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getMeetingShares(e,t,r){return await this.client.get(`v1/workspaces/${t}/meetings/${r}/shares`,{headers:{Authorization:`Bearer ${e}`}}).json()}async upsertMeetingUserGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/meetings/${r}/shares/users/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeMeetingUserGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/meetings/${r}/shares/users/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async upsertMeetingTeamGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/meetings/${r}/shares/teams/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeMeetingTeamGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/meetings/${r}/shares/teams/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async getWorkflows(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),await this.client.get(`v1/workspaces/${t}/workflows`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getWorkflow(e,t,r){return await this.client.get(`v1/workspaces/${t}/workflows/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async createWorkflow(e,t,r){return await this.client.post(`v1/workspaces/${t}/workflows`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async updateWorkflow(e,t,r,n){await this.client.put(`v1/workspaces/${t}/workflows/${r}`,{headers:{Authorization:`Bearer ${e}`},json:n})}async triggerWorkflowRun(e,t,r,n){return await this.client.post(`v1/workspaces/${t}/workflows/${r}/runs`,{headers:{Authorization:`Bearer ${e}`},json:n===void 0?{}:{args:n}}).json()}async getWorkflowRuns(e,t,r,n){let i={limit:n?.limit??20};return n?.nextKey&&(i.nextKey=n.nextKey),await this.client.get(`v1/workspaces/${t}/workflows/${r}/runs`,{headers:{Authorization:`Bearer ${e}`},searchParams:i}).json()}async getWorkflowRun(e,t,r,n){return await this.client.get(`v1/workspaces/${t}/workflows/${r}/runs/${n}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getWorkflowGrants(e,t,r){return await this.client.get(`v1/workspaces/${t}/workflows/${r}/grants`,{headers:{Authorization:`Bearer ${e}`}}).json()}async upsertWorkflowGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/workflows/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeWorkflowGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/workflows/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async getNotifications(e,t,r){let n={limit:r?.limit??20};return r?.tab&&(n.tab=r.tab),r?.eventType&&(n.eventType=r.eventType),r?.cursor&&(n.cursor=r.cursor),await this.client.get(`v1/workspaces/${t}/notifications`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getNotificationUnreadCount(e,t){return await this.client.get(`v1/workspaces/${t}/notifications/unreadCount`,{headers:{Authorization:`Bearer ${e}`}}).json()}async markNotificationRead(e,t,r){await this.client.post(`v1/workspaces/${t}/notifications/${r}/read`,{headers:{Authorization:`Bearer ${e}`}})}async markAllNotificationsRead(e,t){await this.client.post(`v1/workspaces/${t}/notifications/readAll`,{headers:{Authorization:`Bearer ${e}`}})}async getModels(e,t){return await this.client.get(`v1/workspaces/${t}/models`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getConnectors(e,t){return await this.client.get(`v1/workspaces/${t}/availableConnectors`,{headers:{Authorization:`Bearer ${e}`},searchParams:{limit:100,connectionStatus:"connected"}}).json()}async getTasks(e,t,r=20){return await this.client.get(`v1/workspaces/${t}/tasks`,{headers:{Authorization:`Bearer ${e}`},searchParams:{limit:r}}).json()}async searchTasks(e,t,r,n){let i={q:r,limit:n?.limit??20};return n?.nextKey&&(i.nextKey=n.nextKey),await this.client.get(`v1/workspaces/${t}/tasks/search`,{headers:{Authorization:`Bearer ${e}`},searchParams:i}).json()}async getMessages(e,t,r,n=50){return await this.client.get(`v1/workspaces/${t}/tasks/${r}/messages`,{headers:{Authorization:`Bearer ${e}`},searchParams:{limit:n}}).json()}async getAgent(e,t,r){return await this.client.get(`v1/workspaces/${t}/agents/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async listAvailableSkills(e,t,r){return await this.client.get(`v1/workspaces/${t}/availableSkills`,{headers:{Authorization:`Bearer ${e}`},searchParams:{createdBy:r?.createdBy,nextKey:r?.nextKey,limit:r?.limit??20}}).json()}async uploadSkill(e,t,r){return await this.client.post(`v1/workspaces/${t}/skills`,{headers:{Authorization:`Bearer ${e}`},body:r}).json()}async deleteSkill(e,t,r){await this.client.delete(`v1/workspaces/${t}/skills/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async updateSkillPreference(e,t,r,n){return await this.client.patch(`v1/workspaces/${t}/skills/${r}/preference`,{headers:{Authorization:`Bearer ${e}`},json:{isEnabled:n}}).json()}async getSkillVersions(e,t,r){return await this.client.get(`v1/workspaces/${t}/skills/${r}/versions`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getSkillGrants(e,t,r){return await this.client.get(`v1/workspaces/${t}/skills/${r}/grants`,{headers:{Authorization:`Bearer ${e}`}}).json()}async upsertSkillGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/skills/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeSkillGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/skills/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async downloadSkillCurrent(e,t,r){return await this.client.get(`v1/workspaces/${t}/skills/${r}/download`,{headers:{Authorization:`Bearer ${e}`}}).json()}async task(e,t,r){try{let n=await this.client.post(`v1/workspaces/${t}/tasks`,{headers:{Authorization:`Bearer ${e}`},json:r,timeout:6e4,throwHttpErrors:!1});if(!n.ok){let o=await n.text();throw new Error(`Task API failed (${n.status}): ${o}`)}let i=await n.json();return i.noop||!i.streamId?new Response(`data: [DONE]
3
-
4
- `,{headers:{"Content-Type":"text/event-stream"}}):await this.taskStream(e,t,i.taskId)}catch(n){throw n instanceof ke?new TypeError("Request timed out. Please check your connection and try again.",{cause:n}):n}}async taskStream(e,t,r){let n=await this.client.get(`v1/workspaces/${t}/tasks/${r}/stream`,{headers:{Authorization:`Bearer ${e}`,Accept:"text/event-stream"},timeout:!1,throwHttpErrors:!1});if(!n.ok){let i=await n.text();throw new Error(`Task stream failed (${n.status}): ${i}`)}return n}async getBudget(e,t){return await this.client.get(`v1/workspaces/${t}/budget`,{headers:{Authorization:`Bearer ${e}`}}).json()}async updateBudget(e,t,r){await this.client.put(`v1/workspaces/${t}/budget`,{headers:{Authorization:`Bearer ${e}`},json:{budget:r}})}async getMonthlyUsages(e,t,r){return await this.client.get(`v1/workspaces/${t}/monthlyUsages`,{headers:{Authorization:`Bearer ${e}`},searchParams:{nextKey:r?.nextKey,limit:r?.limit??20}}).json()}async getBillingOverview(e,t){return await this.client.get(`v1/workspaces/${t}/billing/overview`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getBillingInvoices(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),await this.client.get(`v1/workspaces/${t}/billing/invoices`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getUsageOverview(e,t){return await this.client.get(`v1/workspaces/${t}/usage/overview`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getUsageMe(e,t){return await this.client.get(`v1/workspaces/${t}/usage/me`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getUsageConsumptions(e,t,r){let n={limit:r?.limit??20,offset:r?.offset??0};return r?.periodStart&&(n.periodStart=r.periodStart),await this.client.get(`v1/workspaces/${t}/usage/consumptions`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async exportUsageCsv(e,t,r){let n={};return r&&(n.periodStart=r),await this.client.get(`v1/workspaces/${t}/usage/export`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).text()}async createTaskShare(e,t,r,n="public"){return await this.client.post(`v1/workspaces/${t}/tasks/${r}/shares`,{headers:{Authorization:`Bearer ${e}`},json:{visibility:n}}).json()}async getSharedTask(e,t){let r={};return t&&(r.Authorization=`Bearer ${t}`),await this.client.get(`v1/shares/${e}`,{headers:r}).json()}async getSharedMessages(e,t=50,r){let n={};return r&&(n.Authorization=`Bearer ${r}`),await this.client.get(`v1/shares/${e}/messages`,{headers:n,searchParams:{limit:t}}).json()}async deleteTask(e,t,r){await this.client.delete(`v1/workspaces/${t}/tasks/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async getModelProviders(e,t){return await this.client.get(`v1/workspaces/${t}/modelProviders`,{headers:{Authorization:`Bearer ${e}`}}).json()}async uploadFile(e,t,r,n){let i=new FormData,o=new Blob([r.buffer],{type:r.mimeType});return i.append("file",o,r.filename),i.append("modelProviderId",n),await this.client.post(`v1/workspaces/${t}/files`,{headers:{Authorization:`Bearer ${e}`},body:i,timeout:12e4}).json()}async getSchedules(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),await this.client.get(`v1/workspaces/${t}/schedules`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getSchedule(e,t,r){return await this.client.get(`v1/workspaces/${t}/schedules/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async createSchedule(e,t,r){return await this.client.post(`v1/workspaces/${t}/schedules`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async updateSchedule(e,t,r,n){await this.client.put(`v1/workspaces/${t}/schedules/${r}`,{headers:{Authorization:`Bearer ${e}`},json:n})}async deleteSchedule(e,t,r){await this.client.delete(`v1/workspaces/${t}/schedules/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async activateSchedule(e,t,r){await this.client.post(`v1/workspaces/${t}/schedules/${r}/activate`,{headers:{Authorization:`Bearer ${e}`}})}async deactivateSchedule(e,t,r){await this.client.post(`v1/workspaces/${t}/schedules/${r}/deactivate`,{headers:{Authorization:`Bearer ${e}`}})}async runScheduleNow(e,t,r){return await this.client.post(`v1/workspaces/${t}/schedules/${r}/run`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getScheduleRuns(e,t,r,n){let i={limit:n?.limit??20};return n?.nextKey&&(i.nextKey=n.nextKey),await this.client.get(`v1/workspaces/${t}/schedules/${r}/runs`,{headers:{Authorization:`Bearer ${e}`},searchParams:i}).json()}static async getAuthenticatedClient(e){let t=await p.getAll(e);return t?{client:new s(void 0,e),accessToken:t.accessToken,workspaceId:t.workspaceId??null}:null}};function Pe(){return process.env.ENTRYDESK_SANDBOX==="true"}function I(){if(!Pe())return null;let s=process.env.ENTRYDESK_SANDBOX_ACCESS_TOKEN?.trim(),e=process.env.ENTRYDESK_SANDBOX_WORKSPACE_ID?.trim();if(!s||!e){let t=[];throw s||t.push("ENTRYDESK_SANDBOX_ACCESS_TOKEN"),e||t.push("ENTRYDESK_SANDBOX_WORKSPACE_ID"),new Error(`Sandbox mode enabled but missing credentials: ${t.join(", ")}`)}return{accessToken:s,workspaceId:e}}function L(){let s=process.env.ENTRYDESK_TOKEN?.trim();if(!s)return null;let e=process.env.ENTRYDESK_WORKSPACE_ID?.trim();if(!e)throw new Error("ENTRYDESK_TOKEN is set but ENTRYDESK_WORKSPACE_ID is missing. Both are required for PAT authentication.");return{accessToken:s,workspaceId:e}}function rt(){let s=I();if(s)return{authSource:"sandbox-env",label:"sandbox environment (ENTRYDESK_SANDBOX)",workspaceId:s.workspaceId};let e=L();return e?{authSource:"pat-env",label:"personal access token (ENTRYDESK_TOKEN)",workspaceId:e.workspaceId}:null}import{execFile as Re}from"child_process";import{setTimeout as Se}from"timers/promises";import{decodeJwt as Ae}from"jose";import $e,{HTTPError as be,isHTTPError as Te}from"ky";function te(s){if(s===null||typeof s!="object")return{error:""};let e=s;return{code:typeof e.code=="string"?e.code:void 0,error:typeof e.error=="string"?e.error:""}}var _="entrydesk-cli",Ee="offline_access workspaces:read tasks:read tasks:write tasks:delete agents:read agents:write connectors:read connectors:write tools:read tools:execute skills:read skills:write meetings:read meetings:write workflows:read workflows:write notifications:read notifications:write publishes:read publishes:write calendar:read calendar:write schedules:read schedules:write user:read user:write";function Ce(s){return new Promise((e,t)=>{let r=process.platform,n,i;switch(r){case"darwin":n="open",i=[s];break;case"win32":n="cmd",i=["/c","start","",s];break;default:n="xdg-open",i=[s];break}Re(n,i,o=>{o?t(new Error(`Failed to open browser. Please manually visit: ${s}`,{cause:o})):e()})})}async function ut(s){let e=B(),t=re(),r=K(),n=process.env.NODE_TLS_REJECT_UNAUTHORIZED;r.ignoreSslErrors&&(process.env.NODE_TLS_REJECT_UNAUTHORIZED="0",console.error("WARNING: SSL certificate validation is disabled globally for this process during the login flow. All connections in this process will skip TLS verification. Only use ENTRYDESK_IGNORE_SSL_ERRORS for local development."));try{let i=$e.create({baseUrl:e.replace(/\/?$/,"/"),timeout:3e4,hooks:{beforeError:[({error:c})=>(Te(c)&&(c.request.headers.delete("authorization"),c.request.headers.delete("Authorization")),c)]}}),o;try{o=await i.post("v1/oauth/device/code",{json:{client_id:_,scope:Ee}}).json()}catch(c){let w=c instanceof Error?c:new Error("Failed to request device code");throw s?.onError?.(w),w}let{device_code:R,user_code:u,expires_in:ae,interval:ce}=o,V=new URL("/oauth/device",t);V.searchParams.set("user_code",u);let X=V.toString();s?.onDeviceCodeReceived?.(u,X),s?.onBrowserOpening?.();try{await Ce(X)}catch(c){process.env.DEBUG&&console.error("[DEBUG] Failed to open browser:",c)}s?.onWaitingForAuthorization?.();let Z=Math.max(ce,5)*1e3,le=Date.now()+ae*1e3;for(;Date.now()<le;){await Se(Z);try{let c=await i.post("v1/oauth/token",{json:{grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:R,client_id:_}}).json();s?.onAuthorized?.();let w={};try{w=Ae(c.access_token)}catch{}return{accessToken:c.access_token,refreshToken:c.refresh_token??void 0,email:w.email||"",scopes:c.scope.split(" ").filter(D=>D.length>0)}}catch(c){if(c instanceof be){let{code:D,error:ge}=te(c.data),z=D||ge;if(!z)continue;switch(z){case"authorization_pending":continue;case"slow_down":Z+=5e3;continue;case"access_denied":throw new Error("Authorization denied by user",{cause:c});case"expired_token":throw new Error("Device code expired. Please try again.",{cause:c});default:throw new Error(`Authorization failed: ${z||"Unknown error"}`,{cause:c})}}let w=c instanceof Error?c:new Error("Unknown error during authorization");throw s?.onError?.(w),w}}throw new Error("Device code expired. Please try again.")}finally{n===void 0?delete process.env.NODE_TLS_REJECT_UNAUTHORIZED:process.env.NODE_TLS_REJECT_UNAUTHORIZED=n}}function Be(s){if(s instanceof xe){let e=s.response.status;return e===400||e===401}return!1}var h=class extends Error{code;constructor(e,t){super(t),this.code=e}};function Ke(s){try{let e=s.split(".");if(e.length<2)return null;let t=e[1].replace(/-/g,"+").replace(/_/g,"/"),r=(4-t.length%4)%4,n=t.padEnd(t.length+r,"="),i=Buffer.from(n,"base64").toString("utf8");return JSON.parse(i)}catch{return null}}function Ie(s,e=300){let r=Ke(s)?.exp;if(typeof r!="number")return!1;let n=Math.floor(Date.now()/1e3);return r-n<=e}async function se(s){let e=s.accessToken;if(!Ie(e))return e;if(!s.refreshToken)throw await p.clear(),new h("session-expired","Session expired. Please run `entrydesk login` again.");let t=s.refreshToken;try{let n=await new x().refreshOAuthToken({refreshToken:t,clientId:_}),i=await p.getAll();return i?.accessToken&&i.refreshToken&&i.refreshToken!==t?i.accessToken:(await p.saveAll({...i??s,accessToken:n.access_token,refreshToken:n.refresh_token??i?.refreshToken??t}),n.access_token)}catch(r){if(!Be(r))throw new h("refresh-failed","Could not refresh your session (auth server unreachable). Please try again.");let n=await p.getAll();if(n?.accessToken&&n.refreshToken&&n.refreshToken!==t)return n.accessToken;throw await p.clear(),new h("session-expired","Session expired. Please run `entrydesk login` again.")}}async function wt(){let s=I();if(s)return s.accessToken;let e=await p.getAll();if(!e?.accessToken)throw new h("not-logged-in","Not logged in. Run `entrydesk login` first.");return se(e)}async function kt(){let s=I();if(s)return{accessToken:s.accessToken,workspaceId:s.workspaceId};let e=L();if(e)return e;let t=await p.getAll();if(!t?.accessToken)throw new h("not-logged-in","Not logged in. Run `entrydesk login` first.");if(!t.workspaceId)throw new h("no-workspace","No workspace selected. Run `entrydesk workspaces` first.");return{accessToken:await se(t),workspaceId:t.workspaceId}}var f=class extends Error{constructor(t,r=1,n){super(t);this.exitCode=r;this.cause=n;this.name="CLIError"}exitCode;cause};function St(s){let e=!!process.env.DEBUG;if(s instanceof f&&(console.error(`Error: ${s.message}`),s.cause&&(console.error(`Cause: ${s.cause.message}`),e&&s.cause.stack&&console.error(s.cause.stack)),process.exit(s.exitCode)),s instanceof h&&(console.error(s.message),e&&s.stack&&console.error(s.stack),process.exit(1)),s instanceof Ue&&(console.error("Request timed out. Please check your connection and try again."),e&&s.stack&&console.error(s.stack),process.exit(1)),s instanceof _e){let t=s.response.status;console.error(t===401?"Not authorized (401). Your session may have expired \u2014 run `entrydesk login`.":t===403?"Forbidden (403). Your account or token lacks permission for this action. If your token predates a recently added feature, run `entrydesk login` to refresh its scopes; otherwise you may lack permission in this workspace.":`Request failed (${t}): ${s.response.statusText}`),e&&s.stack&&console.error(s.stack),process.exit(1)}s instanceof Error&&(console.error(`Unexpected error: ${s.message}`),e&&s.stack&&console.error(s.stack),process.exit(1)),console.error("An unknown error occurred"),process.exit(1)}var P="default",De=/^[A-Za-z0-9_-]+$/,G=null;function H(){return b.join(Me.homedir(),".entrydesk")}function ie(){return b.join(H(),"profiles")}function oe(){return b.join(H(),"profiles.json")}function U(s){return b.join(ie(),s)}function Y(s){if(!y.existsSync(s))y.mkdirSync(s,{mode:448,recursive:!0});else try{y.chmodSync(s,448)}catch{}}function ze(){Y(H())}function W(){Y(ie())}function je(){let s=oe();try{if(!y.existsSync(s))return null;let e=y.readFileSync(s,"utf-8");return JSON.parse(e)}catch{return null}}function $(s){ze();let e=oe();y.writeFileSync(e,JSON.stringify(s,null,2),{mode:384});try{y.chmodSync(e,384)}catch{}}function Fe(s){let e=s.profiles?.length?Array.from(new Set(s.profiles)):[],t=s.currentProfile&&e.includes(s.currentProfile)?s.currentProfile:e[0]||P;return e.length===0&&e.push(P),e.includes(t)||e.unshift(t),{currentProfile:t,profiles:e}}function C(s){W(),Y(U(s))}function v(){let s=je();if(!s){let t={currentProfile:P,profiles:[P]};return $(t),W(),C(P),t}let e=Fe(s);return(e.currentProfile!==s.currentProfile||e.profiles.length!==s.profiles.length)&&$(e),W(),e}function S(s){if(!s)throw new f("Profile name is required.");if(!De.test(s))throw new f("Invalid profile name. Use letters, numbers, dash, or underscore.")}function E(s,e){if(!s.profiles.includes(e))throw new f(`Profile not found: ${e}`)}function ne(s,e){if(s.profiles.includes(e))throw new f(`Profile already exists: ${e}`)}var a={DEFAULT_PROFILE:P,setOverrideProfile(s){G=s},getOverrideProfile(){return G},getProfileDir(s){return U(s)},getProfileConfigFile(s){return b.join(a.getProfileDir(s),"config.json")},getProfileCredentialsFile(s){return b.join(a.getProfileDir(s),"credentials.json")},getProfileNames(){return[...v().profiles]},getProfileCount(){return a.getProfileNames().length},getCurrentProfileName(){return v().currentProfile},getEffectiveProfileName(s){let e=v(),t=s||G||e.currentProfile;return S(t),E(e,t),t},ensureProfileExists(s){let e=v();S(s),E(e,s)},createProfile(s){S(s);let e=v();ne(e,s);let t={currentProfile:e.currentProfile,profiles:[...e.profiles,s]};$(t),C(s)},deleteProfile(s){S(s);let e=v();if(E(e,s),e.profiles.length===1)throw new f("Cannot delete the last profile.");let t=e.profiles.filter(i=>i!==s),r=e.currentProfile;r===s&&(r=t.includes(P)?P:t[0]),$({currentProfile:r,profiles:t});try{y.rmSync(a.getProfileDir(s),{recursive:!0,force:!0})}catch{}return{currentProfile:r}},renameProfile(s,e){S(s),S(e);let t=v();E(t,s),ne(t,e);let r=U(s),n=U(e);if(y.existsSync(r))try{y.renameSync(r,n)}catch(u){throw new f("Failed to rename profile directory.",1,u)}else C(e);let i=t.profiles.map(u=>u===s?e:u),o=t.currentProfile===s?e:t.currentProfile;return $({currentProfile:o,profiles:i}),{currentProfile:o}},setCurrentProfile(s){S(s);let e=v();E(e,s);let t={currentProfile:s,profiles:e.profiles};$(t),C(s)},ensureProfileDir:C};function Oe(s){let e=a.getEffectiveProfileName(s);return a.getProfileConfigFile(e)}function g(s){let e=Oe(s);try{if(!M.existsSync(e))return{};let t=M.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return{}}}function m(s,e){let t=a.getEffectiveProfileName(e);a.ensureProfileDir(t);let r=a.getProfileConfigFile(t);M.writeFileSync(r,JSON.stringify(s,null,2),{mode:384});try{M.chmodSync(r,384)}catch{}}var J={getApiUrl(s){return g(s).apiUrl??null},setApiUrl(s,e){let t=g(e);t.apiUrl=s,m(t,e)},clearApiUrl(s){let e=g(s);delete e.apiUrl,m(e,s)},getHubUrl(s){return g(s).hubUrl??null},setHubUrl(s,e){let t=g(e);t.hubUrl=s,m(t,e)},getAll(s){return g(s)},setAll(s,e){m(s,e)},set(s,e,t){let r=g(t);r[s]=e,m(r,t)},get(s,e){return g(e)[s]},unset(s,e){let t=g(e);delete t[s],m(t,e)},getDefaultModel(s){return g(s).model?.default??null},setDefaultModel(s,e){let t=g(e);t.model={...t.model,default:s},m(t,e)},getDefaultConnectorIds(s){return g(s).connectors?.defaults??null},setDefaultConnectorIds(s,e){let t=g(e);t.connectors={...t.connectors,defaults:s},m(t,e)},getLocalTools(s){return g(s).localTools??null},setLocalTools(s,e){let t=g(e);t.localTools={...t.localTools,...s},m(t,e)}};var Ne="https://api.entrydesk.com",Le="https://app.entrydesk.com",Ge=3100,We=300*1e3;function q(s){return{apiUrl:J.getApiUrl(s)||process.env.ENTRYDESK_API_URL||Ne,hubUrl:J.getHubUrl(s)||process.env.ENTRYDESK_HUB_URL||Le,mcp:{httpPort:Ge},auth:{loginTimeout:We,ignoreSslErrors:process.env.ENTRYDESK_IGNORE_SSL_ERRORS==="true"||!1}}}function B(s){return q(s).apiUrl}function re(s){return q(s).hubUrl}function K(){return q().auth}export{a,J as b,q as c,B as d,re as e,K as f,p as g,x as h,L as i,rt as j,te as k,_ as l,ut as m,h as n,Ie as o,se as p,wt as q,kt as r,f as s,St as t};
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import{h as c,r as s,t as i}from"./chunk-UXJD5BRR.js";import"./chunk-KURQCTT3.js";async function p(l){try{let n,t;try{let o=await s();n=o.accessToken,t=o.workspaceId}catch(o){let r=o instanceof Error?o.message:"Authentication failed";console.error(r),process.exit(1)}let a=new c,{connectors:e}=await a.getConnectors(n,t);if(l.json){console.log(JSON.stringify(e));return}if(e.length===0){console.log("No connectors found in this workspace.");return}console.log(`Connected Connectors (${e.length}):
3
- `);for(let o of e){let r=o.connected?"connected":"disconnected";console.log(` ${o.name} (${r})`),console.log(` Provider: ${o.provider}`),console.log(` ID: ${o.id}`),console.log("")}}catch(n){i(n)}}export{p as runConnectors};
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- import"./chunk-KURQCTT3.js";var r=[{name:"task",category:"Chat & Tasks",summary:"Send a message or run an interactive task",example:'entrydesk task -m "..." --model <model>'},{name:"tasks",category:"Chat & Tasks",summary:"List, search, or view tasks"},{name:"tool",category:"Chat & Tasks",summary:"List, get, or call MCP tools"},{name:"agents",category:"Build",summary:"List, show, create, publish, and share agents"},{name:"skills",category:"Build",summary:"List, upload, version, toggle, and share skills"},{name:"workflow",category:"Build",summary:"Create, run, and manage workflows"},{name:"meeting",category:"Build",summary:"Meetings, recordings, summaries, transcripts, sharing"},{name:"schedules",category:"Build",summary:"Create and manage scheduled tasks"},{name:"notifications",category:"Build",summary:"List, count, or mark notifications read"},{name:"workspaces",category:"Workspace",summary:"List or switch workspaces"},{name:"models",category:"Workspace",summary:"List available models"},{name:"connectors",category:"Workspace",summary:"List connected connectors"},{name:"usage",category:"Workspace",summary:"Usage: balance, per-user breakdown, CSV export"},{name:"billing",category:"Workspace",summary:"Billing status and invoices"},{name:"budget",category:"Workspace",summary:"View or manage the workspace budget"},{name:"login",category:"Setup",summary:"Authenticate with EntryDesk"},{name:"logout",category:"Setup",summary:"Sign out and clear credentials"},{name:"status",category:"Setup",summary:"Show authentication status"},{name:"profile",category:"Setup",summary:"Manage profiles"},{name:"config",category:"Setup",summary:"Manage CLI configuration"},{name:"mcp-server",category:"Setup",summary:"Start the MCP server (stdio or HTTP)"},{name:"version",category:"Setup",summary:"Show the version number"},{name:"help",category:"Setup",summary:"Show this help"}],m=new Set(["agents","billing","budget","config","meeting","notifications","profile","schedules","skills","task","tasks","tool","usage","workflow","workspaces"]);function n(){let s=["","EntryDesk CLI \u2014 interact with EntryDesk from your terminal","","Usage: entrydesk <command> [options]","Run `entrydesk <command> --help` for a command's options.",""],a=[];for(let e of r)a.includes(e.category)||a.push(e.category);for(let e of a){s.push(`${e}:`);for(let t of r.filter(o=>o.category===e)){let o=` ${t.name.padEnd(14)} ${t.summary}`;s.push(t.example?`${o} \xB7 e.g. ${t.example}`:o)}s.push("")}return s.push("Global Options:"," --json Output JSON for scripting (most commands support it)"," --profile <p> Use a specific profile for this command"," -h, --help Show help (top-level, or for a specific command)","","Examples:",' entrydesk task -m "Summarize my open tasks" --model <model>',' entrydesk meeting transcript <recordingId> | entrydesk task -m "List action items"'," entrydesk agents --mine --json","","Docs: https://entrydesk.com/docs/cli"),s.join(`
3
- `)}function i(){console.log(n())}function c(s){let a=r.find(t=>t.name===s),e=[""];a?e.push(`entrydesk ${a.name} \u2014 ${a.summary}`):e.push(`entrydesk ${s}`),e.push("",`Usage: entrydesk ${s} [options]`,"","Global Options:"," --json Output JSON for scripting (where supported)"," --profile <p> Use a specific profile for this command"," -h, --help Show this help","","Run `entrydesk --help` for the full command list."),console.log(e.join(`
4
- `))}export{r as COMMANDS,m as COMMANDS_WITH_OWN_HELP,n as buildHelpText,c as printCommandHelp,i as printHelp};
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env node
2
- import{h as D,k as I,r as U,t as z}from"./chunk-UXJD5BRR.js";import"./chunk-KURQCTT3.js";import j from"crypto";import v from"fs";import c from"fs/promises";import x from"os";import s from"path";import{Readable as N}from"stream";import{pipeline as E}from"stream/promises";import O from"adm-zip";import A from"archiver";import{isHTTPError as R}from"ky";function g(){console.log(`
3
- Usage: entrydesk skills [list|upload|delete|download|toggle|versions|share] [options]
4
-
5
- Commands:
6
- list List available skills (default)
7
- upload <file.zip> Upload a skill zip file
8
- upload <folder> Upload a skill folder (auto-zipped)
9
- delete <skillId> Delete a skill you own
10
- download <skillId> Download and extract a skill to ./<skill-name>/
11
- toggle <skillId> Enable/disable a skill for yourself (--enable/--disable)
12
- versions <skillId> List a skill's version history
13
- share <skillId> Show or manage sharing (user grants)
14
-
15
- Options:
16
- --me Only list skills created by me
17
- --force Overwrite an existing skill with the same name
18
- --enable / --disable For toggle: turn the skill on/off for yourself
19
- --add-user <userId> For share: grant a user access (use with --role)
20
- --remove-user <userId> For share: revoke a user's access
21
- --role owner|editor|viewer Role for --add-user (default: viewer)
22
- --json Output JSON (for list/upload)
23
- `)}function F(e,r){let i=s.relative(e,r);return i===""||!i.startsWith("..")&&!s.isAbsolute(i)}async function J(e){let r=await c.realpath(e),i=[process.cwd(),x.homedir()];if(!(await Promise.all(i.map(async f=>{try{return await c.realpath(f)}catch{return s.resolve(f)}}))).some(f=>F(f,r)))throw new Error("Invalid upload path: must be within the current directory or your home directory.")}async function T(e){let r=await c.mkdtemp(s.join(x.tmpdir(),"entrydesk-skill-")),i=s.join(r,`${s.basename(e)}.zip`);return await new Promise((p,u)=>{let f=v.createWriteStream(i),k=A("zip",{zlib:{level:9}});f.on("close",()=>p()),f.on("error",u),k.on("error",u),k.pipe(f),k.directory(e,!1),k.finalize()}),{zipPath:i,cleanupDir:r}}function K(e){console.log(`Versions (${e.length}):
24
- `);for(let r of e){let i=new Date(r.createdAt).toLocaleString();if(console.log(` v${r.versionNumber} \xB7 ${i}`),r.description){let p=r.description.length>100?`${r.description.slice(0,100)}...`:r.description;console.log(` ${p}`)}console.log(` Version ID: ${r.id}`),console.log("")}}function V(e){if(console.log(`User grants (${e.grants.length}):`),e.grants.length===0){console.log(" (none)");return}for(let r of e.grants)console.log(` - ${r.user.name} <${r.user.email}> \xB7 ${r.role}`),console.log(` ID: ${r.userId}`)}async function oe(e){if(e.help){g();return}let r,i;try{let o=await U();r=o.accessToken,i=o.workspaceId}catch(o){z(o)}let p=e.action||"list",u=new D;if(p==="upload"){let o=e.configKey;o||(console.error("Missing file path."),g(),process.exit(1));let n=s.resolve(o),t;try{t=await c.stat(n)}catch{console.error(`File not found: ${n}`),process.exit(1)}let a=n,y=null;try{try{await J(n)}catch(d){let l=d instanceof Error?d.message:"Invalid upload path.";console.error(l),process.exit(1)}if(t.isDirectory()){let d=await T(n);a=d.zipPath,y=d.cleanupDir}else t.isFile()||(console.error(`Not a file or directory: ${n}`),process.exit(1));s.extname(a).toLowerCase()!==".zip"&&(console.error("Only .zip files are supported for upload."),process.exit(1));let $=await c.readFile(a),m=new FormData;m.append("file",new Blob([$],{type:"application/zip"}),s.basename(a)),e.force&&m.append("force","true");let w;try{w=await u.uploadSkill(r,i,m)}catch(d){if(R(d)&&d.response.status===409){let{code:l}=I(d.data);l==="skill_name_conflict"?console.error("Upload failed: A skill with this name is owned by another user."):(console.error("Upload failed: A skill with this name already exists."),console.error("Use --force to overwrite the existing skill.")),process.exit(1)}throw d}if(e.json){console.log(JSON.stringify(w));return}console.log(`Uploaded skill: ${w.name}`),console.log(` ID: ${w.id}`),console.log(` Version ID: ${w.versionId}`),console.log(` Description: ${w.description}`);return}finally{y&&await c.rm(y,{recursive:!0,force:!0})}}if(p==="toggle"){let o=e.configKey;o||(console.error("Missing skill ID."),g(),process.exit(1)),e.enable===e.disable&&(console.error("Pass exactly one of --enable or --disable."),process.exit(1));let n=!!e.enable,t=await u.updateSkillPreference(r,i,o,n);if(e.json){console.log(JSON.stringify(t));return}console.log(`${t.isEnabled?"Enabled":"Disabled"} skill for you: ${o}`);return}if(p==="versions"){let o=e.configKey;o||(console.error("Missing skill ID."),g(),process.exit(1));let n=await u.getSkillVersions(r,i,o);if(e.json){console.log(JSON.stringify(n));return}if(n.versions.length===0){console.log("No versions for this skill.");return}K(n.versions);return}if(p==="share"){let o=e.configKey;o||(console.error("Missing skill ID."),g(),process.exit(1));let n=e.role??"viewer";if(e.addUser){let a=await u.upsertSkillGrant(r,i,o,e.addUser,n);if(e.json){console.log(JSON.stringify(a));return}console.log(`Granted ${n} to user ${e.addUser}`);return}if(e.removeUser){if(await u.removeSkillGrant(r,i,o,e.removeUser),e.json){console.log(JSON.stringify({userId:e.removeUser,removed:!0}));return}console.log(`Revoked access for user ${e.removeUser}`);return}let t=await u.getSkillGrants(r,i,o);if(e.json){console.log(JSON.stringify(t));return}V(t);return}if(p==="delete"){let o=e.configKey;o||(console.error("Missing skill ID."),g(),process.exit(1)),await u.deleteSkill(r,i,o),console.log(`Deleted skill: ${o}`);return}if(p==="download"){let o=e.configKey;o||(console.error("Missing skill ID."),g(),process.exit(1));let{url:n,name:t}=await u.downloadSkillCurrent(r,i,o);(t.includes("/")||t.includes(s.sep)||t==="."||t===".."||!t)&&(console.error(`Invalid skill name for output directory: ${t}`),process.exit(1));let a=s.resolve(t),y=await c.mkdtemp(s.join(x.tmpdir(),"entrydesk-skill-download-")),$=s.join(y,`${t}.zip`);try{let m=await fetch(n);if(!m.ok)throw new Error(`Failed to download skill zip: ${m.status} ${m.statusText}`);if(!m.body)throw new Error("Response body is empty");let w=v.createWriteStream($);await E(N.fromWeb(m.body),w);let d=await c.mkdtemp(s.join(s.dirname(a),".entrydesk-skill-extract-")),l=null;try{e.json||console.log("Extracting...");let b=new O($),P=s.resolve(d)+s.sep;for(let h of b.getEntries()){if(h.isDirectory)continue;let S=s.resolve(d,h.entryName);if(!S.startsWith(P))throw new Error(`Zip entry contains path traversal: ${h.entryName}`);await c.mkdir(s.dirname(S),{recursive:!0}),await c.writeFile(S,h.getData())}v.existsSync(a)&&(l=s.join(s.dirname(a),`.entrydesk-backup-${j.randomUUID()}`),e.json||console.log(`Replacing existing directory: ${a}`),await c.rename(a,l));try{await c.rename(d,a),l&&v.existsSync(l)&&(await c.rm(l,{recursive:!0,force:!0}),l=null)}catch(h){throw l&&v.existsSync(l)&&(await c.rename(l,a),l=null),h}}catch(b){if(await c.rm(d,{recursive:!0,force:!0}),l&&v.existsSync(l))try{await c.rename(l,a)}catch{console.error(`Warning: Could not restore backup. Your original files are at: ${l}`)}throw b}if(e.json){console.log(JSON.stringify({skillId:o,skillName:t,outputDir:a}));return}console.log(`Downloaded skill "${t}" to ${a}`)}finally{await c.rm(y,{recursive:!0,force:!0})}return}p!=="list"&&(console.error(`Unknown skills command: ${p}`),g(),process.exit(1));let f=[],k;do{let o=await u.listAvailableSkills(r,i,{createdBy:e.createdBy,nextKey:k,limit:100});f.push(...o.skills),k=o.nextKey}while(k);if(e.json){console.log(JSON.stringify(f));return}if(f.length===0){console.log("No skills found in this workspace.");return}console.log(`Available Skills (${f.length}):
25
- `);for(let o of f)console.log(` ${o.name} (${o.provider})`),console.log(` ${o.description.slice(0,120)}`),console.log(` ID: ${o.id}`),console.log(` Author: ${o.author.name}`),console.log("")}export{g as printSkillsUsage,oe as runSkills};