@entrydesk/cli 1.23.1 → 1.25.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 (43) hide show
  1. package/README.md +8 -0
  2. package/dist/agents-BPEYRMJS.js +43 -0
  3. package/dist/{billing-QKAGGKLE.js → billing-ZIIVREJT.js} +1 -1
  4. package/dist/budget-GOLUDBCL.js +12 -0
  5. package/dist/{chunk-YKH2UWFC.js → chunk-DR3LDSMV.js} +2 -2
  6. package/dist/chunk-EFMVEUKG.js +97 -0
  7. package/dist/{config-EHPADRGK.js → config-4IUXVJTP.js} +1 -1
  8. package/dist/{config-ZZEWQRKI.js → config-IAKKALFC.js} +1 -1
  9. package/dist/{config-help-MDC62DDX.js → config-help-VOALBZOV.js} +1 -1
  10. package/dist/{connectors-NKSDT2HG.js → connectors-CSQK22LM.js} +1 -1
  11. package/dist/{help-RTXIBJ6C.js → help-4WGGQ6JC.js} +2 -2
  12. package/dist/index.js +1 -1
  13. package/dist/{login-O77HDVW3.js → login-EB3L2V2J.js} +1 -1
  14. package/dist/{logout-A7CYWGTM.js → logout-ADWPA2FG.js} +1 -1
  15. package/dist/{marketplace-CAXL5PH4.js → marketplace-SQVRI7DY.js} +5 -5
  16. package/dist/{mcp-D7GHEFAP.js → mcp-VDO3M3ZZ.js} +3 -3
  17. package/dist/{meeting-6YXQJKT5.js → meeting-TW3VZXAR.js} +2 -2
  18. package/dist/{models-BQT6MNN3.js → models-B3KI6HNA.js} +1 -1
  19. package/dist/{notifications-ZE4MQURK.js → notifications-W4JZNPP5.js} +2 -2
  20. package/dist/{profile-PQUC4VYR.js → profile-AHVLOC6L.js} +1 -1
  21. package/dist/{recordings-EIAQWZ6J.js → recordings-LYXVL3QK.js} +1 -1
  22. package/dist/schedules-EBOKWL2V.js +57 -0
  23. package/dist/skills-KZ3IZP5O.js +30 -0
  24. package/dist/{status-XMD5WLMC.js → status-L6BVD6XO.js} +1 -1
  25. package/dist/{task-53WFEYLH.js → task-37D7QU3L.js} +35 -35
  26. package/dist/{tasks-7T7RUCWK.js → tasks-IN2ZYMSB.js} +11 -11
  27. package/dist/{token-TTVFX36M.js → token-FCXXKQBB.js} +1 -1
  28. package/dist/token-util-OEHRI4SO.js +2 -0
  29. package/dist/tool-MJKJCMYH.js +35 -0
  30. package/dist/update-XSR4E72E.js +4 -0
  31. package/dist/{usage-4F4AGUYD.js → usage-46QSLRS2.js} +6 -6
  32. package/dist/{version-ULX7NNGK.js → version-Y63DOD77.js} +1 -1
  33. package/dist/{workflow-LUR7AL3C.js → workflow-BR4CFCAK.js} +11 -11
  34. package/dist/{workspaces-65YARQ7K.js → workspaces-IAN5MGM7.js} +1 -1
  35. package/package.json +6 -6
  36. package/dist/agents-JCLIHY4P.js +0 -43
  37. package/dist/budget-VDIBB2G7.js +0 -12
  38. package/dist/chunk-DJHTNXHH.js +0 -97
  39. package/dist/schedules-LWXLUKOS.js +0 -57
  40. package/dist/skills-INLQDLRZ.js +0 -30
  41. package/dist/token-util-YJCUCZTI.js +0 -2
  42. package/dist/tool-J25QCBER.js +0 -35
  43. /package/dist/{chunk-35QGVUAZ.js → chunk-HDVXCFOU.js} +0 -0
package/README.md CHANGED
@@ -9,6 +9,14 @@ rendering, and scripting-friendly JSON output.
9
9
  npm install -g @entrydesk/cli
10
10
  ```
11
11
 
12
+ To update an existing installation to the latest published version:
13
+
14
+ ```bash
15
+ entrydesk update # check + install
16
+ entrydesk update --check # only check, don't install
17
+ entrydesk update --json # machine-readable result
18
+ ```
19
+
12
20
  ## Quick Start
13
21
 
14
22
  Build and run from the repo:
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ import{c as u}from"./chunk-EFMVEUKG.js";import{h as f,q as h,s as y}from"./chunk-DR3LDSMV.js";import"./chunk-KURQCTT3.js";function m(){console.log(`
3
+ Usage: entrydesk agents [list|show|create|update|delete|publish|share] [options]
4
+
5
+ Commands:
6
+ list List available agents (default; --mine for your own)
7
+ show <agentId> Show one agent's full details
8
+ create Create a new agent
9
+ update <agentId> Update an agent you own
10
+ delete <agentId> Delete an agent you own
11
+ publish <agentId> Publish an agent to the workspace
12
+ share <agentId> Show or manage sharing (user grants)
13
+
14
+ Create/Update Options:
15
+ --name <name>
16
+ --description <text>
17
+ --system-prompt <text>
18
+ --model-id <modelId>
19
+ --connector-ids id1,id2
20
+ --capabilities sandbox,web_search,image_generation,chart
21
+ --conversation-starters s1,s2,s3
22
+ --tools prefix__tool1,prefix__tool2
23
+ --icon-id <iconId>
24
+
25
+ List Options:
26
+ --mine List agents you own/edit (with publish state)
27
+ --limit <number> Max agents per page; also page size for --all (default: 100)
28
+ --next-key <cursor> Fetch next page using cursor
29
+ --all Fetch all agents (auto-paginate)
30
+
31
+ Share Options:
32
+ --add-user <userId> Grant a user access (use with --role)
33
+ --remove-user <userId> Revoke a user's access
34
+ --role owner|editor|viewer Role for --add-user (default: viewer)
35
+
36
+ Flags:
37
+ --json Output JSON
38
+ `)}function I(e){if(!e)return[];let o=new Map([["sandbox","sandbox"],["web","web_search"],["web-search","web_search"],["web_search","web_search"],["image","image_generation"],["image-gen","image_generation"],["image_generation","image_generation"],["chart","chart"]]);return e.map(t=>o.get(t)??t)}function w(e){console.log(`Available Agents (${e.length}):
39
+ `);for(let o of e){if(console.log(` ${o.name} (${o.visibility})`),o.description){let t=o.description.length>80?`${o.description.slice(0,80)}...`:o.description;console.log(` ${t}`)}console.log(` ID: ${o.id}`),console.log("")}}function A(e){console.log(`My Agents (${e.length}):
40
+ `);for(let o of e){let t=[];o.latestVersionNumber!=null&&t.push(`v${o.latestVersionNumber}`),o.hasUnpublishedChanges&&t.push("unpublished changes");let s=t.length>0?` (${t.join(" \xB7 ")})`:"";if(console.log(` ${o.name}${s}`),o.description){let a=o.description.length>80?`${o.description.slice(0,80)}...`:o.description;console.log(` ${a}`)}console.log(` ${o.myRole??"no-role"} \xB7 ID: ${o.id}`),console.log("")}}function b(e){console.log(`${e.name}
41
+ `),console.log(` ID: ${e.id}`),e.visibility&&console.log(` Visibility: ${e.visibility}`),e.model&&console.log(` Model: ${e.model.name}`),e.author&&console.log(` Author: ${e.author.name}${e.author.isMe?" (you)":""}`),e.description&&console.log(` Description: ${e.description}`),e.capabilities&&e.capabilities.length>0&&console.log(` Capabilities: ${e.capabilities.join(", ")}`),e.connectors&&e.connectors.length>0&&console.log(` Connectors: ${e.connectors.map(o=>o.name).join(", ")}`),e.tools&&e.tools.length>0&&console.log(` Tools: ${e.tools.length}`),e.conversationStarters&&e.conversationStarters.length>0&&console.log(` Starters: ${e.conversationStarters.length}`),e.systemPrompt&&console.log(`
42
+ System Prompt:
43
+ ${e.systemPrompt}`)}function $(e){let o=u(e);if(console.log(`User grants (${o.length}):`),o.length===0){console.log(" (none)");return}for(let t of o)console.log(` - ${t.user.name} <${t.user.email}> \xB7 ${t.role}`),console.log(` ID: ${t.userId}`)}function x(e){return(!e.name||!e.description||!e.systemPrompt||!e.modelId)&&(console.error("Missing required fields for agent create/update."),m(),process.exit(1)),{name:e.name,description:e.description,systemPrompt:e.systemPrompt,modelId:e.modelId,connectorIds:e.connectorIds??[],capabilities:I(e.capabilities),conversationStarters:e.conversationStarters??[],tools:e.tools,iconId:e.iconId}}async function P(e){try{if(e.help){m();return}let o=await h(),{accessToken:t,workspaceId:s}=o,a=e.action||"list",r=new f;if(a==="show"){if(!e.agentId)throw new Error("Missing agentId for show command");let i=await r.getAgent(t,s,e.agentId);if(e.json){console.log(JSON.stringify(i));return}b(i);return}if(a==="publish"){if(!e.agentId)throw new Error("Missing agentId for publish command");if(await r.publishAgent(t,s,e.agentId),e.json){console.log(JSON.stringify({id:e.agentId,published:!0}));return}console.log(`Published agent to the workspace: ${e.agentId}`);return}if(a==="share"){if(!e.agentId)throw new Error("Missing agentId for share command");let i=e.agentId,n=e.role??"viewer";if(e.addUser){let c=await r.upsertAgentGrant(t,s,i,e.addUser,n);if(e.json){console.log(JSON.stringify(c));return}console.log(`Granted ${n} to user ${e.addUser}`);return}if(e.removeUser){if(await r.removeAgentGrant(t,s,i,e.removeUser),e.json){console.log(JSON.stringify({userId:e.removeUser,removed:!0}));return}console.log(`Revoked access for user ${e.removeUser}`);return}let l=await r.getAgentGrants(t,s,i);if(e.json){console.log(JSON.stringify(l));return}$(l);return}if(a==="create"){let i=x(e),n=await r.createAgent(t,s,i);if(e.json){console.log(JSON.stringify(n));return}console.log(`Created agent: ${n.name}`),console.log(` ID: ${n.id}`);return}if(a==="update"){let i=e.agentId;if(!i)throw new Error("Missing agentId for update command");let n=await r.getAgent(t,s,i),l={name:e.name??n.name,description:e.description??n.description,systemPrompt:e.systemPrompt??n.systemPrompt??"",modelId:e.modelId??n.model?.id??"",connectorIds:e.connectorIds??n.connectors?.map(c=>c.id)??[],capabilities:e.capabilities?I(e.capabilities):n.capabilities??[],conversationStarters:e.conversationStarters??n.conversationStarters??[],tools:e.tools??n.tools??[],iconId:e.iconId??n.iconId};await r.updateAgent(t,s,i,l),console.log(`Updated agent: ${i}`);return}if(a==="delete"){let i=e.agentId;if(!i)throw new Error("Missing agentId for delete command");await r.deleteAgent(t,s,i),console.log(`Deleted agent: ${i}`);return}if(a!=="list"&&(console.error(`Unknown agents command: ${a}`),m(),process.exit(1)),e.all&&e.nextKey&&(console.error("Cannot use --all and --next-key together."),process.exit(1)),e.mine){let i=[],n=e.all?void 0:e.nextKey,l=100;for(let c=0;;c++){c>=l&&(console.error(`Reached maximum page limit (${l}). Use --limit and --next-key for manual pagination.`),process.exit(1));let d=await r.getMyAgents(t,s,{limit:e.limit,nextKey:n});if(i.push(...d.agents),n=d.nextKey,!e.all||!n)break}if(e.json){console.log(JSON.stringify({agents:i,nextKey:n}));return}if(i.length===0){console.log("You have no agents in this workspace.");return}A(i),!e.all&&n&&console.log(`Next page: --next-key ${n}`);return}if(e.all){let n=[],l;for(let c=0;;c++){c>=100&&(console.error("Reached maximum page limit (100). Use --limit and --next-key for manual pagination."),process.exit(1));let d=await r.getAgents(t,s,{limit:e.limit??100,nextKey:l});if(n.push(...d.agents),l=d.nextKey,!l)break}if(e.json){console.log(JSON.stringify({agents:n}));return}if(n.length===0){console.log("No agents found in this workspace.");return}w(n);return}let{agents:g,nextKey:p}=await r.getAgents(t,s,{limit:e.limit,nextKey:e.nextKey});if(e.json){console.log(JSON.stringify({agents:g,nextKey:p}));return}if(g.length===0){console.log("No agents found in this workspace.");return}w(g),p&&console.log(`Next page: --next-key ${p}`)}catch(o){y(o)}}export{P as runAgents};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{h as u,i as p,r as m,t as d}from"./chunk-YKH2UWFC.js";import"./chunk-KURQCTT3.js";function f(){console.log(`
2
+ import{h as u,i as p,q as m,s as d}from"./chunk-DR3LDSMV.js";import"./chunk-KURQCTT3.js";function f(){console.log(`
3
3
  Usage: entrydesk billing [status|invoices] [options]
4
4
 
5
5
  Commands:
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import{h as c,q as a,s as d}from"./chunk-DR3LDSMV.js";import"./chunk-KURQCTT3.js";function p(){console.log(`
3
+ Usage: entrydesk budget [get|set|clear] [options]
4
+
5
+ Commands:
6
+ get Show current workspace budget (default)
7
+ set <amount> Set workspace budget (e.g., 100.00)
8
+ clear Remove workspace budget
9
+
10
+ Flags:
11
+ --json Output JSON
12
+ `)}async function b(e){try{if(e.help){p();return}let u=await a(),{accessToken:o,workspaceId:n}=u,s=e.action||"get",r=new c;if(s==="set"){let t=e.configKey;if(!t)throw new Error("Missing budget amount for set command");let i=Number.parseFloat(t);if(Number.isNaN(i)||i<0)throw new Error("Budget must be a positive number");if(await r.updateBudget(o,n,t),e.json){let l=await r.getBudget(o,n);console.log(JSON.stringify(l));return}console.log(`Budget updated: $${t}`);return}if(s==="clear"){if(await r.updateBudget(o,n,null),e.json){let t=await r.getBudget(o,n);console.log(JSON.stringify(t));return}console.log("Budget cleared.");return}if(s!=="get")throw new Error(`Unknown budget command: ${s}`);let g=await r.getBudget(o,n);if(e.json){console.log(JSON.stringify(g));return}if(g.budget===null){console.log("No budget set for this workspace.");return}console.log(`Current workspace budget: $${g.budget}`)}catch(u){d(u)}}export{b as runBudget};
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import _ from"fs";import m from"fs";import ze from"os";import C from"path";import{HTTPError as _e,TimeoutError as je}from"ky";import{HTTPError as Me}from"ky";import ke,{TimeoutError as ve,isHTTPError as Re}from"ky";import b from"crypto";import p from"fs";import de from"path";var pe="ENTRYDESK_FORCE_FILE_STORAGE",S="EntryDesk CLI",he="__entrydesk_keychain_test__",fe="profile:",ye=".credentials.key",ee={keychain:!1,permissions:!1,corruptFile:!1,windowsFile:!1};function v(s,e){ee[s]||(ee[s]=!0,console.error(e))}function me(){return process.env.ENTRYDESK_DEBUG?.toLowerCase()==="true"}function te(s){if(!s||typeof s!="object")return!1;let e=s;return!(!("accessToken"in e||"refreshToken"in e||"email"in e||"workspaceId"in e)||"accessToken"in e&&typeof e.accessToken!="string"||"refreshToken"in e&&typeof e.refreshToken!="string"||"email"in e&&typeof e.email!="string"||"workspaceId"in e&&typeof e.workspaceId!="string")}function we(s){if(!s||typeof s!="object")return!1;let e=s;return typeof e.getPassword=="function"&&typeof e.setPassword=="function"&&typeof e.deletePassword=="function"}function D(s){return a.getProfileCredentialsFile(s)}var F=class{getKeyFilePath(e){return de.join(a.getProfileDir(e),ye)}loadEncryptionKey(e){let t=this.getKeyFilePath(e);try{if(!p.existsSync(t))return null;let r=p.readFileSync(t);return r.length!==32?null:(this.ensureSecureFilePermissions(t),r)}catch{return null}}createEncryptionKey(e){a.ensureProfileDir(e);let t=this.getKeyFilePath(e),r=b.randomBytes(32);return p.writeFileSync(t,r,{mode:384}),this.ensureSecureFilePermissions(t),r}getOrCreateEncryptionKey(e){let t=this.loadEncryptionKey(e);return t||this.createEncryptionKey(e)}encrypt(e,t){let r=b.randomBytes(16),n=b.createCipheriv("aes-256-gcm",t,r),i=n.update(e,"utf8","hex");i+=n.final("hex");let o=n.getAuthTag();return`${r.toString("hex")}:${o.toString("hex")}:${i}`}decrypt(e,t){let r=e.split(":");if(r.length!==3)throw new Error("Invalid encrypted data format");let n=Buffer.from(r[0],"hex"),i=Buffer.from(r[1],"hex"),o=r[2],u=b.createDecipheriv("aes-256-gcm",t,n,{authTagLength:16});u.setAuthTag(i);let d=u.update(o,"hex","utf8");return d+=u.final("utf8"),d}tryDecrypt(e,t){try{return this.decrypt(e,t)}catch{return null}}tryParseCredentials(e){try{let t=JSON.parse(e);return te(t)?t:null}catch{return null}}ensureSecureFilePermissions(e){if(process.platform!=="win32"){try{p.chmodSync(e,384)}catch{v("permissions","Warning: Failed to set secure permissions on credentials file.");return}try{(p.statSync(e).mode&511)!==384&&v("permissions","Warning: Credentials file permissions are too permissive.")}catch{v("permissions","Warning: Failed to verify credentials file permissions.")}}}async getCredentials(e){let t=D(e);try{if(!p.existsSync(t))return null;let r=p.readFileSync(t,"utf-8").trim();if(!r)return null;let n=this.loadEncryptionKey(e),i=n?this.tryDecrypt(r,n):null;if(i){let o=this.tryParseCredentials(i);if(o)return o}return v("corruptFile","Warning: Credentials file is unreadable. Please run `entrydesk login` again."),null}catch{return null}}async setCredentials(e,t){a.ensureProfileDir(e);let r=D(e),n=this.getOrCreateEncryptionKey(e),i=this.encrypt(JSON.stringify(t),n);p.writeFileSync(r,i,{mode:384}),this.ensureSecureFilePermissions(r)}async deleteCredentials(e){let t=D(e);try{p.existsSync(t)&&p.unlinkSync(t)}catch{}}},O=class{keytarModule=null;keytarLoadAttempted=!1;keychainAvailable=null;async getKeytar(){if(this.keytarLoadAttempted)return this.keytarModule;this.keytarLoadAttempted=!0;try{let t=await import("keytar"),r=t&&typeof t=="object"&&"default"in t?t.default:t;this.keytarModule=we(r)?r:null}catch{this.keytarModule=null}return this.keytarModule}getAccount(e){return`${fe}${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=`${he}${b.randomBytes(8).toString("hex")}`,r="test";await e.setPassword(S,t,r);let n=await e.getPassword(S,t),i=await e.deletePassword(S,t);return this.keychainAvailable=!!(i&&n===r),this.keychainAvailable}catch{return this.keychainAvailable=!1,!1}}async isAvailable(){return this.checkKeychainAvailability()}async getCredentials(e){if(!await this.checkKeychainAvailability())throw new Error("Keychain is not available");let t=await this.getKeytar();if(!t)throw new Error("Keytar module not available");let r=await t.getPassword(S,this.getAccount(e));if(!r)return null;let n=this.tryParseKeychainPayload(r);return n||v("corruptFile",`Warning: Keychain entry for profile "${e}" is unreadable.`),n}async setCredentials(e,t){if(!await this.checkKeychainAvailability())throw new Error("Keychain is not available");let r=await this.getKeytar();if(!r)throw new Error("Keytar module not available");let n=JSON.stringify(t);await r.setPassword(S,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(S,this.getAccount(e))}tryParseKeychainPayload(e){try{let t=JSON.parse(e);return te(t)?t:null}catch{return null}}},N=class{keychainStorage=null;fileStorage=new F;keychainAvailable=null;initPromise=null;shouldForceFileStorage(){return process.env[pe]?.toLowerCase()==="true"}async initializeStorage(){if(this.shouldForceFileStorage()){this.keychainAvailable=!1,this.keychainStorage=null;return}try{let e=new O,t=await e.isAvailable();this.keychainAvailable=t,this.keychainStorage=t?e:null}catch{this.keychainAvailable=!1,this.keychainStorage=null}!this.keychainAvailable&&!this.shouldForceFileStorage()&&(me()&&v("keychain","Keychain unavailable. Falling back to file-based credentials."),process.platform==="win32"&&v("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()||v("keychain","Keychain error encountered. Falling back to file-based credentials."),this.keychainAvailable=!1,this.keychainStorage=null}async getKeychainStorage(){return await this.ensureInitialized(),this.shouldForceFileStorage()?null:this.keychainAvailable?this.keychainStorage:null}async getCredentials(e){let t=await this.getKeychainStorage();if(!t)return this.fileStorage.getCredentials(e);try{let n=await t.getCredentials(e);if(n)return n}catch{return this.disableKeychain(),this.fileStorage.getCredentials(e)}let r=await this.fileStorage.getCredentials(e);if(r)try{await t.setCredentials(e,r),await this.fileStorage.deleteCredentials(e)}catch{}return r}async setCredentials(e,t){let r=await this.getKeychainStorage();if(!r){await this.fileStorage.setCredentials(e,t);return}try{await r.setCredentials(e,t),await this.fileStorage.deleteCredentials(e)}catch{this.disableKeychain(),await this.fileStorage.setCredentials(e,t)}}async deleteCredentials(e){let t=await this.getKeychainStorage();if(t)try{await t.deleteCredentials(e)}catch{this.disableKeychain()}await this.fileStorage.deleteCredentials(e)}},l=new N,h={async saveAccessToken(s,e){let t=a.getEffectiveProfileName(e),r=await l.getCredentials(t)??{};r.accessToken=s,await l.setCredentials(t,r)},async getAccessToken(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.accessToken??null},async saveRefreshToken(s,e){let t=a.getEffectiveProfileName(e),r=await l.getCredentials(t)??{};r.refreshToken=s,await l.setCredentials(t,r)},async getRefreshToken(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.refreshToken??null},async saveEmail(s,e){let t=a.getEffectiveProfileName(e),r=await l.getCredentials(t)??{};r.email=s,await l.setCredentials(t,r)},async getEmail(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.email??null},async saveWorkspaceId(s,e){let t=a.getEffectiveProfileName(e),r=await l.getCredentials(t)??{};r.workspaceId=s,await l.setCredentials(t,r)},async getWorkspaceId(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.workspaceId??null},async saveAll(s,e){let t=a.getEffectiveProfileName(e);await l.setCredentials(t,s)},async getAll(s){let e=a.getEffectiveProfileName(s);return l.getCredentials(e)},async clear(s){let e=a.getEffectiveProfileName(s);await l.deleteCredentials(e)},async isLoggedIn(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.accessToken!=null}};var B=class s{client;baseUrl;runtimeConfigCache;constructor(e,t){this.baseUrl=e||M(t),K().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})=>(Re(n)&&(n.request.headers.delete("authorization"),n.request.headers.delete("Authorization")),n)]}})}getBaseUrl(){return this.baseUrl}async refreshOAuthToken(e){return this.client.post("v1/oauth/token",{json:{grant_type:"refresh_token",refresh_token:e.refreshToken,client_id:e.clientId}}).json()}async revokeOAuthToken(e){await this.client.post("v1/oauth/revoke",{json:{token:e.token,token_type_hint:"refresh_token",client_id:e.clientId}})}async getWorkspaces(e){try{return process.env.DEBUG&&console.log(`[DEBUG] Calling getWorkspaces API: ${this.baseUrl}/v1/workspaces`),await this.client.get("v1/workspaces",{headers:{Authorization:`Bearer ${e}`}}).json()}catch(t){throw process.env.DEBUG&&(console.error("[DEBUG] getWorkspaces error:",t),t instanceof Error&&"cause"in t&&console.error("[DEBUG] Error cause:",t.cause)),t}}async getAgents(e,t,r){let n={limit:r?.limit??100};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),await this.client.get(`v1/workspaces/${t}/availableAgents`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async createAgent(e,t,r){return await this.client.post(`v1/workspaces/${t}/agents`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async updateAgent(e,t,r,n){await this.client.put(`v1/workspaces/${t}/agents/${r}`,{headers:{Authorization:`Bearer ${e}`},json:n})}async deleteAgent(e,t,r){await this.client.delete(`v1/workspaces/${t}/agents/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async getMyAgents(e,t,r){let n={limit:r?.limit??100};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),await this.client.get(`v1/workspaces/${t}/myAgents`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async publishAgent(e,t,r){await this.client.post(`v1/workspaces/${t}/agents/${r}/publish`,{headers:{Authorization:`Bearer ${e}`}})}async getAgentGrants(e,t,r){return await this.client.get(`v1/workspaces/${t}/agents/${r}/grants`,{headers:{Authorization:`Bearer ${e}`}}).json()}async upsertAgentGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/agents/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeAgentGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/agents/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async getMeetings(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),r?.filter&&(n.filter=r.filter),r?.sortBy&&(n.sortBy=r.sortBy),await this.client.get(`v1/workspaces/${t}/meetings`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getMeeting(e,t,r){return await this.client.get(`v1/workspaces/${t}/meetings/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async createMeeting(e,t,r){return await this.client.post(`v1/workspaces/${t}/meetings`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async updateMeeting(e,t,r,n){return await this.client.patch(`v1/workspaces/${t}/meetings/${r}`,{headers:{Authorization:`Bearer ${e}`},json:n}).json()}async deleteMeeting(e,t,r){await this.client.delete(`v1/workspaces/${t}/meetings/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async getMeetingPreviousBrief(e,t,r){return await this.client.get(`v1/workspaces/${t}/meetings/${r}/previous`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getRecording(e,t,r){return await this.client.get(`v1/workspaces/${t}/recordings/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getMeetingShares(e,t,r){return await this.client.get(`v1/workspaces/${t}/meetings/${r}/shares`,{headers:{Authorization:`Bearer ${e}`}}).json()}async upsertMeetingUserGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/meetings/${r}/shares/users/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeMeetingUserGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/meetings/${r}/shares/users/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async upsertMeetingTeamGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/meetings/${r}/shares/teams/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeMeetingTeamGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/meetings/${r}/shares/teams/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async getWorkflows(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),await this.client.get(`v1/workspaces/${t}/workflows`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getWorkflow(e,t,r){return await this.client.get(`v1/workspaces/${t}/workflows/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async createWorkflow(e,t,r){return await this.client.post(`v1/workspaces/${t}/workflows`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async updateWorkflow(e,t,r,n){await this.client.put(`v1/workspaces/${t}/workflows/${r}`,{headers:{Authorization:`Bearer ${e}`},json:n})}async triggerWorkflowRun(e,t,r,n){return await this.client.post(`v1/workspaces/${t}/workflows/${r}/runs`,{headers:{Authorization:`Bearer ${e}`},json:n===void 0?{}:{args:n}}).json()}async getWorkflowRuns(e,t,r,n){let i={limit:n?.limit??20};return n?.nextKey&&(i.nextKey=n.nextKey),await this.client.get(`v1/workspaces/${t}/workflows/${r}/runs`,{headers:{Authorization:`Bearer ${e}`},searchParams:i}).json()}async getWorkflowRun(e,t,r,n){return await this.client.get(`v1/workspaces/${t}/workflows/${r}/runs/${n}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getWorkflowGrants(e,t,r){return await this.client.get(`v1/workspaces/${t}/workflows/${r}/grants`,{headers:{Authorization:`Bearer ${e}`}}).json()}async upsertWorkflowGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/workflows/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeWorkflowGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/workflows/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async getNotifications(e,t,r){let n={limit:r?.limit??20};return r?.tab&&(n.tab=r.tab),r?.eventType&&(n.eventType=r.eventType),r?.cursor&&(n.cursor=r.cursor),await this.client.get(`v1/workspaces/${t}/notifications`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getNotificationUnreadCount(e,t){return await this.client.get(`v1/workspaces/${t}/notifications/unreadCount`,{headers:{Authorization:`Bearer ${e}`}}).json()}async markNotificationRead(e,t,r){await this.client.post(`v1/workspaces/${t}/notifications/${r}/read`,{headers:{Authorization:`Bearer ${e}`}})}async markAllNotificationsRead(e,t){await this.client.post(`v1/workspaces/${t}/notifications/readAll`,{headers:{Authorization:`Bearer ${e}`}})}async getRuntimeConfig(){if(this.runtimeConfigCache)return this.runtimeConfigCache;let e=await this.client.get("v1/runtimeConfig").json();return this.runtimeConfigCache=e,e}async getModels(e,t){return await this.client.get(`v1/workspaces/${t}/models`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getModelTiers(e,t){return await this.client.get(`v1/workspaces/${t}/modelTiers`,{headers:{Authorization:`Bearer ${e}`}}).json()}async listSelectableModels(e,t){let{deploymentMode:r}=await this.getRuntimeConfig(),{models:n}=r==="saas"?await this.getModelTiers(e,t):await this.getModels(e,t);return{models:n.filter(i=>i.enabled!==!1)}}async getConnectors(e,t,r){let n={limit:r?.limit??100,connectionStatus:r?.connectionStatus??"connected"};return r?.search&&(n.search=r.search),r?.nextKey&&(n.nextKey=r.nextKey),await this.client.get(`v1/workspaces/${t}/availableConnectors`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getConnectorTools(e,t,r){return this.client.get(`v1/workspaces/${t}/connectors/${r}/tools`,{headers:{Authorization:`Bearer ${e}`}}).json()}async connectConnectorToken(e,t,r,n){await this.client.put(`v1/workspaces/${t}/connectors/${r}/token`,{headers:{Authorization:`Bearer ${e}`},json:n})}async getConnectorAuthUrl(e,t,r){return this.client.post(`v1/workspaces/${t}/connectors/${r}/authUrl`,{headers:{Authorization:`Bearer ${e}`},json:{}}).json()}async disconnectConnector(e,t,r){await this.client.delete(`v1/workspaces/${t}/connectors/${r}/token`,{headers:{Authorization:`Bearer ${e}`}})}async getTasks(e,t,r=20){return await this.client.get(`v1/workspaces/${t}/tasks`,{headers:{Authorization:`Bearer ${e}`},searchParams:{limit:r}}).json()}async searchTasks(e,t,r,n){let i={q:r,limit:n?.limit??20};return n?.nextKey&&(i.nextKey=n.nextKey),await this.client.get(`v1/workspaces/${t}/tasks/search`,{headers:{Authorization:`Bearer ${e}`},searchParams:i}).json()}async getMessages(e,t,r,n=50){return await this.client.get(`v1/workspaces/${t}/tasks/${r}/messages`,{headers:{Authorization:`Bearer ${e}`},searchParams:{limit:n}}).json()}async getAgent(e,t,r){return await this.client.get(`v1/workspaces/${t}/agents/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async listAvailableSkills(e,t,r){return await this.client.get(`v1/workspaces/${t}/availableSkills`,{headers:{Authorization:`Bearer ${e}`},searchParams:{createdBy:r?.createdBy,nextKey:r?.nextKey,limit:r?.limit??20}}).json()}async uploadSkill(e,t,r){return await this.client.post(`v1/workspaces/${t}/skills`,{headers:{Authorization:`Bearer ${e}`},body:r}).json()}async deleteSkill(e,t,r){await this.client.delete(`v1/workspaces/${t}/skills/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async updateSkillPreference(e,t,r,n){return await this.client.patch(`v1/workspaces/${t}/skills/${r}/preference`,{headers:{Authorization:`Bearer ${e}`},json:{isEnabled:n}}).json()}async getSkillVersions(e,t,r){return await this.client.get(`v1/workspaces/${t}/skills/${r}/versions`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getSkillGrants(e,t,r){return await this.client.get(`v1/workspaces/${t}/skills/${r}/grants`,{headers:{Authorization:`Bearer ${e}`}}).json()}async upsertSkillGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/skills/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeSkillGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/skills/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async downloadSkillCurrent(e,t,r){return await this.client.get(`v1/workspaces/${t}/skills/${r}/download`,{headers:{Authorization:`Bearer ${e}`}}).json()}async task(e,t,r){try{let n=await this.client.post(`v1/workspaces/${t}/tasks`,{headers:{Authorization:`Bearer ${e}`},json:r,timeout:6e4,throwHttpErrors:!1});if(!n.ok){let o=await n.text();throw new Error(`Task API failed (${n.status}): ${o}`)}let i=await n.json();return i.noop||!i.streamId?new Response(`data: [DONE]
2
+ import _ from"fs";import m from"fs";import ze from"os";import C from"path";import{HTTPError as _e,TimeoutError as je}from"ky";import{HTTPError as Me}from"ky";import ve,{TimeoutError as Re,isHTTPError as re}from"ky";import b from"crypto";import p from"fs";import pe from"path";var he="ENTRYDESK_FORCE_FILE_STORAGE",S="EntryDesk CLI",fe="__entrydesk_keychain_test__",ye="profile:",me=".credentials.key",ee={keychain:!1,permissions:!1,corruptFile:!1,windowsFile:!1};function v(s,e){ee[s]||(ee[s]=!0,console.error(e))}function we(){return process.env.ENTRYDESK_DEBUG?.toLowerCase()==="true"}function te(s){if(!s||typeof s!="object")return!1;let e=s;return!(!("accessToken"in e||"refreshToken"in e||"email"in e||"workspaceId"in e)||"accessToken"in e&&typeof e.accessToken!="string"||"refreshToken"in e&&typeof e.refreshToken!="string"||"email"in e&&typeof e.email!="string"||"workspaceId"in e&&typeof e.workspaceId!="string")}function ke(s){if(!s||typeof s!="object")return!1;let e=s;return typeof e.getPassword=="function"&&typeof e.setPassword=="function"&&typeof e.deletePassword=="function"}function D(s){return a.getProfileCredentialsFile(s)}var F=class{getKeyFilePath(e){return pe.join(a.getProfileDir(e),me)}loadEncryptionKey(e){let t=this.getKeyFilePath(e);try{if(!p.existsSync(t))return null;let r=p.readFileSync(t);return r.length!==32?null:(this.ensureSecureFilePermissions(t),r)}catch{return null}}createEncryptionKey(e){a.ensureProfileDir(e);let t=this.getKeyFilePath(e),r=b.randomBytes(32);return p.writeFileSync(t,r,{mode:384}),this.ensureSecureFilePermissions(t),r}getOrCreateEncryptionKey(e){let t=this.loadEncryptionKey(e);return t||this.createEncryptionKey(e)}encrypt(e,t){let r=b.randomBytes(16),n=b.createCipheriv("aes-256-gcm",t,r),i=n.update(e,"utf8","hex");i+=n.final("hex");let o=n.getAuthTag();return`${r.toString("hex")}:${o.toString("hex")}:${i}`}decrypt(e,t){let r=e.split(":");if(r.length!==3)throw new Error("Invalid encrypted data format");let n=Buffer.from(r[0],"hex"),i=Buffer.from(r[1],"hex"),o=r[2],d=b.createDecipheriv("aes-256-gcm",t,n,{authTagLength:16});d.setAuthTag(i);let u=d.update(o,"hex","utf8");return u+=d.final("utf8"),u}tryDecrypt(e,t){try{return this.decrypt(e,t)}catch{return null}}tryParseCredentials(e){try{let t=JSON.parse(e);return te(t)?t:null}catch{return null}}ensureSecureFilePermissions(e){if(process.platform!=="win32"){try{p.chmodSync(e,384)}catch{v("permissions","Warning: Failed to set secure permissions on credentials file.");return}try{(p.statSync(e).mode&511)!==384&&v("permissions","Warning: Credentials file permissions are too permissive.")}catch{v("permissions","Warning: Failed to verify credentials file permissions.")}}}async getCredentials(e){let t=D(e);try{if(!p.existsSync(t))return null;let r=p.readFileSync(t,"utf-8").trim();if(!r)return null;let n=this.loadEncryptionKey(e),i=n?this.tryDecrypt(r,n):null;if(i){let o=this.tryParseCredentials(i);if(o)return o}return v("corruptFile","Warning: Credentials file is unreadable. Please run `entrydesk login` again."),null}catch{return null}}async setCredentials(e,t){a.ensureProfileDir(e);let r=D(e),n=this.getOrCreateEncryptionKey(e),i=this.encrypt(JSON.stringify(t),n);p.writeFileSync(r,i,{mode:384}),this.ensureSecureFilePermissions(r)}async deleteCredentials(e){let t=D(e);try{p.existsSync(t)&&p.unlinkSync(t)}catch{}}},O=class{keytarModule=null;keytarLoadAttempted=!1;keychainAvailable=null;async getKeytar(){if(this.keytarLoadAttempted)return this.keytarModule;this.keytarLoadAttempted=!0;try{let t=await import("keytar"),r=t&&typeof t=="object"&&"default"in t?t.default:t;this.keytarModule=ke(r)?r:null}catch{this.keytarModule=null}return this.keytarModule}getAccount(e){return`${ye}${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")}`,r="test";await e.setPassword(S,t,r);let n=await e.getPassword(S,t),i=await e.deletePassword(S,t);return this.keychainAvailable=!!(i&&n===r),this.keychainAvailable}catch{return this.keychainAvailable=!1,!1}}async isAvailable(){return this.checkKeychainAvailability()}async getCredentials(e){if(!await this.checkKeychainAvailability())throw new Error("Keychain is not available");let t=await this.getKeytar();if(!t)throw new Error("Keytar module not available");let r=await t.getPassword(S,this.getAccount(e));if(!r)return null;let n=this.tryParseKeychainPayload(r);return n||v("corruptFile",`Warning: Keychain entry for profile "${e}" is unreadable.`),n}async setCredentials(e,t){if(!await this.checkKeychainAvailability())throw new Error("Keychain is not available");let r=await this.getKeytar();if(!r)throw new Error("Keytar module not available");let n=JSON.stringify(t);await r.setPassword(S,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(S,this.getAccount(e))}tryParseKeychainPayload(e){try{let t=JSON.parse(e);return te(t)?t:null}catch{return null}}},N=class{keychainStorage=null;fileStorage=new F;keychainAvailable=null;initPromise=null;shouldForceFileStorage(){return process.env[he]?.toLowerCase()==="true"}async initializeStorage(){if(this.shouldForceFileStorage()){this.keychainAvailable=!1,this.keychainStorage=null;return}try{let e=new O,t=await e.isAvailable();this.keychainAvailable=t,this.keychainStorage=t?e:null}catch{this.keychainAvailable=!1,this.keychainStorage=null}!this.keychainAvailable&&!this.shouldForceFileStorage()&&(we()&&v("keychain","Keychain unavailable. Falling back to file-based credentials."),process.platform==="win32"&&v("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()||v("keychain","Keychain error encountered. Falling back to file-based credentials."),this.keychainAvailable=!1,this.keychainStorage=null}async getKeychainStorage(){return await this.ensureInitialized(),this.shouldForceFileStorage()?null:this.keychainAvailable?this.keychainStorage:null}async getCredentials(e){let t=await this.getKeychainStorage();if(!t)return this.fileStorage.getCredentials(e);try{let n=await t.getCredentials(e);if(n)return n}catch{return this.disableKeychain(),this.fileStorage.getCredentials(e)}let r=await this.fileStorage.getCredentials(e);if(r)try{await t.setCredentials(e,r),await this.fileStorage.deleteCredentials(e)}catch{}return r}async setCredentials(e,t){let r=await this.getKeychainStorage();if(!r){await this.fileStorage.setCredentials(e,t);return}try{await r.setCredentials(e,t),await this.fileStorage.deleteCredentials(e)}catch{this.disableKeychain(),await this.fileStorage.setCredentials(e,t)}}async deleteCredentials(e){let t=await this.getKeychainStorage();if(t)try{await t.deleteCredentials(e)}catch{this.disableKeychain()}await this.fileStorage.deleteCredentials(e)}},l=new N,h={async saveAccessToken(s,e){let t=a.getEffectiveProfileName(e),r=await l.getCredentials(t)??{};r.accessToken=s,await l.setCredentials(t,r)},async getAccessToken(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.accessToken??null},async saveRefreshToken(s,e){let t=a.getEffectiveProfileName(e),r=await l.getCredentials(t)??{};r.refreshToken=s,await l.setCredentials(t,r)},async getRefreshToken(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.refreshToken??null},async saveEmail(s,e){let t=a.getEffectiveProfileName(e),r=await l.getCredentials(t)??{};r.email=s,await l.setCredentials(t,r)},async getEmail(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.email??null},async saveWorkspaceId(s,e){let t=a.getEffectiveProfileName(e),r=await l.getCredentials(t)??{};r.workspaceId=s,await l.setCredentials(t,r)},async getWorkspaceId(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.workspaceId??null},async saveAll(s,e){let t=a.getEffectiveProfileName(e);await l.setCredentials(t,s)},async getAll(s){let e=a.getEffectiveProfileName(s);return l.getCredentials(e)},async clear(s){let e=a.getEffectiveProfileName(s);await l.deleteCredentials(e)},async isLoggedIn(s){let e=a.getEffectiveProfileName(s);return(await l.getCredentials(e))?.accessToken!=null}};var B=class s{client;baseUrl;runtimeConfigCache;constructor(e,t){this.baseUrl=e||M(t),K().ignoreSslErrors&&(process.env.NODE_TLS_REJECT_UNAUTHORIZED="0",process.env.DEBUG&&console.log("[DEBUG] ApiClient: SSL certificate validation disabled")),this.client=ve.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})=>(re(n)&&(n.request.headers.delete("authorization"),n.request.headers.delete("Authorization")),n)]}})}getBaseUrl(){return this.baseUrl}async refreshOAuthToken(e){return this.client.post("v1/oauth/token",{json:{grant_type:"refresh_token",refresh_token:e.refreshToken,client_id:e.clientId}}).json()}async revokeOAuthToken(e){await this.client.post("v1/oauth/revoke",{json:{token:e.token,token_type_hint:"refresh_token",client_id:e.clientId}})}async getWorkspaces(e){try{return process.env.DEBUG&&console.log(`[DEBUG] Calling getWorkspaces API: ${this.baseUrl}/v1/workspaces`),await this.client.get("v1/workspaces",{headers:{Authorization:`Bearer ${e}`}}).json()}catch(t){throw process.env.DEBUG&&(console.error("[DEBUG] getWorkspaces error:",t),t instanceof Error&&"cause"in t&&console.error("[DEBUG] Error cause:",t.cause)),t}}async getAgents(e,t,r){let n={limit:r?.limit??100};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),await this.client.get(`v1/workspaces/${t}/availableAgents`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async createAgent(e,t,r){return await this.client.post(`v1/workspaces/${t}/agents`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async updateAgent(e,t,r,n){await this.client.put(`v1/workspaces/${t}/agents/${r}`,{headers:{Authorization:`Bearer ${e}`},json:n})}async deleteAgent(e,t,r){await this.client.delete(`v1/workspaces/${t}/agents/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async getMyAgents(e,t,r){let n={limit:r?.limit??100};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),await this.client.get(`v1/workspaces/${t}/myAgents`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async publishAgent(e,t,r){await this.client.post(`v1/workspaces/${t}/agents/${r}/publish`,{headers:{Authorization:`Bearer ${e}`}})}async getAgentGrants(e,t,r){return await this.client.get(`v1/workspaces/${t}/agents/${r}/grants`,{headers:{Authorization:`Bearer ${e}`}}).json()}async upsertAgentGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/agents/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeAgentGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/agents/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async getMeetings(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),r?.filter&&(n.filter=r.filter),r?.sortBy&&(n.sortBy=r.sortBy),await this.client.get(`v1/workspaces/${t}/meetings`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getMeeting(e,t,r){return await this.client.get(`v1/workspaces/${t}/meetings/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async createMeeting(e,t,r){return await this.client.post(`v1/workspaces/${t}/meetings`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async updateMeeting(e,t,r,n){return await this.client.patch(`v1/workspaces/${t}/meetings/${r}`,{headers:{Authorization:`Bearer ${e}`},json:n}).json()}async deleteMeeting(e,t,r){await this.client.delete(`v1/workspaces/${t}/meetings/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async getMeetingPreviousBrief(e,t,r){return await this.client.get(`v1/workspaces/${t}/meetings/${r}/previous`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getRecording(e,t,r){return await this.client.get(`v1/workspaces/${t}/recordings/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getMeetingShares(e,t,r){return await this.client.get(`v1/workspaces/${t}/meetings/${r}/shares`,{headers:{Authorization:`Bearer ${e}`}}).json()}async upsertMeetingUserGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/meetings/${r}/shares/users/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeMeetingUserGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/meetings/${r}/shares/users/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async upsertMeetingTeamGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/meetings/${r}/shares/teams/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeMeetingTeamGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/meetings/${r}/shares/teams/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async getWorkflows(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),await this.client.get(`v1/workspaces/${t}/workflows`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getWorkflow(e,t,r){return await this.client.get(`v1/workspaces/${t}/workflows/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async createWorkflow(e,t,r){return await this.client.post(`v1/workspaces/${t}/workflows`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async updateWorkflow(e,t,r,n){await this.client.put(`v1/workspaces/${t}/workflows/${r}`,{headers:{Authorization:`Bearer ${e}`},json:n})}async triggerWorkflowRun(e,t,r,n){return await this.client.post(`v1/workspaces/${t}/workflows/${r}/runs`,{headers:{Authorization:`Bearer ${e}`},json:n===void 0?{}:{args:n}}).json()}async getWorkflowRuns(e,t,r,n){let i={limit:n?.limit??20};return n?.nextKey&&(i.nextKey=n.nextKey),await this.client.get(`v1/workspaces/${t}/workflows/${r}/runs`,{headers:{Authorization:`Bearer ${e}`},searchParams:i}).json()}async getWorkflowRun(e,t,r,n){return await this.client.get(`v1/workspaces/${t}/workflows/${r}/runs/${n}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getWorkflowGrants(e,t,r){return await this.client.get(`v1/workspaces/${t}/workflows/${r}/grants`,{headers:{Authorization:`Bearer ${e}`}}).json()}async upsertWorkflowGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/workflows/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeWorkflowGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/workflows/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async getNotifications(e,t,r){let n={limit:r?.limit??20};return r?.tab&&(n.tab=r.tab),r?.eventType&&(n.eventType=r.eventType),r?.cursor&&(n.cursor=r.cursor),await this.client.get(`v1/workspaces/${t}/notifications`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getNotificationUnreadCount(e,t){return await this.client.get(`v1/workspaces/${t}/notifications/unreadCount`,{headers:{Authorization:`Bearer ${e}`}}).json()}async markNotificationRead(e,t,r){await this.client.post(`v1/workspaces/${t}/notifications/${r}/read`,{headers:{Authorization:`Bearer ${e}`}})}async markAllNotificationsRead(e,t){await this.client.post(`v1/workspaces/${t}/notifications/readAll`,{headers:{Authorization:`Bearer ${e}`}})}async getRuntimeConfig(){if(this.runtimeConfigCache)return this.runtimeConfigCache;let e=await this.client.get("v1/runtimeConfig").json();return this.runtimeConfigCache=e,e}async getModels(e,t){return await this.client.get(`v1/workspaces/${t}/models`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getModelTiers(e,t){return await this.client.get(`v1/workspaces/${t}/modelTiers`,{headers:{Authorization:`Bearer ${e}`}}).json()}async listSelectableModels(e,t){let{deploymentMode:r}=await this.getRuntimeConfig(),{models:n}=r==="saas"?await this.getModelTiers(e,t):await this.getModels(e,t);return{models:n.filter(i=>i.enabled!==!1)}}async getConnectors(e,t,r){let n={limit:r?.limit??100,connectionStatus:r?.connectionStatus??"connected"};return r?.search&&(n.search=r.search),r?.nextKey&&(n.nextKey=r.nextKey),await this.client.get(`v1/workspaces/${t}/availableConnectors`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getConnectorTools(e,t,r){return this.client.get(`v1/workspaces/${t}/connectors/${r}/tools`,{headers:{Authorization:`Bearer ${e}`}}).json()}async connectConnectorToken(e,t,r,n){await this.client.put(`v1/workspaces/${t}/connectors/${r}/token`,{headers:{Authorization:`Bearer ${e}`},json:n})}async getConnectorAuthUrl(e,t,r){return this.client.post(`v1/workspaces/${t}/connectors/${r}/authUrl`,{headers:{Authorization:`Bearer ${e}`},json:{}}).json()}async disconnectConnector(e,t,r){await this.client.delete(`v1/workspaces/${t}/connectors/${r}/token`,{headers:{Authorization:`Bearer ${e}`}})}async getTasks(e,t,r=20){return await this.client.get(`v1/workspaces/${t}/tasks`,{headers:{Authorization:`Bearer ${e}`},searchParams:{limit:r}}).json()}async searchTasks(e,t,r,n){let i={q:r,limit:n?.limit??20};return n?.nextKey&&(i.nextKey=n.nextKey),await this.client.get(`v1/workspaces/${t}/tasks/search`,{headers:{Authorization:`Bearer ${e}`},searchParams:i}).json()}async getMessages(e,t,r,n=50){return await this.client.get(`v1/workspaces/${t}/tasks/${r}/messages`,{headers:{Authorization:`Bearer ${e}`},searchParams:{limit:n}}).json()}async getAgent(e,t,r){return await this.client.get(`v1/workspaces/${t}/agents/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async listAvailableSkills(e,t,r){return await this.client.get(`v1/workspaces/${t}/availableSkills`,{headers:{Authorization:`Bearer ${e}`},searchParams:{createdBy:r?.createdBy,nextKey:r?.nextKey,limit:r?.limit??20}}).json()}async uploadSkill(e,t,r){return await this.client.post(`v1/workspaces/${t}/skills`,{headers:{Authorization:`Bearer ${e}`},body:r}).json()}async deleteSkill(e,t,r){await this.client.delete(`v1/workspaces/${t}/skills/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async updateSkillPreference(e,t,r,n){return await this.client.patch(`v1/workspaces/${t}/skills/${r}/preference`,{headers:{Authorization:`Bearer ${e}`},json:{isEnabled:n}}).json()}async getSkillVersions(e,t,r){return await this.client.get(`v1/workspaces/${t}/skills/${r}/versions`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getSkillGrants(e,t,r){return await this.client.get(`v1/workspaces/${t}/skills/${r}/grants`,{headers:{Authorization:`Bearer ${e}`}}).json()}async upsertSkillGrant(e,t,r,n,i){return await this.client.put(`v1/workspaces/${t}/skills/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`},json:{role:i}}).json()}async removeSkillGrant(e,t,r,n){await this.client.delete(`v1/workspaces/${t}/skills/${r}/grants/${n}`,{headers:{Authorization:`Bearer ${e}`}})}async downloadSkillCurrent(e,t,r){return await this.client.get(`v1/workspaces/${t}/skills/${r}/download`,{headers:{Authorization:`Bearer ${e}`}}).json()}async task(e,t,r){try{let n=await this.client.post(`v1/workspaces/${t}/tasks`,{headers:{Authorization:`Bearer ${e}`},json:r,timeout:6e4,throwHttpErrors:!1});if(!n.ok){let o=await n.text();throw new Error(`Task API failed (${n.status}): ${o}`)}let i=await n.json();return i.noop||!i.streamId?new Response(`data: [DONE]
3
3
 
4
- `,{headers:{"Content-Type":"text/event-stream"}}):await this.taskStream(e,t,i.taskId)}catch(n){throw n instanceof ve?new TypeError("Request timed out. Please check your connection and try again.",{cause:n}):n}}async taskStream(e,t,r){let n=await this.client.get(`v1/workspaces/${t}/tasks/${r}/stream`,{headers:{Authorization:`Bearer ${e}`,Accept:"text/event-stream"},timeout:!1,throwHttpErrors:!1});if(!n.ok){let i=await n.text();throw new Error(`Task stream failed (${n.status}): ${i}`)}return n}async getBudget(e,t){return await this.client.get(`v1/workspaces/${t}/budget`,{headers:{Authorization:`Bearer ${e}`}}).json()}async updateBudget(e,t,r){await this.client.put(`v1/workspaces/${t}/budget`,{headers:{Authorization:`Bearer ${e}`},json:{budget:r}})}async getMonthlyUsages(e,t,r){return await this.client.get(`v1/workspaces/${t}/monthlyUsages`,{headers:{Authorization:`Bearer ${e}`},searchParams:{nextKey:r?.nextKey,limit:r?.limit??20}}).json()}async getBillingOverview(e,t){return await this.client.get(`v1/workspaces/${t}/billing/overview`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getBillingInvoices(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),await this.client.get(`v1/workspaces/${t}/billing/invoices`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getUsageOverview(e,t){return await this.client.get(`v1/workspaces/${t}/usage/overview`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getUsageMe(e,t){return await this.client.get(`v1/workspaces/${t}/usage/me`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getUsageConsumptions(e,t,r){let n={limit:r?.limit??20,offset:r?.offset??0};return r?.periodStart&&(n.periodStart=r.periodStart),await this.client.get(`v1/workspaces/${t}/usage/consumptions`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async exportUsageCsv(e,t,r){let n={};return r&&(n.periodStart=r),await this.client.get(`v1/workspaces/${t}/usage/export`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).text()}async createTaskShare(e,t,r,n="public"){return await this.client.post(`v1/workspaces/${t}/tasks/${r}/shares`,{headers:{Authorization:`Bearer ${e}`},json:{visibility:n}}).json()}async getSharedTask(e,t){let r={};return t&&(r.Authorization=`Bearer ${t}`),await this.client.get(`v1/shares/${e}`,{headers:r}).json()}async getSharedMessages(e,t=50,r){let n={};return r&&(n.Authorization=`Bearer ${r}`),await this.client.get(`v1/shares/${e}/messages`,{headers:n,searchParams:{limit:t}}).json()}async deleteTask(e,t,r){await this.client.delete(`v1/workspaces/${t}/tasks/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async getModelProviders(e,t){return await this.client.get(`v1/workspaces/${t}/modelProviders`,{headers:{Authorization:`Bearer ${e}`}}).json()}async uploadFile(e,t,r,n){let i=new FormData,o=new Blob([r.buffer],{type:r.mimeType});return i.append("file",o,r.filename),i.append("modelProviderId",n),await this.client.post(`v1/workspaces/${t}/files`,{headers:{Authorization:`Bearer ${e}`},body:i,timeout:12e4}).json()}async getSchedules(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),await this.client.get(`v1/workspaces/${t}/schedules`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getSchedule(e,t,r){return await this.client.get(`v1/workspaces/${t}/schedules/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async createSchedule(e,t,r){return await this.client.post(`v1/workspaces/${t}/schedules`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async updateSchedule(e,t,r,n){await this.client.put(`v1/workspaces/${t}/schedules/${r}`,{headers:{Authorization:`Bearer ${e}`},json:n})}async deleteSchedule(e,t,r){await this.client.delete(`v1/workspaces/${t}/schedules/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async activateSchedule(e,t,r){await this.client.post(`v1/workspaces/${t}/schedules/${r}/activate`,{headers:{Authorization:`Bearer ${e}`}})}async deactivateSchedule(e,t,r){await this.client.post(`v1/workspaces/${t}/schedules/${r}/deactivate`,{headers:{Authorization:`Bearer ${e}`}})}async runScheduleNow(e,t,r){return await this.client.post(`v1/workspaces/${t}/schedules/${r}/run`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getScheduleRuns(e,t,r,n){let i={limit:n?.limit??20};return n?.nextKey&&(i.nextKey=n.nextKey),await this.client.get(`v1/workspaces/${t}/schedules/${r}/runs`,{headers:{Authorization:`Bearer ${e}`},searchParams:i}).json()}async listRecordings(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),this.client.get(`v1/workspaces/${t}/recordings`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async importRecordingMedia(e,t,r){return this.client.post(`v1/workspaces/${t}/recordings/import/media`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async previewRecordingMedia(e,t,r){let n={url:r};return this.client.get(`v1/workspaces/${t}/recordings/preview/media`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getRecordingAudioUrl(e,t,r){return this.client.get(`v1/workspaces/${t}/recordings/${r}/audioUrl`,{headers:{Authorization:`Bearer ${e}`}}).json()}async retryRecording(e,t,r){return this.client.post(`v1/workspaces/${t}/recordings/${r}/retry`,{headers:{Authorization:`Bearer ${e}`}}).json()}async deleteRecording(e,t,r){await this.client.delete(`v1/workspaces/${t}/recordings/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async searchMarketplace(e){let t={};return e?.type&&(t.type=e.type),e?.tag&&(t.tag=e.tag),e?.limit&&(t.limit=e.limit),e?.cursor&&(t.cursor=e.cursor),this.client.get("v1/marketplace/resources",{searchParams:t}).json()}async getMarketplaceAgent(e){return this.client.get(`v1/marketplace/agents/${encodeURIComponent(e)}`).json()}async getMarketplaceSkill(e){return this.client.get(`v1/marketplace/skills/${encodeURIComponent(e)}`).json()}async listMarketplaceRoles(){return this.client.get("v1/marketplace/roles").json()}async installMarketplaceResource(e,t,r,n){return this.client.post(`v1/workspaces/${t}/marketplace/${r}s/${encodeURIComponent(n)}/install`,{headers:{Authorization:`Bearer ${e}`},json:{}}).json()}static async getAuthenticatedClient(e){let t=await h.getAll(e);return t?{client:new s(void 0,e),accessToken:t.accessToken,workspaceId:t.workspaceId??null}:null}};function Pe(){return process.env.ENTRYDESK_SANDBOX==="true"}function I(){if(!Pe())return null;let s=process.env.ENTRYDESK_SANDBOX_ACCESS_TOKEN?.trim(),e=process.env.ENTRYDESK_SANDBOX_WORKSPACE_ID?.trim();if(!s||!e){let t=[];throw s||t.push("ENTRYDESK_SANDBOX_ACCESS_TOKEN"),e||t.push("ENTRYDESK_SANDBOX_WORKSPACE_ID"),new Error(`Sandbox mode enabled but missing credentials: ${t.join(", ")}`)}return{accessToken:s,workspaceId:e}}function L(){let s=process.env.ENTRYDESK_TOKEN?.trim();if(!s)return null;let e=process.env.ENTRYDESK_WORKSPACE_ID?.trim();if(!e)throw new Error("ENTRYDESK_TOKEN is set but ENTRYDESK_WORKSPACE_ID is missing. Both are required for PAT authentication.");return{accessToken:s,workspaceId:e}}function nt(){let s=I();if(s)return{authSource:"sandbox-env",label:"sandbox environment (ENTRYDESK_SANDBOX)",workspaceId:s.workspaceId};let e=L();return e?{authSource:"pat-env",label:"personal access token (ENTRYDESK_TOKEN)",workspaceId:e.workspaceId}:null}import{execFile as Ae}from"child_process";import{setTimeout as Se}from"timers/promises";import{decodeJwt as $e}from"jose";import Ce,{HTTPError as se,isHTTPError as be}from"ky";function G(s){if(s===null||typeof s!="object")return{error:""};let e=s;return{code:typeof e.code=="string"?e.code:void 0,error:typeof e.error=="string"?e.error:""}}var T="entrydesk-cli",Te="offline_access workspaces:read tasks:read tasks:write tasks:delete agents:read agents:write connectors:read connectors:write tools:read tools:execute skills:read skills:write meetings:read meetings:write workflows:read workflows:write notifications:read notifications:write publishes:read publishes:write calendar:read calendar:write schedules:read schedules:write user:read user:write";function Ee(s,e){let t=new Set(e.split(/[\s,]+/).filter(Boolean)),r=s.split(" ").filter(Boolean);return{rejected:r.filter(n=>t.has(n)),remaining:r.filter(n=>!t.has(n))}}async function xe(s,e,t){try{return await s.post("v1/oauth/device/code",{json:{client_id:T,scope:e}}).json()}catch(r){if(!(r instanceof se))throw r;let{code:n,error:i}=G(r.data);if(n==="invalid_scope"){let{rejected:o,remaining:u}=Ee(e,i);if(o.length>0&&u.length>0)return t?.onWarning?.(`This server doesn't support these scopes: ${o.join(", ")}. Continuing without them \u2014 commands that need them may be unavailable.`),s.post("v1/oauth/device/code",{json:{client_id:T,scope:u.join(" ")}}).json()}throw new Error(i?`Failed to request device code: ${i}`:"Failed to request device code",{cause:r})}}function Be(s){return new Promise((e,t)=>{let r=process.platform,n,i;switch(r){case"darwin":n="open",i=[s];break;case"win32":n="cmd",i=["/c","start","",s];break;default:n="xdg-open",i=[s];break}Ae(n,i,o=>{o?t(new Error(`Failed to open browser. Please manually visit: ${s}`,{cause:o})):e()})})}async function pt(s){let e=M(),t=re(),r=K(),n=process.env.NODE_TLS_REJECT_UNAUTHORIZED;r.ignoreSslErrors&&(process.env.NODE_TLS_REJECT_UNAUTHORIZED="0",console.error("WARNING: SSL certificate validation is disabled globally for this process during the login flow. All connections in this process will skip TLS verification. Only use ENTRYDESK_IGNORE_SSL_ERRORS for local development."));try{let i=Ce.create({baseUrl:e.replace(/\/?$/,"/"),timeout:3e4,hooks:{beforeError:[({error:c})=>(be(c)&&(c.request.headers.delete("authorization"),c.request.headers.delete("Authorization")),c)]}}),o;try{o=await xe(i,Te,s)}catch(c){let k=c instanceof Error?c:new Error("Failed to request device code");throw s?.onError?.(k),k}let{device_code:u,user_code:d,expires_in:ce,interval:le}=o,X=new URL("/oauth/device",t);X.searchParams.set("user_code",d);let Z=X.toString();s?.onDeviceCodeReceived?.(d,Z),s?.onBrowserOpening?.();try{await Be(Z)}catch(c){process.env.DEBUG&&console.error("[DEBUG] Failed to open browser:",c)}s?.onWaitingForAuthorization?.();let Q=Math.max(le,5)*1e3,ge=Date.now()+ce*1e3;for(;Date.now()<ge;){await Se(Q);try{let c=await i.post("v1/oauth/token",{json:{grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:u,client_id:T}}).json();s?.onAuthorized?.();let k={};try{k=$e(c.access_token)}catch{}return{accessToken:c.access_token,refreshToken:c.refresh_token??void 0,email:k.email||"",scopes:c.scope.split(" ").filter(j=>j.length>0)}}catch(c){if(c instanceof se){let{code:j,error:ue}=G(c.data),z=j||ue;if(!z)continue;switch(z){case"authorization_pending":continue;case"slow_down":Q+=5e3;continue;case"access_denied":throw new Error("Authorization denied by user",{cause:c});case"expired_token":throw new Error("Device code expired. Please try again.",{cause:c});default:throw new Error(`Authorization failed: ${z||"Unknown error"}`,{cause:c})}}let k=c instanceof Error?c:new Error("Unknown error during authorization");throw s?.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}}function Ke(s){if(s instanceof Me){let e=s.response.status;return e===400||e===401}return!1}var f=class extends Error{code;constructor(e,t){super(t),this.code=e}};function Ie(s){try{let e=s.split(".");if(e.length<2)return null;let t=e[1].replace(/-/g,"+").replace(/_/g,"/"),r=(4-t.length%4)%4,n=t.padEnd(t.length+r,"="),i=Buffer.from(n,"base64").toString("utf8");return JSON.parse(i)}catch{return null}}function Ue(s,e=300){let r=Ie(s)?.exp;if(typeof r!="number")return!1;let n=Math.floor(Date.now()/1e3);return r-n<=e}async function ne(s){let e=s.accessToken;if(!Ue(e))return e;if(!s.refreshToken)throw await h.clear(),new f("session-expired","Session expired. Please run `entrydesk login` again.");let t=s.refreshToken;try{let n=await new B().refreshOAuthToken({refreshToken:t,clientId:T}),i=await h.getAll();return i?.accessToken&&i.refreshToken&&i.refreshToken!==t?i.accessToken:(await h.saveAll({...i??s,accessToken:n.access_token,refreshToken:n.refresh_token??i?.refreshToken??t}),n.access_token)}catch(r){if(!Ke(r))throw new f("refresh-failed","Could not refresh your session (auth server unreachable). Please try again.");let n=await h.getAll();if(n?.accessToken&&n.refreshToken&&n.refreshToken!==t)return n.accessToken;throw await h.clear(),new f("session-expired","Session expired. Please run `entrydesk login` again.")}}async function vt(){let s=I();if(s)return s.accessToken;let e=await h.getAll();if(!e?.accessToken)throw new f("not-logged-in","Not logged in. Run `entrydesk login` first.");return ne(e)}async function Rt(){let s=I();if(s)return{accessToken:s.accessToken,workspaceId:s.workspaceId};let e=L();if(e)return e;let t=await h.getAll();if(!t?.accessToken)throw new f("not-logged-in","Not logged in. Run `entrydesk login` first.");if(!t.workspaceId)throw new f("no-workspace","No workspace selected. Run `entrydesk workspaces` first.");return{accessToken:await ne(t),workspaceId:t.workspaceId}}var y=class extends Error{constructor(t,r=1,n){super(t);this.exitCode=r;this.cause=n;this.name="CLIError"}exitCode;cause};function $t(s){let e=!!process.env.DEBUG;if(s instanceof y&&(console.error(`Error: ${s.message}`),s.cause&&(console.error(`Cause: ${s.cause.message}`),e&&s.cause.stack&&console.error(s.cause.stack)),process.exit(s.exitCode)),s instanceof f&&(console.error(s.message),e&&s.stack&&console.error(s.stack),process.exit(1)),s instanceof je&&(console.error("Request timed out. Please check your connection and try again."),e&&s.stack&&console.error(s.stack),process.exit(1)),s instanceof _e){let t=s.response.status;console.error(t===401?"Not authorized (401). Your session may have expired \u2014 run `entrydesk login`.":t===403?"Forbidden (403). Your account or token lacks permission for this action. If your token predates a recently added feature, run `entrydesk login` to refresh its scopes; otherwise you may lack permission in this workspace.":`Request failed (${t}): ${s.response.statusText}`),e&&s.stack&&console.error(s.stack),process.exit(1)}s instanceof Error&&(console.error(`Unexpected error: ${s.message}`),e&&s.stack&&console.error(s.stack),process.exit(1)),console.error("An unknown error occurred"),process.exit(1)}var P="default",De=/^[A-Za-z0-9_-]+$/,W=null;function Y(){return C.join(ze.homedir(),".entrydesk")}function oe(){return C.join(Y(),"profiles")}function ae(){return C.join(Y(),"profiles.json")}function U(s){return C.join(oe(),s)}function V(s){if(!m.existsSync(s))m.mkdirSync(s,{mode:448,recursive:!0});else try{m.chmodSync(s,448)}catch{}}function Fe(){V(Y())}function H(){V(oe())}function Oe(){let s=ae();try{if(!m.existsSync(s))return null;let e=m.readFileSync(s,"utf-8");return JSON.parse(e)}catch{return null}}function $(s){Fe();let e=ae();m.writeFileSync(e,JSON.stringify(s,null,2),{mode:384});try{m.chmodSync(e,384)}catch{}}function Ne(s){let e=s.profiles?.length?Array.from(new Set(s.profiles)):[],t=s.currentProfile&&e.includes(s.currentProfile)?s.currentProfile:e[0]||P;return e.length===0&&e.push(P),e.includes(t)||e.unshift(t),{currentProfile:t,profiles:e}}function x(s){H(),V(U(s))}function R(){let s=Oe();if(!s){let t={currentProfile:P,profiles:[P]};return $(t),H(),x(P),t}let e=Ne(s);return(e.currentProfile!==s.currentProfile||e.profiles.length!==s.profiles.length)&&$(e),H(),e}function A(s){if(!s)throw new y("Profile name is required.");if(!De.test(s))throw new y("Invalid profile name. Use letters, numbers, dash, or underscore.")}function E(s,e){if(!s.profiles.includes(e))throw new y(`Profile not found: ${e}`)}function ie(s,e){if(s.profiles.includes(e))throw new y(`Profile already exists: ${e}`)}var a={DEFAULT_PROFILE:P,setOverrideProfile(s){W=s},getOverrideProfile(){return W},getProfileDir(s){return U(s)},getProfileConfigFile(s){return C.join(a.getProfileDir(s),"config.json")},getProfileCredentialsFile(s){return C.join(a.getProfileDir(s),"credentials.json")},getProfileNames(){return[...R().profiles]},getProfileCount(){return a.getProfileNames().length},getCurrentProfileName(){return R().currentProfile},getEffectiveProfileName(s){let e=R(),t=s||W||e.currentProfile;return A(t),E(e,t),t},ensureProfileExists(s){let e=R();A(s),E(e,s)},createProfile(s){A(s);let e=R();ie(e,s);let t={currentProfile:e.currentProfile,profiles:[...e.profiles,s]};$(t),x(s)},deleteProfile(s){A(s);let e=R();if(E(e,s),e.profiles.length===1)throw new y("Cannot delete the last profile.");let t=e.profiles.filter(i=>i!==s),r=e.currentProfile;r===s&&(r=t.includes(P)?P:t[0]),$({currentProfile:r,profiles:t});try{m.rmSync(a.getProfileDir(s),{recursive:!0,force:!0})}catch{}return{currentProfile:r}},renameProfile(s,e){A(s),A(e);let t=R();E(t,s),ie(t,e);let r=U(s),n=U(e);if(m.existsSync(r))try{m.renameSync(r,n)}catch(d){throw new y("Failed to rename profile directory.",1,d)}else x(e);let i=t.profiles.map(d=>d===s?e:d),o=t.currentProfile===s?e:t.currentProfile;return $({currentProfile:o,profiles:i}),{currentProfile:o}},setCurrentProfile(s){A(s);let e=R();E(e,s);let t={currentProfile:s,profiles:e.profiles};$(t),x(s)},ensureProfileDir:x};function Le(s){let e=a.getEffectiveProfileName(s);return a.getProfileConfigFile(e)}function g(s){let e=Le(s);try{if(!_.existsSync(e))return{};let t=_.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return{}}}function w(s,e){let t=a.getEffectiveProfileName(e);a.ensureProfileDir(t);let r=a.getProfileConfigFile(t);_.writeFileSync(r,JSON.stringify(s,null,2),{mode:384});try{_.chmodSync(r,384)}catch{}}var J={getApiUrl(s){return g(s).apiUrl??null},setApiUrl(s,e){let t=g(e);t.apiUrl=s,w(t,e)},clearApiUrl(s){let e=g(s);delete e.apiUrl,w(e,s)},getHubUrl(s){return g(s).hubUrl??null},setHubUrl(s,e){let t=g(e);t.hubUrl=s,w(t,e)},getAll(s){return g(s)},setAll(s,e){w(s,e)},set(s,e,t){let r=g(t);r[s]=e,w(r,t)},get(s,e){return g(e)[s]},unset(s,e){let t=g(e);delete t[s],w(t,e)},getDefaultModel(s){return g(s).model?.default??null},setDefaultModel(s,e){let t=g(e);t.model={...t.model,default:s},w(t,e)},getDefaultConnectorIds(s){return g(s).connectors?.defaults??null},setDefaultConnectorIds(s,e){let t=g(e);t.connectors={...t.connectors,defaults:s},w(t,e)},getLocalTools(s){return g(s).localTools??null},setLocalTools(s,e){let t=g(e);t.localTools={...t.localTools,...s},w(t,e)}};var Ge="https://api.entrydesk.com",We="https://app.entrydesk.com",He=3100,Ye=300*1e3;function q(s){return{apiUrl:J.getApiUrl(s)||process.env.ENTRYDESK_API_URL||Ge,hubUrl:J.getHubUrl(s)||process.env.ENTRYDESK_HUB_URL||We,mcp:{httpPort:He},auth:{loginTimeout:Ye,ignoreSslErrors:process.env.ENTRYDESK_IGNORE_SSL_ERRORS==="true"||!1}}}function M(s){return q(s).apiUrl}function re(s){return q(s).hubUrl}function K(){return q().auth}export{a,J as b,q as c,M as d,re as e,K as f,h as g,B as h,L as i,nt as j,G as k,T as l,pt as m,f as n,Ue as o,ne as p,vt as q,Rt as r,y as s,$t as t};
4
+ `,{headers:{"Content-Type":"text/event-stream"}}):await this.taskStream(e,t,i.taskId)}catch(n){throw n instanceof Re?new TypeError("Request timed out. Please check your connection and try again.",{cause:n}):n}}async taskStream(e,t,r){let n=await this.client.get(`v1/workspaces/${t}/tasks/${r}/stream`,{headers:{Authorization:`Bearer ${e}`,Accept:"text/event-stream"},timeout:!1,throwHttpErrors:!1});if(!n.ok){let i=await n.text();throw new Error(`Task stream failed (${n.status}): ${i}`)}return n}async getBudget(e,t){return await this.client.get(`v1/workspaces/${t}/budget`,{headers:{Authorization:`Bearer ${e}`}}).json()}async updateBudget(e,t,r){await this.client.put(`v1/workspaces/${t}/budget`,{headers:{Authorization:`Bearer ${e}`},json:{budget:r}})}async getMonthlyUsages(e,t,r){return await this.client.get(`v1/workspaces/${t}/monthlyUsages`,{headers:{Authorization:`Bearer ${e}`},searchParams:{nextKey:r?.nextKey,limit:r?.limit??20}}).json()}async getBillingOverview(e,t){return await this.client.get(`v1/workspaces/${t}/billing/overview`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getBillingInvoices(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),await this.client.get(`v1/workspaces/${t}/billing/invoices`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getUsageOverview(e,t){return await this.client.get(`v1/workspaces/${t}/usage/overview`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getUsageMe(e,t){return await this.client.get(`v1/workspaces/${t}/usage/me`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getUsageConsumptions(e,t,r){let n={limit:r?.limit??20,offset:r?.offset??0};return r?.periodStart&&(n.periodStart=r.periodStart),await this.client.get(`v1/workspaces/${t}/usage/consumptions`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async exportUsageCsv(e,t,r){let n={};return r&&(n.periodStart=r),await this.client.get(`v1/workspaces/${t}/usage/export`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).text()}async createTaskShare(e,t,r,n="public"){try{return await this.client.post(`v1/workspaces/${t}/tasks/${r}/shares`,{headers:{Authorization:`Bearer ${e}`},json:{visibility:n}}).json()}catch(i){if(re(i)&&i.response.status===403){let o=await i.response.json().catch(()=>null);if(o?.code==="sharing_disabled")throw new Error("Sharing is turned off for this workspace by an admin.",{cause:i});if(o?.code==="share_visibility_not_allowed")throw new Error("Public sharing is turned off for this workspace by an admin.",{cause:i})}throw i}}async getSharedTask(e,t){let r={};return t&&(r.Authorization=`Bearer ${t}`),await this.client.get(`v1/shares/${e}`,{headers:r}).json()}async getSharedMessages(e,t=50,r){let n={};return r&&(n.Authorization=`Bearer ${r}`),await this.client.get(`v1/shares/${e}/messages`,{headers:n,searchParams:{limit:t}}).json()}async deleteTask(e,t,r){await this.client.delete(`v1/workspaces/${t}/tasks/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async getModelProviders(e,t){return await this.client.get(`v1/workspaces/${t}/modelProviders`,{headers:{Authorization:`Bearer ${e}`}}).json()}async uploadFile(e,t,r,n){let i=new FormData,o=new Blob([r.buffer],{type:r.mimeType});return i.append("file",o,r.filename),i.append("modelProviderId",n),await this.client.post(`v1/workspaces/${t}/files`,{headers:{Authorization:`Bearer ${e}`},body:i,timeout:12e4}).json()}async getSchedules(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),await this.client.get(`v1/workspaces/${t}/schedules`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getSchedule(e,t,r){return await this.client.get(`v1/workspaces/${t}/schedules/${r}`,{headers:{Authorization:`Bearer ${e}`}}).json()}async createSchedule(e,t,r){return await this.client.post(`v1/workspaces/${t}/schedules`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async updateSchedule(e,t,r,n){await this.client.put(`v1/workspaces/${t}/schedules/${r}`,{headers:{Authorization:`Bearer ${e}`},json:n})}async deleteSchedule(e,t,r){await this.client.delete(`v1/workspaces/${t}/schedules/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async activateSchedule(e,t,r){await this.client.post(`v1/workspaces/${t}/schedules/${r}/activate`,{headers:{Authorization:`Bearer ${e}`}})}async deactivateSchedule(e,t,r){await this.client.post(`v1/workspaces/${t}/schedules/${r}/deactivate`,{headers:{Authorization:`Bearer ${e}`}})}async runScheduleNow(e,t,r){return await this.client.post(`v1/workspaces/${t}/schedules/${r}/run`,{headers:{Authorization:`Bearer ${e}`}}).json()}async getScheduleRuns(e,t,r,n){let i={limit:n?.limit??20};return n?.nextKey&&(i.nextKey=n.nextKey),await this.client.get(`v1/workspaces/${t}/schedules/${r}/runs`,{headers:{Authorization:`Bearer ${e}`},searchParams:i}).json()}async listRecordings(e,t,r){let n={limit:r?.limit??20};return r?.nextKey&&(n.nextKey=r.nextKey),r?.search&&(n.search=r.search),this.client.get(`v1/workspaces/${t}/recordings`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async importRecordingMedia(e,t,r){return this.client.post(`v1/workspaces/${t}/recordings/import/media`,{headers:{Authorization:`Bearer ${e}`},json:r}).json()}async previewRecordingMedia(e,t,r){let n={url:r};return this.client.get(`v1/workspaces/${t}/recordings/preview/media`,{headers:{Authorization:`Bearer ${e}`},searchParams:n}).json()}async getRecordingAudioUrl(e,t,r){return this.client.get(`v1/workspaces/${t}/recordings/${r}/audioUrl`,{headers:{Authorization:`Bearer ${e}`}}).json()}async retryRecording(e,t,r){return this.client.post(`v1/workspaces/${t}/recordings/${r}/retry`,{headers:{Authorization:`Bearer ${e}`}}).json()}async deleteRecording(e,t,r){await this.client.delete(`v1/workspaces/${t}/recordings/${r}`,{headers:{Authorization:`Bearer ${e}`}})}async searchMarketplace(e){let t={};return e?.type&&(t.type=e.type),e?.tag&&(t.tag=e.tag),e?.limit&&(t.limit=e.limit),e?.cursor&&(t.cursor=e.cursor),this.client.get("v1/marketplace/resources",{searchParams:t}).json()}async getMarketplaceAgent(e){return this.client.get(`v1/marketplace/agents/${encodeURIComponent(e)}`).json()}async getMarketplaceSkill(e){return this.client.get(`v1/marketplace/skills/${encodeURIComponent(e)}`).json()}async listMarketplaceRoles(){return this.client.get("v1/marketplace/roles").json()}async installMarketplaceResource(e,t,r,n){return this.client.post(`v1/workspaces/${t}/marketplace/${r}s/${encodeURIComponent(n)}/install`,{headers:{Authorization:`Bearer ${e}`},json:{}}).json()}static async getAuthenticatedClient(e){let t=await h.getAll(e);return t?{client:new s(void 0,e),accessToken:t.accessToken,workspaceId:t.workspaceId??null}:null}};function Pe(){return process.env.ENTRYDESK_SANDBOX==="true"}function I(){if(!Pe())return null;let s=process.env.ENTRYDESK_SANDBOX_ACCESS_TOKEN?.trim(),e=process.env.ENTRYDESK_SANDBOX_WORKSPACE_ID?.trim();if(!s||!e){let t=[];throw s||t.push("ENTRYDESK_SANDBOX_ACCESS_TOKEN"),e||t.push("ENTRYDESK_SANDBOX_WORKSPACE_ID"),new Error(`Sandbox mode enabled but missing credentials: ${t.join(", ")}`)}return{accessToken:s,workspaceId:e}}function L(){let s=process.env.ENTRYDESK_TOKEN?.trim();if(!s)return null;let e=process.env.ENTRYDESK_WORKSPACE_ID?.trim();if(!e)throw new Error("ENTRYDESK_TOKEN is set but ENTRYDESK_WORKSPACE_ID is missing. Both are required for PAT authentication.");return{accessToken:s,workspaceId:e}}function nt(){let s=I();if(s)return{authSource:"sandbox-env",label:"sandbox environment (ENTRYDESK_SANDBOX)",workspaceId:s.workspaceId};let e=L();return e?{authSource:"pat-env",label:"personal access token (ENTRYDESK_TOKEN)",workspaceId:e.workspaceId}:null}import{execFile as Ae}from"child_process";import{setTimeout as Se}from"timers/promises";import{decodeJwt as $e}from"jose";import Ce,{HTTPError as ne,isHTTPError as be}from"ky";function G(s){if(s===null||typeof s!="object")return{error:""};let e=s;return{code:typeof e.code=="string"?e.code:void 0,error:typeof e.error=="string"?e.error:""}}var T="entrydesk-cli",Te="offline_access workspaces:read tasks:read tasks:write tasks:delete agents:read agents:write connectors:read connectors:write tools:read tools:execute skills:read skills:write meetings:read meetings:write workflows:read workflows:write notifications:read notifications:write publishes:read publishes:write calendar:read calendar:write schedules:read schedules:write user:read user:write";function Ee(s,e){let t=new Set(e.split(/[\s,]+/).filter(Boolean)),r=s.split(" ").filter(Boolean);return{rejected:r.filter(n=>t.has(n)),remaining:r.filter(n=>!t.has(n))}}async function xe(s,e,t){try{return await s.post("v1/oauth/device/code",{json:{client_id:T,scope:e}}).json()}catch(r){if(!(r instanceof ne))throw r;let{code:n,error:i}=G(r.data);if(n==="invalid_scope"){let{rejected:o,remaining:d}=Ee(e,i);if(o.length>0&&d.length>0)return t?.onWarning?.(`This server doesn't support these scopes: ${o.join(", ")}. Continuing without them \u2014 commands that need them may be unavailable.`),s.post("v1/oauth/device/code",{json:{client_id:T,scope:d.join(" ")}}).json()}throw new Error(i?`Failed to request device code: ${i}`:"Failed to request device code",{cause:r})}}function Be(s){return new Promise((e,t)=>{let r=process.platform,n,i;switch(r){case"darwin":n="open",i=[s];break;case"win32":n="cmd",i=["/c","start","",s];break;default:n="xdg-open",i=[s];break}Ae(n,i,o=>{o?t(new Error(`Failed to open browser. Please manually visit: ${s}`,{cause:o})):e()})})}async function pt(s){let e=M(),t=se(),r=K(),n=process.env.NODE_TLS_REJECT_UNAUTHORIZED;r.ignoreSslErrors&&(process.env.NODE_TLS_REJECT_UNAUTHORIZED="0",console.error("WARNING: SSL certificate validation is disabled globally for this process during the login flow. All connections in this process will skip TLS verification. Only use ENTRYDESK_IGNORE_SSL_ERRORS for local development."));try{let i=Ce.create({baseUrl:e.replace(/\/?$/,"/"),timeout:3e4,hooks:{beforeError:[({error:c})=>(be(c)&&(c.request.headers.delete("authorization"),c.request.headers.delete("Authorization")),c)]}}),o;try{o=await xe(i,Te,s)}catch(c){let k=c instanceof Error?c:new Error("Failed to request device code");throw s?.onError?.(k),k}let{device_code:d,user_code:u,expires_in:le,interval:ge}=o,X=new URL("/oauth/device",t);X.searchParams.set("user_code",u);let Z=X.toString();s?.onDeviceCodeReceived?.(u,Z),s?.onBrowserOpening?.();try{await Be(Z)}catch(c){process.env.DEBUG&&console.error("[DEBUG] Failed to open browser:",c)}s?.onWaitingForAuthorization?.();let Q=Math.max(ge,5)*1e3,de=Date.now()+le*1e3;for(;Date.now()<de;){await Se(Q);try{let c=await i.post("v1/oauth/token",{json:{grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:d,client_id:T}}).json();s?.onAuthorized?.();let k={};try{k=$e(c.access_token)}catch{}return{accessToken:c.access_token,refreshToken:c.refresh_token??void 0,email:k.email||"",scopes:c.scope.split(" ").filter(j=>j.length>0)}}catch(c){if(c instanceof ne){let{code:j,error:ue}=G(c.data),z=j||ue;if(!z)continue;switch(z){case"authorization_pending":continue;case"slow_down":Q+=5e3;continue;case"access_denied":throw new Error("Authorization denied by user",{cause:c});case"expired_token":throw new Error("Device code expired. Please try again.",{cause:c});default:throw new Error(`Authorization failed: ${z||"Unknown error"}`,{cause:c})}}let k=c instanceof Error?c:new Error("Unknown error during authorization");throw s?.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}}function Ke(s){if(s instanceof Me){let e=s.response.status;return e===400||e===401}return!1}var f=class extends Error{code;constructor(e,t){super(t),this.name="AuthError",this.code=e}};function Ie(s){try{let e=s.split(".");if(e.length<2)return null;let t=e[1].replace(/-/g,"+").replace(/_/g,"/"),r=(4-t.length%4)%4,n=t.padEnd(t.length+r,"="),i=Buffer.from(n,"base64").toString("utf8");return JSON.parse(i)}catch{return null}}function Ue(s,e=300){let r=Ie(s)?.exp;if(typeof r!="number")return!1;let n=Math.floor(Date.now()/1e3);return r-n<=e}async function ie(s){let e=s.accessToken;if(!Ue(e))return e;if(!s.refreshToken)throw await h.clear(),new f("session-expired","Session expired. Please run `entrydesk login` again.");let t=s.refreshToken;try{let n=await new B().refreshOAuthToken({refreshToken:t,clientId:T}),i=await h.getAll();return i?.accessToken&&i.refreshToken&&i.refreshToken!==t?i.accessToken:(await h.saveAll({...i??s,accessToken:n.access_token,refreshToken:n.refresh_token??i?.refreshToken??t}),n.access_token)}catch(r){if(!Ke(r))throw new f("refresh-failed","Could not refresh your session (auth server unreachable). Please try again.");let n=await h.getAll();if(n?.accessToken&&n.refreshToken&&n.refreshToken!==t)return n.accessToken;throw await h.clear(),new f("session-expired","Session expired. Please run `entrydesk login` again.")}}async function vt(){let s=I();if(s)return s.accessToken;let e=await h.getAll();if(!e?.accessToken)throw new f("not-logged-in","Not logged in. Run `entrydesk login` first.");return ie(e)}async function Rt(){let s=I();if(s)return{accessToken:s.accessToken,workspaceId:s.workspaceId};let e=L();if(e)return e;let t=await h.getAll();if(!t?.accessToken)throw new f("not-logged-in","Not logged in. Run `entrydesk login` first.");if(!t.workspaceId)throw new f("no-workspace","No workspace selected. Run `entrydesk workspaces` first.");return{accessToken:await ie(t),workspaceId:t.workspaceId}}var y=class extends Error{constructor(t,r=1,n){super(t);this.exitCode=r;this.cause=n;this.name="CLIError"}exitCode;cause};function $t(s){let e=!!process.env.DEBUG;if(s instanceof y&&(console.error(`Error: ${s.message}`),s.cause&&(console.error(`Cause: ${s.cause.message}`),e&&s.cause.stack&&console.error(s.cause.stack)),process.exit(s.exitCode)),s instanceof f&&(console.error(s.message),e&&s.stack&&console.error(s.stack),process.exit(1)),s instanceof je&&(console.error("Request timed out. Please check your connection and try again."),e&&s.stack&&console.error(s.stack),process.exit(1)),s instanceof _e){let t=s.response.status;console.error(t===401?"Not authorized (401). Your session may have expired \u2014 run `entrydesk login`.":t===403?"Forbidden (403). Your account or token lacks permission for this action. If your token predates a recently added feature, run `entrydesk login` to refresh its scopes; otherwise you may lack permission in this workspace.":`Request failed (${t}): ${s.response.statusText}`),e&&s.stack&&console.error(s.stack),process.exit(1)}s instanceof Error&&(console.error(`Unexpected error: ${s.message}`),e&&s.stack&&console.error(s.stack),process.exit(1)),console.error("An unknown error occurred"),process.exit(1)}var P="default",De=/^[A-Za-z0-9_-]+$/,W=null;function Y(){return C.join(ze.homedir(),".entrydesk")}function ae(){return C.join(Y(),"profiles")}function ce(){return C.join(Y(),"profiles.json")}function U(s){return C.join(ae(),s)}function V(s){if(m.existsSync(s))try{m.chmodSync(s,448)}catch{}else m.mkdirSync(s,{mode:448,recursive:!0})}function Fe(){V(Y())}function H(){V(ae())}function Oe(){let s=ce();try{if(!m.existsSync(s))return null;let e=m.readFileSync(s,"utf-8");return JSON.parse(e)}catch{return null}}function $(s){Fe();let e=ce();m.writeFileSync(e,JSON.stringify(s,null,2),{mode:384});try{m.chmodSync(e,384)}catch{}}function Ne(s){let e=s.profiles?.length?[...new Set(s.profiles)]:[],t=s.currentProfile&&e.includes(s.currentProfile)?s.currentProfile:e[0]||P;return e.length===0&&e.push(P),e.includes(t)||e.unshift(t),{currentProfile:t,profiles:e}}function x(s){H(),V(U(s))}function R(){let s=Oe();if(!s){let t={currentProfile:P,profiles:[P]};return $(t),H(),x(P),t}let e=Ne(s);return(e.currentProfile!==s.currentProfile||e.profiles.length!==s.profiles.length)&&$(e),H(),e}function A(s){if(!s)throw new y("Profile name is required.");if(!De.test(s))throw new y("Invalid profile name. Use letters, numbers, dash, or underscore.")}function E(s,e){if(!s.profiles.includes(e))throw new y(`Profile not found: ${e}`)}function oe(s,e){if(s.profiles.includes(e))throw new y(`Profile already exists: ${e}`)}var a={DEFAULT_PROFILE:P,setOverrideProfile(s){W=s},getOverrideProfile(){return W},getProfileDir(s){return U(s)},getProfileConfigFile(s){return C.join(a.getProfileDir(s),"config.json")},getProfileCredentialsFile(s){return C.join(a.getProfileDir(s),"credentials.json")},getProfileNames(){return[...R().profiles]},getProfileCount(){return a.getProfileNames().length},getCurrentProfileName(){return R().currentProfile},getEffectiveProfileName(s){let e=R(),t=s||W||e.currentProfile;return A(t),E(e,t),t},ensureProfileExists(s){let e=R();A(s),E(e,s)},createProfile(s){A(s);let e=R();oe(e,s);let t={currentProfile:e.currentProfile,profiles:[...e.profiles,s]};$(t),x(s)},deleteProfile(s){A(s);let e=R();if(E(e,s),e.profiles.length===1)throw new y("Cannot delete the last profile.");let t=e.profiles.filter(i=>i!==s),r=e.currentProfile;r===s&&(r=t.includes(P)?P:t[0]),$({currentProfile:r,profiles:t});try{m.rmSync(a.getProfileDir(s),{recursive:!0,force:!0})}catch{}return{currentProfile:r}},renameProfile(s,e){A(s),A(e);let t=R();E(t,s),oe(t,e);let r=U(s),n=U(e);if(m.existsSync(r))try{m.renameSync(r,n)}catch(u){throw new y("Failed to rename profile directory.",1,u)}else x(e);let i=t.profiles.map(u=>u===s?e:u),o=t.currentProfile===s?e:t.currentProfile;return $({currentProfile:o,profiles:i}),{currentProfile:o}},setCurrentProfile(s){A(s);let e=R();E(e,s);let t={currentProfile:s,profiles:e.profiles};$(t),x(s)},ensureProfileDir:x};function Le(s){let e=a.getEffectiveProfileName(s);return a.getProfileConfigFile(e)}function g(s){let e=Le(s);try{if(!_.existsSync(e))return{};let t=_.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return{}}}function w(s,e){let t=a.getEffectiveProfileName(e);a.ensureProfileDir(t);let r=a.getProfileConfigFile(t);_.writeFileSync(r,JSON.stringify(s,null,2),{mode:384});try{_.chmodSync(r,384)}catch{}}var J={getApiUrl(s){return g(s).apiUrl??null},setApiUrl(s,e){let t=g(e);t.apiUrl=s,w(t,e)},clearApiUrl(s){let e=g(s);delete e.apiUrl,w(e,s)},getHubUrl(s){return g(s).hubUrl??null},setHubUrl(s,e){let t=g(e);t.hubUrl=s,w(t,e)},getAll(s){return g(s)},setAll(s,e){w(s,e)},set(s,e,t){let r=g(t);r[s]=e,w(r,t)},get(s,e){return g(e)[s]},unset(s,e){let t=g(e);delete t[s],w(t,e)},getDefaultModel(s){return g(s).model?.default??null},setDefaultModel(s,e){let t=g(e);t.model={...t.model,default:s},w(t,e)},getDefaultConnectorIds(s){return g(s).connectors?.defaults??null},setDefaultConnectorIds(s,e){let t=g(e);t.connectors={...t.connectors,defaults:s},w(t,e)},getLocalTools(s){return g(s).localTools??null},setLocalTools(s,e){let t=g(e);t.localTools={...t.localTools,...s},w(t,e)}};var Ge="https://api.entrydesk.com",We="https://app.entrydesk.com",He=3100,Ye=300*1e3;function q(s){return{apiUrl:J.getApiUrl(s)||process.env.ENTRYDESK_API_URL||Ge,hubUrl:J.getHubUrl(s)||process.env.ENTRYDESK_HUB_URL||We,mcp:{httpPort:He},auth:{loginTimeout:Ye,ignoreSslErrors:process.env.ENTRYDESK_IGNORE_SSL_ERRORS==="true"||!1}}}function M(s){return q(s).apiUrl}function se(s){return q(s).hubUrl}function K(){return q().auth}export{a,J as b,q as c,M as d,se as e,K as f,h as g,B as h,L as i,nt as j,T as k,pt as l,f as m,Ue as n,ie as o,vt as p,Rt as q,y as r,$t as s};