@entrydesk/cli 1.11.8 → 1.11.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{h as l,i as c,k as t}from"./chunk-JB5ASFUE.js";async function m(e){if(process.env.DEBUG){let{getApiUrl:i,getHubUrl:s}=await import("./config-SQ273QT4.js");console.log(`[DEBUG] Hub URL: ${s()}`),console.log(`[DEBUG] API URL: ${i()}`)}let o=await t({onDeviceCodeReceived:(i,s)=>{e.json||(console.log(""),console.log("To authenticate, please:"),console.log(""),console.log(` 1. Visit: ${s}`),console.log(` 2. Enter code: ${i}`),console.log(""))},onBrowserOpening:()=>{e.json||console.log("Opening browser...")},onWaitingForAuthorization:()=>{e.json||console.log("Waiting for authorization...")},onAuthorized:()=>{e.json||console.log("Authorization successful!")}}),r=new c,{workspaces:a}=await r.getWorkspaces(o.accessToken),n=a[0];await l.saveAll({accessToken:o.accessToken,refreshToken:o.refreshToken,email:o.email,workspaceId:n?.id}),e.json?console.log(JSON.stringify({email:o.email,workspaceId:n?.id,workspaceName:n?.name})):(console.log(`Logged in as ${o.email}`),n&&console.log(`Workspace: ${n.name}`))}export{m as runLogin};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{h as r,i as e,j as t,r as n}from"./chunk-JB5ASFUE.js";async function f(i){try{let o=await r.getAll();if(!o){console.log("Not logged in");return}try{o.refreshToken&&await new e().revokeOAuthToken({token:o.refreshToken,clientId:t})}catch{}await r.clear(),console.log("Logged out successfully")}catch(o){n(o)}}export{f as runLogout};
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import{c as m,h as u,m as y,n as w,p as f}from"./chunk-JB5ASFUE.js";import h from"http";import{stderr as T}from"process";import{Client as k}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as C}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{Server as v}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as P}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as A}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{CallToolRequestSchema as O,ListToolsRequestSchema as E}from"@modelcontextprotocol/sdk/types.js";function a(c){T.write(`${c}
3
+ `)}async function g(c,e,o){let r=new k({name:"entrydesk-cli-proxy",version:"1.0.0"}),i=new URL(`${c}/v1/workspaces/${o}/mcp`),t=new C(i,{requestInit:{headers:{Authorization:`Bearer ${e}`}}});return await r.connect(t),r}function S(c){let e=new v({name:"entrydesk-cli",version:"1.0.0"},{capabilities:{tools:{}}});return e.setRequestHandler(E,async()=>({tools:(await(await c()).listTools()).tools})),e.setRequestHandler(O,async o=>{let{name:r,arguments:i}=o.params,n=await(await c()).callTool({name:r,arguments:i}),l=Array.isArray(n.content)?[...n.content]:[];return n.structuredContent&&l.push({type:"text",text:JSON.stringify(n.structuredContent,null,2)}),{content:l,structuredContent:n.structuredContent,isError:n.isError}}),e}async function H(c,e,o){let r=h.createServer(async(i,t)=>{if(i.method==="OPTIONS"){t.setHeader("Access-Control-Allow-Origin","*"),t.setHeader("Access-Control-Allow-Methods","GET, POST, DELETE, OPTIONS"),t.setHeader("Access-Control-Allow-Headers","Content-Type, Accept"),t.writeHead(204),t.end();return}if(i.url!=="/mcp"){t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Not found"}));return}let n=S(c),l=new A({sessionIdGenerator:void 0});if(t.setHeader("Access-Control-Allow-Origin","*"),t.on("close",()=>{l.close(),n.close()}),await n.connect(l),i.method==="POST"){let p="";i.on("data",s=>{p+=s.toString()}),i.on("end",async()=>{try{let s=JSON.parse(p);await l.handleRequest(i,t,s)}catch{t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Invalid JSON"}))}})}else await l.handleRequest(i,t)});r.listen(o,()=>{a(`EntryDesk MCP server running at http://localhost:${o}/mcp`),a("Press Ctrl+C to stop")}),process.on("SIGINT",async()=>{a(`
4
+ Shutting down...`),r.close(),await e(),process.exit(0)}),process.on("SIGTERM",async()=>{r.close(),await e(),process.exit(0)})}async function x(c,e){let o=S(c),r=new P;r.onclose=async()=>{await e()},await o.connect(r)}async function L(c={mode:"stdio"}){process.on("unhandledRejection",e=>{console.error("[entrydesk-mcp] Unhandled rejection:",e)}),process.on("uncaughtException",e=>{console.error("[entrydesk-mcp] Uncaught exception:",e)});try{a("[entrydesk-mcp] Starting MCP server...");let e,o;try{let s=await f();e=s.accessToken,o=s.workspaceId}catch(s){let d=s instanceof Error?s.message:"Authentication failed";console.error(d),process.exit(1)}let{apiUrl:r,mcp:i}=m();a(`[entrydesk-mcp] Connecting to ${r}...`),a(`[entrydesk-mcp] Workspace: ${o}`);let t=await g(r,e,o);a("[entrydesk-mcp] Connected to EntryDesk API");let n=null,l=async()=>y(e)?n||(n=(async()=>{a("[entrydesk-mcp] Token expiring soon, refreshing...");let s=await u.getAll();if(!s?.accessToken)throw new Error("Not logged in. Please run `entrydesk login` again.");let d=await w(s);if(d!==e){e=d;try{await t.close()}catch{}t=await g(r,e,o),a("[entrydesk-mcp] Token refreshed, reconnected")}return t})().finally(()=>{n=null}),n):t,p=async()=>{try{await t.close()}catch{}};if(c.mode==="http"){let s=c.port??i.httpPort;await H(l,p,s)}else a("[entrydesk-mcp] Starting stdio server..."),await x(l,p),a("[entrydesk-mcp] Stdio server started")}catch(e){console.error("[entrydesk-mcp] Fatal error:",e),process.exit(1)}}export{L as startMcpServer};
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import{i as n,p as t,r as l}from"./chunk-JB5ASFUE.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
+ `);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};
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import{a as t,b as u,h as m,q as f,r as d}from"./chunk-JB5ASFUE.js";function h(){console.log(`
3
+ Usage: entrydesk profile [list|show|current|create|use|delete|rename|clone] [args]
4
+
5
+ Commands:
6
+ list List profiles (default)
7
+ show <name> Show profile details
8
+ current Show active profile
9
+ create <name> Create a profile (default name: default)
10
+ use <name> Switch active profile
11
+ delete <name> Delete a profile
12
+ rename <from> <to> Rename a profile
13
+ clone <from> <to> Clone config defaults (no credentials)
14
+
15
+ Flags:
16
+ --json Output JSON
17
+ `)}function a(r,o){if(r)return r;if(o&&t.getProfileCount()===1)return t.getProfileNames()[0];throw new f("Profile name is required when multiple profiles exist.")}function P(r){if(!r)return"none";let o=[];return r.sandbox&&o.push("sandbox"),r.webSearch&&o.push("webSearch"),r.imageGeneration&&o.push("imageGeneration"),r.chart&&o.push("chart"),o.length>0?o.join(", "):"none"}async function b(r){try{let o=r.action||"list",i=t.getCurrentProfileName(),c=r.name??r.profile,l=r.value;if(r.help||o==="help"){h();return}if(o==="list"){let e=t.getProfileNames();if(r.json){console.log(JSON.stringify({currentProfile:i,profiles:e.map(n=>({name:n,isCurrent:n===i}))}));return}console.log(`Profiles (${e.length}):`);for(let n of e)console.log(` ${n}${n===i?" (current)":""}`);return}if(o==="current"){if(r.json){console.log(JSON.stringify({name:i,isCurrent:!0}));return}console.log(`Current profile: ${i}`);return}if(o==="show"){let e=a(c,!0),n=u.getAll(e),s=await m.getAll(e),g=!!s?.accessToken;if(r.json){console.log(JSON.stringify({name:e,isCurrent:e===i,config:n,auth:g?{loggedIn:!0,email:s?.email??null,workspaceId:s?.workspaceId??null}:{loggedIn:!1}}));return}console.log(`Profile: ${e}${e===i?" (current)":""}`),console.log(` API URL: ${n.apiUrl??"default"}`),console.log(` Hub URL: ${n.hubUrl??"default"}`),console.log(` Model: ${n.model?.default??"unset"}`);let p=n.connectors?.defaults&&n.connectors.defaults.length>0?n.connectors.defaults.join(", "):"unset";console.log(` Connectors: ${p}`),console.log(` Capabilities: ${P(n.capabilities)}`),console.log(g?` Logged in as: ${s?.email??"unknown"}`:" Not logged in"),g&&s?.workspaceId&&console.log(` Workspace ID: ${s.workspaceId}`);return}if(o==="create"){let e=c||t.DEFAULT_PROFILE;if(t.createProfile(e),r.json){console.log(JSON.stringify({name:e,created:!0}));return}console.log(`Profile created: ${e}`);return}if(o==="use"||o==="switch"){let e=a(c,!0);if(t.setCurrentProfile(e),r.json){console.log(JSON.stringify({name:e,current:!0}));return}console.log(`Switched to profile: ${e}`);return}if(o==="delete"||o==="remove"||o==="rm"){let e=a(c,!0),n=t.deleteProfile(e);if(r.json){console.log(JSON.stringify({deleted:e,currentProfile:n.currentProfile}));return}console.log(`Profile deleted: ${e}`),console.log(`Current profile: ${n.currentProfile}`);return}if(o==="rename"||o==="move"||o==="mv"){let e=a(c,!0);if(!l)throw new f("New profile name is required.");let n=t.renameProfile(e,l);if(r.json){console.log(JSON.stringify({renamed:e,name:l,currentProfile:n.currentProfile}));return}console.log(`Profile renamed: ${e} -> ${l}`),console.log(`Current profile: ${n.currentProfile}`);return}if(o==="clone"||o==="copy"){let e=a(c,!0);if(!l)throw new f("Target profile name is required.");let n=u.getAll(e);if(t.createProfile(l),u.setAll(n,l),await m.clear(l),r.json){console.log(JSON.stringify({source:e,name:l,cloned:!0}));return}console.log(`Profile cloned: ${e} -> ${l}`);return}throw new f(`Unknown profile command: ${o}`)}catch(o){d(o)}}export{b as runProfile};
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+ import{i as f,p as m,r as p}from"./chunk-JB5ASFUE.js";function d(){console.log(`
3
+ Usage: entrydesk schedules [list|get|create|delete] [options]
4
+
5
+ Commands:
6
+ list List all schedules (default)
7
+ get <scheduleId> Show schedule details
8
+ create Create a new schedule
9
+ delete <scheduleId> Delete a schedule
10
+
11
+ Create Options:
12
+ --name <name> Schedule name (required)
13
+ --prompt <text> Prompt to send to agent (required)
14
+ --agent-id <id> Agent ID to use (required)
15
+ --starts-at <datetime> Start time in ISO format (required)
16
+ --utc-offset <offset> Timezone offset (e.g., +08:00, default: +00:00)
17
+
18
+ Repeat Config:
19
+ --repeat-type <type> no-repeat, minutes, hours, days, weeks, months
20
+ --every <n> Repeat every N units
21
+ --time <HH:MM> Time of day (for days/weeks/months)
22
+ --days-of-week <0-6> Comma-separated days (0=Sun, for weeks)
23
+ --days-of-month <1-31> Comma-separated days (for months)
24
+ --last-day-of-month Include last day of month
25
+
26
+ Flags:
27
+ --json Output JSON
28
+ `)}function h(e){if(e.type==="no-repeat")return"No repeat";let{interval:t}=e;switch(t.unit){case"minutes":return`Every ${t.every} minute${t.every>1?"s":""}`;case"hours":return`Every ${t.every} hour${t.every>1?"s":""} at :${String(t.minute).padStart(2,"0")}`;case"days":return`Every ${t.every} day${t.every>1?"s":""} at ${String(t.time.hour).padStart(2,"0")}:${String(t.time.minute).padStart(2,"0")}`;case"weeks":{let o=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],s=t.daysOfWeek.map(i=>o[i]).join(", ");return`Every ${t.every} week${t.every>1?"s":""} on ${s} at ${String(t.time.hour).padStart(2,"0")}:${String(t.time.minute).padStart(2,"0")}`}case"months":{let o=t.lastDayOfMonth?t.daysOfMonth.length>0?`${t.daysOfMonth.join(", ")} and last day`:"last day":t.daysOfMonth.join(", ");return`Every ${t.every} month${t.every>1?"s":""} on day ${o} at ${String(t.time.hour).padStart(2,"0")}:${String(t.time.minute).padStart(2,"0")}`}default:return"Unknown"}}function l(e,t){let o=new Date(e),s=t.match(/^([+-])(\d{2}):(\d{2})$/);if(!s)return o.toISOString();let i=s[1]==="+"?1:-1,c=parseInt(s[2],10),r=parseInt(s[3],10),u=i*(c*60+r)*60*1e3;return`${new Date(o.getTime()+u).toISOString().replace("T"," ").slice(0,19)} (${t})`}function y(e){console.log(`
29
+ Schedule: ${e.name}
30
+ ${"\u2501".repeat(50)}
31
+ ID: ${e.id}
32
+ Agent: ${e.agent.name}
33
+ Status: ${e.isActive?"Active":"Paused"}
34
+ Timezone: ${e.utcOffset}
35
+
36
+ Prompt:
37
+ ${e.prompt.slice(0,200)}${e.prompt.length>200?"...":""}
38
+
39
+ Schedule:
40
+ ${h(e.config)}
41
+
42
+ Next Run: ${e.nextRunAt?l(e.nextRunAt,e.utcOffset):"-"}
43
+ Created: ${l(e.createdAt,e.utcOffset)}
44
+ Updated: ${l(e.updatedAt,e.utcOffset)}
45
+ `)}function S(e){let t=e.repeatType||"no-repeat";if(t==="no-repeat")return{type:"no-repeat"};let o=e.every??1,s=e.time||"09:00",[i,c]=s.split(":"),r={hour:parseInt(i,10),minute:parseInt(c,10)};switch(t){case"minutes":return{type:"repeat",interval:{unit:"minutes",every:o}};case"hours":return{type:"repeat",interval:{unit:"hours",every:o,minute:r.minute}};case"days":return{type:"repeat",interval:{unit:"days",every:o,time:r}};case"weeks":return{type:"repeat",interval:{unit:"weeks",every:o,daysOfWeek:e.daysOfWeek??[1],time:r}};case"months":return{type:"repeat",interval:{unit:"months",every:o,daysOfMonth:e.daysOfMonth??[1],lastDayOfMonth:e.lastDayOfMonth||!1,time:r}};default:return{type:"no-repeat"}}}async function O(e){try{if(e.help){d();return}let t=await m(),{accessToken:o,workspaceId:s}=t,i=e.action||"list",c=new f;if(i==="get"){let n=e.scheduleId;n||(console.error("Missing schedule ID."),d(),process.exit(1));let a=await c.getSchedule(o,s,n);if(e.json){console.log(JSON.stringify(a));return}y(a);return}if(i==="create"){(!e.name||!e.prompt||!e.agentId||!e.startsAt)&&(console.error("Missing required fields for schedule creation."),console.error("Required: --name, --prompt, --agent-id, --starts-at"),d(),process.exit(1));let n={name:e.name,prompt:e.prompt,agentId:e.agentId,startsAt:e.startsAt,config:S(e),utcOffset:e.utcOffset||"+00:00"},a=await c.createSchedule(o,s,n);if(e.json){console.log(JSON.stringify(a));return}console.log(`Created schedule: ${a.name}`),console.log(` ID: ${a.id}`),console.log(` Next Run: ${a.nextRunAt?l(a.nextRunAt,a.utcOffset):"-"}`);return}if(i==="delete"){let n=e.scheduleId;n||(console.error("Missing schedule ID."),d(),process.exit(1)),await c.deleteSchedule(o,s,n),console.log(`Deleted schedule: ${n}`);return}i!=="list"&&(console.error(`Unknown schedules command: ${i}`),d(),process.exit(1));let r=[],u;do{let n=await c.getSchedules(o,s,{nextKey:u,limit:100});r.push(...n.schedules),u=n.nextKey}while(u);if(e.json){console.log(JSON.stringify(r));return}if(r.length===0){console.log("No schedules found in this workspace.");return}console.log(`Schedules (${r.length}):
46
+ `);for(let n of r){let a=n.isActive?"\x1B[32mActive\x1B[0m":"\x1B[33mPaused\x1B[0m";console.log(` ${n.name}`),console.log(` Agent: ${n.agent.name}`),console.log(` Repeat: ${h(n.config)}`),console.log(` Status: ${a}`),console.log(` Next Run: ${n.nextRunAt?l(n.nextRunAt,n.utcOffset):"-"}`),console.log(` ID: ${n.id}`),console.log("")}}catch(t){p(t)}}export{O as runSchedules};
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import{i as S,p as z,r as I}from"./chunk-JB5ASFUE.js";import U from"crypto";import g from"fs";import i from"fs/promises";import b from"os";import o from"path";import{Readable as A}from"stream";import{pipeline as E}from"stream/promises";import j from"adm-zip";import N from"archiver";function D(){console.log(`
3
+ Usage: entrydesk skills [list|upload|delete|download] [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
+
12
+ Options:
13
+ --me Only list skills created by me
14
+ --force Overwrite an existing skill with the same name
15
+ --json Output JSON (for list/upload)
16
+ `)}function O(t,d){let n=o.relative(t,d);return n===""||!n.startsWith("..")&&!o.isAbsolute(n)}async function W(t){let d=await i.realpath(t),n=[process.cwd(),b.homedir()];if(!(await Promise.all(n.map(async a=>{try{return await i.realpath(a)}catch{return o.resolve(a)}}))).some(a=>O(a,d)))throw new Error("Invalid upload path: must be within the current directory or your home directory.")}async function R(t){let d=await i.mkdtemp(o.join(b.tmpdir(),"entrydesk-skill-")),n=o.join(d,`${o.basename(t)}.zip`);return await new Promise((f,m)=>{let a=g.createWriteStream(n),u=N("zip",{zlib:{level:9}});a.on("close",()=>f()),a.on("error",m),u.on("error",m),u.pipe(a),u.directory(t,!1),u.finalize()}),{zipPath:n,cleanupDir:d}}async function Y(t){let d,n;try{let e=await z();d=e.accessToken,n=e.workspaceId}catch(e){I(e)}let f=t.action||"list",m=new S;if(f==="upload"){let e=t.configKey;e||(console.error("Missing file path."),D(),process.exit(1));let w=o.resolve(e),c;try{c=await i.stat(w)}catch{console.error(`File not found: ${w}`),process.exit(1)}let s=w,k=null;try{try{await W(w)}catch(l){let r=l instanceof Error?l.message:"Invalid upload path.";console.error(r),process.exit(1)}if(c.isDirectory()){let l=await R(w);s=l.zipPath,k=l.cleanupDir}else c.isFile()||(console.error(`Not a file or directory: ${w}`),process.exit(1));o.extname(s).toLowerCase()!==".zip"&&(console.error("Only .zip files are supported for upload."),process.exit(1));let v=await i.readFile(s),p=new FormData;p.append("file",new Blob([v],{type:"application/zip"}),o.basename(s)),t.force&&p.append("force","true");let y;try{y=await m.uploadSkill(d,n,p)}catch(l){if(l instanceof Error&&l.name==="HTTPError"){let r=l;if(r.response&&r.response.status===409){try{(await r.response.json()).code==="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."))}catch{console.error("Upload failed: A skill with this name already exists."),console.error("Use --force to overwrite the existing skill.")}process.exit(1)}}throw l}if(t.json){console.log(JSON.stringify(y));return}console.log(`Uploaded skill: ${y.name}`),console.log(` ID: ${y.id}`),console.log(` Version ID: ${y.versionId}`),console.log(` Description: ${y.description}`);return}finally{k&&await i.rm(k,{recursive:!0,force:!0})}}if(f==="delete"){let e=t.configKey;e||(console.error("Missing skill ID."),D(),process.exit(1)),await m.deleteSkill(d,n,e),console.log(`Deleted skill: ${e}`);return}if(f==="download"){let e=t.configKey;e||(console.error("Missing skill ID."),D(),process.exit(1));let{url:w,name:c}=await m.downloadSkillCurrent(d,n,e);(c.includes("/")||c.includes(o.sep)||c==="."||c===".."||!c)&&(console.error(`Invalid skill name for output directory: ${c}`),process.exit(1));let s=o.resolve(c),k=await i.mkdtemp(o.join(b.tmpdir(),"entrydesk-skill-download-")),v=o.join(k,`${c}.zip`);try{let p=await fetch(w);if(!p.ok)throw new Error(`Failed to download skill zip: ${p.status} ${p.statusText}`);if(!p.body)throw new Error("Response body is empty");let y=g.createWriteStream(v);await E(A.fromWeb(p.body),y);let l=await i.mkdtemp(o.join(o.dirname(s),".entrydesk-skill-extract-")),r=null;try{t.json||console.log("Extracting...");let x=new j(v),P=o.resolve(l)+o.sep;for(let h of x.getEntries()){if(h.isDirectory)continue;let $=o.resolve(l,h.entryName);if(!$.startsWith(P))throw new Error(`Zip entry contains path traversal: ${h.entryName}`);await i.mkdir(o.dirname($),{recursive:!0}),await i.writeFile($,h.getData())}g.existsSync(s)&&(r=o.join(o.dirname(s),`.entrydesk-backup-${U.randomUUID()}`),t.json||console.log(`Replacing existing directory: ${s}`),await i.rename(s,r));try{await i.rename(l,s),r&&g.existsSync(r)&&(await i.rm(r,{recursive:!0,force:!0}),r=null)}catch(h){throw r&&g.existsSync(r)&&(await i.rename(r,s),r=null),h}}catch(x){if(await i.rm(l,{recursive:!0,force:!0}),r&&g.existsSync(r))try{await i.rename(r,s)}catch{console.error(`Warning: Could not restore backup. Your original files are at: ${r}`)}throw x}if(t.json){console.log(JSON.stringify({skillId:e,skillName:c,outputDir:s}));return}console.log(`Downloaded skill "${c}" to ${s}`)}finally{await i.rm(k,{recursive:!0,force:!0})}return}f!=="list"&&(console.error(`Unknown skills command: ${f}`),D(),process.exit(1));let a=[],u;do{let e=await m.listAvailableSkills(d,n,{createdBy:t.createdBy,nextKey:u,limit:100});a.push(...e.skills),u=e.nextKey}while(u);if(t.json){console.log(JSON.stringify(a));return}if(a.length===0){console.log("No skills found in this workspace.");return}console.log(`Available Skills (${a.length}):
17
+ `);for(let e of a)console.log(` ${e.name} (${e.provider})`),console.log(` ${e.description.slice(0,120)}`),console.log(` ID: ${e.id}`),console.log(` Author: ${e.author.name}`),console.log("")}export{Y as runSkills};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{a as i,b as r,h as c,i as a,l as g,o as f,r as p}from"./chunk-JB5ASFUE.js";async function A(s){try{let o=i.getEffectiveProfileName(),e=await c.getAll(),n={model:r.getDefaultModel(),connectors:r.getDefaultConnectorIds(),capabilities:r.getCapabilities()};if(!e){s.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 t;if(e.workspaceId)try{let l=new a,d=await f(),{workspaces:m}=await l.getWorkspaces(d);t=m.find(k=>k.id===e.workspaceId)?.name}catch(l){if(l instanceof g){s.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}}s.json?console.log(JSON.stringify({loggedIn:!0,profile:o,email:e.email,workspaceId:e.workspaceId,workspaceName:t,defaults:n})):(console.log(`Profile: ${o}`),console.log(`Logged in as ${e.email}`),t&&console.log(`Workspace: ${t}`),e.workspaceId&&console.log(`Workspace ID: ${e.workspaceId}`))}catch(o){p(o)}}export{A as runStatus};
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ import{c as S,p as _}from"./chunk-JB5ASFUE.js";import B from"fs";import{Client as E}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as L}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 s=new E({name:"entrydesk-cli",version:"1.0.0"}),i=new URL(`${t}/v1/workspaces/${o}/mcp`),r=new L(i,{requestInit:{headers:{Authorization:`Bearer ${n}`}}});return await s.connect(r),s}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),s=d.extname(o),i=o.slice(0,-s.length),r=J(t),l=d.join(n,o);if(await N(l,r))return l;for(let u=1;u<=b;u++){let w=d.join(n,`${i}-${u}${s}`);if(await N(w,r))return w}let c=Math.random().toString(36).slice(2,10),a=d.join(n,`${i}-${c}${s}`);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),s=e.slice(-I),r=((n-O-I)/1024).toFixed(1),l=(n/1024).toFixed(1),c=` ... (skipped ${r}KB of ${l}KB) ...`;return t&&(c+=`
3
+ Tip: jq -r '.structuredContent.field' <file> | grep/head/tail`),`${o}
4
+
5
+ ${c}
6
+
7
+ ${s}`}function $(e){console.log(`${p.green}Tool execution result saved to: ${e}${p.reset}`),console.log()}function x(){console.log(`${p.green}Tool execution result:${p.reset}`)}function R(e){return e.split("__")[0]??e}function f(e,t,n){console.error(n?JSON.stringify({error:{code:e,message:t}}):`Error [${e}]: ${t}`),process.exit(1)}function g(e,t,n="CONNECTION_FAILED"){let o=e instanceof Error?e.message:"Unknown error";o.includes("Not logged in")||o.includes("not-logged-in")?f("AUTH_MISSING",o,t):f(n,o,t)}async function H(){return process.stdin.isTTY?null:new Promise(e=>{let t=[],n=!1,o=!1,s=()=>{clearTimeout(r),process.stdin.removeListener("data",l),process.stdin.removeListener("end",c),process.stdin.removeListener("error",a)},i=u=>{o||(o=!0,s(),e(u))},r=setTimeout(()=>{n||i(null)},100),l=u=>{n=!0,clearTimeout(r),t.push(u)},c=()=>{t.length===0?i(null):i(Buffer.concat(t).toString("utf-8").trim())},a=()=>{i(null)};process.stdin.on("data",l),process.stdin.on("end",c),process.stdin.on("error",a),process.stdin.resume()})}var m=class extends Error{constructor(t){super(t),this.name="InputError"}};async function Y(e,t){if(e)return e;if(t)try{return B.readFileSync(t,"utf-8").trim()}catch(o){let s=o instanceof Error?o.message:"Failed to read input file";throw new m(`Failed to read input file: ${s}`)}let n=await H();if(n)return n;throw new m("Input JSON is required. Use --input, --input-file, or pipe via stdin")}function V(e){let t=[];return t.push(`Tool: ${e.name}`),e.description&&t.push(` Description: ${e.description}`),t.join(`
8
+ `)}function q(e){let t=[];return t.push(`Tool: ${e.name}`),e.description&&(t.push("Description:"),t.push(` ${e.description}`)),t.push("Input Schema:"),t.push(JSON.stringify(e.inputSchema,null,2)),t.join(`
9
+ `)}async function X(e,t){let n=await T().catch(o=>{g(o,e)});try{let s=(await n.listTools()).tools;if(t){let i=t.toLowerCase();s=s.filter(r=>R(r.name).toLowerCase().startsWith(i))}if(e)console.log(JSON.stringify(s,null,2));else{let i=t?` (prefix: ${t})`:"";console.log(`Available Tools (${s.length})${i}:
10
+ `);for(let r of s)console.log(V(r)),console.log()}}catch(o){g(o,e)}finally{await n.close().catch(()=>{})}}async function z(e,t){let n=await T().catch(o=>{g(o,t)});try{let s=(await n.listTools()).tools.find(i=>i.name===e);s||f("TOOL_NOT_FOUND",`Tool not found: ${e}`,t),console.log(t?JSON.stringify(s,null,2):q(s))}catch(o){g(o,t)}finally{await n.close().catch(()=>{})}}async function G(e,t,n){let o;try{o=JSON.parse(t)}catch(r){let l=r instanceof Error?`Invalid JSON input: ${r.message}`:"Invalid JSON input";f("INVALID_INPUT",l,n)}let s=await T().catch(r=>{g(r,n,"TOOL_CALL_FAILED")}),i=!1;try{let r=await s.callTool({name:e,arguments:o});if(n)console.log(JSON.stringify(r,null,2));else{let l=await C(e,r);l&&$(l),x();let c=r.content;for(let a of c)a.type==="text"?console.log(a.text):a.type==="image"?console.log(`[Image: ${a.mimeType}]`):a.type==="resource"?console.log(`[Resource: ${a.resource?.uri??"unknown"}]`):console.log(JSON.stringify(a,null,2));if(r.structuredContent){let a=JSON.stringify(r.structuredContent,null,2),u=k(a,l);console.log(u)}}r.isError&&(i=!0)}catch(r){g(r,n,"TOOL_CALL_FAILED")}finally{await s.close().catch(()=>{})}i&&process.exit(1)}async function lt(e){let t=e.json??!1;switch(e.action){case"list":await X(t,e.prefix);break;case"get":e.name||f("INVALID_INPUT","Tool name is required",t),await z(e.name,t);break;case"call":{e.name||f("INVALID_INPUT","Tool name is required",t);let n;try{n=await Y(e.input,e.inputFile)}catch(o){throw o instanceof m&&f("INVALID_INPUT",o.message,t),o}await G(e.name,n,t);break}default:console.log(`Usage: entrydesk tool <action> [options]
11
+
12
+ Actions:
13
+ list List all available tools
14
+ get <name> Get details of a specific tool
15
+ call <name> Call a tool with JSON input
16
+
17
+ Options:
18
+ --json Output in JSON format
19
+ -p, --prefix <name> Filter tools by prefix (for 'list' action)
20
+ -i, --input <json> JSON input for tool call
21
+ -f, --input-file <path> Read JSON input from file
22
+
23
+ Input Priority (for 'call' action):
24
+ 1. --input flag (direct JSON string)
25
+ 2. --input-file flag (read from file)
26
+ 3. stdin (piped input)
27
+
28
+ Examples:
29
+ entrydesk tool list
30
+ entrydesk tool list --prefix agent
31
+ entrydesk tool get agent__search_agents
32
+ entrydesk tool call agent__search_agents --input '{"limit": 5}'
33
+ entrydesk tool call agent__search_agents --input-file input.json
34
+ echo '{"limit": 5}' | entrydesk tool call agent__search_agents
35
+ `);break}}export{m as InputError,Y as getInputJson,H as readStdin,lt as runTool};
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import{i as d,p as f}from"./chunk-JB5ASFUE.js";function U(){console.log(`
3
+ Usage: entrydesk usage [options]
4
+
5
+ Options:
6
+ --limit <number> Limit number of users shown (default: all)
7
+ --sort-by cost|operations Sort by cost or operations (default: cost)
8
+ --json Output JSON
9
+
10
+ Examples:
11
+ entrydesk usage # Show all users, sorted by cost
12
+ entrydesk usage --limit 10 # Show top 10 users
13
+ entrydesk usage --sort-by operations # Sort by operation count
14
+ entrydesk usage --json # JSON output
15
+ `)}async function k(e){if(e.help){U();return}let l,a;try{let o=await f();l=o.accessToken,a=o.workspaceId}catch(o){let s=o instanceof Error?o.message:"Authentication failed";console.error(s),process.exit(1)}let h=new d,t=[],r,i=0,m=100;do{let o=await h.getMonthlyUsages(l,a,{nextKey:r,limit:100});if(t.push(...o.monthlyUsages),r=o.nextKey,i++,i>=m){console.error(`Warning: Showing first ${t.length} entries (pagination limit reached)`);break}}while(r);if(e.json){console.log(JSON.stringify(t));return}if(t.length===0){console.log("No usage data found for this workspace.");return}console.log(`Current Month Usage:
16
+ `);let c=0,g=0;for(let o of t)c+=parseFloat(o.totalCost),g+=o.operationCount;console.log(`Total Cost: $${c.toFixed(2)}`),console.log(`Total Operations: ${g.toLocaleString()}`),console.log(`Users: ${t.length}
17
+ `);let u=e.sortBy||"cost",p=[...t].toSorted((o,s)=>u==="cost"?parseFloat(s.totalCost)-parseFloat(o.totalCost):s.operationCount-o.operationCount),y=e.limit&&e.limit>0?e.limit:p.length,n=p.slice(0,y);console.log(`Usage by User (sorted by ${u}, showing ${n.length} of ${t.length}):
18
+ `);for(let o of n){let s=parseFloat(o.totalCost);console.log(` ${o.user.name} (${o.user.email})`),console.log(` Cost: $${s.toFixed(2)}`),console.log(` Operations: ${o.operationCount.toLocaleString()}`),console.log("")}n.length<t.length&&console.log(`... and ${t.length-n.length} more users`)}export{k as runUsage};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ function n(){console.log("entrydesk 1.11.9")}export{n as printVersion};
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import{h as a,i as w,o as k}from"./chunk-JB5ASFUE.js";function l(){console.log(`
3
+ Usage: entrydesk workspaces [list|switch|use] [options]
4
+
5
+ Commands:
6
+ list List all workspaces (default)
7
+ switch <workspaceId> Switch to a workspace
8
+ use <workspaceId> Switch to a workspace (alias)
9
+
10
+ Flags:
11
+ --json Output JSON
12
+ `)}async function h(e){if(e.help){l();return}let t,f=(await a.getAll())?.workspaceId;try{t=await k()}catch(o){let s=o instanceof Error?o.message:"Authentication failed";console.error(s),process.exit(1)}let r=e.action||"list",p=new w;if(r==="switch"||r==="use"){let o=e.configKey;o||(console.error("Missing workspaceId for switch."),l(),process.exit(1));let{workspaces:s}=await p.getWorkspaces(t),i=s.find(n=>n.id===o);if(!i){console.error(`Workspace not found: ${o}`),console.error(`
13
+ Available workspaces:`);for(let n of s)console.error(` ${n.name}: ${n.id}`);process.exit(1)}if(await a.saveWorkspaceId(o),e.json){console.log(JSON.stringify({workspaceId:o,workspaceName:i.name}));return}console.log(`Switched to workspace: ${i.name}`),console.log(` ID: ${o}`);return}r!=="list"&&(console.error(`Unknown workspaces command: ${r}`),l(),process.exit(1));let{workspaces:c}=await p.getWorkspaces(t);if(e.json){console.log(JSON.stringify(c));return}if(c.length===0){console.log("No workspaces found.");return}console.log(`Workspaces (${c.length}):
14
+ `);for(let o of c){let s=o.id===f?" (current)":"";console.log(` ${o.name}${s}`),console.log(` ID: ${o.id}`),console.log("")}}export{h as runWorkspaces};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@entrydesk/cli",
3
- "version": "1.11.8",
3
+ "version": "1.11.9",
4
4
  "description": "EntryDesk CLI - Interact with EntryDesk from your terminal",
5
5
  "type": "module",
6
6
  "bin": {