@ranger-testing/ranger-cli 2.0.5 → 2.0.7

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 (116) hide show
  1. package/build/cli.js +1 -914
  2. package/build/commands/addEnv.js +1 -1
  3. package/build/commands/authEncrypt.js +1 -36
  4. package/build/commands/clean.js +1 -1
  5. package/build/commands/config.js +1 -93
  6. package/build/commands/env.js +1 -98
  7. package/build/commands/feature.js +1 -653
  8. package/build/commands/hook.js +1 -33
  9. package/build/commands/hooks/autoPrompt.js +1 -32
  10. package/build/commands/hooks/disable.js +1 -33
  11. package/build/commands/hooks/enable.js +1 -58
  12. package/build/commands/hooks/exitPlanMode.js +1 -35
  13. package/build/commands/hooks/index.js +1 -12
  14. package/build/commands/hooks/output.js +1 -71
  15. package/build/commands/hooks/planReminder.js +1 -46
  16. package/build/commands/hooks/planStart.js +1 -30
  17. package/build/commands/hooks/postEdit.js +1 -43
  18. package/build/commands/hooks/preCompact.js +1 -30
  19. package/build/commands/hooks/sessionEnd.js +1 -25
  20. package/build/commands/hooks/sessionStart.js +1 -93
  21. package/build/commands/hooks/stopHook.js +1 -155
  22. package/build/commands/index.js +1 -12
  23. package/build/commands/login.js +1 -26
  24. package/build/commands/setupCi.js +1 -189
  25. package/build/commands/skillup.js +1 -80
  26. package/build/commands/start.js +1 -1
  27. package/build/commands/status.js +1 -198
  28. package/build/commands/update.js +1 -182
  29. package/build/commands/updateEnv.js +1 -1
  30. package/build/commands/useEnv.js +1 -1
  31. package/build/commands/utils/activeProfile.js +1 -76
  32. package/build/commands/utils/browserSessionsApi.js +1 -1
  33. package/build/commands/utils/claudeConfig.js +1 -73
  34. package/build/commands/utils/claudePlugin.js +1 -85
  35. package/build/commands/utils/crypto.js +1 -42
  36. package/build/commands/utils/desirePathLog.js +1 -139
  37. package/build/commands/utils/deviceAuth.js +1 -232
  38. package/build/commands/utils/environment.js +1 -65
  39. package/build/commands/utils/featureApi.js +1 -371
  40. package/build/commands/utils/featureReportGenerator.js +1 -204
  41. package/build/commands/utils/fixWebmDuration.js +1 -0
  42. package/build/commands/utils/git.js +1 -44
  43. package/build/commands/utils/keychain.js +1 -1
  44. package/build/commands/utils/localAgentInstallationsApi.js +1 -1
  45. package/build/commands/utils/profileMessages.js +1 -8
  46. package/build/commands/utils/profileSetupBanner.js +1 -167
  47. package/build/commands/utils/rangerRoot.js +1 -60
  48. package/build/commands/utils/reportGenerator.js +1 -130
  49. package/build/commands/utils/retry.js +1 -25
  50. package/build/commands/utils/sessionCache.js +1 -299
  51. package/build/commands/utils/settings.js +1 -313
  52. package/build/commands/utils/skillContent.js +1 -28
  53. package/build/commands/utils/skills.js +1 -1
  54. package/build/commands/utils/telemetry.js +1 -254
  55. package/build/commands/utils/userApi.js +1 -32
  56. package/build/commands/utils/version.js +1 -62
  57. package/build/commands/verifyFeature.js +1 -1343
  58. package/build/commands/verifyInBrowser.js +1 -1
  59. package/package.json +4 -1
  60. package/build/cli.js.map +0 -1
  61. package/build/commands/addEnv.js.map +0 -1
  62. package/build/commands/authEncrypt.js.map +0 -1
  63. package/build/commands/clean.js.map +0 -1
  64. package/build/commands/config.js.map +0 -1
  65. package/build/commands/env.js.map +0 -1
  66. package/build/commands/feature.js.map +0 -1
  67. package/build/commands/hook.js.map +0 -1
  68. package/build/commands/hooks/autoPrompt.js.map +0 -1
  69. package/build/commands/hooks/disable.js.map +0 -1
  70. package/build/commands/hooks/enable.js.map +0 -1
  71. package/build/commands/hooks/exitPlanMode.js.map +0 -1
  72. package/build/commands/hooks/index.js.map +0 -1
  73. package/build/commands/hooks/output.js.map +0 -1
  74. package/build/commands/hooks/planReminder.js.map +0 -1
  75. package/build/commands/hooks/planStart.js.map +0 -1
  76. package/build/commands/hooks/postEdit.js.map +0 -1
  77. package/build/commands/hooks/preCompact.js.map +0 -1
  78. package/build/commands/hooks/sessionEnd.js.map +0 -1
  79. package/build/commands/hooks/sessionStart.js.map +0 -1
  80. package/build/commands/hooks/stopHook.js.map +0 -1
  81. package/build/commands/index.js.map +0 -1
  82. package/build/commands/login.js.map +0 -1
  83. package/build/commands/setupCi.js.map +0 -1
  84. package/build/commands/skillup.js.map +0 -1
  85. package/build/commands/start.js.map +0 -1
  86. package/build/commands/status.js.map +0 -1
  87. package/build/commands/update.js.map +0 -1
  88. package/build/commands/updateEnv.js.map +0 -1
  89. package/build/commands/useEnv.js.map +0 -1
  90. package/build/commands/utils/activeProfile.js.map +0 -1
  91. package/build/commands/utils/browserSessionsApi.js.map +0 -1
  92. package/build/commands/utils/claudeConfig.js.map +0 -1
  93. package/build/commands/utils/claudePlugin.js.map +0 -1
  94. package/build/commands/utils/crypto.js.map +0 -1
  95. package/build/commands/utils/desirePathLog.js.map +0 -1
  96. package/build/commands/utils/deviceAuth.js.map +0 -1
  97. package/build/commands/utils/environment.js.map +0 -1
  98. package/build/commands/utils/featureApi.js.map +0 -1
  99. package/build/commands/utils/featureReportGenerator.js.map +0 -1
  100. package/build/commands/utils/git.js.map +0 -1
  101. package/build/commands/utils/keychain.js.map +0 -1
  102. package/build/commands/utils/localAgentInstallationsApi.js.map +0 -1
  103. package/build/commands/utils/profileMessages.js.map +0 -1
  104. package/build/commands/utils/profileSetupBanner.js.map +0 -1
  105. package/build/commands/utils/rangerRoot.js.map +0 -1
  106. package/build/commands/utils/reportGenerator.js.map +0 -1
  107. package/build/commands/utils/retry.js.map +0 -1
  108. package/build/commands/utils/sessionCache.js.map +0 -1
  109. package/build/commands/utils/settings.js.map +0 -1
  110. package/build/commands/utils/skillContent.js.map +0 -1
  111. package/build/commands/utils/skills.js.map +0 -1
  112. package/build/commands/utils/telemetry.js.map +0 -1
  113. package/build/commands/utils/userApi.js.map +0 -1
  114. package/build/commands/utils/version.js.map +0 -1
  115. package/build/commands/verifyFeature.js.map +0 -1
  116. package/build/commands/verifyInBrowser.js.map +0 -1
@@ -1,232 +1 @@
1
- import { exec } from 'child_process';
2
- import { getCurrentEnvironment, ENVIRONMENT_CONFIGS, getApiBaseUrl, } from './environment.js';
3
- import { storeToken, storeRefreshToken } from './keychain.js';
4
- const WORKOS_DEVICE_AUTH_URL = 'https://api.workos.com/user_management/authorize/device';
5
- const WORKOS_TOKEN_URL = 'https://api.workos.com/user_management/authenticate';
6
- /**
7
- * Request a device code from WorkOS for the device authorization flow.
8
- */
9
- export async function requestDeviceCode(clientId) {
10
- const response = await fetch(WORKOS_DEVICE_AUTH_URL, {
11
- method: 'POST',
12
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
13
- body: new URLSearchParams({
14
- client_id: clientId,
15
- }),
16
- });
17
- if (!response.ok) {
18
- const text = await response.text();
19
- throw new Error(`Failed to request device code: ${response.status} ${text}`);
20
- }
21
- return response.json();
22
- }
23
- /**
24
- * Poll WorkOS for token exchange after user authorizes the device.
25
- * Resolves when the user completes auth, or rejects on expiry/error.
26
- */
27
- export async function pollForTokens(clientId, deviceCode, interval, expiresIn) {
28
- const deadline = Date.now() + expiresIn * 1000;
29
- let pollInterval = interval * 1000;
30
- while (Date.now() < deadline) {
31
- await sleep(pollInterval);
32
- const response = await fetch(WORKOS_TOKEN_URL, {
33
- method: 'POST',
34
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
35
- body: new URLSearchParams({
36
- client_id: clientId,
37
- device_code: deviceCode,
38
- grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
39
- }),
40
- });
41
- if (response.ok) {
42
- return response.json();
43
- }
44
- const body = await response.json();
45
- if (body.error === 'authorization_pending') {
46
- continue;
47
- }
48
- if (body.error === 'slow_down') {
49
- pollInterval += 1000;
50
- continue;
51
- }
52
- // expired_token, access_denied, or other terminal error
53
- throw new Error(body.error_description || body.error || 'Authentication failed');
54
- }
55
- throw new Error('Device authorization timed out');
56
- }
57
- /**
58
- * Fetch the authenticated user's profile from the backend.
59
- */
60
- async function fetchUserProfile(workosAccessToken) {
61
- const apiBaseUrl = getApiBaseUrl();
62
- try {
63
- const res = await fetch(`${apiBaseUrl}/organization/me`, {
64
- method: 'GET',
65
- headers: { 'workos-token': workosAccessToken },
66
- });
67
- if (res.ok)
68
- return res.json();
69
- }
70
- catch {
71
- // ignore
72
- }
73
- return null;
74
- }
75
- /**
76
- * Build a unique CLI API key name by checking existing keys and incrementing.
77
- * First key: "Alice's CLI Key"
78
- * Second key: "Alice's CLI Key (2)"
79
- * Third key: "Alice's CLI Key (3)"
80
- */
81
- function buildKeyName(baseName, existingKeys) {
82
- const matching = existingKeys.filter((k) => k.name === baseName || k.name.startsWith(`${baseName} (`));
83
- if (matching.length === 0)
84
- return baseName;
85
- return `${baseName} (${matching.length + 1})`;
86
- }
87
- /**
88
- * Call the backend POST /api-keys endpoint to auto-provision an MCP API key,
89
- * authenticated via the WorkOS access token.
90
- *
91
- * Names keys like "Alice's CLI Key", incrementing a number suffix if the user
92
- * provisions multiple keys.
93
- */
94
- export async function provisionApiKey(workosAccessToken) {
95
- const apiBaseUrl = getApiBaseUrl();
96
- const headers = {
97
- 'Content-Type': 'application/json',
98
- 'workos-token': workosAccessToken,
99
- };
100
- const profile = await fetchUserProfile(workosAccessToken);
101
- const firstName = profile?.firstName || profile?.email?.split('@')[0];
102
- const baseName = firstName ? `${firstName}'s CLI Key` : 'CLI Key';
103
- // List existing keys to determine the right suffix
104
- let existingKeys = [];
105
- try {
106
- const listRes = await fetch(`${apiBaseUrl}/api-keys`, {
107
- method: 'GET',
108
- headers,
109
- });
110
- if (listRes.ok) {
111
- const data = await listRes.json();
112
- existingKeys = data.apiKeys;
113
- }
114
- }
115
- catch {
116
- // If listing fails, just use the base name
117
- }
118
- const keyName = buildKeyName(baseName, existingKeys);
119
- const response = await fetch(`${apiBaseUrl}/api-keys`, {
120
- method: 'POST',
121
- headers,
122
- body: JSON.stringify({
123
- name: keyName,
124
- scope: 'mcp:write',
125
- }),
126
- });
127
- if (!response.ok) {
128
- const text = await response.text();
129
- throw new Error(`Failed to provision API key: ${response.status} ${text}`);
130
- }
131
- const data = await response.json();
132
- return data.apiKey.token;
133
- }
134
- /**
135
- * Open a URL in the user's default browser.
136
- */
137
- export function openBrowser(url) {
138
- const platform = process.platform;
139
- const cmd = platform === 'darwin'
140
- ? 'open'
141
- : platform === 'win32'
142
- ? 'start'
143
- : 'xdg-open';
144
- exec(`${cmd} ${JSON.stringify(url)}`);
145
- }
146
- function decodeJwtPayload(token) {
147
- const parts = token.split('.');
148
- if (parts.length !== 3)
149
- throw new Error('Invalid JWT format');
150
- const payload = Buffer.from(parts[1], 'base64url').toString('utf-8');
151
- return JSON.parse(payload);
152
- }
153
- async function selfServeSignup(accessToken) {
154
- const apiBaseUrl = getApiBaseUrl();
155
- const response = await fetch(`${apiBaseUrl}/organization/self-serve-signup`, {
156
- method: 'POST',
157
- headers: {
158
- 'Content-Type': 'application/json',
159
- 'workos-token': accessToken,
160
- },
161
- });
162
- if (!response.ok) {
163
- const text = await response.text();
164
- throw new Error(`Failed to create organization: ${response.status} ${text}`);
165
- }
166
- return response.json();
167
- }
168
- async function refreshTokenWithOrg(clientId, refreshToken, organizationId) {
169
- const response = await fetch(WORKOS_TOKEN_URL, {
170
- method: 'POST',
171
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
172
- body: new URLSearchParams({
173
- client_id: clientId,
174
- grant_type: 'refresh_token',
175
- refresh_token: refreshToken,
176
- organization_id: organizationId,
177
- }),
178
- });
179
- if (!response.ok) {
180
- const text = await response.text();
181
- throw new Error(`Failed to refresh token with org: ${response.status} ${text}`);
182
- }
183
- return response.json();
184
- }
185
- /**
186
- * Run the full device authorization flow:
187
- * 1. Request device code from WorkOS
188
- * 2. Open browser for user to authenticate
189
- * 3. Poll for tokens
190
- * 4. If no org_id in token, run self-serve signup + refresh
191
- * 5. Provision an MCP API key via the backend
192
- * 6. Store the API key and refresh token
193
- *
194
- * Returns the provisioned API token.
195
- */
196
- export async function runDeviceAuthFlow() {
197
- const env = getCurrentEnvironment();
198
- const clientId = ENVIRONMENT_CONFIGS[env].workosClientId;
199
- // Step 1: Request device code
200
- const deviceCode = await requestDeviceCode(clientId);
201
- // Step 2: Open browser and show code
202
- console.log('\n🔐 Opening browser to log in...\n');
203
- openBrowser(deviceCode.verification_uri_complete);
204
- console.log(`If the browser doesn't open, visit: ${deviceCode.verification_uri_complete}`);
205
- console.log(`Code: ${deviceCode.user_code}\n`);
206
- // Step 3: Poll for tokens
207
- process.stdout.write('Waiting for authentication...');
208
- let tokens = await pollForTokens(clientId, deviceCode.device_code, deviceCode.interval, deviceCode.expires_in);
209
- console.log(' ✓');
210
- // Step 4: Check if token has an org_id; if not, self-serve signup
211
- const claims = decodeJwtPayload(tokens.access_token);
212
- if (!claims.org_id) {
213
- process.stdout.write('Setting up your organization...');
214
- const { organizationId } = await selfServeSignup(tokens.access_token);
215
- tokens = await refreshTokenWithOrg(clientId, tokens.refresh_token, organizationId);
216
- console.log(' ✓');
217
- }
218
- // Step 5: Provision API key
219
- process.stdout.write('Provisioning API key...');
220
- const apiToken = await provisionApiKey(tokens.access_token);
221
- console.log(' ✓');
222
- // Step 6: Store credentials
223
- await storeToken(apiToken);
224
- if (tokens.refresh_token) {
225
- await storeRefreshToken(tokens.refresh_token);
226
- }
227
- return apiToken;
228
- }
229
- function sleep(ms) {
230
- return new Promise((resolve) => setTimeout(resolve, ms));
231
- }
232
- //# sourceMappingURL=deviceAuth.js.map
1
+ const _0x32e7fb=_0x45cd;function _0x5926(){const _0xf92359=['apiKey','urn:ietf:params:oauth:grant-type:device_code','log','PIHAa','access_token','json','YVqZK','WZALF','from','expires_in','verification_uri_complete','zREHb','base64url','stdout','/organization/self-serve-signup','30288NoSenK','fBtnV','Authentication\x20failed','RyqFr','HQrWq','ZBCBU','POST','\x20\x20\x20A\x20human\x20needs\x20to\x20complete\x20authentication\x20in\x20the\x20browser.\x0a','filter','org_id','application/json','refresh_token','GET','100GimvQP','10794xnBndP','MJizz','Code:\x20','90780CXFeSk','WktmJ','Waiting\x20for\x20authentication...','utf-8','https://api.workos.com/user_management/authenticate','stringify','pEgWR','312288rbGxZE','error','dnDRy','jdMEm','NAXoO','/api-keys','start','Invalid\x20JWT\x20format','application/x-www-form-urlencoded','DsQPc','win32','673113UaITlK','now','If\x20the\x20browser\x20doesn\x27t\x20open,\x20visit:\x20','epgRx','text','mcp:write','write','\x0a🔐\x20Opening\x20browser\x20to\x20log\x20in...','Provisioning\x20API\x20key...','114JVDcRC','3284595FPJpFR','cLTmJ','split','uFOuV','Device\x20authorization\x20timed\x20out','Setting\x20up\x20your\x20organization...','startsWith','4472528UFkoTX'];_0x5926=function(){return _0xf92359;};return _0x5926();}function _0x45cd(_0x256a80,_0x4097b7){_0x256a80=_0x256a80-0x142;const _0x5926cf=_0x5926();let _0x45cd9c=_0x5926cf[_0x256a80];return _0x45cd9c;}(function(_0x3704e0,_0x2e052f){const _0x50fffc=_0x45cd,_0x495335=_0x3704e0();while(!![]){try{const _0x333023=-parseInt(_0x50fffc(0x17b))/0x1+parseInt(_0x50fffc(0x182))/0x2+parseInt(_0x50fffc(0x152))/0x3*(parseInt(_0x50fffc(0x16a))/0x4)+parseInt(_0x50fffc(0x177))/0x5*(parseInt(_0x50fffc(0x178))/0x6)+parseInt(_0x50fffc(0x149))/0x7+-parseInt(_0x50fffc(0x15a))/0x8+parseInt(_0x50fffc(0x153))/0x9;if(_0x333023===_0x2e052f)break;else _0x495335['push'](_0x495335['shift']());}catch(_0x252f1c){_0x495335['push'](_0x495335['shift']());}}}(_0x5926,0x47138));import{exec}from'child_process';import{getCurrentEnvironment,ENVIRONMENT_CONFIGS,getApiBaseUrl}from'./environment.js';import{storeToken,storeRefreshToken}from'./keychain.js';const WORKOS_DEVICE_AUTH_URL='https://api.workos.com/user_management/authorize/device',WORKOS_TOKEN_URL=_0x32e7fb(0x17f);export async function requestDeviceCode(_0x498be9){const _0x3306a9=_0x32e7fb,_0x2e03d3=await fetch(WORKOS_DEVICE_AUTH_URL,{'method':'POST','headers':{'Content-Type':'application/x-www-form-urlencoded'},'body':new URLSearchParams({'client_id':_0x498be9})});if(!_0x2e03d3['ok']){const _0x8f4a1e=await _0x2e03d3[_0x3306a9(0x14d)]();throw new Error('Failed\x20to\x20request\x20device\x20code:\x20'+_0x2e03d3['status']+'\x20'+_0x8f4a1e);}return _0x2e03d3[_0x3306a9(0x160)]();}export async function pollForTokens(_0x57b2c8,_0x38e8ad,_0x4933c8,_0x11149b){const _0x3d0fe3=_0x32e7fb,_0x26c1a9={'HQrWq':function(_0x30bef9,_0x479c65){return _0x30bef9+_0x479c65;},'PyXiu':function(_0x3f0125,_0x5ab799){return _0x3f0125*_0x5ab799;},'FjatL':function(_0x44135a,_0x16a831){return _0x44135a(_0x16a831);},'ZRGKt':function(_0x35d15f,_0x4b2979,_0x4face5){return _0x35d15f(_0x4b2979,_0x4face5);},'NIOqy':_0x3d0fe3(0x170),'RyqFr':'application/x-www-form-urlencoded','PvkAV':function(_0x54fef9,_0x37d8ae){return _0x54fef9===_0x37d8ae;},'uNLzG':_0x3d0fe3(0x157)},_0x93f5e=_0x26c1a9[_0x3d0fe3(0x16e)](Date['now'](),_0x26c1a9['PyXiu'](_0x11149b,0x3e8));let _0x2ac4f3=_0x4933c8*0x3e8;while(Date[_0x3d0fe3(0x14a)]()<_0x93f5e){await _0x26c1a9['FjatL'](sleep,_0x2ac4f3);const _0x497d39=await _0x26c1a9['ZRGKt'](fetch,WORKOS_TOKEN_URL,{'method':_0x26c1a9['NIOqy'],'headers':{'Content-Type':_0x26c1a9[_0x3d0fe3(0x16d)]},'body':new URLSearchParams({'client_id':_0x57b2c8,'device_code':_0x38e8ad,'grant_type':_0x3d0fe3(0x15c)})});if(_0x497d39['ok'])return _0x497d39[_0x3d0fe3(0x160)]();const _0x3f9ac6=await _0x497d39['json']();if(_0x3f9ac6[_0x3d0fe3(0x183)]==='authorization_pending')continue;if(_0x26c1a9['PvkAV'](_0x3f9ac6[_0x3d0fe3(0x183)],'slow_down')){_0x2ac4f3+=0x3e8;continue;}throw new Error(_0x3f9ac6['error_description']||_0x3f9ac6['error']||_0x3d0fe3(0x16c));}throw new Error(_0x26c1a9['uNLzG']);}async function fetchUserProfile(_0x4d6320){const _0x112ef2=_0x32e7fb,_0x544df9={'itkKe':function(_0xb3a56b){return _0xb3a56b();},'pEgWR':_0x112ef2(0x176)},_0x54cc44=_0x544df9['itkKe'](getApiBaseUrl);try{const _0x3f1ccd=await fetch(_0x54cc44+'/organization/me',{'method':_0x544df9[_0x112ef2(0x181)],'headers':{'workos-token':_0x4d6320}});if(_0x3f1ccd['ok'])return _0x3f1ccd[_0x112ef2(0x160)]();}catch{}return null;}function buildKeyName(_0x43f484,_0x23ed15){const _0x35e7dc=_0x32e7fb,_0x4402de={'ZBCBU':function(_0x222ce1,_0xaa54c){return _0x222ce1===_0xaa54c;},'MJizz':function(_0x36d4c5,_0x278e97){return _0x36d4c5+_0x278e97;}},_0x345c87=_0x23ed15[_0x35e7dc(0x172)](_0x126631=>_0x126631['name']===_0x43f484||_0x126631['name'][_0x35e7dc(0x159)](_0x43f484+'\x20('));if(_0x4402de[_0x35e7dc(0x16f)](_0x345c87['length'],0x0))return _0x43f484;return _0x43f484+'\x20('+_0x4402de[_0x35e7dc(0x179)](_0x345c87['length'],0x1)+')';}export async function provisionApiKey(_0x2671d0){const _0x3e3c99=_0x32e7fb,_0x6b2191={'QdQWs':function(_0x298d44){return _0x298d44();},'PIHAa':function(_0x250c1c,_0x1094df){return _0x250c1c(_0x1094df);},'WZALF':function(_0x2d6f6d,_0x118427,_0x2dc3e0){return _0x2d6f6d(_0x118427,_0x2dc3e0);},'dnDRy':_0x3e3c99(0x176),'cLTmJ':function(_0x4f3422,_0x4d187c,_0x36b9e2){return _0x4f3422(_0x4d187c,_0x36b9e2);}},_0x4f301b=_0x6b2191['QdQWs'](getApiBaseUrl),_0x402283={'Content-Type':_0x3e3c99(0x174),'workos-token':_0x2671d0},_0x327602=await _0x6b2191[_0x3e3c99(0x15e)](fetchUserProfile,_0x2671d0),_0x2a46a1=_0x327602?.['firstName']||_0x327602?.['email']?.[_0x3e3c99(0x155)]('@')[0x0],_0x181607=_0x2a46a1?_0x2a46a1+'\x27s\x20CLI\x20Key':'CLI\x20Key';let _0x315f7f=[];try{const _0x18730d=await _0x6b2191[_0x3e3c99(0x162)](fetch,_0x4f301b+'/api-keys',{'method':_0x6b2191[_0x3e3c99(0x184)],'headers':_0x402283});if(_0x18730d['ok']){const _0x4a645f=await _0x18730d['json']();_0x315f7f=_0x4a645f['apiKeys'];}}catch{}const _0x5ebaf1=_0x6b2191[_0x3e3c99(0x154)](buildKeyName,_0x181607,_0x315f7f),_0x1c97d9=await fetch(_0x4f301b+_0x3e3c99(0x143),{'method':'POST','headers':_0x402283,'body':JSON[_0x3e3c99(0x180)]({'name':_0x5ebaf1,'scope':_0x3e3c99(0x14e)})});if(!_0x1c97d9['ok']){const _0x59d287=await _0x1c97d9[_0x3e3c99(0x14d)]();throw new Error('Failed\x20to\x20provision\x20API\x20key:\x20'+_0x1c97d9['status']+'\x20'+_0x59d287);}const _0x164640=await _0x1c97d9[_0x3e3c99(0x160)]();return _0x164640[_0x3e3c99(0x15b)]['token'];}export function openBrowser(_0x1e536f){const _0x5507f3=_0x32e7fb,_0x2d5161={'vbgLX':'darwin','NAXoO':'open'},_0x4bac8b=process['platform'],_0x332728=_0x4bac8b===_0x2d5161['vbgLX']?_0x2d5161[_0x5507f3(0x142)]:_0x4bac8b===_0x5507f3(0x148)?_0x5507f3(0x144):'xdg-open';exec(_0x332728+'\x20'+JSON[_0x5507f3(0x180)](_0x1e536f));}function decodeJwtPayload(_0x58c8be){const _0x56bd43=_0x32e7fb,_0x23de38=_0x58c8be[_0x56bd43(0x155)]('.');if(_0x23de38['length']!==0x3)throw new Error(_0x56bd43(0x145));const _0x21f059=Buffer[_0x56bd43(0x163)](_0x23de38[0x1],_0x56bd43(0x167))['toString'](_0x56bd43(0x17e));return JSON['parse'](_0x21f059);}async function selfServeSignup(_0x3dc0c2){const _0x54d219=_0x32e7fb,_0xc79ffd={'WktmJ':'POST'},_0x49de44=getApiBaseUrl(),_0x3323ad=await fetch(_0x49de44+_0x54d219(0x169),{'method':_0xc79ffd[_0x54d219(0x17c)],'headers':{'Content-Type':'application/json','workos-token':_0x3dc0c2}});if(!_0x3323ad['ok']){const _0x1bb38e=await _0x3323ad['text']();throw new Error('Failed\x20to\x20create\x20organization:\x20'+_0x3323ad['status']+'\x20'+_0x1bb38e);}return _0x3323ad['json']();}async function refreshTokenWithOrg(_0x437abd,_0x6c871b,_0x47b3a0){const _0x1a02b7=_0x32e7fb,_0x2e8389={'epgRx':function(_0x4c754e,_0x153f13,_0x45ed49){return _0x4c754e(_0x153f13,_0x45ed49);},'jdMEm':_0x1a02b7(0x146),'uFOuV':'refresh_token'},_0x2acedf=await _0x2e8389[_0x1a02b7(0x14c)](fetch,WORKOS_TOKEN_URL,{'method':'POST','headers':{'Content-Type':_0x2e8389[_0x1a02b7(0x185)]},'body':new URLSearchParams({'client_id':_0x437abd,'grant_type':_0x2e8389[_0x1a02b7(0x156)],'refresh_token':_0x6c871b,'organization_id':_0x47b3a0})});if(!_0x2acedf['ok']){const _0x201168=await _0x2acedf[_0x1a02b7(0x14d)]();throw new Error('Failed\x20to\x20refresh\x20token\x20with\x20org:\x20'+_0x2acedf['status']+'\x20'+_0x201168);}return _0x2acedf[_0x1a02b7(0x160)]();}export async function runDeviceAuthFlow(){const _0x1ac484=_0x32e7fb,_0x3deb0d={'cVMnD':function(_0x547906){return _0x547906();},'fBtnV':function(_0xfca3f6,_0xefa4d5){return _0xfca3f6(_0xefa4d5);},'drstq':_0x1ac484(0x171),'YVqZK':_0x1ac484(0x17d),'SPhsm':function(_0x578c19,_0x13cd1d,_0x2339b7,_0x4e246a,_0x20e7cf){return _0x578c19(_0x13cd1d,_0x2339b7,_0x4e246a,_0x20e7cf);},'zREHb':function(_0xe18165,_0x1fbfc2){return _0xe18165(_0x1fbfc2);},'DsQPc':function(_0x12feb0,_0x57609a,_0x5bc68a,_0xd361f6){return _0x12feb0(_0x57609a,_0x5bc68a,_0xd361f6);}},_0x203688=_0x3deb0d['cVMnD'](getCurrentEnvironment),_0x31019b=ENVIRONMENT_CONFIGS[_0x203688]['workosClientId'],_0x5f21c8=await _0x3deb0d[_0x1ac484(0x16b)](requestDeviceCode,_0x31019b);console['log'](_0x1ac484(0x150)),console['log'](_0x3deb0d['drstq']),openBrowser(_0x5f21c8[_0x1ac484(0x165)]),console['log'](_0x1ac484(0x14b)+_0x5f21c8[_0x1ac484(0x165)]),console[_0x1ac484(0x15d)](_0x1ac484(0x17a)+_0x5f21c8['user_code']+'\x0a'),process['stdout']['write'](_0x3deb0d[_0x1ac484(0x161)]);let _0x33bf9f=await _0x3deb0d['SPhsm'](pollForTokens,_0x31019b,_0x5f21c8['device_code'],_0x5f21c8['interval'],_0x5f21c8[_0x1ac484(0x164)]);console['log']('\x20✓');const _0x1b9818=decodeJwtPayload(_0x33bf9f[_0x1ac484(0x15f)]);if(!_0x1b9818[_0x1ac484(0x173)]){process[_0x1ac484(0x168)]['write'](_0x1ac484(0x158));const {organizationId:_0x3b9a90}=await _0x3deb0d[_0x1ac484(0x166)](selfServeSignup,_0x33bf9f[_0x1ac484(0x15f)]);_0x33bf9f=await _0x3deb0d[_0x1ac484(0x147)](refreshTokenWithOrg,_0x31019b,_0x33bf9f[_0x1ac484(0x175)],_0x3b9a90),console['log']('\x20✓');}process[_0x1ac484(0x168)][_0x1ac484(0x14f)](_0x1ac484(0x151));const _0x5d2a89=await provisionApiKey(_0x33bf9f['access_token']);return console['log']('\x20✓'),await storeToken(_0x5d2a89),_0x33bf9f[_0x1ac484(0x175)]&&await _0x3deb0d[_0x1ac484(0x16b)](storeRefreshToken,_0x33bf9f[_0x1ac484(0x175)]),_0x5d2a89;}function sleep(_0x315b61){return new Promise(_0x599a04=>setTimeout(_0x599a04,_0x315b61));}
@@ -1,65 +1 @@
1
- /**
2
- * Centralized environment configuration for the CLI.
3
- *
4
- * Supports three environments: prod, staging, and local.
5
- * Each environment has its own API base URL.
6
- *
7
- * End users always use prod (default).
8
- * Developers can override by setting RANGER_CLI_ENV=staging or RANGER_CLI_ENV=local.
9
- */
10
- /**
11
- * Environment configurations for API URLs.
12
- */
13
- export const ENVIRONMENT_CONFIGS = {
14
- prod: {
15
- apiBaseUrl: 'https://api.ranger.net',
16
- workosClientId: 'client_01J9CBYM7M5ZETCF7G6614DXR2',
17
- aiProxyUrl: 'https://ai-proxy-716115358910.us-central1.run.app',
18
- },
19
- staging: {
20
- apiBaseUrl: 'https://api.staging.ranger.net',
21
- workosClientId: 'client_01J9CBYM2DKWV9HM17D95Z540K',
22
- aiProxyUrl: 'https://ai-proxy-301751771437.us-central1.run.app',
23
- },
24
- local: {
25
- apiBaseUrl: 'http://localhost:8080',
26
- workosClientId: 'client_01J9CBYM2DKWV9HM17D95Z540K',
27
- aiProxyUrl: 'http://localhost:8090',
28
- },
29
- };
30
- /**
31
- * Default environment when none is specified.
32
- */
33
- export const DEFAULT_ENVIRONMENT = 'prod';
34
- /**
35
- * Validate that a string is a valid environment name.
36
- */
37
- export function isValidEnvironment(env) {
38
- return env === 'prod' || env === 'staging' || env === 'local';
39
- }
40
- /**
41
- * Get the current environment from RANGER_CLI_ENV env var.
42
- * Defaults to 'prod' for end users.
43
- * Developers can set RANGER_CLI_ENV=staging or RANGER_CLI_ENV=local.
44
- */
45
- export function getCurrentEnvironment() {
46
- const env = process.env.RANGER_CLI_ENV;
47
- if (env && isValidEnvironment(env)) {
48
- return env;
49
- }
50
- return DEFAULT_ENVIRONMENT;
51
- }
52
- /**
53
- * Get the API base URL for the current environment.
54
- * Priority: RANGER_API_URL env var > RANGER_CLI_ENV-based config > prod default
55
- */
56
- export function getApiBaseUrl() {
57
- return ENVIRONMENT_CONFIGS[getCurrentEnvironment()].apiBaseUrl;
58
- }
59
- /**
60
- * Get the AI Proxy URL for the current environment.
61
- */
62
- export function getAiProxyUrl() {
63
- return ENVIRONMENT_CONFIGS[getCurrentEnvironment()].aiProxyUrl;
64
- }
65
- //# sourceMappingURL=environment.js.map
1
+ function _0x4867(){const _0x2d4667=['460gWYfWu','aiProxyUrl','PFFQb','axwnO','https://ai-proxy-716115358910.us-central1.run.app','56ohufsm','https://api.ranger.net','RBSZi','365481PZRHoZ','997108tEJORC','16863pnGtlB','KytVf','30BLptza','http://localhost:8090','client_01J9CBYM2DKWV9HM17D95Z540K','http://localhost:8080','1944355tDoKbb','3762890ptaTxo','apiBaseUrl','1052286GMBzZt','prod','6090jvmGAQ'];_0x4867=function(){return _0x2d4667;};return _0x4867();}const _0x11840a=_0x1d76;(function(_0x406519,_0x442319){const _0x24be2b=_0x1d76,_0x4f9119=_0x406519();while(!![]){try{const _0xbef9a5=-parseInt(_0x24be2b(0xd3))/0x1*(-parseInt(_0x24be2b(0xca))/0x2)+parseInt(_0x24be2b(0xc8))/0x3*(parseInt(_0x24be2b(0xd4))/0x4)+-parseInt(_0x24be2b(0xce))/0x5+-parseInt(_0x24be2b(0xd1))/0x6+parseInt(_0x24be2b(0xc7))/0x7+parseInt(_0x24be2b(0xc3))/0x8*(-parseInt(_0x24be2b(0xc6))/0x9)+parseInt(_0x24be2b(0xcf))/0xa;if(_0xbef9a5===_0x442319)break;else _0x4f9119['push'](_0x4f9119['shift']());}catch(_0x1a4c35){_0x4f9119['push'](_0x4f9119['shift']());}}}(_0x4867,0x639af));export const ENVIRONMENT_CONFIGS={'prod':{'apiBaseUrl':_0x11840a(0xc4),'workosClientId':'client_01J9CBYM7M5ZETCF7G6614DXR2','aiProxyUrl':_0x11840a(0xc2)},'staging':{'apiBaseUrl':'https://api.staging.ranger.net','workosClientId':_0x11840a(0xcc),'aiProxyUrl':'https://ai-proxy-301751771437.us-central1.run.app'},'local':{'apiBaseUrl':_0x11840a(0xcd),'workosClientId':'client_01J9CBYM2DKWV9HM17D95Z540K','aiProxyUrl':_0x11840a(0xcb)}};function _0x1d76(_0xed0ac7,_0x2ad6d0){_0xed0ac7=_0xed0ac7-0xc2;const _0x486797=_0x4867();let _0x1d765f=_0x486797[_0xed0ac7];return _0x1d765f;}export const DEFAULT_ENVIRONMENT=_0x11840a(0xd2);export function isValidEnvironment(_0x2c8882){const _0x4da954=_0x11840a,_0xde1f23={'kMLIi':function(_0x50e61b,_0x59b576){return _0x50e61b===_0x59b576;},'KytVf':function(_0x21d02e,_0xe28834){return _0x21d02e===_0xe28834;},'PFFQb':'staging'};return _0xde1f23['kMLIi'](_0x2c8882,_0x4da954(0xd2))||_0xde1f23[_0x4da954(0xc9)](_0x2c8882,_0xde1f23[_0x4da954(0xd6)])||_0x2c8882==='local';}export function getCurrentEnvironment(){const _0x46df08={'aeugq':function(_0x3f1f2b,_0x2dba18){return _0x3f1f2b(_0x2dba18);}},_0x8fe17c=process['env']['RANGER_CLI_ENV'];if(_0x8fe17c&&_0x46df08['aeugq'](isValidEnvironment,_0x8fe17c))return _0x8fe17c;return DEFAULT_ENVIRONMENT;}export function getApiBaseUrl(){const _0x12d4f9=_0x11840a,_0x29cdf1={'RBSZi':function(_0x447fe5){return _0x447fe5();}};return ENVIRONMENT_CONFIGS[_0x29cdf1[_0x12d4f9(0xc5)](getCurrentEnvironment)][_0x12d4f9(0xd0)];}export function getAiProxyUrl(){const _0x48574b=_0x11840a,_0x58f952={'axwnO':function(_0x2ead24){return _0x2ead24();}};return ENVIRONMENT_CONFIGS[_0x58f952[_0x48574b(0xd7)](getCurrentEnvironment)][_0x48574b(0xd5)];}