zephyr-agent
Version:
Zephyr plugin agent
343 lines (342 loc) • 20.5 kB
JavaScript
import __rslib_shim_module__ from "node:module";
const require = /*#__PURE__*/ __rslib_shim_module__.createRequire(/*#__PURE__*/ (()=>import.meta.url)());
import { __webpack_require__ } from "../../rslib-runtime~0.mjs";
import * as __rspack_external__errors_index_mjs_bc02d34b from "../errors/index.mjs";
import * as __rspack_external__http_http_request_mjs_e0ec1005 from "../http/http-request.mjs";
import * as __rspack_external__logging_index_mjs_bd0f08e1 from "../logging/index.mjs";
import * as __rspack_external__logging_picocolor_mjs_749489b9 from "../logging/picocolor.mjs";
import * as __rspack_external__logging_ze_log_event_mjs_dadcdc10 from "../logging/ze-log-event.mjs";
import * as __rspack_external__node_persist_ci_token_mjs_5383b782 from "../node-persist/ci-token.mjs";
import * as __rspack_external__node_persist_secret_token_mjs_2ca2d450 from "../node-persist/secret-token.mjs";
import * as __rspack_external__node_persist_server_token_mjs_c1b80ed0 from "../node-persist/server-token.mjs";
import * as __rspack_external__node_persist_session_lock_mjs_61ab62b5 from "../node-persist/session-lock.mjs";
import * as __rspack_external__node_persist_storage_keys_mjs_41459324 from "../node-persist/storage-keys.mjs";
import * as __rspack_external__node_persist_token_mjs_6dd6d8db from "../node-persist/token.mjs";
import * as __rspack_external__security_redaction_mjs_ec717f6d from "../security/redaction.mjs";
import * as __rspack_external__auth_flags_mjs_4ce594b1 from "./auth-flags.mjs";
import * as __rspack_external__sse_mjs_fbbcd222 from "./sse.mjs";
import * as __rspack_external__token_expiry_mjs_d128c678 from "./token-expiry.mjs";
import * as __rspack_external_ci_info_720cc1a9 from "ci-info";
import * as __rspack_external_node_fs_1b05aee1 from "node:fs";
import * as __rspack_external_node_os_4f3c9d58 from "node:os";
import * as __rspack_external_node_path_806ed179 from "node:path";
import * as __rspack_external_node_readline_d8f53bef from "node:readline";
import * as __rspack_external_node_tty_1e2156d7 from "node:tty";
import * as __rspack_external_zephyr_edge_contract_255b965c from "zephyr-edge-contract";
__webpack_require__.add({
"./src/lib/auth/login.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
var ci_info__rspack_import_0 = __webpack_require__("ci-info?d35c");
var node_fs__rspack_import_1 = __webpack_require__("node:fs?f49c");
var node_os__rspack_import_2 = __webpack_require__("node:os?6058");
var node_path__rspack_import_3 = __webpack_require__("node:path?43cf");
var node_readline__rspack_import_4 = __webpack_require__("node:readline");
var node_tty__rspack_import_5 = __webpack_require__("node:tty?edcb");
var zephyr_edge_contract__rspack_import_6 = __webpack_require__("zephyr-edge-contract?b237");
var _errors__rspack_import_7 = __webpack_require__("../errors?2432");
var _http_http_request__rspack_import_8 = __webpack_require__("../http/http-request?7b79");
var _logging__rspack_import_9 = __webpack_require__("../logging?fa68");
var _logging_picocolor__rspack_import_10 = __webpack_require__("../logging/picocolor?88ae");
var _logging_ze_log_event__rspack_import_11 = __webpack_require__("../logging/ze-log-event?6644");
var _node_persist_secret_token__rspack_import_12 = __webpack_require__("../node-persist/secret-token?b638");
var _node_persist_session_lock__rspack_import_13 = __webpack_require__("../node-persist/session-lock");
var _node_persist_storage_keys__rspack_import_14 = __webpack_require__("../node-persist/storage-keys?338b");
var _node_persist_token__rspack_import_15 = __webpack_require__("../node-persist/token?5aac");
var _sse__rspack_import_16 = __webpack_require__("./sse");
var _auth_flags__rspack_import_17 = __webpack_require__("./auth-flags");
var _token_expiry__rspack_import_18 = __webpack_require__("./token-expiry");
var _node_persist_ci_token__rspack_import_19 = __webpack_require__("../node-persist/ci-token");
var _node_persist_server_token__rspack_import_20 = __webpack_require__("../node-persist/server-token");
var _security_redaction__rspack_import_21 = __webpack_require__("../security/redaction?5a18");
function _ts_add_disposable_resource(env, value, async) {
if (null != value) {
if ("object" != typeof value && "function" != typeof value) throw new TypeError("Object expected.");
var dispose, inner;
if (async) {
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
dispose = value[Symbol.asyncDispose];
}
if (void 0 === dispose) {
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
dispose = value[Symbol.dispose];
if (async) inner = dispose;
}
if ("function" != typeof dispose) throw new TypeError("Object not disposable.");
if (inner) dispose = function() {
try {
inner.call(this);
} catch (e) {
return Promise.reject(e);
}
};
env.stack.push({
value: value,
dispose: dispose,
async: async
});
} else if (async) env.stack.push({
async: true
});
return value;
}
var _SuppressedError1 = null;
function _ts_dispose_resources(env) {
function fail(e) {
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
env.hasError = true;
}
var r, s = 0;
function next() {
while(r = env.stack.pop())try {
if (!r.async && 1 === s) return s = 0, env.stack.push(r), Promise.resolve().then(next);
if (r.dispose) {
var result = r.dispose.call(r.value);
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
fail(e);
return next();
});
} else s |= 1;
} catch (e) {
fail(e);
}
if (1 === s) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
if (env.hasError) throw env.error;
}
return next();
}
async function checkAuth(git_config) {
const env = {
stack: [],
error: void 0,
hasError: false
};
try {
const secret_token = (0, _node_persist_secret_token__rspack_import_12.getSecretToken)();
const server_token = (0, _node_persist_server_token__rspack_import_20.getServerToken)();
const ci_token = (0, _node_persist_ci_token__rspack_import_19.getCiToken)();
if (secret_token) return void (0, _logging_ze_log_event__rspack_import_11.logFn)('debug', 'Token found in environment. Using secret token for authentication.');
if (server_token) (0, _logging_ze_log_event__rspack_import_11.logFn)('debug', 'Server token found in environment. Using server token for authentication.');
if (ci_token) (0, _logging_ze_log_event__rspack_import_11.logFn)('debug', 'CI token found in environment. Using CI-inferred token attribution.');
const existingToken = await (0, _node_persist_token__rspack_import_15.getToken)(git_config);
if (existingToken) {
if ((0, _token_expiry__rspack_import_18.isTokenStillValid)(existingToken, _auth_flags__rspack_import_17.TOKEN_EXPIRY.SHORT_VALIDITY_CHECK_SEC)) return void _logging__rspack_import_9.ze_log.auth('You are already logged in');
await (0, _node_persist_token__rspack_import_15.removeToken)();
}
if (ci_info__rspack_import_0.isCI || !(0, node_tty__rspack_import_5.isatty)(process.stdin.fd) || !(0, node_tty__rspack_import_5.isatty)(process.stdout.fd)) {
(0, _logging_ze_log_event__rspack_import_11.logFn)('warn', `Could not load ${_node_persist_storage_keys__rspack_import_14.StorageKeys.ze_secret_token}.`);
throw new _errors__rspack_import_7.ZephyrError(_errors__rspack_import_7.ZeErrors.ERR_AUTH_ERROR, {
message: 'Interactive login is unavailable. Run the deployment in a terminal or provide a valid authentication token.'
});
}
(0, _logging_ze_log_event__rspack_import_11.logFn)('', `${(0, _logging_picocolor__rspack_import_10.yellow)('Authentication required')} - You need to log in to Zephyr Cloud`);
const sessionKey = _ts_add_disposable_resource(env, (0, _node_persist_session_lock__rspack_import_13.getSessionKey)(), false);
const authUrl = await getAuthenticationURL(sessionKey.session);
if (!sessionKey.owner) (0, _logging_ze_log_event__rspack_import_11.logFn)('', (0, _logging_picocolor__rspack_import_10.gray)('Waiting for session unlock...'));
const browserController = new AbortController();
let privateAuthenticationArtifact;
promptForAuthAction(authUrl, browserController.signal).then(()=>openUrl(authUrl)).catch(()=>{
if (!browserController.signal.aborted) privateAuthenticationArtifact = fallbackManualLogin(authUrl);
}).finally(()=>{
if (browserController.signal.aborted) privateAuthenticationArtifact?.cleanup();
});
try {
if (sessionKey.owner) {
const newToken = await waitForAccessToken(sessionKey.session);
await (0, _node_persist_token__rspack_import_15.saveToken)(newToken);
} else {
await (0, _node_persist_session_lock__rspack_import_13.waitForUnlock)(browserController.signal);
const token = await (0, _node_persist_token__rspack_import_15.getToken)(git_config);
if (!token) throw new _errors__rspack_import_7.ZephyrError(_errors__rspack_import_7.ZeErrors.ERR_AUTH_ERROR, {
message: 'No token found after authentication finished, did it timeout?'
});
}
} finally{
browserController.abort();
privateAuthenticationArtifact?.cleanup();
}
(0, _logging_ze_log_event__rspack_import_11.logFn)('', `${(0, _logging_picocolor__rspack_import_10.green)('✓')} You are now logged in to Zephyr Cloud\n`);
} catch (e) {
env.error = e;
env.hasError = true;
} finally{
_ts_dispose_resources(env);
}
}
async function promptForAuthAction(authUrl, signal) {
const rl = node_readline__rspack_import_4.createInterface({
input: process.stdin,
output: process.stdout,
signal
});
return new Promise((resolve)=>{
rl.question(formatAuthenticationPromptForTerminal(authUrl), {
signal
}, resolve);
});
}
function formatAuthenticationPromptForTerminal(authUrl, interactive = _logging_picocolor__rspack_import_10.isTTY) {
if (!interactive) return (0, _logging_ze_log_event__rspack_import_11.formatLogMsg)('\nA private authentication link was generated. Waiting for browser authentication.\n');
return [
(0, _logging_ze_log_event__rspack_import_11.formatLogMsg)('\nAuthentication URL (shown only in this terminal):'),
authUrl,
(0, _logging_ze_log_event__rspack_import_11.formatLogMsg)(`\n${(0, _logging_picocolor__rspack_import_10.gray)(`Hit ${(0, _logging_picocolor__rspack_import_10.bold)((0, _logging_picocolor__rspack_import_10.white)('Enter'))} to open it in your browser.`)}\n`)
].join('\n');
}
function fallbackManualLogin(url) {
(0, _logging_ze_log_event__rspack_import_11.logFn)('', '');
(0, _logging_ze_log_event__rspack_import_11.logFn)('', "An unexpected error happened when opening the browser.");
let artifact;
try {
artifact = createPrivateAuthenticationArtifact(url);
} catch {
(0, _logging_ze_log_event__rspack_import_11.logFn)('error', 'Could not create a private authentication link. Please retry in an environment that can open a browser.');
return;
}
try {
(0, _logging_ze_log_event__rspack_import_11.logFn)('', `${(0, _logging_picocolor__rspack_import_10.yellow)('Please open this private HTML file in your browser:')}`);
(0, _logging_ze_log_event__rspack_import_11.logFn)('', artifact.filePath);
(0, _logging_ze_log_event__rspack_import_11.logFn)('', `${(0, _logging_picocolor__rspack_import_10.blue)('⏳')} Waiting for you to complete authentication in browser...`);
return artifact;
} catch {
artifact.cleanup();
return;
}
}
function createPrivateAuthenticationArtifact(url, writeArtifact = node_fs__rspack_import_1.writeFileSync) {
const directory = (0, node_fs__rspack_import_1.mkdtempSync)((0, node_path__rspack_import_3.join)((0, node_os__rspack_import_2.tmpdir)(), 'zephyr-auth-'));
const filePath = (0, node_path__rspack_import_3.join)(directory, 'login.html');
try {
(0, node_fs__rspack_import_1.chmodSync)(directory, 448);
const escapedUrl = url.replace(/&/gu, '&').replace(/</gu, '<').replace(/>/gu, '>').replace(/"/gu, '"').replace(/'/gu, ''');
writeArtifact(filePath, `<!doctype html><meta http-equiv="refresh" content="0;url=${escapedUrl}"><title>Zephyr authentication</title>`, {
encoding: 'utf8',
flag: 'wx',
mode: 384
});
} catch (error) {
try {
(0, node_fs__rspack_import_1.rmSync)(directory, {
force: true,
recursive: true
});
} catch {}
throw error;
}
return {
filePath,
cleanup: ()=>(0, node_fs__rspack_import_1.rmSync)(directory, {
force: true,
recursive: true
})
};
}
async function openUrl(url) {
const openModule = await eval("import('open')");
await openModule.default(url);
}
async function getAuthenticationURL(state) {
const authorizeUrl = new URL(zephyr_edge_contract__rspack_import_6.ze_api_gateway.authorize_link, (0, zephyr_edge_contract__rspack_import_6.ZE_API_ENDPOINT)());
authorizeUrl.searchParams.set('state', state);
_logging__rspack_import_9.ze_log.auth('getAuthenticationURL', (0, _security_redaction__rspack_import_21.redactUrl)(authorizeUrl));
const [ok, cause, data] = await (0, _http_http_request__rspack_import_8.makeRequest)({
path: zephyr_edge_contract__rspack_import_6.ze_api_gateway.authorize_link,
base: (0, zephyr_edge_contract__rspack_import_6.ZE_API_ENDPOINT)(),
query: {
state
}
});
if (!ok) throw new _errors__rspack_import_7.ZephyrError(_errors__rspack_import_7.ZeErrors.ERR_AUTH_ERROR, {
cause,
message: 'Could not get authentication URL'
});
return data;
}
async function waitForAccessToken(sessionKey) {
const url = new URL(zephyr_edge_contract__rspack_import_6.ze_api_gateway.websocket, (0, zephyr_edge_contract__rspack_import_6.ZE_API_ENDPOINT)());
url.searchParams.set('sessionId', sessionKey);
const authListener = new _sse__rspack_import_16.AuthListener(url);
const resp = await authListener.waitForToken();
(0, _logging__rspack_import_9.ze_debug)('waitForAccessToken', 'Received token for authentication session');
return resp.token;
}
__webpack_require__.d(__webpack_exports__, {
checkAuth: ()=>checkAuth,
createPrivateAuthenticationArtifact: ()=>createPrivateAuthenticationArtifact,
formatAuthenticationPromptForTerminal: ()=>formatAuthenticationPromptForTerminal,
isTokenStillValid: ()=>_token_expiry__rspack_import_18.isTokenStillValid
});
},
"../errors?2432" (module) {
module.exports = __rspack_external__errors_index_mjs_bc02d34b;
},
"../http/http-request?7b79" (module) {
module.exports = __rspack_external__http_http_request_mjs_e0ec1005;
},
"../logging?fa68" (module) {
module.exports = __rspack_external__logging_index_mjs_bd0f08e1;
},
"../logging/picocolor?88ae" (module) {
module.exports = __rspack_external__logging_picocolor_mjs_749489b9;
},
"../logging/ze-log-event?6644" (module) {
module.exports = __rspack_external__logging_ze_log_event_mjs_dadcdc10;
},
"../node-persist/ci-token" (module) {
module.exports = __rspack_external__node_persist_ci_token_mjs_5383b782;
},
"../node-persist/secret-token?b638" (module) {
module.exports = __rspack_external__node_persist_secret_token_mjs_2ca2d450;
},
"../node-persist/server-token" (module) {
module.exports = __rspack_external__node_persist_server_token_mjs_c1b80ed0;
},
"../node-persist/session-lock" (module) {
module.exports = __rspack_external__node_persist_session_lock_mjs_61ab62b5;
},
"../node-persist/storage-keys?338b" (module) {
module.exports = __rspack_external__node_persist_storage_keys_mjs_41459324;
},
"../node-persist/token?5aac" (module) {
module.exports = __rspack_external__node_persist_token_mjs_6dd6d8db;
},
"../security/redaction?5a18" (module) {
module.exports = __rspack_external__security_redaction_mjs_ec717f6d;
},
"./auth-flags" (module) {
module.exports = __rspack_external__auth_flags_mjs_4ce594b1;
},
"./sse" (module) {
module.exports = __rspack_external__sse_mjs_fbbcd222;
},
"./token-expiry" (module) {
module.exports = __rspack_external__token_expiry_mjs_d128c678;
},
"ci-info?d35c" (module) {
module.exports = __rspack_external_ci_info_720cc1a9;
},
"node:fs?f49c" (module) {
module.exports = __rspack_external_node_fs_1b05aee1;
},
"node:os?6058" (module) {
module.exports = __rspack_external_node_os_4f3c9d58;
},
"node:path?43cf" (module) {
module.exports = __rspack_external_node_path_806ed179;
},
"node:readline" (module) {
module.exports = __rspack_external_node_readline_d8f53bef;
},
"node:tty?edcb" (module) {
module.exports = __rspack_external_node_tty_1e2156d7;
},
"zephyr-edge-contract?b237" (module) {
module.exports = __rspack_external_zephyr_edge_contract_255b965c;
}
});
const login = __webpack_require__("./src/lib/auth/login.ts");
var checkAuth = login.checkAuth;
var createPrivateAuthenticationArtifact = login.createPrivateAuthenticationArtifact;
var formatAuthenticationPromptForTerminal = login.formatAuthenticationPromptForTerminal;
var isTokenStillValid = login.isTokenStillValid;
export { checkAuth, createPrivateAuthenticationArtifact, formatAuthenticationPromptForTerminal, isTokenStillValid };
//# sourceMappingURL=login.mjs.map