orizu 0.5.49 → 0.5.50
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.
- package/dist/account-directory.d.ts +2 -2
- package/dist/account-directory.d.ts.map +1 -1
- package/dist/account-directory.js +7 -32
- package/dist/auth-commands.d.ts.map +1 -1
- package/dist/auth-commands.js +22 -30
- package/dist/credentials.d.ts +5 -0
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +84 -3
- package/dist/dataset-transfer-upload.d.ts.map +1 -1
- package/dist/dataset-transfer-upload.js +6 -1
- package/dist/directory-list-read.d.ts +37 -0
- package/dist/directory-list-read.d.ts.map +1 -0
- package/dist/directory-list-read.js +87 -0
- package/dist/hosted-boot.d.ts.map +1 -1
- package/dist/hosted-boot.js +59 -41
- package/dist/hosted-harness-opencode.d.ts +31 -0
- package/dist/hosted-harness-opencode.d.ts.map +1 -1
- package/dist/hosted-harness-opencode.js +45 -7
- package/dist/hosted-loop.d.ts +39 -2
- package/dist/hosted-loop.d.ts.map +1 -1
- package/dist/hosted-loop.js +127 -18
- package/dist/hosted-session-seed.d.ts +2 -0
- package/dist/hosted-session-seed.d.ts.map +1 -1
- package/dist/hosted-session-seed.js +27 -10
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +39 -234
- package/dist/keyboard-select.d.ts.map +1 -1
- package/dist/keyboard-select.js +23 -45
- package/dist/project-create-workflow.d.ts +18 -0
- package/dist/project-create-workflow.d.ts.map +1 -0
- package/dist/project-create-workflow.js +121 -0
- package/dist/self-update-command.d.ts +8 -0
- package/dist/self-update-command.d.ts.map +1 -0
- package/dist/self-update-command.js +390 -0
- package/dist/self-update.d.ts +29 -16
- package/dist/self-update.d.ts.map +1 -1
- package/dist/self-update.js +55 -244
- package/dist/setup-account.d.ts.map +1 -1
- package/dist/setup-account.js +4 -1
- package/dist/setup-and-skills-commands.d.ts.map +1 -1
- package/dist/setup-and-skills-commands.js +88 -102
- package/dist/skill-install-workflow.d.ts +23 -0
- package/dist/skill-install-workflow.d.ts.map +1 -0
- package/dist/skill-install-workflow.js +184 -0
- package/dist/skill-installer.d.ts +8 -3
- package/dist/skill-installer.d.ts.map +1 -1
- package/dist/skill-installer.js +26 -33
- package/dist/stored-session-requests.d.ts +27 -0
- package/dist/stored-session-requests.d.ts.map +1 -0
- package/dist/stored-session-requests.js +264 -0
- package/dist/terminal-key-session.d.ts +23 -0
- package/dist/terminal-key-session.d.ts.map +1 -0
- package/dist/terminal-key-session.js +74 -0
- package/package.json +1 -1
- package/src/account-directory.ts +8 -42
- package/src/auth-commands.ts +20 -29
- package/src/credentials.ts +83 -3
- package/src/dataset-transfer-upload.ts +7 -1
- package/src/directory-list-read.ts +123 -0
- package/src/hosted-boot.ts +65 -43
- package/src/hosted-harness-opencode.ts +65 -9
- package/src/hosted-loop.ts +152 -18
- package/src/hosted-session-seed.ts +25 -8
- package/src/http.ts +39 -317
- package/src/keyboard-select.ts +18 -55
- package/src/project-create-workflow.ts +139 -0
- package/src/self-update-command.ts +419 -0
- package/src/self-update.ts +70 -266
- package/src/setup-account.ts +4 -1
- package/src/setup-and-skills-commands.ts +89 -121
- package/src/skill-install-workflow.ts +215 -0
- package/src/skill-installer.ts +31 -38
- package/src/stored-session-requests.ts +316 -0
- package/src/terminal-key-session.ts +88 -0
|
@@ -103,8 +103,8 @@ declare const TASK_STATUS_ACTION_LABELS: {
|
|
|
103
103
|
};
|
|
104
104
|
};
|
|
105
105
|
type AuthenticatedRequest = AuthenticatedRequestContext['fetch'];
|
|
106
|
-
declare function fetchTeams(request?: AuthenticatedRequest): Promise<Team[]>;
|
|
107
|
-
declare function fetchProjects(teamSlug?: string, request?: AuthenticatedRequest): Promise<Project[]>;
|
|
106
|
+
declare function fetchTeams(request?: AuthenticatedRequest, timeoutMs?: number): Promise<Team[]>;
|
|
107
|
+
declare function fetchProjects(teamSlug?: string, request?: AuthenticatedRequest, timeoutMs?: number): Promise<Project[]>;
|
|
108
108
|
declare function fetchTasks(project?: string, status?: string): Promise<Task[]>;
|
|
109
109
|
declare function fetchApps(project: string, status?: string): Promise<AppSummary[]>;
|
|
110
110
|
declare function fetchDatasets(project: string, status?: string): Promise<DatasetSummary[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-directory.d.ts","sourceRoot":"","sources":["../src/account-directory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"account-directory.d.ts","sourceRoot":"","sources":["../src/account-directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { createInterface } from 'readline/promises';
|
|
|
4
4
|
import { isInteractiveTerminal, normalizeSlugInput, hasJsonFlag, getArg } from './command-line-arguments.js';
|
|
5
5
|
import { printLine, printError, printJson } from './cli-console-output.js';
|
|
6
6
|
import { sanitizeTerminalText, parseJsonResponse } from './json-response.js';
|
|
7
|
+
import { PROJECT_LIST, readDirectoryList, TEAM_LIST } from './directory-list-read.js';
|
|
7
8
|
import { authedFetch } from './http.js';
|
|
8
9
|
const TASK_STATUS_ACTION_LABELS = {
|
|
9
10
|
paused: {
|
|
@@ -48,23 +49,13 @@ async function promptSelect(title, items, label, options) {
|
|
|
48
49
|
rl.close();
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
|
-
async function fetchTeams(request = authedFetch) {
|
|
52
|
-
|
|
53
|
-
if (!response.ok) {
|
|
54
|
-
throw new Error(`Failed to fetch teams: ${await response.text()}`);
|
|
55
|
-
}
|
|
56
|
-
const data = await parseJsonResponse(response, 'Teams list');
|
|
57
|
-
return data.teams;
|
|
52
|
+
async function fetchTeams(request = authedFetch, timeoutMs) {
|
|
53
|
+
return await readDirectoryList(request, '/api/cli/teams', TEAM_LIST, timeoutMs);
|
|
58
54
|
}
|
|
59
|
-
async function fetchProjects(teamSlug, request = authedFetch) {
|
|
55
|
+
async function fetchProjects(teamSlug, request = authedFetch, timeoutMs) {
|
|
60
56
|
const normalizedTeamSlug = teamSlug ? normalizeSlugInput(teamSlug) : undefined;
|
|
61
57
|
const query = normalizedTeamSlug ? `?teamSlug=${encodeURIComponent(normalizedTeamSlug)}` : '';
|
|
62
|
-
|
|
63
|
-
if (!response.ok) {
|
|
64
|
-
throw new Error(`Failed to fetch projects: ${await response.text()}`);
|
|
65
|
-
}
|
|
66
|
-
const data = await parseJsonResponse(response, 'Projects list');
|
|
67
|
-
return data.projects;
|
|
58
|
+
return await readDirectoryList(request, `/api/cli/projects${query}`, PROJECT_LIST, timeoutMs);
|
|
68
59
|
}
|
|
69
60
|
async function fetchTasks(project, status = 'active') {
|
|
70
61
|
const params = new URLSearchParams();
|
|
@@ -115,24 +106,8 @@ async function createTeamOnServer(name, request = authedFetch) {
|
|
|
115
106
|
return await createTeamWithDeadline(name, request);
|
|
116
107
|
}
|
|
117
108
|
async function createProjectOnServer(teamSlug, name, request = authedFetch) {
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
headers: { 'Content-Type': 'application/json' },
|
|
121
|
-
body: JSON.stringify({ teamSlug, name }),
|
|
122
|
-
});
|
|
123
|
-
if (!response.ok) {
|
|
124
|
-
throw new Error(`Failed to create project: ${await response.text()}`);
|
|
125
|
-
}
|
|
126
|
-
const data = await parseJsonResponse(response, 'Project create');
|
|
127
|
-
return {
|
|
128
|
-
id: data.project.id,
|
|
129
|
-
name: data.project.name,
|
|
130
|
-
slug: data.project.slug,
|
|
131
|
-
teamId: data.project.teamId || '',
|
|
132
|
-
teamName: data.project.teamName || data.project.teamSlug,
|
|
133
|
-
teamSlug: data.project.teamSlug,
|
|
134
|
-
role: data.project.role || 'admin',
|
|
135
|
-
};
|
|
109
|
+
const { createProjectWithDeadline } = await import('./project-create-workflow.js');
|
|
110
|
+
return await createProjectWithDeadline(teamSlug, name, request);
|
|
136
111
|
}
|
|
137
112
|
async function resolveProjectSelection(projectArg) {
|
|
138
113
|
projectArg = projectArg || process.env.ORIZU_PROJECT || null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-commands.d.ts","sourceRoot":"","sources":["../src/auth-commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth-commands.d.ts","sourceRoot":"","sources":["../src/auth-commands.ts"],"names":[],"mappings":"AA6BA,iBAAS,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,cAAc,CAEnE;AAMD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAQD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,GAAG,CAwB5E;AA6BD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBtD;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzC;AAwBD,iBAAe,KAAK,CAAC,eAAe,CAAC,EAAE,MAAM,iBAmC5C;AAoHD,iBAAe,MAAM,kBAWpB;AAED,iBAAe,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,iBAwC7C;AAED,iBAAe,QAAQ,kBA0BtB;AAED,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA"}
|
package/dist/auth-commands.js
CHANGED
|
@@ -4,12 +4,11 @@ import { spawn } from 'child_process';
|
|
|
4
4
|
import { createServer } from 'http';
|
|
5
5
|
import { sanitizeTerminalText, parseJsonResponse } from './json-response.js';
|
|
6
6
|
import { isInteractiveTerminal, hasArg, hasJsonFlag, getArg } from './command-line-arguments.js';
|
|
7
|
-
import { getBaseUrl, resolveLoginTarget, resolveLogoutTarget, assertSecureTokenTransport, authedFetch,
|
|
8
|
-
import { hasResolvableAuth, rememberProcessSecret, saveServerCredentials, getServerCredentials,
|
|
7
|
+
import { getBaseUrl, resolveLoginTarget, resolveLogoutTarget, assertSecureTokenTransport, authedFetch, } from './http.js';
|
|
8
|
+
import { clearUnreadableServerCredentials, hasResolvableAuth, rememberProcessSecret, saveServerCredentials, getServerCredentials, resolveAuthTokenForBaseUrl, } from './credentials.js';
|
|
9
9
|
import { printJson, printLine, printLoginProgress } from './cli-console-output.js';
|
|
10
10
|
import { shouldUseHeadlessLogin, waitForHeadlessAuthorization } from './headless-login.js';
|
|
11
11
|
import { renderCliAuthBrowserPage } from './cli-auth-browser-page.js';
|
|
12
|
-
import { describeLogoutHttpFailure, describeLogoutTransportFailure } from './logout-diagnostic.js';
|
|
13
12
|
import { resolveProjectSelection } from './account-directory.js';
|
|
14
13
|
function isNodeError(error) {
|
|
15
14
|
return error instanceof Error;
|
|
@@ -247,6 +246,15 @@ async function logout(baseUrlOverride) {
|
|
|
247
246
|
const { baseUrl, credentialBaseUrl } = resolveLogoutTarget(baseUrlOverride);
|
|
248
247
|
const credentials = getServerCredentials(credentialBaseUrl);
|
|
249
248
|
if (!credentials) {
|
|
249
|
+
// A saved sign-in this CLI cannot read is removed: it may be a pasted token (ORI-2675).
|
|
250
|
+
if (clearUnreadableServerCredentials(credentialBaseUrl)) {
|
|
251
|
+
if (hasJsonFlag()) {
|
|
252
|
+
printJson({ status: 'removed-unreadable', server: baseUrl });
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
printLine(`Removed the saved sign-in for ${sanitizeTerminalText(baseUrl)}, which this CLI could not read.`);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
250
258
|
if (hasJsonFlag()) {
|
|
251
259
|
printJson({ status: 'already-logged-out', server: baseUrl });
|
|
252
260
|
return;
|
|
@@ -254,35 +262,19 @@ async function logout(baseUrlOverride) {
|
|
|
254
262
|
printLine(`Already logged out for ${sanitizeTerminalText(baseUrl)}.`);
|
|
255
263
|
return;
|
|
256
264
|
}
|
|
257
|
-
const
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
try {
|
|
266
|
-
assertSecureTokenTransport(baseUrl);
|
|
267
|
-
const response = await fetch(`${baseUrl}/api/cli/auth/logout`, {
|
|
268
|
-
method: 'POST',
|
|
269
|
-
headers: {
|
|
270
|
-
'Content-Type': 'application/json',
|
|
271
|
-
Authorization: `Bearer ${authorizationToken}`,
|
|
272
|
-
},
|
|
273
|
-
body: 'refreshToken' in credentials
|
|
274
|
-
? JSON.stringify({ refreshToken: credentials.refreshToken })
|
|
275
|
-
: undefined,
|
|
276
|
-
...credentialRequestRedirectPolicy(),
|
|
277
|
-
});
|
|
278
|
-
if (!response.ok) {
|
|
279
|
-
remoteLogoutError = await describeLogoutHttpFailure(response, logoutSecrets);
|
|
265
|
+
const { storedLogout } = await import('./stored-session-requests.js');
|
|
266
|
+
const { remoteError: remoteLogoutError, localCredentialCleared } = await storedLogout(baseUrl, credentialBaseUrl, credentials);
|
|
267
|
+
// Another login saved for this server while logout was out is kept.
|
|
268
|
+
if (!localCredentialCleared && getServerCredentials(credentialBaseUrl)) {
|
|
269
|
+
if (hasJsonFlag()) {
|
|
270
|
+
printJson({ status: 'changed', server: baseUrl, remoteLogoutError });
|
|
271
|
+
process.exitCode = 1;
|
|
272
|
+
return;
|
|
280
273
|
}
|
|
274
|
+
if (remoteLogoutError)
|
|
275
|
+
console.warn(`Warning: remote logout failed: ${remoteLogoutError}`);
|
|
276
|
+
throw new Error(`ORIZU_CREDENTIALS_CHANGED: another login was saved for ${sanitizeTerminalText(baseUrl)} during logout; it was kept. Run orizu logout again to remove it.`);
|
|
281
277
|
}
|
|
282
|
-
catch (error) {
|
|
283
|
-
remoteLogoutError = describeLogoutTransportFailure(error, logoutSecrets);
|
|
284
|
-
}
|
|
285
|
-
clearServerCredentials(credentialBaseUrl);
|
|
286
278
|
if (hasJsonFlag()) {
|
|
287
279
|
printJson({ status: 'logged-out', server: baseUrl, remoteLogoutError });
|
|
288
280
|
return;
|
package/dist/credentials.d.ts
CHANGED
|
@@ -63,5 +63,10 @@ export declare function hasResolvableAuth(baseUrl: string): boolean;
|
|
|
63
63
|
export declare function setActiveBaseUrl(baseUrl: string | null): void;
|
|
64
64
|
export declare function clearServerCredentialsIfCurrent(baseUrl: string, expected: ServerCredentials): boolean;
|
|
65
65
|
export declare function clearServerCredentials(baseUrl: string): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Remove a saved sign-in this CLI cannot read (it may be a pasted token).
|
|
68
|
+
* Returns false when there is none, or when it has become readable since.
|
|
69
|
+
*/
|
|
70
|
+
export declare function clearUnreadableServerCredentials(baseUrl: string): boolean;
|
|
66
71
|
export declare function clearCredentialsFile(): void;
|
|
67
72
|
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAoBA,OAAO,EACL,iBAAiB,EAEjB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,YAAY,CAAA;AAMnB,wBAAgB,YAAY,IAAI,MAAM,CAKrC;AA0HD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAgCvE;AAED;;;;GAIG;AACH,wBAAsB,mCAAmC,CAAC,CAAC,EACzD,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAiDZ;AAwGD,wBAAgB,qBAAqB,IAAI,mBAAmB,GAAG,mBAAmB,GAAG,IAAI,CA8BxF;
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAoBA,OAAO,EACL,iBAAiB,EAEjB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,YAAY,CAAA;AAMnB,wBAAgB,YAAY,IAAI,MAAM,CAKrC;AA0HD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAgCvE;AAED;;;;GAIG;AACH,wBAAsB,mCAAmC,CAAC,CAAC,EACzD,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAiDZ;AAwGD,wBAAgB,qBAAqB,IAAI,mBAAmB,GAAG,mBAAmB,GAAG,IAAI,CA8BxF;AA0BD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAuB9E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,QAepF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,QAatF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAS3F;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,iBAAiB,EAC3B,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAUT;AAmBD,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAMhD;AAED,uFAAuF;AACvF,wBAAgB,uBAAuB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyCxE;AAID,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,yBAAyB,IAAI,SAAS,MAAM,EAAE,CAE7D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CA0BrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAclE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAS1D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,QAMtD;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAWT;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAc/D;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAYzE;AAED,wBAAgB,oBAAoB,SAKnC"}
|
package/dist/credentials.js
CHANGED
|
@@ -305,6 +305,28 @@ export function loadCredentialsConfig() {
|
|
|
305
305
|
console.warn('Warning: credentials file has unrecognized format — please re-login with `orizu login`');
|
|
306
306
|
return null;
|
|
307
307
|
}
|
|
308
|
+
function isNonEmptyString(value) {
|
|
309
|
+
return typeof value === 'string' && value.length > 0;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* A saved sign-in this CLI can use: a session (it has an access token) or an
|
|
313
|
+
* API key. Plain code, not Effect Schema: this file is loaded by every
|
|
314
|
+
* command, including hosted sessions signed with ORIZU_TOKEN, which must never
|
|
315
|
+
* load Effect.
|
|
316
|
+
*/
|
|
317
|
+
function isServerCredentials(value) {
|
|
318
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
319
|
+
return false;
|
|
320
|
+
const entry = value;
|
|
321
|
+
if ('accessToken' in entry) {
|
|
322
|
+
return isNonEmptyString(entry.accessToken)
|
|
323
|
+
&& isNonEmptyString(entry.refreshToken)
|
|
324
|
+
&& typeof entry.expiresAt === 'number'
|
|
325
|
+
&& Number.isFinite(entry.expiresAt);
|
|
326
|
+
}
|
|
327
|
+
return isNonEmptyString(entry.apiKey);
|
|
328
|
+
}
|
|
329
|
+
const warnedUnreadableServers = new Set();
|
|
308
330
|
export function getServerCredentials(baseUrl) {
|
|
309
331
|
const config = loadCredentialsConfig();
|
|
310
332
|
if (!config) {
|
|
@@ -313,7 +335,18 @@ export function getServerCredentials(baseUrl) {
|
|
|
313
335
|
if (!Object.hasOwn(config.servers, baseUrl)) {
|
|
314
336
|
return null;
|
|
315
337
|
}
|
|
316
|
-
|
|
338
|
+
const entry = config.servers[baseUrl];
|
|
339
|
+
if (entry === null || entry === undefined)
|
|
340
|
+
return null;
|
|
341
|
+
if (!isServerCredentials(entry)) {
|
|
342
|
+
// Never the value: a hand-edited file may hold a token here (ORI-2675).
|
|
343
|
+
if (!warnedUnreadableServers.has(baseUrl)) {
|
|
344
|
+
warnedUnreadableServers.add(baseUrl);
|
|
345
|
+
console.warn(`Warning: the saved sign-in for ${baseUrl} is not in a format this CLI understands. Run \`orizu login --server ${baseUrl}\` to replace it, or \`orizu logout --server ${baseUrl}\` to remove it.`);
|
|
346
|
+
}
|
|
347
|
+
return null;
|
|
348
|
+
}
|
|
349
|
+
return entry;
|
|
317
350
|
}
|
|
318
351
|
export function saveServerCredentials(baseUrl, credentials) {
|
|
319
352
|
return withCredentialsTransactionLock(() => {
|
|
@@ -345,6 +378,9 @@ export function updateServerCredentials(baseUrl, credentials) {
|
|
|
345
378
|
});
|
|
346
379
|
}
|
|
347
380
|
export function credentialsEqual(left, right) {
|
|
381
|
+
// Entries read straight from the file may be malformed; those never match.
|
|
382
|
+
if (!isServerCredentials(left) || !isServerCredentials(right))
|
|
383
|
+
return false;
|
|
348
384
|
if ('apiKey' in left || 'apiKey' in right) {
|
|
349
385
|
return 'apiKey' in left && 'apiKey' in right && left.apiKey === right.apiKey;
|
|
350
386
|
}
|
|
@@ -363,9 +399,31 @@ export function updateServerCredentialsIfCurrent(baseUrl, expected, replacement)
|
|
|
363
399
|
return true;
|
|
364
400
|
});
|
|
365
401
|
}
|
|
402
|
+
function isServerAddress(value) {
|
|
403
|
+
if (typeof value !== 'string')
|
|
404
|
+
return false;
|
|
405
|
+
try {
|
|
406
|
+
normalizeBaseUrl(value);
|
|
407
|
+
return true;
|
|
408
|
+
}
|
|
409
|
+
catch {
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// Never the value: the "Invalid server URL" error would print it (ORI-2675).
|
|
414
|
+
// No fallback to the default server either: with an app.orizu.ai sign-in
|
|
415
|
+
// saved, that would run the command as a different account.
|
|
416
|
+
function unreadableActiveServerError() {
|
|
417
|
+
return new Error('The saved server in credentials.json isn\'t a valid address. Run `orizu login --server <url>`.');
|
|
418
|
+
}
|
|
366
419
|
export function getActiveBaseUrl() {
|
|
367
420
|
const config = loadCredentialsConfig();
|
|
368
|
-
|
|
421
|
+
const active = config?.activeBaseUrl;
|
|
422
|
+
if (active === null || active === undefined || active === '')
|
|
423
|
+
return null;
|
|
424
|
+
if (isServerAddress(active))
|
|
425
|
+
return active;
|
|
426
|
+
throw unreadableActiveServerError();
|
|
369
427
|
}
|
|
370
428
|
/** Resolve the selected server and move a retired production credential atomically. */
|
|
371
429
|
export function resolveCredentialServer(selected) {
|
|
@@ -383,7 +441,11 @@ export function resolveCredentialServer(selected) {
|
|
|
383
441
|
return withCredentialsTransactionLock(() => {
|
|
384
442
|
const config = loadCredentialsConfig();
|
|
385
443
|
// Another process may have selected a different server while we waited.
|
|
386
|
-
const
|
|
444
|
+
const storedSource = config?.activeBaseUrl;
|
|
445
|
+
if (!selected && storedSource !== null && storedSource !== undefined && storedSource !== '' && !isServerAddress(storedSource)) {
|
|
446
|
+
throw unreadableActiveServerError();
|
|
447
|
+
}
|
|
448
|
+
const currentSource = selected ?? (isServerAddress(storedSource) ? storedSource : null);
|
|
387
449
|
if (!currentSource)
|
|
388
450
|
return null;
|
|
389
451
|
const currentTarget = canonicalServerUrl(currentSource);
|
|
@@ -535,6 +597,25 @@ export function clearServerCredentials(baseUrl) {
|
|
|
535
597
|
return true;
|
|
536
598
|
});
|
|
537
599
|
}
|
|
600
|
+
/**
|
|
601
|
+
* Remove a saved sign-in this CLI cannot read (it may be a pasted token).
|
|
602
|
+
* Returns false when there is none, or when it has become readable since.
|
|
603
|
+
*/
|
|
604
|
+
export function clearUnreadableServerCredentials(baseUrl) {
|
|
605
|
+
return withCredentialsTransactionLock(() => {
|
|
606
|
+
const config = loadCredentialsConfig();
|
|
607
|
+
if (!config || !Object.hasOwn(config.servers, baseUrl))
|
|
608
|
+
return false;
|
|
609
|
+
const entry = config.servers[baseUrl];
|
|
610
|
+
if (entry === null || entry === undefined || isServerCredentials(entry))
|
|
611
|
+
return false;
|
|
612
|
+
delete config.servers[baseUrl];
|
|
613
|
+
if (config.activeBaseUrl === baseUrl)
|
|
614
|
+
config.activeBaseUrl = null;
|
|
615
|
+
writeCredentials(config);
|
|
616
|
+
return true;
|
|
617
|
+
});
|
|
618
|
+
}
|
|
538
619
|
export function clearCredentialsFile() {
|
|
539
620
|
return withCredentialsTransactionLock(() => {
|
|
540
621
|
const path = getCredentialsPath();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-transfer-upload.d.ts","sourceRoot":"","sources":["../src/dataset-transfer-upload.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsD,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAM/H,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACzF,aAAa,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAC/E;AAGD,KAAK,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAChD,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,CAAA;AAE9H,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,YAAY,CAAA;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;CACnD;
|
|
1
|
+
{"version":3,"file":"dataset-transfer-upload.d.ts","sourceRoot":"","sources":["../src/dataset-transfer-upload.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsD,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAM/H,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACzF,aAAa,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAC/E;AAGD,KAAK,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAChD,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,CAAA;AAE9H,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,YAAY,CAAA;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;CACnD;AAiID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,sBAAsB,CAAA;CAAE,CAAC,CAE9I"}
|
|
@@ -25,6 +25,11 @@ const DatasetUploadApi = Context.Service('orizu/DatasetUploadApi');
|
|
|
25
25
|
function isAuthContextChange(cause) {
|
|
26
26
|
return cause instanceof Error && cause.message.startsWith('ORIZU_AUTH_CONTEXT_CHANGED:');
|
|
27
27
|
}
|
|
28
|
+
// authedFetch sets this when the server answered 401 and the sign-in refresh
|
|
29
|
+
// then failed, so the request was not sent again: nothing was written.
|
|
30
|
+
function isRequestRejected(cause) {
|
|
31
|
+
return cause instanceof Error && cause.requestRejected === true;
|
|
32
|
+
}
|
|
28
33
|
// Only the existing authentication client's rejected-token refresh may replay a
|
|
29
34
|
// request. No transient/transport retries belong around these non-idempotent writes.
|
|
30
35
|
function post(path, body, context, prefix, timeoutMs) {
|
|
@@ -41,7 +46,7 @@ function post(path, body, context, prefix, timeoutMs) {
|
|
|
41
46
|
}
|
|
42
47
|
return await parseJsonResponse(response, context);
|
|
43
48
|
},
|
|
44
|
-
catch: cause => cause instanceof DatasetWriteFailure ? cause : new DatasetWriteFailure(cause instanceof Error ? cause.message : String(cause), requestStarted && !isAuthContextChange(cause) ? 'unknown' : 'rejected', { cause }),
|
|
49
|
+
catch: cause => cause instanceof DatasetWriteFailure ? cause : new DatasetWriteFailure(cause instanceof Error ? cause.message : String(cause), requestStarted && !isAuthContextChange(cause) && !isRequestRejected(cause) ? 'unknown' : 'rejected', { cause }),
|
|
45
50
|
}).pipe(Effect.timeoutOrElse({
|
|
46
51
|
duration: timeoutMs,
|
|
47
52
|
orElse: () => Effect.fail(new DatasetWriteFailure(`DATASET_TRANSFER_TIMEOUT: ${context} exceeded its deadline`, requestStarted ? 'unknown' : 'rejected')),
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
type ListRequest = (path: string, init: RequestInit) => Promise<Response>;
|
|
2
|
+
interface ListShape<T> {
|
|
3
|
+
/** How the list is named in messages: "team list". */
|
|
4
|
+
what: string;
|
|
5
|
+
/** The words before a refused reply's text, as before: "Failed to fetch teams". */
|
|
6
|
+
failed: string;
|
|
7
|
+
/** The label for a reply that isn't JSON: "Teams list". */
|
|
8
|
+
label: string;
|
|
9
|
+
/** The reply's field holding the list: "teams". */
|
|
10
|
+
field: string;
|
|
11
|
+
/** The item with any missing optional field filled in, or null when the CLI can't use it. */
|
|
12
|
+
read: (value: unknown) => T | null;
|
|
13
|
+
}
|
|
14
|
+
export interface ListedTeam {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
slug: string;
|
|
18
|
+
role: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ListedProject {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
slug: string;
|
|
24
|
+
teamId: string;
|
|
25
|
+
teamName: string;
|
|
26
|
+
teamSlug: string;
|
|
27
|
+
role: string;
|
|
28
|
+
}
|
|
29
|
+
export declare const TEAM_LIST: ListShape<ListedTeam>;
|
|
30
|
+
export declare const PROJECT_LIST: ListShape<ListedProject>;
|
|
31
|
+
/**
|
|
32
|
+
* One request with a time limit, its reply read under the same limit. A list
|
|
33
|
+
* Orizu can't read stops here, before any caller writes a file.
|
|
34
|
+
*/
|
|
35
|
+
export declare function readDirectoryList<T>(request: ListRequest, path: string, shape: ListShape<T>, timeoutMs?: number): Promise<T[]>;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=directory-list-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-list-read.d.ts","sourceRoot":"","sources":["../src/directory-list-read.ts"],"names":[],"mappings":"AAKA,KAAK,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEzE,UAAU,SAAS,CAAC,CAAC;IACnB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAA;IACb,6FAA6F;IAC7F,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,GAAG,IAAI,CAAA;CACnC;AAgBD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAKD,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,UAAU,CAU3C,CAAA;AAID,eAAO,MAAM,YAAY,EAAE,SAAS,CAAC,aAAa,CAmBjD,CAAA;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EACnB,SAAS,SAA0B,GAClC,OAAO,CAAC,CAAC,EAAE,CAAC,CAwBd"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// The team and project lists that setup, `teams list` and `projects list`
|
|
2
|
+
// read. Plain TypeScript on purpose: hosted sessions list teams and projects
|
|
3
|
+
// with ORIZU_TOKEN or ORIZU_TOKEN_FILE set, and that path loads no Effect.
|
|
4
|
+
import { parseJsonResponse } from './json-response.js';
|
|
5
|
+
const isRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
6
|
+
// Every command that names a project reads these lists, and none of them read
|
|
7
|
+
// ORIZU_DATASET_TRANSFER_TIMEOUT_MS before, so they get a fixed limit. Setup
|
|
8
|
+
// passes the setting, as its team and project creates already use it.
|
|
9
|
+
const DEFAULT_LIST_TIMEOUT_MS = 120_000;
|
|
10
|
+
const isNonEmptyString = (value) => typeof value === 'string' && value.length > 0;
|
|
11
|
+
/** A field the CLI only shows: absent, null or a string. */
|
|
12
|
+
const isOptionalString = (value) => value === undefined || value === null || typeof value === 'string';
|
|
13
|
+
// The CLI needs a team's id and slug. Its name and role are only shown, and a
|
|
14
|
+
// missing role was already shown as "-", so those may be missing; any other
|
|
15
|
+
// field the server sends is kept as it came.
|
|
16
|
+
export const TEAM_LIST = {
|
|
17
|
+
what: 'team list',
|
|
18
|
+
failed: 'Failed to fetch teams',
|
|
19
|
+
label: 'Teams list',
|
|
20
|
+
field: 'teams',
|
|
21
|
+
read: value => {
|
|
22
|
+
if (!isRecord(value) || !isNonEmptyString(value.id) || !isNonEmptyString(value.slug))
|
|
23
|
+
return null;
|
|
24
|
+
if (!isOptionalString(value.name) || !isOptionalString(value.role))
|
|
25
|
+
return null;
|
|
26
|
+
return { ...value, id: value.id, slug: value.slug, name: value.name ?? value.slug, role: value.role ?? '' };
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
// Setup files each project by its slug and records its id, under its team's
|
|
30
|
+
// slug, so those three must be there; the rest are only shown.
|
|
31
|
+
export const PROJECT_LIST = {
|
|
32
|
+
what: 'project list',
|
|
33
|
+
failed: 'Failed to fetch projects',
|
|
34
|
+
label: 'Projects list',
|
|
35
|
+
field: 'projects',
|
|
36
|
+
read: value => {
|
|
37
|
+
if (!isRecord(value) || !isNonEmptyString(value.id) || !isNonEmptyString(value.slug) || !isNonEmptyString(value.teamSlug))
|
|
38
|
+
return null;
|
|
39
|
+
if (!isOptionalString(value.name) || !isOptionalString(value.teamId) || !isOptionalString(value.teamName) || !isOptionalString(value.role))
|
|
40
|
+
return null;
|
|
41
|
+
return {
|
|
42
|
+
...value,
|
|
43
|
+
id: value.id,
|
|
44
|
+
slug: value.slug,
|
|
45
|
+
teamSlug: value.teamSlug,
|
|
46
|
+
name: value.name ?? value.slug,
|
|
47
|
+
teamId: value.teamId ?? '',
|
|
48
|
+
teamName: value.teamName ?? value.teamSlug,
|
|
49
|
+
role: value.role ?? '',
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* One request with a time limit, its reply read under the same limit. A list
|
|
55
|
+
* Orizu can't read stops here, before any caller writes a file.
|
|
56
|
+
*/
|
|
57
|
+
export async function readDirectoryList(request, path, shape, timeoutMs = DEFAULT_LIST_TIMEOUT_MS) {
|
|
58
|
+
const controller = new AbortController();
|
|
59
|
+
let timedOut = false;
|
|
60
|
+
const timer = setTimeout(() => { timedOut = true; controller.abort(); }, timeoutMs);
|
|
61
|
+
try {
|
|
62
|
+
const response = await request(path, { signal: controller.signal });
|
|
63
|
+
if (!response.ok)
|
|
64
|
+
throw new Error(`${shape.failed}: ${await response.text()}`);
|
|
65
|
+
const data = await parseJsonResponse(response, shape.label);
|
|
66
|
+
const list = isRecord(data) ? data[shape.field] : undefined;
|
|
67
|
+
const unreadable = new Error(`The server sent a ${shape.what} Orizu can't read. Run \`orizu update\` and try again; if it still fails, the server may be having trouble.`);
|
|
68
|
+
if (!Array.isArray(list))
|
|
69
|
+
throw unreadable;
|
|
70
|
+
const items = [];
|
|
71
|
+
for (const value of list) {
|
|
72
|
+
const item = shape.read(value);
|
|
73
|
+
if (item === null)
|
|
74
|
+
throw unreadable;
|
|
75
|
+
items.push(item);
|
|
76
|
+
}
|
|
77
|
+
return items;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (timedOut)
|
|
81
|
+
throw new Error(`Orizu didn't get the ${shape.what} within ${timeoutMs / 1000} s. Check your connection and try again.`);
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
clearTimeout(timer);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-boot.d.ts","sourceRoot":"","sources":["../src/hosted-boot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAmBH,OAAO,
|
|
1
|
+
{"version":3,"file":"hosted-boot.d.ts","sourceRoot":"","sources":["../src/hosted-boot.ts"],"names":[],"mappings":"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"}
|