@entrydesk/cli 2.1.0-beta.4 → 2.1.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 (60) hide show
  1. package/README.md +15 -0
  2. package/dist/{add-4VqDcbIj.js → add-D4yZrlJH.js} +1 -1
  3. package/dist/{agents-CCOqroYN.js → agents-3dOJzTmM.js} +1 -1
  4. package/dist/{billing-BV5kdyQb.js → billing-Cyk-IzGv.js} +1 -1
  5. package/dist/{budget-CnxbNkne.js → budget-znTQ0rkG.js} +1 -1
  6. package/dist/build-task-request-config-C62XneUL.js +10 -0
  7. package/dist/commands--5Ein-MI.js +10 -0
  8. package/dist/{commands-DRUlUd-I.js → commands-D5BrzwFc.js} +1 -1
  9. package/dist/{config-CJf4r7wp.js → config-D-9dIy19.js} +1 -1
  10. package/dist/{connectors-C_Re7e0l.js → connectors-B7smri5B.js} +2 -2
  11. package/dist/index.js +17 -17
  12. package/dist/{instruction-DYgn39xF.js → instruction-BzftVNfK.js} +1 -1
  13. package/dist/{login-C0Zz6tHG.js → login-Ch3S9nh6.js} +1 -1
  14. package/dist/{logout-DnFBlXMZ.js → logout-BFFnjWjY.js} +1 -1
  15. package/dist/{marketplace-DQsEzT6T.js → marketplace-DNm78dKX.js} +1 -1
  16. package/dist/mcp-D2zejorr.js +11 -0
  17. package/dist/mcp-client-ltOwvE7T.js +10 -0
  18. package/dist/{meeting-C6H_GJB7.js → meeting-BdLr54zK.js} +1 -1
  19. package/dist/{message-utils-Cq_Fel5P.js → message-utils-DiNLK_84.js} +1 -1
  20. package/dist/{models-DT78HZxx.js → models-6WioEQKB.js} +1 -1
  21. package/dist/{notifications-3UrKbGaT.js → notifications-DIokyl4e.js} +1 -1
  22. package/dist/{paginate-Brd-j5V8.js → paginate-C9ixtica.js} +1 -1
  23. package/dist/{paths-mBL9tt9p.js → paths-CZAS8cbS.js} +1 -1
  24. package/dist/{profile-D4m5ZAG7.js → profile-CWsA2P_O.js} +1 -1
  25. package/dist/profile-storage-CuiJZpFD.js +68 -0
  26. package/dist/{project-C5_rCWCh.js → project-c8F30d-Q.js} +1 -1
  27. package/dist/{project-context-DnIuy1T0.js → project-context-C0ozCzKH.js} +1 -1
  28. package/dist/{project-governance-CxDZSThr.js → project-governance-DRDjqvX8.js} +1 -1
  29. package/dist/{project-sources-D17oXXhL.js → project-sources-DFn7Tn7u.js} +1 -1
  30. package/dist/{project-sources-write-C-W8gjLg.js → project-sources-write-Bz0lGCid.js} +1 -1
  31. package/dist/{project-tasks-t4HFgEoZ.js → project-tasks-DnOrMxr3.js} +1 -1
  32. package/dist/{push-CJZLFEdk.js → push-mojEdys2.js} +1 -1
  33. package/dist/{recordings-DeB1LqiS.js → recordings-BbeRVH0H.js} +1 -1
  34. package/dist/remove-BLF3muSH.js +10 -0
  35. package/dist/{resolve-Czx_OkYk.js → resolve-BoqGhxVK.js} +2 -2
  36. package/dist/{resource-grants-zAoqe73P.js → resource-grants-CtIINiDN.js} +1 -1
  37. package/dist/{schedules-COBaV-Be.js → schedules-ec4cS2A0.js} +2 -2
  38. package/dist/skills-C0xCUb-M.js +10 -0
  39. package/dist/status-Bfh5hjTq.js +10 -0
  40. package/dist/status-DpYhlJPA.js +10 -0
  41. package/dist/{task-C8PttINZ.js → task-DfLoMsmZ.js} +36 -36
  42. package/dist/{tasks-CAmfAGsn.js → tasks-Bl8A2HW6.js} +1 -1
  43. package/dist/{tasks-dv0gJ38_.js → tasks-CA2QZ8rX.js} +1 -1
  44. package/dist/{tool-kEevHrsQ.js → tool-B8CuZYYb.js} +1 -1
  45. package/dist/{update-Y9S-P4wG.js → update-BVBj3leV.js} +1 -1
  46. package/dist/{usage-CHIhyA8S.js → usage-CIhTZm98.js} +1 -1
  47. package/dist/{usage-audit-C1xGe42N.js → usage-audit-BUcbqdAc.js} +3 -3
  48. package/dist/{version-Dgsb7T5N.js → version-C1OwBsCd.js} +1 -1
  49. package/dist/{workflow-DWmgcRJ_.js → workflow-DJSq8hY5.js} +1 -1
  50. package/dist/{workspaces-3PFiXy1I.js → workspaces-BM_3Miqs.js} +1 -1
  51. package/package.json +5 -4
  52. package/dist/build-task-request-config-CjKDSNjv.js +0 -10
  53. package/dist/commands-gyHmiEsC.js +0 -10
  54. package/dist/mcp-DHXuIFWP.js +0 -11
  55. package/dist/mcp-client-EK-Fh8gM.js +0 -10
  56. package/dist/profile-storage-CPg61h-2.js +0 -68
  57. package/dist/remove-ChV-BE95.js +0 -10
  58. package/dist/skills-OLZywcSs.js +0 -10
  59. package/dist/status-CpfDbB9S.js +0 -10
  60. package/dist/status-Oo8upbyy.js +0 -10
@@ -7,7 +7,7 @@ if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
7
7
  );
8
8
  process.exit(1);
9
9
  }
10
- import{b as e,l as t,o as n,u as r}from"./profile-storage-CPg61h-2.js";import{f as i,i as a,o,t as s,u as c}from"./resolve-Czx_OkYk.js";import{l,n as u,u as d}from"./message-utils-Cq_Fel5P.js";const f=`\x1B[2m`,p=`\x1B[0m`,m=`\x1B[36m`,h=`\x1B[33m`,g=`\x1B[32m`;function _(e,t){let n=t===void 0?{event:e}:{event:e,data:t};process.stdout.write(`${JSON.stringify(n)}\n`)}function v(e){let t=new Date(e),n=new Date().getTime()-t.getTime(),r=Math.floor(n/(1e3*60*60*24));return r===0?t.toLocaleTimeString(`en-US`,{hour:`2-digit`,minute:`2-digit`}):r===1?`Yesterday`:r<7?`${r} days ago`:t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})}function y(e){return e.replace(/<mark>/g,`\x1B[1m`).replace(/<\/mark>/g,p).replace(/&lt;/g,`<`).replace(/&gt;/g,`>`).replace(/&quot;/g,`"`).replace(/&#39;/g,`'`).replace(/&amp;/g,`&`)}function b(e,t){if(t)return e;let n=e.split(`
10
+ import{b as e,l as t,o as n,u as r}from"./profile-storage-CuiJZpFD.js";import{f as i,i as a,o,t as s,u as c}from"./resolve-BoqGhxVK.js";import{l,n as u,u as d}from"./message-utils-DiNLK_84.js";const f=`\x1B[2m`,p=`\x1B[0m`,m=`\x1B[36m`,h=`\x1B[33m`,g=`\x1B[32m`;function _(e,t){let n=t===void 0?{event:e}:{event:e,data:t};process.stdout.write(`${JSON.stringify(n)}\n`)}function v(e){let t=new Date(e),n=new Date().getTime()-t.getTime(),r=Math.floor(n/(1e3*60*60*24));return r===0?t.toLocaleTimeString(`en-US`,{hour:`2-digit`,minute:`2-digit`}):r===1?`Yesterday`:r<7?`${r} days ago`:t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})}function y(e){return e.replace(/<mark>/g,`\x1B[1m`).replace(/<\/mark>/g,p).replace(/&lt;/g,`<`).replace(/&gt;/g,`>`).replace(/&quot;/g,`"`).replace(/&#39;/g,`'`).replace(/&amp;/g,`&`)}function b(e,t){if(t)return e;let n=e.split(`
11
11
  `);if(n.length<=15)return e;let r=n.slice(0,6),i=n.slice(-4),a=n.length-10;return[...r,`… (${a} lines omitted, use --full-output to see all) …`,...i].join(`
12
12
  `)}function x(e){if(!e||typeof e!=`object`)return e;if(Array.isArray(e))return e.map(x);let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&r.length>200?t[n]=r.slice(0,150)+`… (truncated)`:typeof r==`object`&&r?t[n]=x(r):t[n]=r;return t}function S(e){if(!e||typeof e!=`object`)return String(e);try{return JSON.stringify(e,null,2)}catch{return String(e)}}function C(e){return d(S(e))}function w(e,t){if(!e)return`(no result)`;if(typeof e!=`object`)return b(d(String(e)),t);let n=t?e:x(e);if(`structuredContent`in n&&n.structuredContent){let e=n.structuredContent,r=[];if(e.stdout&&typeof e.stdout==`string`&&e.stdout.trim()&&r.push(d(e.stdout.trim())),e.stderr&&typeof e.stderr==`string`&&e.stderr.trim()&&r.push(`${h}[stderr]${p} ${d(e.stderr.trim())}`),e.urls&&Array.isArray(e.urls)){let t=e.urls;for(let e of t)e.path&&e.url&&r.push(d(`${e.path}: ${e.url}`))}return r.length===0&&r.push(d(JSON.stringify(e,null,2))),b(r.join(`
13
13
  `),t)}return`content`in n&&Array.isArray(n.content)?b(d(n.content.filter(e=>e.type===`text`&&e.text).map(e=>e.text).join(`
@@ -7,4 +7,4 @@ if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
7
7
  );
8
8
  process.exit(1);
9
9
  }
10
- import{n as e}from"./tasks-CAmfAGsn.js";export{e as runTasks};
10
+ import{n as e}from"./tasks-Bl8A2HW6.js";export{e as runTasks};
@@ -7,7 +7,7 @@ if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
7
7
  );
8
8
  process.exit(1);
9
9
  }
10
- import{Y as e,c as t,i as n,s as r}from"./profile-storage-CPg61h-2.js";import{t as i}from"./isRecord-BNZWvqVS.js";import{n as a,r as o}from"./mcp-client-EK-Fh8gM.js";import s from"node:fs";import c from"node:os";import l from"node:path";import u from"node:fs/promises";const d=!process.env.NO_COLOR&&process.stdout.isTTY,f={green:d?`\x1B[32m`:``,yellow:d?`\x1B[33m`:``,reset:d?`\x1B[0m`:``},p=8*1024;function m(){return l.join(c.homedir(),`.entrydesk`,`tool-results`)}function h(e){let t=e.trim().replace(/[/\\:*?"<>|\s]/g,`_`).replace(/_+/g,`_`).replace(/^[._]+|[._]+$/g,``).slice(0,100);return!t||t===`.`||t===`..`?`unnamed_tool`:t}function g(e){try{return JSON.stringify(e,(e,t)=>typeof t==`bigint`?`${t}n`:typeof t==`function`?`[Function]`:typeof t==`symbol`?t.toString():t,2)}catch{return String(e)}}function _(e){let t=new Date;return`${[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(`-`)}_${h(e)}.json`}async function v(e,t){try{return await u.writeFile(e,t,{encoding:`utf8`,flag:`wx`}),!0}catch(e){if(e instanceof Error&&`code`in e&&e.code===`EEXIST`)return!1;throw e}}async function y(e,t){try{let n=m();await u.mkdir(n,{recursive:!0});let r=_(e),i=l.extname(r),a=r.slice(0,-i.length),o=g(t),s=l.join(n,r);if(await v(s,o))return s;for(let e=1;e<=100;e++){let t=l.join(n,`${a}-${e}${i}`);if(await v(t,o))return t}let c=Math.random().toString(36).slice(2,10),d=l.join(n,`${a}-${c}${i}`);return await u.writeFile(d,o,{encoding:`utf8`,flag:`wx`}),d}catch(e){let t=e instanceof Error?e.message:`unknown error`;return console.error(`${f.yellow}Warning: Could not save result to file: ${t}${f.reset}`),null}}function b(e,t){let n=Buffer.byteLength(e,`utf8`);if(n<=10240)return e;let r=e.slice(0,p),i=e.slice(-2048),a=` … (skipped ${((n-p-2048)/1024).toFixed(1)}KB of ${(n/1024).toFixed(1)}KB) …`;return t&&(a+=`
10
+ import{Q as e,c as t,i as n,s as r}from"./profile-storage-CuiJZpFD.js";import{t as i}from"./isRecord-BNZWvqVS.js";import{n as a,r as o}from"./mcp-client-ltOwvE7T.js";import s from"node:fs";import c from"node:os";import l from"node:path";import u from"node:fs/promises";const d=!process.env.NO_COLOR&&process.stdout.isTTY,f={green:d?`\x1B[32m`:``,yellow:d?`\x1B[33m`:``,reset:d?`\x1B[0m`:``},p=8*1024;function m(){return l.join(c.homedir(),`.entrydesk`,`tool-results`)}function h(e){let t=e.trim().replace(/[/\\:*?"<>|\s]/g,`_`).replace(/_+/g,`_`).replace(/^[._]+|[._]+$/g,``).slice(0,100);return!t||t===`.`||t===`..`?`unnamed_tool`:t}function g(e){try{return JSON.stringify(e,(e,t)=>typeof t==`bigint`?`${t}n`:typeof t==`function`?`[Function]`:typeof t==`symbol`?t.toString():t,2)}catch{return String(e)}}function _(e){let t=new Date;return`${[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(`-`)}_${h(e)}.json`}async function v(e,t){try{return await u.writeFile(e,t,{encoding:`utf8`,flag:`wx`}),!0}catch(e){if(e instanceof Error&&`code`in e&&e.code===`EEXIST`)return!1;throw e}}async function y(e,t){try{let n=m();await u.mkdir(n,{recursive:!0});let r=_(e),i=l.extname(r),a=r.slice(0,-i.length),o=g(t),s=l.join(n,r);if(await v(s,o))return s;for(let e=1;e<=100;e++){let t=l.join(n,`${a}-${e}${i}`);if(await v(t,o))return t}let c=Math.random().toString(36).slice(2,10),d=l.join(n,`${a}-${c}${i}`);return await u.writeFile(d,o,{encoding:`utf8`,flag:`wx`}),d}catch(e){let t=e instanceof Error?e.message:`unknown error`;return console.error(`${f.yellow}Warning: Could not save result to file: ${t}${f.reset}`),null}}function b(e,t){let n=Buffer.byteLength(e,`utf8`);if(n<=10240)return e;let r=e.slice(0,p),i=e.slice(-2048),a=` … (skipped ${((n-p-2048)/1024).toFixed(1)}KB of ${(n/1024).toFixed(1)}KB) …`;return t&&(a+=`
11
11
  Tip: jq -r '.structuredContent.field' <file> | grep/head/tail`),`${r}\n\n${a}\n\n${i}`}function x(e){console.log(`${f.green}Tool execution result saved to: ${e}${f.reset}`),console.log()}function S(){console.log(`${f.green}Tool execution result:${f.reset}`)}function C(e){return i(e)&&typeof e.name==`string`&&(e.description===void 0||typeof e.description==`string`)}function w(e){return Array.isArray(e.primaryTools)&&e.primaryTools.every(C)&&(e.relatedTools===void 0||Array.isArray(e.relatedTools)&&e.relatedTools.every(C))&&(e.toolSchemas===void 0||i(e.toolSchemas))&&(e.authStatuses===void 0||Array.isArray(e.authStatuses)&&e.authStatuses.every(e=>i(e)&&typeof e.toolNamespace==`string`&&typeof e.connected==`boolean`&&(e.authStatusMessage===void 0||typeof e.authStatusMessage==`string`)))&&[e.recommendedPlanSteps,e.knownPitfalls].every(e=>e===void 0||Array.isArray(e)&&e.every(e=>typeof e==`string`))&&(e.error===null||typeof e.error==`string`)}function T(e){return e.split(`__`)[0]??e}function E(e,t,n){console.error(n?JSON.stringify({error:{code:e,message:t}}):`Error [${e}]: ${t}`),process.exitCode=1}function D(e,t,n){E(e,t,n),process.exit(1)}function O(e,i,a=`CONNECTION_FAILED`){if(r(e)){E(a,n(),i);return}let o=e instanceof Error?e.message:`Unknown error`;e instanceof t&&e.code===`not-logged-in`?E(`AUTH_MISSING`,o,i):E(a,o,i)}function k(e,t,n=`CONNECTION_FAILED`){O(e,t,n),process.exit(1)}async function A(){return process.stdin.isTTY?null:new Promise(e=>{let t=[],n=!1,r=!1,i,a,o,s,c=()=>{clearTimeout(i),process.stdin.removeListener(`data`,a),process.stdin.removeListener(`end`,o),process.stdin.removeListener(`error`,s)},l=t=>{r||(r=!0,c(),e(t))};a=e=>{n=!0,clearTimeout(i),t.push(e)},o=()=>{t.length===0?l(null):l(Buffer.concat(t).toString(`utf-8`).trim())},s=()=>{l(null)},i=setTimeout(()=>{n||l(null)},100),process.stdin.on(`data`,a),process.stdin.on(`end`,o),process.stdin.on(`error`,s),process.stdin.resume()})}var j=class extends Error{constructor(e){super(e),this.name=`InputError`}};async function M(e,t){if(e)return e;if(t)try{return s.readFileSync(t,`utf-8`).trim()}catch(e){throw new j(`Failed to read input file: ${e instanceof Error?e.message:`Failed to read input file`}`)}let n=await A();if(n)return n;throw new j(`Input JSON is required. Use --input, --input-file, or pipe it via stdin.`)}function N(e){let t=[`Tool: ${e.name}`];return e.description&&t.push(` Description: ${e.description}`),t.join(`
12
12
  `)}async function P(e){let t=[],n=new Set,r;do{let i=await e.listTools(r?{cursor:r}:{},o());if(t.push(...i.tools),r=i.nextCursor,r){if(n.has(r))throw Error(`Tool listing returned a repeated pagination cursor`);n.add(r)}}while(r);return t}async function F(e,t,n){let r=await e.callTool({name:t,arguments:n},o());if(r.isError){let e=r.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
13
13
  `);throw Error(e||`Tool discovery failed: ${t}`)}if(!i(r.structuredContent))throw Error(`Tool discovery returned no structured content: ${t}`);return r.structuredContent}async function I(t,n){let r=await F(t,e.GET_TOOL_SCHEMAS,{toolNames:[n]}),i=r.errors;if(i?.length)throw Error(i.join(`
@@ -7,4 +7,4 @@ if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
7
7
  );
8
8
  process.exit(1);
9
9
  }
10
- import{r as e}from"./profile-storage-CPg61h-2.js";import{t}from"./version-Dgsb7T5N.js";import n from"cross-spawn";const r=`@entrydesk/cli`;function i(e){let t=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/u.exec(e.trim());return t?{nums:[Number(t[1]),Number(t[2]),Number(t[3])],prerelease:t[4]??null}:null}function a(e,t){if(e===t)return 0;if(e===null)return 1;if(t===null)return-1;let n=e.split(`.`),r=t.split(`.`),i=Math.min(n.length,r.length);for(let e=0;e<i;e++){let t=n[e],i=r[e];if(t!==i){let e=/^\d+$/u.test(t),n=/^\d+$/u.test(i);return e&&n?Number(t)<Number(i)?-1:1:e?-1:n?1:t<i?-1:1}}return n.length===r.length?0:n.length<r.length?-1:1}function o(e,t){let n=i(e),r=i(t);if(!n||!r)return n?1:r?-1:0;for(let e=0;e<3;e++)if(n.nums[e]!==r.nums[e])return n.nums[e]<r.nums[e]?-1:1;return a(n.prerelease,r.prerelease)}function s(e,{inheritOutput:t}){return new Promise((r,i)=>{let a=n(`npm`,e,{stdio:t?[`ignore`,`inherit`,`inherit`]:[`ignore`,`pipe`,`pipe`]}),o=``,s=``;a.stdout?.on(`data`,e=>{o+=String(e)}),a.stderr?.on(`data`,e=>{s+=String(e)}),a.once(`error`,i),a.once(`close`,e=>{r({exitCode:e??1,stdout:o,stderr:s})})})}async function c(){let t;try{t=await s([`view`,r,`version`],{inheritOutput:!1})}catch(t){throw new e(`Failed to run npm — is npm installed and on your PATH?`,1,t instanceof Error?t:void 0)}let n=t.stdout.trim();if(t.exitCode!==0||!n)throw new e(`Failed to look up the latest ${r} version from the npm registry.${t.stderr?`\n${t.stderr.trim()}`:``}`);if(!i(n))throw new e(`Unexpected version from the npm registry: ${JSON.stringify(n)}`);return n}async function l(n){let i=t(),a=await c(),l=o(i,a),u=l>=0;if(n.check||u){n.json?console.log(JSON.stringify({current:i,latest:a,upToDate:u,updated:!1})):console.log(l>0?`entrydesk ${i} is newer than the latest published version (${a}). Nothing to do.`:u?`entrydesk ${i} is already the latest version.`:`Update available: ${i} → ${a}. Run \`entrydesk update\` to install.`);return}n.json||console.log(`Updating entrydesk ${i} → ${a}…`);let d=await s([`install`,`-g`,`${r}@${a}`],{inheritOutput:!n.json});if(d.exitCode!==0){let t=d.stderr?`\n${d.stderr.trim()}`:``;throw new e(`npm install failed (exit code ${d.exitCode}). You can update manually with \`npm install -g ${r}@latest\`.`+t,d.exitCode)}n.json?console.log(JSON.stringify({current:i,latest:a,upToDate:u,updated:!0})):console.log(`entrydesk updated to ${a}.`)}export{l as runUpdate};
10
+ import{r as e}from"./profile-storage-CuiJZpFD.js";import{t}from"./version-C1OwBsCd.js";import n from"cross-spawn";const r=`@entrydesk/cli`;function i(e){let t=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/u.exec(e.trim());return t?{nums:[Number(t[1]),Number(t[2]),Number(t[3])],prerelease:t[4]??null}:null}function a(e,t){if(e===t)return 0;if(e===null)return 1;if(t===null)return-1;let n=e.split(`.`),r=t.split(`.`),i=Math.min(n.length,r.length);for(let e=0;e<i;e++){let t=n[e],i=r[e];if(t!==i){let e=/^\d+$/u.test(t),n=/^\d+$/u.test(i);return e&&n?Number(t)<Number(i)?-1:1:e?-1:n?1:t<i?-1:1}}return n.length===r.length?0:n.length<r.length?-1:1}function o(e,t){let n=i(e),r=i(t);if(!n||!r)return n?1:r?-1:0;for(let e=0;e<3;e++)if(n.nums[e]!==r.nums[e])return n.nums[e]<r.nums[e]?-1:1;return a(n.prerelease,r.prerelease)}function s(e,{inheritOutput:t}){return new Promise((r,i)=>{let a=n(`npm`,e,{stdio:t?[`ignore`,`inherit`,`inherit`]:[`ignore`,`pipe`,`pipe`]}),o=``,s=``;a.stdout?.on(`data`,e=>{o+=String(e)}),a.stderr?.on(`data`,e=>{s+=String(e)}),a.once(`error`,i),a.once(`close`,e=>{r({exitCode:e??1,stdout:o,stderr:s})})})}async function c(){let t;try{t=await s([`view`,r,`version`],{inheritOutput:!1})}catch(t){throw new e(`Failed to run npm — is npm installed and on your PATH?`,1,t instanceof Error?t:void 0)}let n=t.stdout.trim();if(t.exitCode!==0||!n)throw new e(`Failed to look up the latest ${r} version from the npm registry.${t.stderr?`\n${t.stderr.trim()}`:``}`);if(!i(n))throw new e(`Unexpected version from the npm registry: ${JSON.stringify(n)}`);return n}async function l(n){let i=t(),a=await c(),l=o(i,a),u=l>=0;if(n.check||u){n.json?console.log(JSON.stringify({current:i,latest:a,upToDate:u,updated:!1})):console.log(l>0?`entrydesk ${i} is newer than the latest published version (${a}). Nothing to do.`:u?`entrydesk ${i} is already the latest version.`:`Update available: ${i} → ${a}. Run \`entrydesk update\` to install.`);return}n.json||console.log(`Updating entrydesk ${i} → ${a}…`);let d=await s([`install`,`-g`,`${r}@${a}`],{inheritOutput:!n.json});if(d.exitCode!==0){let t=d.stderr?`\n${d.stderr.trim()}`:``;throw new e(`npm install failed (exit code ${d.exitCode}). You can update manually with \`npm install -g ${r}@latest\`.`+t,d.exitCode)}n.json?console.log(JSON.stringify({current:i,latest:a,upToDate:u,updated:!0})):console.log(`entrydesk updated to ${a}.`)}export{l as runUpdate};
@@ -7,5 +7,5 @@ if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
7
7
  );
8
8
  process.exit(1);
9
9
  }
10
- import{b as e,u as t}from"./profile-storage-CPg61h-2.js";import{r as n}from"./format-DCvznP70.js";import{writeFileSync as r}from"node:fs";function i(e){console.log(`Extra-usage balance: ${n(e.balanceUsd)}`);let t=e.currentSpentUsedPercent==null?``:` (${e.currentSpentUsedPercent}% of limit)`;console.log(`Spent this period: ${n(e.currentSpentUsd)}${t}`),e.monthlyExtraUsageLimitUsd!=null&&console.log(`Workspace limit: ${n(e.monthlyExtraUsageLimitUsd)} / month`),e.memberMonthlyExtraUsageLimitUsd!=null&&console.log(`Per-member limit: ${n(e.memberMonthlyExtraUsageLimitUsd)} / month`),e.nextExpiry&&console.log(`Next expiry: ${n(e.nextExpiry.amountUsd)} at ${new Date(e.nextExpiry.expiresAt).toLocaleString()}`),console.log(`Period: ${new Date(e.period.startAt).toLocaleDateString()} – ${new Date(e.period.endAt).toLocaleDateString()}`)}function a(e){console.log(`Seat type: ${e.seatType}`),e.hourly&&console.log(`Hourly used: ${e.hourly.usedPercent}%`),console.log(`Weekly used: ${e.weekly.usedPercent}%`),console.log(`Extra spent: ${n(e.extraUsage.spentUsd)}`),console.log(`Available: ${e.availability.allowed?`yes`:`no (${e.availability.reason??`unknown`})`}`),e.trial&&console.log(`Trial: ${e.trial.remainingDays} days remaining`)}function o(e){console.log(`Consumptions (${e.items.length} of ${e.total}):\n`);for(let t of e.items)console.log(` ${t.user.name} (${t.user.email})`),console.log(` Seat: ${t.seatType} · Extra usage: ${n(t.extraUsage)}`),console.log(` User ID: ${t.user.id}`),console.log(``)}async function s(n){let{accessToken:r,workspaceId:a}=await t(),o=await new e().getUsageOverview(r,a);if(n.json){console.log(JSON.stringify(o));return}i(o)}async function c(n){let{accessToken:r,workspaceId:i}=await t(),o=await new e().getUsageMe(r,i);if(n.json){console.log(JSON.stringify(o));return}a(o)}async function l(n){let{accessToken:r,workspaceId:i}=await t(),a=await new e().getUsageConsumptions(r,i,{limit:n.limit,offset:n.offset,periodStart:n.periodStart});if(n.json){console.log(JSON.stringify(a));return}if(a.items.length===0){console.log(`No consumptions for this period.`);return}o(a)}async function u(n){let{accessToken:i,workspaceId:a}=await t(),o=await new e().exportUsageCsv(i,a,n.periodStart);if(n.output){r(n.output,o),console.log(`Wrote usage CSV to ${n.output}`);return}process.stdout.write(o)}async function d(n){let{accessToken:r,workspaceId:i}=await t(),a=new e,o=[],s,c=0;do{let e=await a.getMonthlyUsages(r,i,{nextKey:s,limit:100});if(o.push(...e.monthlyUsages),s=e.nextKey,c++,c>=100){console.error(`Warning: Showing first ${o.length} entries (pagination limit reached)`);break}}while(s);if(n.json){console.log(JSON.stringify(o));return}if(o.length===0){console.log(`No usage data found for this workspace.`);return}console.log(`Current month usage:
10
+ import{b as e,u as t}from"./profile-storage-CuiJZpFD.js";import{r as n}from"./format-DCvznP70.js";import{writeFileSync as r}from"node:fs";function i(e){console.log(`Extra-usage balance: ${n(e.balanceUsd)}`);let t=e.currentSpentUsedPercent==null?``:` (${e.currentSpentUsedPercent}% of limit)`;console.log(`Spent this period: ${n(e.currentSpentUsd)}${t}`),e.monthlyExtraUsageLimitUsd!=null&&console.log(`Workspace limit: ${n(e.monthlyExtraUsageLimitUsd)} / month`),e.memberMonthlyExtraUsageLimitUsd!=null&&console.log(`Per-member limit: ${n(e.memberMonthlyExtraUsageLimitUsd)} / month`),e.nextExpiry&&console.log(`Next expiry: ${n(e.nextExpiry.amountUsd)} at ${new Date(e.nextExpiry.expiresAt).toLocaleString()}`),console.log(`Period: ${new Date(e.period.startAt).toLocaleDateString()} – ${new Date(e.period.endAt).toLocaleDateString()}`)}function a(e){console.log(`Seat type: ${e.seatType}`),e.hourly&&console.log(`Hourly used: ${e.hourly.usedPercent}%`),console.log(`Weekly used: ${e.weekly.usedPercent}%`),console.log(`Extra spent: ${n(e.extraUsage.spentUsd)}`),console.log(`Available: ${e.availability.allowed?`yes`:`no (${e.availability.reason??`unknown`})`}`),e.trial&&console.log(`Trial: ${e.trial.remainingDays} days remaining`)}function o(e){console.log(`Consumptions (${e.items.length} of ${e.total}):\n`);for(let t of e.items)console.log(` ${t.user.name} (${t.user.email})`),console.log(` Seat: ${t.seatType} · Extra usage: ${n(t.extraUsage)}`),console.log(` User ID: ${t.user.id}`),console.log(``)}async function s(n){let{accessToken:r,workspaceId:a}=await t(),o=await new e().getUsageOverview(r,a);if(n.json){console.log(JSON.stringify(o));return}i(o)}async function c(n){let{accessToken:r,workspaceId:i}=await t(),o=await new e().getUsageMe(r,i);if(n.json){console.log(JSON.stringify(o));return}a(o)}async function l(n){let{accessToken:r,workspaceId:i}=await t(),a=await new e().getUsageConsumptions(r,i,{limit:n.limit,offset:n.offset,periodStart:n.periodStart});if(n.json){console.log(JSON.stringify(a));return}if(a.items.length===0){console.log(`No consumptions for this period.`);return}o(a)}async function u(n){let{accessToken:i,workspaceId:a}=await t(),o=await new e().exportUsageCsv(i,a,n.periodStart);if(n.output){r(n.output,o),console.log(`Wrote usage CSV to ${n.output}`);return}process.stdout.write(o)}async function d(n){let{accessToken:r,workspaceId:i}=await t(),a=new e,o=[],s,c=0;do{let e=await a.getMonthlyUsages(r,i,{nextKey:s,limit:100});if(o.push(...e.monthlyUsages),s=e.nextKey,c++,c>=100){console.error(`Warning: Showing first ${o.length} entries (pagination limit reached)`);break}}while(s);if(n.json){console.log(JSON.stringify(o));return}if(o.length===0){console.log(`No usage data found for this workspace.`);return}console.log(`Current month usage:
11
11
  `);let l=0,u=0;for(let e of o)l+=Number.parseFloat(e.totalCost),u+=e.operationCount;console.log(`Total cost: $${l.toFixed(2)}`),console.log(`Total operations: ${u.toLocaleString()}`),console.log(`Users: ${o.length}\n`);let d=[...o].toSorted((e,t)=>n.sortBy===`cost`?Number.parseFloat(t.totalCost)-Number.parseFloat(e.totalCost):t.operationCount-e.operationCount),f=n.limit??d.length,p=d.slice(0,f);console.log(`Usage by user (sorted by ${n.sortBy}, showing ${p.length} of ${o.length}):\n`);for(let e of p)console.log(` ${e.user.name} (${e.user.email})`),console.log(` Cost: $${Number.parseFloat(e.totalCost).toFixed(2)}`),console.log(` Operations: ${e.operationCount.toLocaleString()}`),console.log(``);p.length<o.length&&console.log(`… and ${o.length-p.length} more users`)}export{u as exportUsage,l as listUsageConsumptions,c as showOwnUsage,s as showUsageBalance,d as showUsageSummary};
@@ -7,6 +7,6 @@ if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
7
7
  );
8
8
  process.exit(1);
9
9
  }
10
- import{T as e,Z as t,r as n}from"./profile-storage-CPg61h-2.js";import{r}from"./format-DCvznP70.js";import{n as i,r as a}from"./mcp-client-EK-Fh8gM.js";function o(t){return Array.isArray(t)&&e(t.map(e=>typeof e==`object`&&e&&`text`in e?String(e.text):``).filter(Boolean).join(`
11
- `))||`usage-audit tool call failed`}async function s(e,t,r){let i=await e.callTool({name:t,arguments:r},a());if(i.isError){let e=o(i.content);throw/not found/i.test(e)?new n(`This deployment does not expose the usage-audit tools (${t}). Credit-billed workspaces record spend in a separate ledger — use \`entrydesk usage consumptions\` and \`entrydesk usage balance\` instead.`):new n(e)}if(i.structuredContent==null)throw new n(`${t} returned no structured content; the workspace may not expose the usage-audit tools.`);return i.structuredContent}async function c(e){let t=await i();try{return await e(t)}finally{await t.close().catch(()=>{})}}function l(e){return e.toLocaleString()}function u(e){return e==null?`—`:`${e>0?`+`:``}${e}%`}function d(e){return e?e.slice(0,10):`never`}async function f(e){let n=await c(n=>s(n,t.GET_COST_RANKING,{groupBy:e.by,...e.days!=null&&{windowDays:e.days},...e.model&&{model:e.model},...e.limit!=null&&{limit:e.limit}}));if(e.json){console.log(JSON.stringify(n,null,2));return}let i=n.windowDays==null?`all time`:`last ${n.windowDays} days`,a=e.model?` · model ~ "${e.model}"`:``;if(console.log(`Cost ranking by ${e.by} · ${i}${a}\n`),n.rows.length===0){console.log(` No spend in this window.`);return}let o=Math.max(...n.rows.map(e=>r(e.cost).length));for(let e of n.rows){let t=e.ownerEmail?` · ${e.ownerEmail}`:``;console.log(` ${r(e.cost).padStart(o)} ${u(e.costChangePct).padEnd(7)} ${l(e.calls).padStart(8)} calls ${e.key}${t}`)}console.log(`\n ${n.rows.length} rows.`)}async function p(e,n){let[i,a]=await c(r=>Promise.all([s(r,t.GET_USER_BREAKDOWN,{email:e,sinceDays:n.days,minCost:n.minCost??0}),s(r,t.GET_USER_DAILY_TREND,{emails:[e],days:n.days})]));if(n.json){console.log(JSON.stringify({breakdown:i,trend:a},null,2));return}if(console.log(`${e} · last ${n.days} days\n`),console.log(`By agent / operation:`),i.breakdown.length===0)console.log(` (no spend)`);else{let e=Math.max(...i.breakdown.map(e=>r(e.cost).length));for(let t of i.breakdown)console.log(` ${r(t.cost).padStart(e)} ${l(t.calls).padStart(8)} calls ${t.agentOrOperation}`)}let o=a.trends[0]?.days??[];if(o.length>0){console.log(`
12
- Daily:`);for(let e of o)console.log(` ${e.date} ${r(e.cost).padStart(10)} ${l(e.calls).padStart(8)} calls`)}if(i.activeSchedules.length>0){console.log(`\nActive schedules (${i.activeSchedules.length}):`);for(let e of i.activeSchedules){let t=e.agentName?` · ${e.agentName}`:``;console.log(` ${e.name}${t} (${e.scheduleType}, last run ${d(e.lastTaskAt)})`)}}}async function m(e){let{stale:n,toolCalls:i}=await c(async n=>{let r=await s(n,t.FIND_STALE_SCHEDULES,{sinceDays:e.days,...e.minCost!=null&&{minCost:e.minCost},...e.limit!=null&&{limit:e.limit}}),i=r.schedules.map(e=>e.scheduleId),a=[];for(let e=0;e<i.length;e+=20)a.push(i.slice(e,e+20));return{stale:r,toolCalls:{schedules:(await Promise.all(a.map(r=>s(n,t.GET_SCHEDULE_TOOL_CALLS,{scheduleIds:r,sinceDays:e.days,recentRuns:5})))).flatMap(e=>e.schedules)}}});if(e.json){console.log(JSON.stringify({stale:n,toolCalls:i},null,2));return}if(console.log(`Schedules spending with unread output · last ${e.days} days\n`),n.schedules.length===0){console.log(` Nothing flagged.`);return}let a=new Map(i.schedules.map(e=>[e.scheduleId,e.toolCalls]));for(let e of n.schedules){console.log(` ${r(e.cost)} ${l(e.runs)} runs ${e.unreadPct}% unread last read ${d(e.lastReadAt)}`),console.log(` ${e.scheduleName} · ${e.ownerEmail}`);let t=a.get(e.scheduleId)??[];if(t.length===0){console.log(` no tool calls in the last 5 runs — deactivation candidate`);continue}console.log(` tools (last 5 runs): ${t.map(e=>`${e.tool} ${e.calls}`).join(`, `)}`);let n=t.filter(e=>e.failedCalls>0);n.length>0&&console.log(` failing: ${n.map(e=>`${e.tool} ${e.failedCalls}`).join(`, `)} — may be spinning on retries`)}console.log(`\n ${n.schedules.length} schedules.`)}export{p as drillUsage,m as findUsageWaste,f as rankUsage};
10
+ import{et as e,r as t,w as n}from"./profile-storage-CuiJZpFD.js";import{r}from"./format-DCvznP70.js";import{n as i,r as a}from"./mcp-client-ltOwvE7T.js";function o(e){return Array.isArray(e)&&n(e.map(e=>typeof e==`object`&&e&&`text`in e?String(e.text):``).filter(Boolean).join(`
11
+ `))||`usage-audit tool call failed`}async function s(e,n,r){let i=await e.callTool({name:n,arguments:r},a());if(i.isError){let e=o(i.content);throw/not found/i.test(e)?new t(`This deployment does not expose the usage-audit tools (${n}). Credit-billed workspaces record spend in a separate ledger — use \`entrydesk usage consumptions\` and \`entrydesk usage balance\` instead.`):new t(e)}if(i.structuredContent==null)throw new t(`${n} returned no structured content; the workspace may not expose the usage-audit tools.`);return i.structuredContent}async function c(e){let t=await i();try{return await e(t)}finally{await t.close().catch(()=>{})}}function l(e){return e.toLocaleString()}function u(e){return e==null?`—`:`${e>0?`+`:``}${e}%`}function d(e){return e?e.slice(0,10):`never`}async function f(t){let n=await c(n=>s(n,e.GET_COST_RANKING,{groupBy:t.by,...t.days!=null&&{windowDays:t.days},...t.model&&{model:t.model},...t.limit!=null&&{limit:t.limit}}));if(t.json){console.log(JSON.stringify(n,null,2));return}let i=n.windowDays==null?`all time`:`last ${n.windowDays} days`,a=t.model?` · model ~ "${t.model}"`:``;if(console.log(`Cost ranking by ${t.by} · ${i}${a}\n`),n.rows.length===0){console.log(` No spend in this window.`);return}let o=Math.max(...n.rows.map(e=>r(e.cost).length));for(let e of n.rows){let t=e.ownerEmail?` · ${e.ownerEmail}`:``;console.log(` ${r(e.cost).padStart(o)} ${u(e.costChangePct).padEnd(7)} ${l(e.calls).padStart(8)} calls ${e.key}${t}`)}console.log(`\n ${n.rows.length} rows.`)}async function p(t,n){let[i,a]=await c(r=>Promise.all([s(r,e.GET_USER_BREAKDOWN,{email:t,sinceDays:n.days,minCost:n.minCost??0}),s(r,e.GET_USER_DAILY_TREND,{emails:[t],days:n.days})]));if(n.json){console.log(JSON.stringify({breakdown:i,trend:a},null,2));return}if(console.log(`${t} · last ${n.days} days\n`),console.log(`By agent / operation:`),i.breakdown.length===0)console.log(` (no spend)`);else{let e=Math.max(...i.breakdown.map(e=>r(e.cost).length));for(let t of i.breakdown)console.log(` ${r(t.cost).padStart(e)} ${l(t.calls).padStart(8)} calls ${t.agentOrOperation}`)}let o=a.trends[0]?.days??[];if(o.length>0){console.log(`
12
+ Daily:`);for(let e of o)console.log(` ${e.date} ${r(e.cost).padStart(10)} ${l(e.calls).padStart(8)} calls`)}if(i.activeSchedules.length>0){console.log(`\nActive schedules (${i.activeSchedules.length}):`);for(let e of i.activeSchedules){let t=e.agentName?` · ${e.agentName}`:``;console.log(` ${e.name}${t} (${e.scheduleType}, last run ${d(e.lastTaskAt)})`)}}}async function m(t){let{stale:n,toolCalls:i}=await c(async n=>{let r=await s(n,e.FIND_STALE_SCHEDULES,{sinceDays:t.days,...t.minCost!=null&&{minCost:t.minCost},...t.limit!=null&&{limit:t.limit}}),i=r.schedules.map(e=>e.scheduleId),a=[];for(let e=0;e<i.length;e+=20)a.push(i.slice(e,e+20));return{stale:r,toolCalls:{schedules:(await Promise.all(a.map(r=>s(n,e.GET_SCHEDULE_TOOL_CALLS,{scheduleIds:r,sinceDays:t.days,recentRuns:5})))).flatMap(e=>e.schedules)}}});if(t.json){console.log(JSON.stringify({stale:n,toolCalls:i},null,2));return}if(console.log(`Schedules spending with unread output · last ${t.days} days\n`),n.schedules.length===0){console.log(` Nothing flagged.`);return}let a=new Map(i.schedules.map(e=>[e.scheduleId,e.toolCalls]));for(let e of n.schedules){console.log(` ${r(e.cost)} ${l(e.runs)} runs ${e.unreadPct}% unread last read ${d(e.lastReadAt)}`),console.log(` ${e.scheduleName} · ${e.ownerEmail}`);let t=a.get(e.scheduleId)??[];if(t.length===0){console.log(` no tool calls in the last 5 runs — deactivation candidate`);continue}console.log(` tools (last 5 runs): ${t.map(e=>`${e.tool} ${e.calls}`).join(`, `)}`);let n=t.filter(e=>e.failedCalls>0);n.length>0&&console.log(` failing: ${n.map(e=>`${e.tool} ${e.failedCalls}`).join(`, `)} — may be spinning on retries`)}console.log(`\n ${n.schedules.length} schedules.`)}export{p as drillUsage,m as findUsageWaste,f as rankUsage};
@@ -7,4 +7,4 @@ if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
7
7
  );
8
8
  process.exit(1);
9
9
  }
10
- function e(){return`2.1.0-beta.4`}export{e as t};
10
+ function e(){return`2.1.0`}export{e as t};
@@ -7,7 +7,7 @@ if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
7
7
  );
8
8
  process.exit(1);
9
9
  }
10
- import{b as e,u as t}from"./profile-storage-CPg61h-2.js";import{t as n}from"./resource-grants-zAoqe73P.js";import{n as r}from"./format-DCvznP70.js";import{t as i}from"./paginate-Brd-j5V8.js";import{readFileSync as a}from"node:fs";import{setTimeout as o}from"node:timers/promises";const s=262144,c=new Set([`completed`,`failed`,`cancelled`]);function l(e){let t;try{t=a(e,`utf8`)}catch{console.error(`Cannot read script file: ${e}`),process.exit(1)}return t.trim().length===0&&(console.error(`Script file is empty: ${e}`),process.exit(1)),Buffer.byteLength(t,`utf8`)>s&&(console.error(`Script file exceeds ${s} bytes.`),process.exit(1)),t}function u(e){console.log(`Workflows (${e.length}):\n`);for(let t of e){let e=t.isActive?`active`:`inactive`;if(console.log(` ${t.name} (${e})`),t.description){let e=t.description.length>80?`${t.description.slice(0,80)}…`:t.description;console.log(` ${e}`)}console.log(` ${t.myRole??`no-role`} · ID: ${t.id}`),console.log(``)}}function d(e,t){console.log(`${e.name}\n`),console.log(` ID: ${e.id}`),console.log(` Active: ${e.isActive}`),console.log(` My role: ${e.myRole??`no-role`}`),e.description&&console.log(` Description: ${e.description}`),console.log(` Updated: ${r(e.updatedAt)}`);let n=e.scriptSource.split(`
10
+ import{b as e,u as t}from"./profile-storage-CuiJZpFD.js";import{t as n}from"./resource-grants-CtIINiDN.js";import{n as r}from"./format-DCvznP70.js";import{t as i}from"./paginate-C9ixtica.js";import{readFileSync as a}from"node:fs";import{setTimeout as o}from"node:timers/promises";const s=262144,c=new Set([`completed`,`failed`,`cancelled`]);function l(e){let t;try{t=a(e,`utf8`)}catch{console.error(`Cannot read script file: ${e}`),process.exit(1)}return t.trim().length===0&&(console.error(`Script file is empty: ${e}`),process.exit(1)),Buffer.byteLength(t,`utf8`)>s&&(console.error(`Script file exceeds ${s} bytes.`),process.exit(1)),t}function u(e){console.log(`Workflows (${e.length}):\n`);for(let t of e){let e=t.isActive?`active`:`inactive`;if(console.log(` ${t.name} (${e})`),t.description){let e=t.description.length>80?`${t.description.slice(0,80)}…`:t.description;console.log(` ${e}`)}console.log(` ${t.myRole??`no-role`} · ID: ${t.id}`),console.log(``)}}function d(e,t){console.log(`${e.name}\n`),console.log(` ID: ${e.id}`),console.log(` Active: ${e.isActive}`),console.log(` My role: ${e.myRole??`no-role`}`),e.description&&console.log(` Description: ${e.description}`),console.log(` Updated: ${r(e.updatedAt)}`);let n=e.scriptSource.split(`
11
11
  `).length;t?(console.log(`\n Script (${n} lines):\n`),console.log(e.scriptSource)):console.log(` Script: ${n} lines (use --show-source to print)`)}function f(e){console.log(`Runs (${e.length}):\n`);for(let t of e){let e=r(t.startedAt??t.createdAt);console.log(` ${t.status}${e?` · ${e}`:``}`),console.log(` ID: ${t.id}`)}}function p(e){console.log(`Run ${e.id}`),console.log(` Workflow: ${e.workflowId}`),console.log(` Status: ${e.status}`),e.startedAt&&console.log(` Started: ${r(e.startedAt)}`),e.completedAt&&console.log(` Completed: ${r(e.completedAt)}`),e.error!=null&&console.log(` Error: ${JSON.stringify(e.error)}`);let t=Object.entries(e.context?.nodes??{});if(t.length>0){console.log(`\n Nodes (${t.length}):`);for(let[e,n]of t){let t=[n.kind??`node`,n.status];n.durationMs!=null&&t.push(`${n.durationMs}ms`),console.log(` - ${n.label??e} [${t.join(` · `)}]`)}}let n=e.context?.logs??[];if(n.length>0){console.log(`
12
12
  Logs:`);for(let e of n)console.log(` ${e}`)}e.context?.spent!=null&&console.log(`\n Tokens spent: ${e.context.spent}`)}async function m(e,t,n,r,i){for(let a=0;a<600;a++){let s=await e.getWorkflowRun(t,n,r,i);if(c.has(s.status))return a>0&&process.stderr.write(`
13
13
  `),s;let l=a*2;process.stderr.write(`\rWaiting… ${s.status} (${l}s)`),await o(2e3)}throw process.stderr.write(`
@@ -7,5 +7,5 @@ if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
7
7
  );
8
8
  process.exit(1);
9
9
  }
10
- import{C as e,b as t,l as n}from"./profile-storage-CPg61h-2.js";async function r(r){let i=await e.getAll(),a=await n(),{workspaces:o}=await new t().getWorkspaces(a);if(r.json){console.log(JSON.stringify(o));return}if(o.length===0){console.log(`No workspaces found.`);return}console.log(`Workspaces (${o.length}):\n`);for(let e of o){let t=e.id===i?.workspaceId?` (current)`:``;console.log(` ${e.name}${t}`),console.log(` ID: ${e.id}`),console.log(``)}}async function i(r,i){let a=await n(),{workspaces:o}=await new t().getWorkspaces(a),s=o.find(e=>e.id===r);if(!s){console.error(`Workspace not found: ${r}`),console.error(`
10
+ import{S as e,b as t,l as n}from"./profile-storage-CuiJZpFD.js";async function r(r){let i=await e.getAll(),a=await n(),{workspaces:o}=await new t().getWorkspaces(a);if(r.json){console.log(JSON.stringify(o));return}if(o.length===0){console.log(`No workspaces found.`);return}console.log(`Workspaces (${o.length}):\n`);for(let e of o){let t=e.id===i?.workspaceId?` (current)`:``;console.log(` ${e.name}${t}`),console.log(` ID: ${e.id}`),console.log(``)}}async function i(r,i){let a=await n(),{workspaces:o}=await new t().getWorkspaces(a),s=o.find(e=>e.id===r);if(!s){console.error(`Workspace not found: ${r}`),console.error(`
11
11
  Available workspaces:`);for(let e of o)console.error(` ${e.name}: ${e.id}`);process.exit(1)}if(await e.saveWorkspaceId(r),i.json){console.log(JSON.stringify({workspaceId:r,workspaceName:s.name}));return}console.log(`Switched to workspace: ${s.name}`),console.log(` ID: ${r}`)}export{r as listWorkspaces,i as switchWorkspace};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@entrydesk/cli",
3
- "version": "2.1.0-beta.4",
3
+ "version": "2.1.0",
4
4
  "description": "EntryDesk CLI - Interact with EntryDesk from your terminal",
5
5
  "type": "module",
6
6
  "bin": {
@@ -17,7 +17,7 @@
17
17
  "@modelcontextprotocol/node": "^2.0.0",
18
18
  "@modelcontextprotocol/server": "^2.0.0",
19
19
  "@vscode/ripgrep": "1.18.0",
20
- "adm-zip": "^0.6.0",
20
+ "adm-zip": "^0.6.1",
21
21
  "ai": "^7.0.102",
22
22
  "archiver": "^7.0.1",
23
23
  "commander": "^15.0.0",
@@ -28,6 +28,7 @@
28
28
  "jose": "^6.2.3",
29
29
  "ky": "^2.0.2",
30
30
  "react": "^19.3.0",
31
+ "undici": "^7.29.0",
31
32
  "uuid": "^14.0.0"
32
33
  },
33
34
  "devDependencies": {
@@ -44,13 +45,13 @@
44
45
  "@types/node": "^24.12.4",
45
46
  "@types/react": "^19.3.0",
46
47
  "@vitejs/plugin-react": "^6.0.3",
47
- "@vitest/coverage-v8": "^4.1.6",
48
+ "@vitest/coverage-v8": "^5.0.1",
48
49
  "babel-plugin-react-compiler": "^1.0.0",
49
50
  "happy-dom": "^20.8.9",
50
51
  "oxlint": "^1.83.0",
51
52
  "tsdown": "^0.22.14",
52
53
  "typescript": "^7.0.2",
53
- "vitest": "^4.1.8"
54
+ "vitest": "^5.0.1"
54
55
  },
55
56
  "optionalDependencies": {
56
57
  "keytar": "^7.9.0"
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env node
2
- var __entrydeskNodeFloor = 24;
3
- if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
4
- process.stderr.write(
5
- 'entrydesk: Node.js ' + __entrydeskNodeFloor + ' or newer is required, but this is Node ' + process.versions.node + '.\n' +
6
- 'Upgrade Node (https://nodejs.org/en/download), then reinstall @entrydesk/cli.\n'
7
- );
8
- process.exit(1);
9
- }
10
- import{dt as e,ot as t,st as n,ut as r}from"./profile-storage-CPg61h-2.js";function i({allowedTools:t,disallowedTools:n}){if(!(!t?.length&&!n?.length))return[...e(t?.map(e=>({toolName:e,policy:r.ALWAYS_ALLOW})),n?.map(e=>({toolName:e,policy:r.BLOCK})))].map(([e,t])=>({toolName:e,policy:t}))}function a(t,n){let i=[...n].map(e=>({toolName:e,policy:r.ALWAYS_ALLOW}));return i.length===0?t:[...e(t,i)].map(([e,t])=>({toolName:e,policy:t}))}function o({agentId:e,model:r,projectId:i,connectorIds:a,clientTools:o,clientToolSystemPrompt:s,toolApprovalMode:c,toolPolicies:l}){return{...i?{projectId:i}:{},...e?{agentId:e}:{...r?{model:r}:{},...a?.length?{connectorIds:a}:{}},...o?{clientTools:n(o,t.DIRECT)}:{},...s?{clientToolSystemPrompt:s}:{},...c?{toolApprovalMode:c}:{},...l?.length?{toolPolicies:l}:{}}}export{i as n,a as r,o as t};
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env node
2
- var __entrydeskNodeFloor = 24;
3
- if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
4
- process.stderr.write(
5
- 'entrydesk: Node.js ' + __entrydeskNodeFloor + ' or newer is required, but this is Node ' + process.versions.node + '.\n' +
6
- 'Upgrade Node (https://nodejs.org/en/download), then reinstall @entrydesk/cli.\n'
7
- );
8
- process.exit(1);
9
- }
10
- import{E as e}from"./profile-storage-CPg61h-2.js";import{a as t,c as n,d as r,f as i,g as a,i as o,l as s,m as c,o as l,r as u,s as d,u as f}from"./paths-mBL9tt9p.js";import{t as p}from"./hash-CnSb1n2t.js";import{r as m}from"./installer-CKB3jBE-.js";import h from"node:path";import g from"node:fs/promises";const _=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;function v(a,o,s){let c=a&&_.test(a)?a:s.workspaceId,l={workspaceId:c,apiUrl:e()};if(t(),o.global)r(l),console.info(`Linked ${d()} → workspace ${c}`);else{let e=process.cwd();i(e,l),console.info(`Linked ${n(e)} → workspace ${c}`)}}function y(e){if(e.global){s()?console.info(`Unlinked ${d()}`):console.info(`No global link found.`);return}let t=l(process.cwd());t&&f(t)?console.info(`Unlinked ${n(t)}`):console.info(`No project link found.`)}async function b(e,t,n,r,i){let o=n.skillId;if(!o){let{skills:t}=await e.client.listAvailableSkills(e.accessToken,e.workspaceId),r=t.find(e=>e.name===n.name);if(!r)throw Error(`Skill not found in workspace: ${n.name}`);o=r.id}let{url:s,name:c}=await e.client.downloadSkillCurrent(e.accessToken,e.workspaceId,o),l=await fetch(s);if(!l.ok)throw Error(`Failed to download ${c}: ${l.status}`);let d=Buffer.from(await l.arrayBuffer()),f=u(t,c);await g.rm(f,{recursive:!0,force:!0}),await g.mkdir(f,{recursive:!0});let{default:_}=await import(`adm-zip`),v=h.resolve(f)+h.sep;for(let e of new _(d).getEntries()){if(e.isDirectory)continue;let t=h.resolve(f,e.entryName);if(!t.startsWith(v))throw Error(`Zip entry contains path traversal: ${e.entryName}`);await g.mkdir(h.dirname(t),{recursive:!0}),await g.writeFile(t,e.getData())}let y=p(f);a(t,c,{source:o,sourceType:`entrydesk`,skillId:o,localHash:y,lastPulledHash:y,mode:`symlink`});let b=m(f,c,t,`symlink`,i);return r||console.info(`✓ pulled ${c} (${y.slice(0,12)}) → agents: ${b.map(e=>e.agentId).join(`, `)}`),{name:c,hash:y}}async function x(e,t,n){let{rootDir:r,workspaceId:i}=o(!!t.global,n.workspaceId),a={...n,workspaceId:i},s=!!t.json,l=[];if(e)l.push(_.test(e)?{skillId:e}:{name:e});else{let e=c(r).skills;for(let[t,n]of Object.entries(e))l.push({skillId:n.skillId,name:t});if(l.length===0){console.info(`Nothing to pull — no tracked skills. Try: entrydesk skills pull <name>`);return}}let u=[];for(let e of l)u.push(await b(a,r,e,s,t.agent));s&&console.info(JSON.stringify(u,null,2))}export{x as n,y as r,v as t};
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env node
2
- var __entrydeskNodeFloor = 24;
3
- if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
4
- process.stderr.write(
5
- 'entrydesk: Node.js ' + __entrydeskNodeFloor + ' or newer is required, but this is Node ' + process.versions.node + '.\n' +
6
- 'Upgrade Node (https://nodejs.org/en/download), then reinstall @entrydesk/cli.\n'
7
- );
8
- process.exit(1);
9
- }
10
- import{C as e,D as t,d as n,f as r,u as i}from"./profile-storage-CPg61h-2.js";import{r as a,t as o}from"./mcp-client-EK-Fh8gM.js";import s from"node:http";import{stderr as c}from"node:process";import{NodeStreamableHTTPServerTransport as l}from"@modelcontextprotocol/node";import{Server as u}from"@modelcontextprotocol/server";import{StdioServerTransport as d}from"@modelcontextprotocol/server/stdio";function f(e){c.write(`${e}\n`)}function p(e,t,n){return o({apiUrl:e,accessToken:t,workspaceId:n,name:`entrydesk-cli-proxy`})}function m(e){let t=new u({name:`entrydesk-cli`,version:`1.0.0`},{capabilities:{tools:{}}});return t.setRequestHandler(`tools/list`,async(t,n)=>({tools:(await(await e()).listTools({},a({signal:n.mcpReq.signal}))).tools})),t.setRequestHandler(`tools/call`,async(t,n)=>{let{name:r,arguments:i}=t.params,{progressToken:o}=n.mcpReq._meta??{},s=await(await e()).callTool({name:r,arguments:i},a({signal:n.mcpReq.signal,onProgress:o===void 0?void 0:e=>{n.mcpReq.notify({method:`notifications/progress`,params:{...e,progressToken:o}}).catch(()=>{})}})),c=Array.isArray(s.content)?[...s.content]:[];return s.structuredContent&&c.push({type:`text`,text:JSON.stringify(s.structuredContent,null,2)}),{content:c,structuredContent:s.structuredContent,isError:s.isError}}),t}async function h(e,t,n){let r=s.createServer(async(t,n)=>{if(t.method===`OPTIONS`){n.setHeader(`Access-Control-Allow-Origin`,`*`),n.setHeader(`Access-Control-Allow-Methods`,`GET, POST, DELETE, OPTIONS`),n.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Accept`),n.writeHead(204),n.end();return}if(t.url!==`/mcp`){n.writeHead(404,{"Content-Type":`application/json`}),n.end(JSON.stringify({error:`Not found`}));return}let r=m(e),i=new l({sessionIdGenerator:void 0});if(n.setHeader(`Access-Control-Allow-Origin`,`*`),n.on(`close`,()=>{i.close(),r.close()}),await r.connect(i),t.method===`POST`){let e=``;t.on(`data`,t=>{e+=t.toString()}),t.on(`end`,async()=>{try{let r=JSON.parse(e);await i.handleRequest(t,n,r)}catch{n.writeHead(400,{"Content-Type":`application/json`}),n.end(JSON.stringify({error:`Invalid JSON`}))}})}else await i.handleRequest(t,n)});r.listen(n,()=>{f(`EntryDesk MCP server running at http://localhost:${n}/mcp`),f(`Press Ctrl+C to stop`)}),process.on(`SIGINT`,async()=>{f(`
11
- Shutting down…`),r.close(),await t(),process.exit(0)}),process.on(`SIGTERM`,async()=>{r.close(),await t(),process.exit(0)})}async function g(e,t){let n=m(e),r=new d;r.onclose=async()=>{await t()},await n.connect(r)}const _={mode:`stdio`};async function v(a=_){process.on(`unhandledRejection`,e=>{console.error(`[entrydesk-mcp] Unhandled rejection:`,e)}),process.on(`uncaughtException`,e=>{console.error(`[entrydesk-mcp] Uncaught exception:`,e)});try{f(`[entrydesk-mcp] Starting MCP server…`);let o,s;try{let e=await i();o=e.accessToken,s=e.workspaceId}catch(e){let t=e instanceof Error?e.message:`Authentication failed`;console.error(t),process.exit(1)}let{apiUrl:c,mcp:l}=t();f(`[entrydesk-mcp] Connecting to ${c}…`),f(`[entrydesk-mcp] Workspace: ${s}`);let u=await p(c,o,s);f(`[entrydesk-mcp] Connected to EntryDesk API`);let d=null,m=async()=>n(o)?d||(d=(async()=>{f(`[entrydesk-mcp] Token expiring soon, refreshing…`);let t=await e.getAll();if(!t?.accessToken)throw Error("Not logged in. Run `entrydesk login` again.");let n=await r(t);if(n!==o){o=n;try{await u.close()}catch{}u=await p(c,o,s),f(`[entrydesk-mcp] Token refreshed, reconnected`)}return u})().finally(()=>{d=null}),d):u,_=async()=>{try{await u.close()}catch{}};a.mode===`http`?await h(m,_,a.port??l.httpPort):(f(`[entrydesk-mcp] Starting stdio server…`),await g(m,_),f(`[entrydesk-mcp] Stdio server started`))}catch(e){console.error(`[entrydesk-mcp] Fatal error:`,e),process.exit(1)}}export{v as startMcpServer};
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env node
2
- var __entrydeskNodeFloor = 24;
3
- if (parseInt(process.versions.node, 10) < __entrydeskNodeFloor) {
4
- process.stderr.write(
5
- 'entrydesk: Node.js ' + __entrydeskNodeFloor + ' or newer is required, but this is Node ' + process.versions.node + '.\n' +
6
- 'Upgrade Node (https://nodejs.org/en/download), then reinstall @entrydesk/cli.\n'
7
- );
8
- process.exit(1);
9
- }
10
- import{A as e,D as t,S as n,u as r}from"./profile-storage-CPg61h-2.js";import{Client as i,StreamableHTTPClientTransport as a}from"@modelcontextprotocol/client";const o=()=>{};function s(t={}){let{requestTimeout:n,requestMaxTotalTimeout:r}=e();return{timeout:n,maxTotalTimeout:r,resetTimeoutOnProgress:!0,onprogress:t.onProgress??o,signal:t.signal}}async function c(e={}){let o=e.apiUrl,s=e.accessToken,c=e.workspaceId;if(!s||!c){let e=await r();s||=e.accessToken,c||=e.workspaceId}o||=t().apiUrl;let l=new i({name:e.name??`entrydesk-cli`,version:`1.0.0`},{versionNegotiation:{mode:`auto`}}),u=new a(new URL(`${o}/v1/workspaces/${c}/mcp`),{requestInit:{headers:{Authorization:`Bearer ${s}`,...n()}}});return await l.connect(u),l}async function l(){return c()}export{l as n,s as r,c as t};