@entrydesk/cli 1.14.0 → 1.15.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 (27) hide show
  1. package/dist/{agents-TARZZ62G.js → agents-4MAYCYII.js} +1 -1
  2. package/dist/{budget-XBWKWNB2.js → budget-OCA7COIH.js} +1 -1
  3. package/dist/chunk-X2E25QKV.js +4 -0
  4. package/dist/{config-LWO7CQLZ.js → config-GF6YLPEC.js} +1 -1
  5. package/dist/{config-ESK6NTS2.js → config-TLCJ3DKQ.js} +1 -1
  6. package/dist/{config-help-HI4DZEFV.js → config-help-3ZC2QDFF.js} +1 -1
  7. package/dist/{connectors-GK2PHHPP.js → connectors-QVMV4D74.js} +1 -1
  8. package/dist/{help-SWG6TVZE.js → help-XCWJ6ETB.js} +15 -0
  9. package/dist/index.js +1 -1
  10. package/dist/{login-K4YOI227.js → login-QL2PNBCC.js} +1 -1
  11. package/dist/{logout-N3WQ7RMN.js → logout-WHLHWAOG.js} +1 -1
  12. package/dist/{mcp-7EB6ETN5.js → mcp-XHQZ7RSD.js} +1 -1
  13. package/dist/{meeting-EBFZOMXT.js → meeting-J4GM3SHA.js} +28 -14
  14. package/dist/{models-HRVZ5J2G.js → models-P5FK3AEB.js} +1 -1
  15. package/dist/{profile-VHHFZKJO.js → profile-C5ZFUCGW.js} +1 -1
  16. package/dist/{schedules-DGPWNY6X.js → schedules-BFWTORX7.js} +1 -1
  17. package/dist/{skills-Q7SGQIS6.js → skills-INANSY4X.js} +1 -1
  18. package/dist/{status-BFUFZRDY.js → status-V7P6ZFPP.js} +1 -1
  19. package/dist/{task-6L2JLCH2.js → task-KOLFLIIS.js} +2 -2
  20. package/dist/{tasks-DO7J2KSF.js → tasks-BVOO6HAB.js} +1 -1
  21. package/dist/{tool-UQDP2DFY.js → tool-2VQDHUYB.js} +1 -1
  22. package/dist/{usage-6MSX36WF.js → usage-DWWIGFAW.js} +1 -1
  23. package/dist/{version-2AFS3STR.js → version-4GNZVX2D.js} +1 -1
  24. package/dist/workflow-AJAN4DMK.js +62 -0
  25. package/dist/{workspaces-4X36ZVUA.js → workspaces-OOCLE4MU.js} +1 -1
  26. package/package.json +3 -3
  27. package/dist/chunk-XWM2TUUW.js +0 -4
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{h as n,q as t,s as l}from"./chunk-XWM2TUUW.js";import"./chunk-KURQCTT3.js";async function p(c){try{let e,r;try{let o=await t();e=o.accessToken,r=o.workspaceId}catch(o){let a=o instanceof Error?o.message:"Authentication failed";console.error(a),process.exit(1)}let i=new n,{models:s}=await i.getModels(e,r);if(c.json){console.log(JSON.stringify(s));return}if(s.length===0){console.log("No models available in this workspace.");return}console.log(`Available Models (${s.length}):
2
+ import{h as n,q as t,s as l}from"./chunk-X2E25QKV.js";import"./chunk-KURQCTT3.js";async function p(c){try{let e,r;try{let o=await t();e=o.accessToken,r=o.workspaceId}catch(o){let a=o instanceof Error?o.message:"Authentication failed";console.error(a),process.exit(1)}let i=new n,{models:s}=await i.getModels(e,r);if(c.json){console.log(JSON.stringify(s));return}if(s.length===0){console.log("No models available in this workspace.");return}console.log(`Available Models (${s.length}):
3
3
  `);for(let o of s)console.log(` ${o.name}`),o.description&&console.log(` ${o.description.slice(0,80)}`),console.log(` ID: ${o.id}`),console.log("")}catch(e){l(e)}}export{p as runModels};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{a as t,b as a,g as m,r as f,s as d}from"./chunk-XWM2TUUW.js";import"./chunk-KURQCTT3.js";function P(){console.log(`
2
+ import{a as t,b as a,g as m,r as f,s as d}from"./chunk-X2E25QKV.js";import"./chunk-KURQCTT3.js";function P(){console.log(`
3
3
  Usage: entrydesk profile [list|show|current|create|use|delete|rename|clone] [args]
4
4
 
5
5
  Commands:
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{h as f,q as m,s as p}from"./chunk-XWM2TUUW.js";import"./chunk-KURQCTT3.js";function d(){console.log(`
2
+ import{h as f,q as m,s as p}from"./chunk-X2E25QKV.js";import"./chunk-KURQCTT3.js";function d(){console.log(`
3
3
  Usage: entrydesk schedules [list|get|create|delete] [options]
4
4
 
5
5
  Commands:
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{h as S,j as z,q as I,s as P}from"./chunk-XWM2TUUW.js";import"./chunk-KURQCTT3.js";import A from"crypto";import g from"fs";import i from"fs/promises";import b from"os";import o from"path";import{Readable as j}from"stream";import{pipeline as E}from"stream/promises";import N from"adm-zip";import O from"archiver";import{isHTTPError as T}from"ky";function x(){console.log(`
2
+ import{h as S,j as z,q as I,s as P}from"./chunk-X2E25QKV.js";import"./chunk-KURQCTT3.js";import A from"crypto";import g from"fs";import i from"fs/promises";import b from"os";import o from"path";import{Readable as j}from"stream";import{pipeline as E}from"stream/promises";import N from"adm-zip";import O from"archiver";import{isHTTPError as T}from"ky";function x(){console.log(`
3
3
  Usage: entrydesk skills [list|upload|delete|download] [options]
4
4
 
5
5
  Commands:
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{a as c,b as i,g as a,h as g,i as f,m as p,p as d,s as u}from"./chunk-XWM2TUUW.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,i as f,m as p,p as d,s as u}from"./chunk-X2E25QKV.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,m as Je,p as an,q as Me,s as cn}from"./chunk-XWM2TUUW.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),To=`## Filesystem Tool Instructions
2
+ import{a as ie,b as fe,c as Bt,g as rt,h as pe,m as Je,p as an,q as Me,s as cn}from"./chunk-X2E25QKV.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),To=`## 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);H(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]),H=a.some(b=>b.status==="uploading"),k=a.length>0;return{pendingFiles:a,addFile:h,removeFile:O,clearFiles:$,getUploadedFileIds:P,hasUploadingFiles:H,hasFiles:k}}import{jsx as q,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=qn(s,l),{state:$,setState:P,messages:H,setMessages:k,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:T}=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:k,setState:P,setCurrentResponse:B,setCredentials:p,setHasPersistedTask:le,getFileIds:_e,clearFiles:mt}),Le=sn(c=>{T(c),B("")},[T]),[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:Te,selectedCapabilities:Se,deleteConfirmMode:Ne,handleInputChange:qe,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:H,hasPersistedTask:J,setHasPersistedTask:le,setMessages:k,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(),ke=h.current;h.current=Z,!(!ke||Z-ke>us)&&(xe||Fe||(h.current=null,ve&&mt(),b.length>0&&qe("")))},{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(ke=>ke.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:[q(F,{children:w}),se(ye,{children:[q(F,{color:"cyan",children:q(on,{type:"dots"})}),q(F,{children:" Initializing task..."})]})]});if($.status==="not-logged-in")return se(ye,{flexDirection:"column",children:[q(F,{children:w}),q(F,{color:"yellow",children:"Not logged in"}),q(F,{dimColor:!0,children:"Run `entrydesk login` to authenticate first."})]});if($.status==="no-workspace")return se(ye,{flexDirection:"column",children:[q(F,{children:w}),q(F,{color:"yellow",children:"No workspace selected"}),q(F,{dimColor:!0,children:"Run `entrydesk workspaces` to select a workspace first."})]});if($.status==="no-model")return se(ye,{flexDirection:"column",children:[q(F,{children:w}),q(F,{color:"yellow",children:"No model or agent specified"}),s&&q(F,{dimColor:!0,children:"Could not determine the model used in this task."}),q(F,{dimColor:!0,children:"Please specify a model with --model or use an agent with -a."}),q(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:[q(F,{children:w}),se(F,{color:"red",children:["Error: ",$.message]}),q(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 Te;if(xe==="capabilities")return Se})();return se(ye,{flexDirection:"column",children:[se(ye,{marginBottom:1,flexDirection:"column",children:[q(F,{children:w}),se(ye,{children:[q(F,{bold:!0,color:"cyan",children:Q?`Continuing: ${Q}`:"EntryDesk CLI"}),se(F,{dimColor:!0,children:[" v","1.14.0"]}),o&&se(F,{color:"magenta",children:[" [",f,"]"]}),q(F,{dimColor:!0,children:" (type /help for commands)"})]})]}),H.map((c,A)=>{let Z=c.parts&&C?Ke(c.parts,!0):c.content,ke=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:ke,children:[M,":"]}),q(Xt,{text:Z})]},A)}),E&&se(ye,{flexDirection:"column",marginBottom:1,children:[q(F,{bold:!0,color:"blue",children:"Assistant:"}),q(Xt,{text:E})]}),$.status==="ready"&&q(kn,{suggestions:st,activeIndex:ze,visible:Fe}),$.status==="ready"&&xe&&q(Tn,{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:[q(F,{color:"cyan",children:q(on,{type:"dots"})}),q(F,{children:" Thinking..."})]}):$.status==="ready"&&!xe?se(ye,{flexDirection:"column",children:[Ne&&q(ye,{marginBottom:1,children:q(F,{color:"yellow",children:"\u26A0\uFE0F Delete this task? (y/N) "})}),ve&&!Ne&&se(ye,{marginBottom:1,flexDirection:"row",gap:1,children:[q(F,{dimColor:!0,children:"Attachments:"}),me.map((c,A)=>se(F,{children:[c.status==="uploading"?se(F,{color:"yellow",children:[q(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&&q(F,{children:", "})]},c.id))]}),se(ye,{children:[q(F,{color:"green",children:"> "}),q(_n,{value:b,onChange:qe,onSubmit:ht,onPaste:We,leadingOffset:2,multiline:!0})]})]}):null,se(ye,{marginTop:1,flexDirection:"column",children:[se(ye,{gap:2,children:[se(F,{children:[q(F,{dimColor:!0,children:"Model: "}),q(F,{color:"magenta",children:ce?m?.model?.name||"loading...":ne.find(c=>c.id===oe)?.name||oe||"none"})]}),se(F,{children:[q(F,{dimColor:!0,children:"Connectors: "}),q(F,{color:"cyan",children:Ot})]}),se(F,{children:[q(F,{dimColor:!0,children:"Capabilities: "}),q(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";async function gs(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf8").trim()}async function hs(e,t,n,s){if(s<1)return console.error("Task number must be 1 or greater"),null;let{tasks:l}=await e.getTasks(t,n,20);if(l.length===0)return console.error("No tasks found. Start a new task first."),null;if(s>l.length)return console.error(`Task number ${s} not found. You have ${l.length} recent tasks.`),console.error("Use `entrydesk tasks` to see available tasks."),null;let a=l[s-1],g;if(!a.agentId){let{messages:y}=await e.getMessages(t,n,a.id,10);g=y.find(h=>h.role==="assistant"&&h.modelId)?.modelId}return{task:a,modelId:g}}var Ve="\x1B[2m",we="\x1B[0m",ln="\x1B[36m",Rt="\x1B[33m",Nt="\x1B[32m",fo="stream-json";function ys(e,t,n,s){e&&t&&(console.error(`Error: Cannot use both ${n} and ${s}`),process.exit(1))}function At(e,t){let n=t===void 0?{event:e}:{event:e,data:t};process.stdout.write(`${JSON.stringify(n)}
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=qn(s,l),{state:$,setState:P,messages:H,setMessages:k,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:T}=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:k,setState:P,setCurrentResponse:B,setCredentials:p,setHasPersistedTask:le,getFileIds:_e,clearFiles:mt}),Le=sn(c=>{T(c),B("")},[T]),[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:Te,selectedCapabilities:Se,deleteConfirmMode:Ne,handleInputChange:qe,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:H,hasPersistedTask:J,setHasPersistedTask:le,setMessages:k,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(),ke=h.current;h.current=Z,!(!ke||Z-ke>us)&&(xe||Fe||(h.current=null,ve&&mt(),b.length>0&&qe("")))},{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(ke=>ke.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:[q(F,{children:w}),se(ye,{children:[q(F,{color:"cyan",children:q(on,{type:"dots"})}),q(F,{children:" Initializing task..."})]})]});if($.status==="not-logged-in")return se(ye,{flexDirection:"column",children:[q(F,{children:w}),q(F,{color:"yellow",children:"Not logged in"}),q(F,{dimColor:!0,children:"Run `entrydesk login` to authenticate first."})]});if($.status==="no-workspace")return se(ye,{flexDirection:"column",children:[q(F,{children:w}),q(F,{color:"yellow",children:"No workspace selected"}),q(F,{dimColor:!0,children:"Run `entrydesk workspaces` to select a workspace first."})]});if($.status==="no-model")return se(ye,{flexDirection:"column",children:[q(F,{children:w}),q(F,{color:"yellow",children:"No model or agent specified"}),s&&q(F,{dimColor:!0,children:"Could not determine the model used in this task."}),q(F,{dimColor:!0,children:"Please specify a model with --model or use an agent with -a."}),q(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:[q(F,{children:w}),se(F,{color:"red",children:["Error: ",$.message]}),q(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 Te;if(xe==="capabilities")return Se})();return se(ye,{flexDirection:"column",children:[se(ye,{marginBottom:1,flexDirection:"column",children:[q(F,{children:w}),se(ye,{children:[q(F,{bold:!0,color:"cyan",children:Q?`Continuing: ${Q}`:"EntryDesk CLI"}),se(F,{dimColor:!0,children:[" v","1.15.0"]}),o&&se(F,{color:"magenta",children:[" [",f,"]"]}),q(F,{dimColor:!0,children:" (type /help for commands)"})]})]}),H.map((c,A)=>{let Z=c.parts&&C?Ke(c.parts,!0):c.content,ke=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:ke,children:[M,":"]}),q(Xt,{text:Z})]},A)}),E&&se(ye,{flexDirection:"column",marginBottom:1,children:[q(F,{bold:!0,color:"blue",children:"Assistant:"}),q(Xt,{text:E})]}),$.status==="ready"&&q(kn,{suggestions:st,activeIndex:ze,visible:Fe}),$.status==="ready"&&xe&&q(Tn,{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:[q(F,{color:"cyan",children:q(on,{type:"dots"})}),q(F,{children:" Thinking..."})]}):$.status==="ready"&&!xe?se(ye,{flexDirection:"column",children:[Ne&&q(ye,{marginBottom:1,children:q(F,{color:"yellow",children:"\u26A0\uFE0F Delete this task? (y/N) "})}),ve&&!Ne&&se(ye,{marginBottom:1,flexDirection:"row",gap:1,children:[q(F,{dimColor:!0,children:"Attachments:"}),me.map((c,A)=>se(F,{children:[c.status==="uploading"?se(F,{color:"yellow",children:[q(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&&q(F,{children:", "})]},c.id))]}),se(ye,{children:[q(F,{color:"green",children:"> "}),q(_n,{value:b,onChange:qe,onSubmit:ht,onPaste:We,leadingOffset:2,multiline:!0})]})]}):null,se(ye,{marginTop:1,flexDirection:"column",children:[se(ye,{gap:2,children:[se(F,{children:[q(F,{dimColor:!0,children:"Model: "}),q(F,{color:"magenta",children:ce?m?.model?.name||"loading...":ne.find(c=>c.id===oe)?.name||oe||"none"})]}),se(F,{children:[q(F,{dimColor:!0,children:"Connectors: "}),q(F,{color:"cyan",children:Ot})]}),se(F,{children:[q(F,{dimColor:!0,children:"Capabilities: "}),q(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";async function gs(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf8").trim()}async function hs(e,t,n,s){if(s<1)return console.error("Task number must be 1 or greater"),null;let{tasks:l}=await e.getTasks(t,n,20);if(l.length===0)return console.error("No tasks found. Start a new task first."),null;if(s>l.length)return console.error(`Task number ${s} not found. You have ${l.length} recent tasks.`),console.error("Use `entrydesk tasks` to see available tasks."),null;let a=l[s-1],g;if(!a.agentId){let{messages:y}=await e.getMessages(t,n,a.id,10);g=y.find(h=>h.role==="assistant"&&h.modelId)?.modelId}return{task:a,modelId:g}}var Ve="\x1B[2m",we="\x1B[0m",ln="\x1B[36m",Rt="\x1B[33m",Nt="\x1B[32m",fo="stream-json";function ys(e,t,n,s){e&&t&&(console.error(`Error: Cannot use both ${n} and ${s}`),process.exit(1))}function At(e,t){let n=t===void 0?{event:e}:{event:e,data:t};process.stdout.write(`${JSON.stringify(n)}
170
170
  `)}function Dt(e,t){if(t)return e;let n=e.split(`
171
171
  `);if(n.length<=20)return e;let s=n.slice(0,5),l=n.slice(-5),a=n.length-10;return[...s,`${Ve}... (${a} lines omitted, use --full-output to see all) ...${we}`,...l].join(`
172
172
  `)}function ws(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}function po(e,t){if(!e)return"(no result)";if(typeof e!="object")return Dt(String(e),t);let n=e;if("structuredContent"in n&&n.structuredContent){let s=n.structuredContent,l=[];if(s.stdout&&typeof s.stdout=="string"&&s.stdout.trim()&&l.push(s.stdout.trim()),s.stderr&&typeof s.stderr=="string"&&s.stderr.trim()&&l.push(`${Rt}[stderr]${we} ${s.stderr.trim()}`),s.urls&&Array.isArray(s.urls)){let a=s.urls;for(let g of a)g.path&&g.url&&l.push(`${g.path}: ${g.url}`)}return l.length===0&&l.push(JSON.stringify(s,null,2)),Dt(l.join(`
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{h as A,p as I,q as b,s as O}from"./chunk-XWM2TUUW.js";import"./chunk-KURQCTT3.js";var $="\x1B[2m",a="\x1B[0m",d="\x1B[36m",w="\x1B[33m",R="\x1B[32m",v="stream-json";function f(e,s){let o=s===void 0?{event:e}:{event:e,data:s};process.stdout.write(`${JSON.stringify(o)}
2
+ import{h as A,p as I,q as b,s as O}from"./chunk-X2E25QKV.js";import"./chunk-KURQCTT3.js";var $="\x1B[2m",a="\x1B[0m",d="\x1B[36m",w="\x1B[33m",R="\x1B[32m",v="stream-json";function f(e,s){let o=s===void 0?{event:e}:{event:e,data:s};process.stdout.write(`${JSON.stringify(o)}
3
3
  `)}function S(e){let s=new Date(e),t=new Date().getTime()-s.getTime(),n=Math.floor(t/(1e3*60*60*24));return n===0?s.toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"}):n===1?"Yesterday":n<7?`${n} days ago`:s.toLocaleDateString("en-US",{month:"short",day:"numeric"})}function y(e,s){if(s)return e;let o=e.split(`
4
4
  `);if(o.length<=15)return e;let t=o.slice(0,6),n=o.slice(-4),i=o.length-10;return[...t,`... (${i} lines omitted, use --full-output to see all) ...`,...n].join(`
5
5
  `)}function N(e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(N);let s={};for(let[o,t]of Object.entries(e))typeof t=="string"&&t.length>200?s[o]=t.slice(0,150)+"... (truncated)":typeof t=="object"&&t!==null?s[o]=N(t):s[o]=t;return s}function j(e){if(!e||typeof e!="object")return String(e);try{return JSON.stringify(e,null,2)}catch{return String(e)}}function E(e,s){if(!e)return"(no result)";if(typeof e!="object")return y(String(e),s);let o=s?e:N(e);if("structuredContent"in o&&o.structuredContent){let t=o.structuredContent,n=[];if(t.stdout&&typeof t.stdout=="string"&&t.stdout.trim()&&n.push(t.stdout.trim()),t.stderr&&typeof t.stderr=="string"&&t.stderr.trim()&&n.push(`${w}[stderr]${a} ${t.stderr.trim()}`),t.urls&&Array.isArray(t.urls)){let i=t.urls;for(let r of i)r.path&&r.url&&n.push(`${r.path}: ${r.url}`)}return n.length===0&&n.push(JSON.stringify(t,null,2)),y(n.join(`
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{c as S,q as _}from"./chunk-XWM2TUUW.js";import"./chunk-KURQCTT3.js";import B from"fs";import{Client as L}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as x}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 x(s,{requestInit:{headers:{Authorization:`Bearer ${n}`}}});return await i.connect(r),i}async function T(){return A()}import h from"fs/promises";import v 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":""},D=10*1024,O=8*1024,I=2*1024,P=100,b=100;function M(){return d.join(v.homedir(),".entrydesk","tool-results")}function F(e){let t=e.trim().replace(/[/\\:*?"<>|\s]/g,"_").replace(/_+/g,"_").replace(/^[._]+|[._]+$/g,"").slice(0,P);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 U(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=M();await h.mkdir(n,{recursive:!0});let o=U(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<=b;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<=D)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,q as _}from"./chunk-X2E25QKV.js";import"./chunk-KURQCTT3.js";import B from"fs";import{Client as L}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as x}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 x(s,{requestInit:{headers:{Authorization:`Bearer ${n}`}}});return await i.connect(r),i}async function T(){return A()}import h from"fs/promises";import v 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":""},D=10*1024,O=8*1024,I=2*1024,P=100,b=100;function M(){return d.join(v.homedir(),".entrydesk","tool-results")}function F(e){let t=e.trim().replace(/[/\\:*?"<>|\s]/g,"_").replace(/_+/g,"_").replace(/^[._]+|[._]+$/g,"").slice(0,P);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 U(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=M();await h.mkdir(n,{recursive:!0});let o=U(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<=b;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<=D)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,q as f}from"./chunk-XWM2TUUW.js";import"./chunk-KURQCTT3.js";function U(){console.log(`
2
+ import{h as d,q as f}from"./chunk-X2E25QKV.js";import"./chunk-KURQCTT3.js";function U(){console.log(`
3
3
  Usage: entrydesk usage [options]
4
4
 
5
5
  Options:
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import"./chunk-KURQCTT3.js";function n(){console.log("entrydesk 1.14.0")}export{n as printVersion};
2
+ import"./chunk-KURQCTT3.js";function n(){console.log("entrydesk 1.15.0")}export{n as printVersion};
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+ import{h as u,q as p,s as g}from"./chunk-X2E25QKV.js";import"./chunk-KURQCTT3.js";import{readFileSync as $}from"fs";var k=262144,x=new Set(["completed","failed","cancelled"]);function f(){console.log(`
3
+ Usage: entrydesk workflow [list|get|create|update|run|runs|run-get|share] [options]
4
+
5
+ Commands:
6
+ list List workflows (default)
7
+ get <workflowId> Show workflow details (--show-source for the script)
8
+ create Create a workflow from a local script file
9
+ update <workflowId> Update name/description/script or enable/disable
10
+ run <workflowId> Trigger a run; prints the runId (--wait to follow)
11
+ runs <workflowId> List runs of a workflow
12
+ run-get <workflowId> <runId> Show a run's status, nodes, and logs
13
+ share <workflowId> Show or manage sharing (user grants)
14
+
15
+ List Options:
16
+ --search <text> Search by name
17
+ --limit <number> Max workflows per page (default: 20)
18
+ --next-key <cursor> Fetch next page using cursor
19
+ --all Fetch all workflows (auto-paginate)
20
+
21
+ Create/Update Options:
22
+ --name <text> (required for create)
23
+ --description <text>
24
+ --file <path.js> Script source file (required for create)
25
+ --activate Enable the workflow (update only)
26
+ --deactivate Disable the workflow (update only)
27
+
28
+ Get Options:
29
+ --show-source Print the full script source
30
+
31
+ Run Options:
32
+ --args '<json>' Inline JSON passed to the workflow's args global
33
+ --args-file <path> Read the JSON args from a file
34
+ --wait Poll the run until it finishes, then print the result
35
+
36
+ Share Options:
37
+ --add-user <userId> Grant a user access (use with --role)
38
+ --remove-user <userId> Revoke a user's access
39
+ --role owner|editor|viewer Role for --add-user (default: viewer)
40
+
41
+ Flags:
42
+ --json Output JSON
43
+
44
+ Examples:
45
+ entrydesk workflow list --search report
46
+ entrydesk workflow create --name "Nightly report" --file ./report.js
47
+ entrydesk workflow run <workflowId> --args '{"date":"2026-06-20"}' --wait
48
+ entrydesk workflow runs <workflowId>
49
+ entrydesk workflow run-get <workflowId> <runId>
50
+ entrydesk workflow share <workflowId> --add-user <userId> --role editor
51
+ `)}function a(o){if(!o)return"";let e=new Date(o);return isNaN(e.getTime())?o:e.toLocaleString()}function m(o){let e;try{e=$(o,"utf8")}catch{console.error(`Cannot read script file: ${o}`),process.exit(1)}return e.trim().length===0&&(console.error(`Script file is empty: ${o}`),process.exit(1)),Buffer.byteLength(e,"utf8")>k&&(console.error(`Script file exceeds ${k} bytes.`),process.exit(1)),e}function A(o){o.args!==void 0&&o.argsFile!==void 0&&(console.error("Use only one of --args or --args-file."),process.exit(1));let e;if(o.argsFile!==void 0)try{e=$(o.argsFile,"utf8")}catch{console.error(`Cannot read args file: ${o.argsFile}`),process.exit(1)}else e=o.args;if(e!==void 0)try{return JSON.parse(e)}catch{console.error("--args/--args-file must be valid JSON."),process.exit(1)}}function h(o){console.log(`Workflows (${o.length}):
52
+ `);for(let e of o){let r=e.isActive?"active":"inactive";if(console.log(` ${e.name} (${r})`),e.description){let t=e.description.length>80?`${e.description.slice(0,80)}...`:e.description;console.log(` ${t}`)}console.log(` ${e.myRole??"no-role"} \xB7 ID: ${e.id}`),console.log("")}}function R(o,e){console.log(`${o.name}
53
+ `),console.log(` ID: ${o.id}`),console.log(` Active: ${o.isActive}`),console.log(` My role: ${o.myRole??"no-role"}`),o.description&&console.log(` Description: ${o.description}`),console.log(` Updated: ${a(o.updatedAt)}`);let r=o.scriptSource.split(`
54
+ `).length;e?(console.log(`
55
+ Script (${r} lines):
56
+ `),console.log(o.scriptSource)):console.log(` Script: ${r} lines (use --show-source to print)`)}function y(o){console.log(`Runs (${o.length}):
57
+ `);for(let e of o){let r=a(e.startedAt??e.createdAt);console.log(` ${e.status}${r?` \xB7 ${r}`:""}`),console.log(` ID: ${e.id}`)}}function S(o){console.log(`Run ${o.id}`),console.log(` Workflow: ${o.workflowId}`),console.log(` Status: ${o.status}`),o.startedAt&&console.log(` Started: ${a(o.startedAt)}`),o.completedAt&&console.log(` Completed: ${a(o.completedAt)}`),o.error!=null&&console.log(` Error: ${JSON.stringify(o.error)}`);let e=Object.entries(o.context?.nodes??{});if(e.length>0){console.log(`
58
+ Nodes (${e.length}):`);for(let[t,i]of e){let n=[i.kind??"node",i.status];i.durationMs!=null&&n.push(`${i.durationMs}ms`),console.log(` - ${i.label??t} [${n.join(" \xB7 ")}]`)}}let r=o.context?.logs??[];if(r.length>0){console.log(`
59
+ Logs:`);for(let t of r)console.log(` ${t}`)}o.context?.spent!=null&&console.log(`
60
+ Tokens spent: ${o.context.spent}`)}function v(o){if(console.log(`User grants (${o.grants.length}):`),o.grants.length===0){console.log(" (none)");return}for(let e of o.grants)console.log(` - ${e.user.name} <${e.user.email}> \xB7 ${e.role}`),console.log(` ID: ${e.userId}`)}async function W(o,e,r,t,i){for(let s=0;s<600;s++){let l=await o.getWorkflowRun(e,r,t,i);if(x.has(l.status))return s>0&&process.stderr.write(`
61
+ `),l;let c=s*2;process.stderr.write(`\rWaiting\u2026 ${l.status} (${c}s)`),await new Promise(d=>setTimeout(d,2e3))}throw process.stderr.write(`
62
+ `),new Error(`Run ${i} did not finish within the wait window.`)}async function I(o){let r=[],t;for(let i=0;;i++){i>=100&&(console.error("Reached maximum page limit (100). Use --limit and --next-key for manual pagination."),process.exit(1));let n=await o(t);if(r.push(...n.items),t=n.nextKey,!t)break}return r}async function N(o,e,r,t){if(t.all&&t.nextKey&&(console.error("Cannot use --all and --next-key together."),process.exit(1)),t.all){let s=await I(async l=>{let c=await o.getWorkflows(e,r,{limit:t.limit??20,nextKey:l,search:t.search});return{items:c.workflows,nextKey:c.nextKey}});if(t.json){console.log(JSON.stringify({workflows:s}));return}if(s.length===0){console.log("No workflows found in this workspace.");return}h(s);return}let{workflows:i,nextKey:n}=await o.getWorkflows(e,r,{limit:t.limit,nextKey:t.nextKey,search:t.search});if(t.json){console.log(JSON.stringify({workflows:i,nextKey:n}));return}if(i.length===0){console.log("No workflows found in this workspace.");return}h(i),n&&console.log(`Next page: --next-key ${n}`)}async function O(o,e,r,t){if(!t.workflowId)throw new Error("Missing workflowId for share command");let i=t.workflowId,n=t.role??"viewer";if(t.addUser){let l=await o.upsertWorkflowGrant(e,r,i,t.addUser,n);if(t.json){console.log(JSON.stringify(l));return}console.log(`Granted ${n} to user ${t.addUser}`);return}if(t.removeUser){if(await o.removeWorkflowGrant(e,r,i,t.removeUser),t.json){console.log(JSON.stringify({userId:t.removeUser,removed:!0}));return}console.log(`Revoked access for user ${t.removeUser}`);return}let s=await o.getWorkflowGrants(e,r,i);if(t.json){console.log(JSON.stringify(s));return}v(s)}async function M(o){try{if(o.help){f();return}let{accessToken:e,workspaceId:r}=await p(),t=o.action||"list",i=new u;if(t==="list"){await N(i,e,r,o);return}if(t==="get"){if(!o.workflowId)throw new Error("Missing workflowId for get command");let n=await i.getWorkflow(e,r,o.workflowId);if(o.json){console.log(JSON.stringify(n));return}R(n,!!o.showSource);return}if(t==="create"){(!o.name||!o.file)&&(console.error("create requires --name and --file <path.js>."),f(),process.exit(1));let n=m(o.file),s=await i.createWorkflow(e,r,{name:o.name,description:o.description,scriptSource:n});if(o.json){console.log(JSON.stringify(s));return}console.log(`Created workflow: ${s.name}`),console.log(` ID: ${s.id}`);return}if(t==="update"){if(!o.workflowId)throw new Error("Missing workflowId for update command");o.activate&&o.deactivate&&(console.error("Cannot use --activate and --deactivate together."),process.exit(1));let n={};if(o.name!==void 0&&(n.name=o.name),o.description!==void 0&&(n.description=o.description),o.file!==void 0&&(n.scriptSource=m(o.file)),o.activate&&(n.isActive=!0),o.deactivate&&(n.isActive=!1),Object.keys(n).length===0&&(console.error("No fields provided to update."),f(),process.exit(1)),await i.updateWorkflow(e,r,o.workflowId,n),o.json){console.log(JSON.stringify({id:o.workflowId,updated:!0}));return}console.log(`Updated workflow: ${o.workflowId}`);return}if(t==="run"){if(!o.workflowId)throw new Error("Missing workflowId for run command");let n=A(o),{runId:s}=await i.triggerWorkflowRun(e,r,o.workflowId,n);if(!o.wait){if(o.json){console.log(JSON.stringify({runId:s}));return}console.log(`Started run: ${s}`),console.log(` Check: entrydesk workflow run-get ${o.workflowId} ${s}`);return}let l=await W(i,e,r,o.workflowId,s);o.json?console.log(JSON.stringify(l)):S(l),l.status!=="completed"&&process.exit(1);return}if(t==="runs"){if(!o.workflowId)throw new Error("Missing workflowId for runs command");if(o.all&&o.nextKey&&(console.error("Cannot use --all and --next-key together."),process.exit(1)),o.all){let l=o.workflowId,c=await I(async d=>{let w=await i.getWorkflowRuns(e,r,l,{limit:o.limit??20,nextKey:d});return{items:w.runs,nextKey:w.nextKey}});if(o.json){console.log(JSON.stringify({runs:c}));return}if(c.length===0){console.log("No runs for this workflow.");return}y(c);return}let{runs:n,nextKey:s}=await i.getWorkflowRuns(e,r,o.workflowId,{limit:o.limit,nextKey:o.nextKey});if(o.json){console.log(JSON.stringify({runs:n,nextKey:s}));return}if(n.length===0){console.log("No runs for this workflow.");return}y(n),s&&console.log(`Next page: --next-key ${s}`);return}if(t==="run-get"){if(!o.workflowId||!o.runId)throw new Error("Missing workflowId or runId for run-get command");let n=await i.getWorkflowRun(e,r,o.workflowId,o.runId);if(o.json){console.log(JSON.stringify(n));return}S(n);return}if(t==="share"){await O(i,e,r,o);return}console.error(`Unknown workflow command: ${t}`),f(),process.exit(1)}catch(e){g(e)}}export{M as runWorkflow};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{g as a,h as w,p as k}from"./chunk-XWM2TUUW.js";import"./chunk-KURQCTT3.js";function l(){console.log(`
2
+ import{g as a,h as w,p as k}from"./chunk-X2E25QKV.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.14.0",
3
+ "version": "1.15.0",
4
4
  "description": "EntryDesk CLI - Interact with EntryDesk from your terminal",
5
5
  "type": "module",
6
6
  "bin": {
@@ -36,9 +36,9 @@
36
36
  "tsup": "^8.5.0",
37
37
  "typescript": "^6.0.3",
38
38
  "vitest": "^4.1.6",
39
+ "@entrydesk/shared": "^0.0.0",
39
40
  "@entrydesk/ci": "^0.0.0",
40
- "@entrydesk/utils": "^0.0.0",
41
- "@entrydesk/shared": "^0.0.0"
41
+ "@entrydesk/utils": "^0.0.0"
42
42
  },
43
43
  "optionalDependencies": {
44
44
  "keytar": "^7.9.0"
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- import U from"fs";import p from"fs";import De from"os";import T from"path";import{HTTPError as Ie,TimeoutError as Ke}from"ky";import ke,{TimeoutError as we,isHTTPError as ve}from"ky";import b from"crypto";import u from"fs";import de from"path";var ue="ENTRYDESK_FORCE_FILE_STORAGE",E="EntryDesk CLI",fe="__entrydesk_keychain_test__",pe="profile:",he=".credentials.key",Q={keychain:!1,permissions:!1,corruptFile:!1,windowsFile:!1};function w(r,e){Q[r]||(Q[r]=!0,console.error(e))}function ye(){return process.env.ENTRYDESK_DEBUG?.toLowerCase()==="true"}function ee(r){if(!r||typeof r!="object")return!1;let e=r;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(r){if(!r||typeof r!="object")return!1;let e=r;return typeof e.getPassword=="function"&&typeof e.setPassword=="function"&&typeof e.deletePassword=="function"}function O(r){return o.getProfileCredentialsFile(r)}var N=class{getKeyFilePath(e){return de.join(o.getProfileDir(e),he)}loadEncryptionKey(e){let t=this.getKeyFilePath(e);try{if(!u.existsSync(t))return null;let s=u.readFileSync(t);return s.length!==32?null:(this.ensureSecureFilePermissions(t),s)}catch{return null}}createEncryptionKey(e){o.ensureProfileDir(e);let t=this.getKeyFilePath(e),s=b.randomBytes(32);return u.writeFileSync(t,s,{mode:384}),this.ensureSecureFilePermissions(t),s}getOrCreateEncryptionKey(e){let t=this.loadEncryptionKey(e);return t||this.createEncryptionKey(e)}encrypt(e,t){let s=b.randomBytes(16),n=b.createCipheriv("aes-256-gcm",t,s),i=n.update(e,"utf8","hex");i+=n.final("hex");let c=n.getAuthTag();return`${s.toString("hex")}:${c.toString("hex")}:${i}`}decrypt(e,t){let s=e.split(":");if(s.length!==3)throw new Error("Invalid encrypted data format");let n=Buffer.from(s[0],"hex"),i=Buffer.from(s[1],"hex"),c=s[2],S=b.createDecipheriv("aes-256-gcm",t,n,{authTagLength:16});S.setAuthTag(i);let d=S.update(c,"hex","utf8");return d+=S.final("utf8"),d}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{u.chmodSync(e,384)}catch{w("permissions","Warning: Failed to set secure permissions on credentials file.");return}try{(u.statSync(e).mode&511)!==384&&w("permissions","Warning: Credentials file permissions are too permissive.")}catch{w("permissions","Warning: Failed to verify credentials file permissions.")}}}async getCredentials(e){let t=O(e);try{if(!u.existsSync(t))return null;let s=u.readFileSync(t,"utf-8").trim();if(!s)return null;let n=this.loadEncryptionKey(e),i=n?this.tryDecrypt(s,n):null;if(i){let c=this.tryParseCredentials(i);if(c)return c}return w("corruptFile","Warning: Credentials file is unreadable. Please run `entrydesk login` again."),null}catch{return null}}async setCredentials(e,t){o.ensureProfileDir(e);let s=O(e),n=this.getOrCreateEncryptionKey(e),i=this.encrypt(JSON.stringify(t),n);u.writeFileSync(s,i,{mode:384}),this.ensureSecureFilePermissions(s)}async deleteCredentials(e){let t=O(e);try{u.existsSync(t)&&u.unlinkSync(t)}catch{}}},j=class{keytarModule=null;keytarLoadAttempted=!1;keychainAvailable=null;async getKeytar(){if(this.keytarLoadAttempted)return this.keytarModule;this.keytarLoadAttempted=!0;try{let t=await import("keytar"),s=t&&typeof t=="object"&&"default"in t?t.default:t;this.keytarModule=me(s)?s:null}catch{this.keytarModule=null}return this.keytarModule}getAccount(e){return`${pe}${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=`${fe}${b.randomBytes(8).toString("hex")}`,s="test";await e.setPassword(E,t,s);let n=await e.getPassword(E,t),i=await e.deletePassword(E,t);return this.keychainAvailable=!!(i&&n===s),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 s=await t.getPassword(E,this.getAccount(e));if(!s)return null;let n=this.tryParseKeychainPayload(s);return n||w("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 s=await this.getKeytar();if(!s)throw new Error("Keytar module not available");let n=JSON.stringify(t);await s.setPassword(E,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(E,this.getAccount(e))}tryParseKeychainPayload(e){try{let t=JSON.parse(e);return ee(t)?t:null}catch{return null}}},z=class{keychainStorage=null;fileStorage=new N;keychainAvailable=null;initPromise=null;shouldForceFileStorage(){return process.env[ue]?.toLowerCase()==="true"}async initializeStorage(){if(this.shouldForceFileStorage()){this.keychainAvailable=!1,this.keychainStorage=null;return}try{let e=new j,t=await e.isAvailable();this.keychainAvailable=t,this.keychainStorage=t?e:null}catch{this.keychainAvailable=!1,this.keychainStorage=null}!this.keychainAvailable&&!this.shouldForceFileStorage()&&(ye()&&w("keychain","Keychain unavailable. Falling back to file-based credentials."),process.platform==="win32"&&w("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()||w("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 s=await this.fileStorage.getCredentials(e);if(s)try{await t.setCredentials(e,s),await this.fileStorage.deleteCredentials(e)}catch{}return s}async setCredentials(e,t){let s=await this.getKeychainStorage();if(!s){await this.fileStorage.setCredentials(e,t);return}try{await s.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 z,h={async saveAccessToken(r,e){let t=o.getEffectiveProfileName(e),s=await l.getCredentials(t)??{};s.accessToken=r,await l.setCredentials(t,s)},async getAccessToken(r){let e=o.getEffectiveProfileName(r);return(await l.getCredentials(e))?.accessToken??null},async saveRefreshToken(r,e){let t=o.getEffectiveProfileName(e),s=await l.getCredentials(t)??{};s.refreshToken=r,await l.setCredentials(t,s)},async getRefreshToken(r){let e=o.getEffectiveProfileName(r);return(await l.getCredentials(e))?.refreshToken??null},async saveEmail(r,e){let t=o.getEffectiveProfileName(e),s=await l.getCredentials(t)??{};s.email=r,await l.setCredentials(t,s)},async getEmail(r){let e=o.getEffectiveProfileName(r);return(await l.getCredentials(e))?.email??null},async saveWorkspaceId(r,e){let t=o.getEffectiveProfileName(e),s=await l.getCredentials(t)??{};s.workspaceId=r,await l.setCredentials(t,s)},async getWorkspaceId(r){let e=o.getEffectiveProfileName(r);return(await l.getCredentials(e))?.workspaceId??null},async saveAll(r,e){let t=o.getEffectiveProfileName(e);await l.setCredentials(t,r)},async getAll(r){let e=o.getEffectiveProfileName(r);return l.getCredentials(e)},async clear(r){let e=o.getEffectiveProfileName(r);await l.deleteCredentials(e)},async isLoggedIn(r){let e=o.getEffectiveProfileName(r);return(await l.getCredentials(e))?.accessToken!=null}};var _=class r{client;baseUrl;constructor(e,t){this.baseUrl=e||$(t),I().ignoreSslErrors&&(process.env.NODE_TLS_REJECT_UNAUTHORIZED="0",process.env.DEBUG&&console.log("[DEBUG] ApiClient: SSL certificate validation disabled")),this.client=ke.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,s){let n={limit:s?.limit??100};return s?.nextKey&&(n.nextKey=s.nextKey),s?.search&&(n.search=s.search),await this.client.get(`v1/workspaces/${t}/availableAgents`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async createAgent(e,t,s){return await this.client.post(`v1/workspaces/${t}/agents`,{headers:{Authorization:`Bearer ${e}`},json:s}).json()}async updateAgent(e,t,s,n){await this.client.put(`v1/workspaces/${t}/agents/${s}`,{headers:{Authorization:`Bearer ${e}`},json:n})}async deleteAgent(e,t,s){await this.client.delete(`v1/workspaces/${t}/agents/${s}`,{headers:{Authorization:`Bearer ${e}`}})}async getMeetings(e,t,s){let n={limit:s?.limit??20};return s?.nextKey&&(n.nextKey=s.nextKey),s?.search&&(n.search=s.search),s?.filter&&(n.filter=s.filter),s?.sortBy&&(n.sortBy=s.sortBy),await this.client.get(`v1/workspaces/${t}/meetings`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getMeeting(e,t,s){return await this.client.get(`v1/workspaces/${t}/meetings/${s}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async createMeeting(e,t,s){return await this.client.post(`v1/workspaces/${t}/meetings`,{headers:{Authorization:`Bearer ${e}`},json:s}).json()}async updateMeeting(e,t,s,n){return await this.client.patch(`v1/workspaces/${t}/meetings/${s}`,{headers:{Authorization:`Bearer ${e}`},json:n}).json()}async deleteMeeting(e,t,s){await this.client.delete(`v1/workspaces/${t}/meetings/${s}`,{headers:{Authorization:`Bearer ${e}`}})}async getMeetingPreviousBrief(e,t,s){return await this.client.get(`v1/workspaces/${t}/meetings/${s}/previous`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getRecording(e,t,s){return await this.client.get(`v1/workspaces/${t}/recordings/${s}`,{headers:{Authorization:`Bearer ${e}`}}).json()}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,s=20){return await this.client.get(`v1/workspaces/${t}/tasks`,{headers:{Authorization:`Bearer ${e}`},searchParams:{limit:s}}).json()}async getMessages(e,t,s,n=50){return await this.client.get(`v1/workspaces/${t}/tasks/${s}/messages`,{headers:{Authorization:`Bearer ${e}`},searchParams:{limit:n}}).json()}async getAgent(e,t,s){return await this.client.get(`v1/workspaces/${t}/agents/${s}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async listAvailableSkills(e,t,s){return await this.client.get(`v1/workspaces/${t}/availableSkills`,{headers:{Authorization:`Bearer ${e}`},searchParams:{createdBy:s?.createdBy,nextKey:s?.nextKey,limit:s?.limit??20}}).json()}async uploadSkill(e,t,s){return await this.client.post(`v1/workspaces/${t}/skills`,{headers:{Authorization:`Bearer ${e}`},body:s}).json()}async deleteSkill(e,t,s){await this.client.delete(`v1/workspaces/${t}/skills/${s}`,{headers:{Authorization:`Bearer ${e}`}})}async downloadSkillCurrent(e,t,s){return await this.client.get(`v1/workspaces/${t}/skills/${s}/download`,{headers:{Authorization:`Bearer ${e}`}}).json()}async task(e,t,s){try{let n=await this.client.post(`v1/workspaces/${t}/tasks`,{headers:{Authorization:`Bearer ${e}`},json:s,timeout:6e4,throwHttpErrors:!1});if(!n.ok){let c=await n.text();throw new Error(`Task API failed (${n.status}): ${c}`)}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 we?new TypeError("Request timed out. Please check your connection and try again.",{cause:n}):n}}async taskStream(e,t,s){let n=await this.client.get(`v1/workspaces/${t}/tasks/${s}/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,s){await this.client.put(`v1/workspaces/${t}/budget`,{headers:{Authorization:`Bearer ${e}`},json:{budget:s}})}async getMonthlyUsages(e,t,s){return await this.client.get(`v1/workspaces/${t}/monthlyUsages`,{headers:{Authorization:`Bearer ${e}`},searchParams:{nextKey:s?.nextKey,limit:s?.limit??20}}).json()}async createTaskShare(e,t,s,n="public"){return await this.client.post(`v1/workspaces/${t}/tasks/${s}/shares`,{headers:{Authorization:`Bearer ${e}`},json:{visibility:n}}).json()}async getSharedTask(e,t){let s={};return t&&(s.Authorization=`Bearer ${t}`),await this.client.get(`v1/shares/${e}`,{headers:s}).json()}async getSharedMessages(e,t=50,s){let n={};return s&&(n.Authorization=`Bearer ${s}`),await this.client.get(`v1/shares/${e}/messages`,{headers:n,searchParams:{limit:t}}).json()}async deleteTask(e,t,s){await this.client.delete(`v1/workspaces/${t}/tasks/${s}`,{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,s,n){let i=new FormData,c=new Blob([s.buffer],{type:s.mimeType});return i.append("file",c,s.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,s){let n={limit:s?.limit??20};return s?.nextKey&&(n.nextKey=s.nextKey),s?.search&&(n.search=s.search),await this.client.get(`v1/workspaces/${t}/schedules`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getSchedule(e,t,s){return await this.client.get(`v1/workspaces/${t}/schedules/${s}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async createSchedule(e,t,s){return await this.client.post(`v1/workspaces/${t}/schedules`,{headers:{Authorization:`Bearer ${e}`},json:s}).json()}async updateSchedule(e,t,s,n){await this.client.put(`v1/workspaces/${t}/schedules/${s}`,{headers:{Authorization:`Bearer ${e}`},json:n})}async deleteSchedule(e,t,s){await this.client.delete(`v1/workspaces/${t}/schedules/${s}`,{headers:{Authorization:`Bearer ${e}`}})}static async getAuthenticatedClient(e){let t=await h.getAll(e);return t?{client:new r(void 0,e),accessToken:t.accessToken,workspaceId:t.workspaceId??null}:null}};function Pe(){return process.env.ENTRYDESK_SANDBOX==="true"}function K(){if(!Pe())return null;let r=process.env.ENTRYDESK_SANDBOX_ACCESS_TOKEN?.trim(),e=process.env.ENTRYDESK_SANDBOX_WORKSPACE_ID?.trim();if(!r||!e){let t=[];throw r||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:r,workspaceId:e}}function L(){let r=process.env.ENTRYDESK_TOKEN?.trim();if(!r)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:r,workspaceId:e}}function et(){let r=K();if(r)return{authSource:"sandbox-env",label:"sandbox environment (ENTRYDESK_SANDBOX)",workspaceId:r.workspaceId};let e=L();return e?{authSource:"pat-env",label:"personal access token (ENTRYDESK_TOKEN)",workspaceId:e.workspaceId}:null}import{execFile as Se}from"child_process";import{setTimeout as Ae}from"timers/promises";import{decodeJwt as Ee}from"jose";import Ce,{HTTPError as Te,isHTTPError as be}from"ky";function te(r){if(r===null||typeof r!="object")return{error:""};let e=r;return{code:typeof e.code=="string"?e.code:void 0,error:typeof e.error=="string"?e.error:""}}var D="entrydesk-cli",Re="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 publishes:read publishes:write calendar:read calendar:write schedules:read schedules:write user:read user:write";function xe(r){return new Promise((e,t)=>{let s=process.platform,n,i;switch(s){case"darwin":n="open",i=[r];break;case"win32":n="cmd",i=["/c","start","",r];break;default:n="xdg-open",i=[r];break}Se(n,i,c=>{c?t(new Error(`Failed to open browser. Please manually visit: ${r}`,{cause:c})):e()})})}async function lt(r){let e=$(),t=re(),s=I(),n=process.env.NODE_TLS_REJECT_UNAUTHORIZED;s.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=Ce.create({baseUrl:e.replace(/\/?$/,"/"),timeout:3e4,hooks:{beforeError:[({error:a})=>(be(a)&&(a.request.headers.delete("authorization"),a.request.headers.delete("Authorization")),a)]}}),c;try{c=await i.post("v1/oauth/device/code",{json:{client_id:D,scope:Re}}).json()}catch(a){let k=a instanceof Error?a:new Error("Failed to request device code");throw r?.onError?.(k),k}let{device_code:S,user_code:d,expires_in:ae,interval:ce}=c,X=new URL("/oauth/device",t);X.searchParams.set("user_code",d);let V=X.toString();r?.onDeviceCodeReceived?.(d,V),r?.onBrowserOpening?.();try{await xe(V)}catch(a){process.env.DEBUG&&console.error("[DEBUG] Failed to open browser:",a)}r?.onWaitingForAuthorization?.();let Z=Math.max(ce,5)*1e3,le=Date.now()+ae*1e3;for(;Date.now()<le;){await Ae(Z);try{let a=await i.post("v1/oauth/token",{json:{grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:S,client_id:D}}).json();r?.onAuthorized?.();let k={};try{k=Ee(a.access_token)}catch{}return{accessToken:a.access_token,refreshToken:a.refresh_token??void 0,email:k.email||"",scopes:a.scope.split(" ").filter(M=>M.length>0)}}catch(a){if(a instanceof Te){let{code:M,error:ge}=te(a.data),F=M||ge;if(!F)continue;switch(F){case"authorization_pending":continue;case"slow_down":Z+=5e3;continue;case"access_denied":throw new Error("Authorization denied by user",{cause:a});case"expired_token":throw new Error("Device code expired. Please try again.",{cause:a});default:throw new Error(`Authorization failed: ${F||"Unknown error"}`,{cause:a})}}let k=a instanceof Error?a:new Error("Unknown error during authorization");throw r?.onError?.(k),k}}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}}var y=class extends Error{code;constructor(e,t){super(t),this.code=e}};function _e(r){try{let e=r.split(".");if(e.length<2)return null;let t=e[1].replace(/-/g,"+").replace(/_/g,"/"),s=(4-t.length%4)%4,n=t.padEnd(t.length+s,"="),i=Buffer.from(n,"base64").toString("utf8");return JSON.parse(i)}catch{return null}}function $e(r,e=300){let s=_e(r)?.exp;if(typeof s!="number")return!1;let n=Math.floor(Date.now()/1e3);return s-n<=e}async function se(r){let e=r.accessToken;if(!$e(e))return e;if(!r.refreshToken)throw await h.clear(),new y("session-expired","Session expired. Please run `entrydesk login` again.");try{let s=await new _().refreshOAuthToken({refreshToken:r.refreshToken,clientId:D});return await h.saveAccessToken(s.access_token),s.refresh_token&&await h.saveRefreshToken(s.refresh_token),s.access_token}catch{throw await h.clear(),new y("session-expired","Session expired. Please run `entrydesk login` again.")}}async function ht(){let r=K();if(r)return r.accessToken;let e=await h.getAll();if(!e?.accessToken)throw new y("not-logged-in","Not logged in. Run `entrydesk login` first.");return se(e)}async function yt(){let r=K();if(r)return{accessToken:r.accessToken,workspaceId:r.workspaceId};let e=L();if(e)return e;let t=await h.getAll();if(!t?.accessToken)throw new y("not-logged-in","Not logged in. Run `entrydesk login` first.");if(!t.workspaceId)throw new y("no-workspace","No workspace selected. Run `entrydesk workspaces` first.");return{accessToken:await se(t),workspaceId:t.workspaceId}}var f=class extends Error{constructor(t,s=1,n){super(t);this.exitCode=s;this.cause=n;this.name="CLIError"}exitCode;cause};function vt(r){let e=!!process.env.DEBUG;r instanceof f&&(console.error(`Error: ${r.message}`),r.cause&&(console.error(`Cause: ${r.cause.message}`),e&&r.cause.stack&&console.error(r.cause.stack)),process.exit(r.exitCode)),r instanceof y&&(console.error(r.message),e&&r.stack&&console.error(r.stack),process.exit(1)),r instanceof Ke&&(console.error("Request timed out. Please check your connection and try again."),e&&r.stack&&console.error(r.stack),process.exit(1)),r instanceof Ie&&(console.error(`Request failed (${r.response.status}): ${r.response.statusText}`),e&&r.stack&&console.error(r.stack),process.exit(1)),r instanceof Error&&(console.error(`Unexpected error: ${r.message}`),e&&r.stack&&console.error(r.stack),process.exit(1)),console.error("An unknown error occurred"),process.exit(1)}var P="default",Be=/^[A-Za-z0-9_-]+$/,W=null;function Y(){return T.join(De.homedir(),".entrydesk")}function ie(){return T.join(Y(),"profiles")}function oe(){return T.join(Y(),"profiles.json")}function B(r){return T.join(ie(),r)}function G(r){if(!p.existsSync(r))p.mkdirSync(r,{mode:448,recursive:!0});else try{p.chmodSync(r,448)}catch{}}function Ue(){G(Y())}function H(){G(ie())}function Me(){let r=oe();try{if(!p.existsSync(r))return null;let e=p.readFileSync(r,"utf-8");return JSON.parse(e)}catch{return null}}function C(r){Ue();let e=oe();p.writeFileSync(e,JSON.stringify(r,null,2),{mode:384});try{p.chmodSync(e,384)}catch{}}function Fe(r){let e=r.profiles?.length?Array.from(new Set(r.profiles)):[],t=r.currentProfile&&e.includes(r.currentProfile)?r.currentProfile:e[0]||P;return e.length===0&&e.push(P),e.includes(t)||e.unshift(t),{currentProfile:t,profiles:e}}function x(r){H(),G(B(r))}function v(){let r=Me();if(!r){let t={currentProfile:P,profiles:[P]};return C(t),H(),x(P),t}let e=Fe(r);return(e.currentProfile!==r.currentProfile||e.profiles.length!==r.profiles.length)&&C(e),H(),e}function A(r){if(!r)throw new f("Profile name is required.");if(!Be.test(r))throw new f("Invalid profile name. Use letters, numbers, dash, or underscore.")}function R(r,e){if(!r.profiles.includes(e))throw new f(`Profile not found: ${e}`)}function ne(r,e){if(r.profiles.includes(e))throw new f(`Profile already exists: ${e}`)}var o={DEFAULT_PROFILE:P,setOverrideProfile(r){W=r},getOverrideProfile(){return W},getProfileDir(r){return B(r)},getProfileConfigFile(r){return T.join(o.getProfileDir(r),"config.json")},getProfileCredentialsFile(r){return T.join(o.getProfileDir(r),"credentials.json")},getProfileNames(){return[...v().profiles]},getProfileCount(){return o.getProfileNames().length},getCurrentProfileName(){return v().currentProfile},getEffectiveProfileName(r){let e=v(),t=r||W||e.currentProfile;return A(t),R(e,t),t},ensureProfileExists(r){let e=v();A(r),R(e,r)},createProfile(r){A(r);let e=v();ne(e,r);let t={currentProfile:e.currentProfile,profiles:[...e.profiles,r]};C(t),x(r)},deleteProfile(r){A(r);let e=v();if(R(e,r),e.profiles.length===1)throw new f("Cannot delete the last profile.");let t=e.profiles.filter(i=>i!==r),s=e.currentProfile;s===r&&(s=t.includes(P)?P:t[0]),C({currentProfile:s,profiles:t});try{p.rmSync(o.getProfileDir(r),{recursive:!0,force:!0})}catch{}return{currentProfile:s}},renameProfile(r,e){A(r),A(e);let t=v();R(t,r),ne(t,e);let s=B(r),n=B(e);if(p.existsSync(s))try{p.renameSync(s,n)}catch(d){throw new f("Failed to rename profile directory.",1,d)}else x(e);let i=t.profiles.map(d=>d===r?e:d),c=t.currentProfile===r?e:t.currentProfile;return C({currentProfile:c,profiles:i}),{currentProfile:c}},setCurrentProfile(r){A(r);let e=v();R(e,r);let t={currentProfile:r,profiles:e.profiles};C(t),x(r)},ensureProfileDir:x};function Oe(r){let e=o.getEffectiveProfileName(r);return o.getProfileConfigFile(e)}function g(r){let e=Oe(r);try{if(!U.existsSync(e))return{};let t=U.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return{}}}function m(r,e){let t=o.getEffectiveProfileName(e);o.ensureProfileDir(t);let s=o.getProfileConfigFile(t);U.writeFileSync(s,JSON.stringify(r,null,2),{mode:384});try{U.chmodSync(s,384)}catch{}}var J={getApiUrl(r){return g(r).apiUrl??null},setApiUrl(r,e){let t=g(e);t.apiUrl=r,m(t,e)},clearApiUrl(r){let e=g(r);delete e.apiUrl,m(e,r)},getHubUrl(r){return g(r).hubUrl??null},setHubUrl(r,e){let t=g(e);t.hubUrl=r,m(t,e)},getAll(r){return g(r)},setAll(r,e){m(r,e)},set(r,e,t){let s=g(t);s[r]=e,m(s,t)},get(r,e){return g(e)[r]},unset(r,e){let t=g(e);delete t[r],m(t,e)},getDefaultModel(r){return g(r).model?.default??null},setDefaultModel(r,e){let t=g(e);t.model={...t.model,default:r},m(t,e)},getDefaultConnectorIds(r){return g(r).connectors?.defaults??null},setDefaultConnectorIds(r,e){let t=g(e);t.connectors={...t.connectors,defaults:r},m(t,e)},getLocalTools(r){return g(r).localTools??null},setLocalTools(r,e){let t=g(e);t.localTools={...t.localTools,...r},m(t,e)}};var Ne="https://api.entrydesk.com",je="https://app.entrydesk.com",ze=3100,Le=300*1e3;function q(r){return{apiUrl:J.getApiUrl(r)||process.env.ENTRYDESK_API_URL||Ne,hubUrl:J.getHubUrl(r)||process.env.ENTRYDESK_HUB_URL||je,mcp:{httpPort:ze},auth:{loginTimeout:Le,ignoreSslErrors:process.env.ENTRYDESK_IGNORE_SSL_ERRORS==="true"||!1}}}function $(r){return q(r).apiUrl}function re(r){return q(r).hubUrl}function I(){return q().auth}export{o as a,J as b,q as c,$ as d,re as e,I as f,h as g,_ as h,et as i,te as j,D as k,lt as l,y as m,$e as n,se as o,ht as p,yt as q,f as r,vt as s};