systemview 2.2.5 → 2.3.1
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/api/Connections.js +6 -1
- package/api/cli-history.json +1 -1
- package/api/connections.json +1 -1
- package/api/index.js +43 -13
- package/build/asset-manifest.json +6 -6
- package/build/index.html +1 -1
- package/build/static/css/main.87b2fd6a.css +8 -0
- package/build/static/css/main.87b2fd6a.css.map +1 -0
- package/build/static/js/{main.f5bafe34.js → main.5d6e3f47.js} +3 -3
- package/build/static/js/main.5d6e3f47.js.map +1 -0
- package/cli/connectService.js +18 -1
- package/cli/cookieClient.js +14 -45
- package/cli/index.js +24 -12
- package/cli/manifest.js +10 -3
- package/cli/manifestHeaders.js +120 -0
- package/cli/probe.js +3 -0
- package/cli/utils/cli.js +6 -1
- package/package.json +1 -1
- package/build/static/css/main.1916c1d1.css +0 -15
- package/build/static/css/main.1916c1d1.css.map +0 -1
- package/build/static/js/main.f5bafe34.js.map +0 -1
- /package/build/static/js/{main.f5bafe34.js.LICENSE.txt → main.5d6e3f47.js.LICENSE.txt} +0 -0
package/cli/connectService.js
CHANGED
|
@@ -3,6 +3,7 @@ const { createCookieHttpClient } = require("./cookieClient");
|
|
|
3
3
|
const cookieHttpClient = createCookieHttpClient();
|
|
4
4
|
const Client = createClient(cookieHttpClient);
|
|
5
5
|
const log = require("./logger");
|
|
6
|
+
const manifestCommands = require("./manifest");
|
|
6
7
|
|
|
7
8
|
async function getUiSvc(uiUrl) {
|
|
8
9
|
try {
|
|
@@ -33,7 +34,7 @@ function printSummary(entries) {
|
|
|
33
34
|
console.log("");
|
|
34
35
|
}
|
|
35
36
|
|
|
36
|
-
module.exports = async function connectService(target, { useManifest, force, connectedUrls, uiUrl } = {}) {
|
|
37
|
+
module.exports = async function connectService(target, { useManifest, save, force, connectedUrls, uiUrl } = {}) {
|
|
37
38
|
const uiSvc = await getUiSvc(uiUrl);
|
|
38
39
|
|
|
39
40
|
// connect (no args) — connect to every service stored in UI
|
|
@@ -133,6 +134,17 @@ module.exports = async function connectService(target, { useManifest, force, con
|
|
|
133
134
|
}
|
|
134
135
|
}
|
|
135
136
|
printSummary(summary);
|
|
137
|
+
if (save) {
|
|
138
|
+
// --save persists THIS connection to the local manifest. The subject is the connection
|
|
139
|
+
// (the services); the applied headers + captured session cookie tag along via save().
|
|
140
|
+
const services = manifest.services.map((s) => ({
|
|
141
|
+
projectCode: manifest.projectCode,
|
|
142
|
+
serviceId: s.serviceId,
|
|
143
|
+
system: s.system,
|
|
144
|
+
specList: s.specList || { tests: [], docs: [] },
|
|
145
|
+
}));
|
|
146
|
+
manifestCommands.save(services);
|
|
147
|
+
}
|
|
136
148
|
} else {
|
|
137
149
|
log.warn("No plugin manifest found. Storing as connected-services.");
|
|
138
150
|
const connectionData = await HttpClient.request({ url: target });
|
|
@@ -165,6 +177,11 @@ module.exports = async function connectService(target, { useManifest, force, con
|
|
|
165
177
|
await notifyUi(uiSvc, project);
|
|
166
178
|
log.success(`connected-services › ${serviceId}`);
|
|
167
179
|
printSummary([{ projectCode: "connected-services", serviceId, url: target }]);
|
|
180
|
+
if (save) {
|
|
181
|
+
manifestCommands.save([
|
|
182
|
+
{ projectCode: "connected-services", serviceId, system: { connectionData }, specList: { tests: [], docs: [] } },
|
|
183
|
+
]);
|
|
184
|
+
}
|
|
168
185
|
}
|
|
169
186
|
} catch (err) {
|
|
170
187
|
log.error(`Connection failed: ${err.message}`);
|
package/cli/cookieClient.js
CHANGED
|
@@ -1,55 +1,25 @@
|
|
|
1
1
|
const axios = require("axios").default;
|
|
2
2
|
const FormData = require("form-data");
|
|
3
|
-
const fs = require("fs");
|
|
4
3
|
const path = require("path");
|
|
5
|
-
const {
|
|
4
|
+
const { headersFor, captureCookie } = require("./manifestHeaders");
|
|
6
5
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return JSON.parse(fs.readFileSync(COOKIE_FILE, "utf8"));
|
|
12
|
-
} catch {
|
|
13
|
-
return {};
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function captureCookies(setCookieHeaders) {
|
|
18
|
-
if (!setCookieHeaders || !setCookieHeaders.length) return;
|
|
19
|
-
const existing = readCookies();
|
|
20
|
-
let changed = false;
|
|
21
|
-
setCookieHeaders.forEach((header) => {
|
|
22
|
-
const [pair] = header.split(";");
|
|
23
|
-
const eqIdx = pair.indexOf("=");
|
|
24
|
-
if (eqIdx === -1) return;
|
|
25
|
-
const name = pair.slice(0, eqIdx).trim();
|
|
26
|
-
const value = pair.slice(eqIdx + 1).trim();
|
|
27
|
-
if (name) {
|
|
28
|
-
existing[name] = value;
|
|
29
|
-
changed = true;
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
if (changed) fs.writeFileSync(COOKIE_FILE, JSON.stringify(existing, null, 2));
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function cookieHeader() {
|
|
36
|
-
const cookies = readCookies();
|
|
37
|
-
const pairs = Object.entries(cookies)
|
|
38
|
-
.map(([k, v]) => `${k}=${v}`)
|
|
39
|
-
.join("; ");
|
|
40
|
-
return pairs || null;
|
|
41
|
-
}
|
|
6
|
+
// HTTP client for the SystemLynx CLI. Per request it attaches the manifest's headers for
|
|
7
|
+
// the target origin (auth tokens, cookies, any scheme — see manifestHeaders.js) and folds
|
|
8
|
+
// any Set-Cookie response back into that store. `extraHeaders` (e.g. --header flags) win on
|
|
9
|
+
// conflict. Cookies + tokens now live in the manifest; there is no separate cookie jar.
|
|
42
10
|
|
|
43
11
|
function createCookieHttpClient(extraHeaders = {}) {
|
|
44
12
|
return {
|
|
45
13
|
request: async ({ method = "get", url, body: data, headers }) => {
|
|
46
14
|
method = method.toLowerCase();
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
15
|
+
// Manifest headers are the base/default; caller-set headers (systemlynx setHeaders, i.e. the
|
|
16
|
+
// CLI `--header` flag) and constructor extraHeaders override them by name. (Matches the upload
|
|
17
|
+
// path below — the request path previously had these flipped, letting the manifest win over
|
|
18
|
+
// an explicit --header.)
|
|
19
|
+
headers = { ...headersFor(url), ...headers, ...extraHeaders };
|
|
50
20
|
try {
|
|
51
21
|
const res = await axios({ url, method, headers, data });
|
|
52
|
-
|
|
22
|
+
captureCookie(url, res.headers["set-cookie"]);
|
|
53
23
|
if (res.status >= 400) throw res.data;
|
|
54
24
|
return res.data;
|
|
55
25
|
} catch (error) {
|
|
@@ -65,16 +35,15 @@ function createCookieHttpClient(extraHeaders = {}) {
|
|
|
65
35
|
if (file) form.append("file", file, path.basename(file.path));
|
|
66
36
|
if (files) files.forEach((f) => form.append("files", f, path.basename(f.path)));
|
|
67
37
|
if (__arguments) form.append("__arguments", JSON.stringify(__arguments));
|
|
68
|
-
const cookie = cookieHeader();
|
|
69
38
|
const allHeaders = {
|
|
70
|
-
...
|
|
71
|
-
...(cookie ? { Cookie: cookie } : {}),
|
|
39
|
+
...headersFor(url),
|
|
72
40
|
...headers,
|
|
41
|
+
...extraHeaders,
|
|
73
42
|
"Content-Type": "multipart/form-data",
|
|
74
43
|
};
|
|
75
44
|
try {
|
|
76
45
|
const res = await axios.post(url, form, { headers: allHeaders });
|
|
77
|
-
|
|
46
|
+
captureCookie(url, res.headers["set-cookie"]);
|
|
78
47
|
if (res.status >= 400) throw res.data;
|
|
79
48
|
return res.data;
|
|
80
49
|
} catch (error) {
|
package/cli/index.js
CHANGED
|
@@ -25,6 +25,17 @@ const DEFAULT_PORT = 3000;
|
|
|
25
25
|
const VERSION = require("../package.json").version;
|
|
26
26
|
const UI_URL = `http://localhost:${DEFAULT_PORT}`;
|
|
27
27
|
|
|
28
|
+
// process.exit() truncates buffered stdout when stdout is a pipe (agents/CI, and large `--json`
|
|
29
|
+
// output). Drain stdout + stderr first, then exit — otherwise big results get cut off mid-stream.
|
|
30
|
+
function flushAndExit(code = 0) {
|
|
31
|
+
let pending = 2;
|
|
32
|
+
const done = () => {
|
|
33
|
+
if (--pending === 0) process.exit(code);
|
|
34
|
+
};
|
|
35
|
+
process.stdout.write("", done);
|
|
36
|
+
process.stderr.write("", done);
|
|
37
|
+
}
|
|
38
|
+
|
|
28
39
|
const MANIFEST_FILE =
|
|
29
40
|
flags.manifest || path.join(process.cwd(), "systemview.manifest.json");
|
|
30
41
|
const connectedUrls = new Set();
|
|
@@ -80,10 +91,10 @@ async function startTest() {
|
|
|
80
91
|
index: flags.index,
|
|
81
92
|
skip: flags.skip,
|
|
82
93
|
});
|
|
83
|
-
|
|
94
|
+
flushAndExit(exitCode);
|
|
84
95
|
} catch (error) {
|
|
85
96
|
log.error("Error executing tests: " + error.message);
|
|
86
|
-
|
|
97
|
+
flushAndExit(1);
|
|
87
98
|
}
|
|
88
99
|
}
|
|
89
100
|
|
|
@@ -99,7 +110,7 @@ async function list() {
|
|
|
99
110
|
verbose: flags.verbose,
|
|
100
111
|
json: flags.json,
|
|
101
112
|
});
|
|
102
|
-
|
|
113
|
+
flushAndExit(0);
|
|
103
114
|
}
|
|
104
115
|
|
|
105
116
|
async function open() {
|
|
@@ -119,7 +130,7 @@ async function open() {
|
|
|
119
130
|
}
|
|
120
131
|
|
|
121
132
|
openBrowser(UI_URL, project_code, namespace, connectedServices);
|
|
122
|
-
|
|
133
|
+
flushAndExit(0);
|
|
123
134
|
}
|
|
124
135
|
|
|
125
136
|
async function quitApp() {
|
|
@@ -136,18 +147,18 @@ async function quitApp() {
|
|
|
136
147
|
log.success("SystemView shutdown successful!");
|
|
137
148
|
} else {
|
|
138
149
|
log.error("Remote shutdown failed!");
|
|
139
|
-
|
|
150
|
+
flushAndExit(1);
|
|
140
151
|
}
|
|
141
152
|
} else {
|
|
142
153
|
log.warn(`No SystemView instance found @ ${api}`);
|
|
143
154
|
}
|
|
144
|
-
|
|
155
|
+
flushAndExit(0);
|
|
145
156
|
}
|
|
146
157
|
|
|
147
158
|
(async () => {
|
|
148
159
|
if (process.argv.includes("--version") || process.argv.includes("-v")) {
|
|
149
160
|
console.log(VERSION);
|
|
150
|
-
|
|
161
|
+
flushAndExit(0);
|
|
151
162
|
}
|
|
152
163
|
|
|
153
164
|
init();
|
|
@@ -168,17 +179,18 @@ async function quitApp() {
|
|
|
168
179
|
const useManifest = process.argv.includes("--manifest");
|
|
169
180
|
await connectService(input[1], {
|
|
170
181
|
useManifest,
|
|
182
|
+
save: process.argv.includes("--save"),
|
|
171
183
|
force: flags.force,
|
|
172
184
|
connectedUrls,
|
|
173
185
|
uiUrl: UI_URL,
|
|
174
186
|
});
|
|
175
|
-
|
|
187
|
+
flushAndExit(0);
|
|
176
188
|
} else if (command === "disconnect") {
|
|
177
189
|
await manifestCommands.disconnect(input[1], input[2], {
|
|
178
190
|
connectedUrls,
|
|
179
191
|
uiUrl: UI_URL,
|
|
180
192
|
});
|
|
181
|
-
|
|
193
|
+
flushAndExit(0);
|
|
182
194
|
} else if (command === "manifest") {
|
|
183
195
|
const sub = input[1];
|
|
184
196
|
if (sub === "save") {
|
|
@@ -188,7 +200,7 @@ async function quitApp() {
|
|
|
188
200
|
} else {
|
|
189
201
|
log.warn("Usage: systemview manifest <save|clean>");
|
|
190
202
|
}
|
|
191
|
-
|
|
203
|
+
flushAndExit(0);
|
|
192
204
|
} else if (command === "probe") {
|
|
193
205
|
await launchApp(DEFAULT_PORT);
|
|
194
206
|
const exitCode = await probe(input[1], input[2], {
|
|
@@ -197,7 +209,7 @@ async function quitApp() {
|
|
|
197
209
|
headers: flags.headers,
|
|
198
210
|
uiUrl: UI_URL,
|
|
199
211
|
});
|
|
200
|
-
|
|
212
|
+
flushAndExit(exitCode || 0);
|
|
201
213
|
} else if (command === "logs" || command === "log") {
|
|
202
214
|
await launchApp(DEFAULT_PORT);
|
|
203
215
|
await logsCommand(input[1], input[2], {
|
|
@@ -216,7 +228,7 @@ async function quitApp() {
|
|
|
216
228
|
saved: flags.saved,
|
|
217
229
|
saveLimit: flags.saveLimit,
|
|
218
230
|
});
|
|
219
|
-
if (!flags.follow)
|
|
231
|
+
if (!flags.follow) flushAndExit(0);
|
|
220
232
|
} else {
|
|
221
233
|
await startApp();
|
|
222
234
|
}
|
package/cli/manifest.js
CHANGED
|
@@ -2,6 +2,7 @@ const fs = require("fs");
|
|
|
2
2
|
const path = require("path");
|
|
3
3
|
const { HttpClient, createClient } = require("systemlynx");
|
|
4
4
|
const { createCookieHttpClient } = require("./cookieClient");
|
|
5
|
+
const { getHeaders } = require("./manifestHeaders");
|
|
5
6
|
const cookieHttpClient = createCookieHttpClient();
|
|
6
7
|
const Client = createClient(cookieHttpClient);
|
|
7
8
|
const log = require("./logger");
|
|
@@ -17,7 +18,7 @@ async function getUiSvc(uiUrl) {
|
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
20
|
|
|
20
|
-
module.exports.save = function saveManifest(manifestServices, manifestFile = DEFAULT_MANIFEST
|
|
21
|
+
module.exports.save = function saveManifest(manifestServices, manifestFile = DEFAULT_MANIFEST) {
|
|
21
22
|
if (!manifestServices || !manifestServices.length) {
|
|
22
23
|
log.warn("No services in session to save.");
|
|
23
24
|
return;
|
|
@@ -32,13 +33,19 @@ module.exports.save = function saveManifest(manifestServices, manifestFile = DEF
|
|
|
32
33
|
log.warn("Multiple project codes in session — saving first project only: " + projectCodes[0]);
|
|
33
34
|
}
|
|
34
35
|
const projectCode = projectCodes[0];
|
|
36
|
+
const headers = getHeaders();
|
|
35
37
|
const manifest = {
|
|
36
38
|
projectCode,
|
|
37
39
|
services: byProject[projectCode],
|
|
38
|
-
...(Object.keys(
|
|
40
|
+
...(headers && Object.keys(headers).length && { headers }),
|
|
39
41
|
};
|
|
40
42
|
fs.writeFileSync(manifestFile, JSON.stringify(manifest, null, 2));
|
|
41
|
-
|
|
43
|
+
const headerOrigins = Object.keys(headers || {});
|
|
44
|
+
const cookieOrigins = headerOrigins.filter((o) => headers[o] && headers[o].Cookie);
|
|
45
|
+
const parts = [`${manifest.services.length} service(s)`];
|
|
46
|
+
if (headerOrigins.length) parts.push(`headers for ${headerOrigins.length} origin(s)`);
|
|
47
|
+
if (cookieOrigins.length) parts.push(`cookies for ${cookieOrigins.length} origin(s)`);
|
|
48
|
+
log.success(`Manifest saved to ${manifestFile} — ${parts.join(", ")}`);
|
|
42
49
|
};
|
|
43
50
|
|
|
44
51
|
module.exports.clean = async function cleanManifest(manifestFile = DEFAULT_MANIFEST) {
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Manifest-backed request headers (RFC-010 Phase 1).
|
|
2
|
+
//
|
|
3
|
+
// Headers live in the manifest, indexed by URL origin. Each value is either a literal
|
|
4
|
+
// ("Bearer abc") or a file-pointer ("@./token") that keeps the secret out of the manifest.
|
|
5
|
+
// Cookies are just the "Cookie" header — a captured Set-Cookie folds into the same store.
|
|
6
|
+
//
|
|
7
|
+
// Read on load, written only on `save`. This module holds the manifest's `headers` in
|
|
8
|
+
// memory for the life of the CLI process (shared across every command via Node's module
|
|
9
|
+
// cache), so a cookie captured by one request is re-sent by the next, and `save` persists
|
|
10
|
+
// whatever accumulated.
|
|
11
|
+
|
|
12
|
+
const fs = require("fs");
|
|
13
|
+
const path = require("path");
|
|
14
|
+
|
|
15
|
+
const MANIFEST_FILE = path.join(process.cwd(), "systemview.manifest.json");
|
|
16
|
+
|
|
17
|
+
// { "<origin>": { "Header-Name": "value" | "@file", "Cookie": "a=1; b=2" } }
|
|
18
|
+
// This is the ONLY header store — user-authored, indexed by service URL origin. The plugin never
|
|
19
|
+
// writes headers; there is no separate project-level default (the old `probeHeaders` is gone).
|
|
20
|
+
let headers = null;
|
|
21
|
+
|
|
22
|
+
// One-time, de-duplicated notices surfaced by CLI commands so the user gets confirmation
|
|
23
|
+
// that something happened ("using headers for X", "captured cookie for X"). Drained via takeNotices().
|
|
24
|
+
const _notified = new Set();
|
|
25
|
+
const _notices = [];
|
|
26
|
+
function note(key, msg) {
|
|
27
|
+
if (_notified.has(key)) return;
|
|
28
|
+
_notified.add(key);
|
|
29
|
+
_notices.push(msg);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function load() {
|
|
33
|
+
// Cache only a NON-empty result. A short-lived CLI process loads once and is done; a long-running
|
|
34
|
+
// UI server, though, may make its first call before the plugin has written the manifest headers —
|
|
35
|
+
// caching that empty read would blind it forever. Re-read until headers actually appear, then cache.
|
|
36
|
+
if (headers && Object.keys(headers).length) return headers;
|
|
37
|
+
headers = {};
|
|
38
|
+
try {
|
|
39
|
+
const m = JSON.parse(fs.readFileSync(MANIFEST_FILE, "utf8"));
|
|
40
|
+
if (m && m.headers && typeof m.headers === "object") headers = m.headers;
|
|
41
|
+
} catch {
|
|
42
|
+
/* no manifest / unreadable — start empty */
|
|
43
|
+
}
|
|
44
|
+
return headers;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function originOf(url) {
|
|
48
|
+
try {
|
|
49
|
+
return new URL(url).origin;
|
|
50
|
+
} catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// "@path" → file contents (trimmed); anything else returned as-is.
|
|
56
|
+
function deref(value) {
|
|
57
|
+
if (typeof value === "string" && value.startsWith("@")) {
|
|
58
|
+
try {
|
|
59
|
+
return fs.readFileSync(path.resolve(process.cwd(), value.slice(1)), "utf8").trim();
|
|
60
|
+
} catch {
|
|
61
|
+
return "";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Resolved header name→value pairs for a request URL, matched by origin.
|
|
68
|
+
function headersFor(url) {
|
|
69
|
+
const origin = originOf(url);
|
|
70
|
+
load();
|
|
71
|
+
const bucket = headers[origin] || {};
|
|
72
|
+
const out = {};
|
|
73
|
+
for (const [name, raw] of Object.entries(bucket)) {
|
|
74
|
+
const value = deref(raw);
|
|
75
|
+
if (value != null && value !== "") out[name] = value;
|
|
76
|
+
}
|
|
77
|
+
const names = Object.keys(out);
|
|
78
|
+
if (names.length) note("attach:" + origin, `using ${names.length} manifest header(s) for ${origin}`);
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Fold Set-Cookie response headers into the in-memory Cookie header for the url's origin.
|
|
83
|
+
function captureCookie(url, setCookieHeaders) {
|
|
84
|
+
if (!setCookieHeaders || !setCookieHeaders.length) return;
|
|
85
|
+
const origin = originOf(url);
|
|
86
|
+
if (!origin) return;
|
|
87
|
+
const store = load();
|
|
88
|
+
if (!store[origin]) store[origin] = {};
|
|
89
|
+
|
|
90
|
+
const jar = {};
|
|
91
|
+
const existing = store[origin].Cookie;
|
|
92
|
+
if (typeof existing === "string") {
|
|
93
|
+
existing.split(";").forEach((p) => {
|
|
94
|
+
const i = p.indexOf("=");
|
|
95
|
+
if (i > -1) jar[p.slice(0, i).trim()] = p.slice(i + 1).trim();
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
setCookieHeaders.forEach((h) => {
|
|
99
|
+
const [pair] = h.split(";");
|
|
100
|
+
const i = pair.indexOf("=");
|
|
101
|
+
if (i > -1) jar[pair.slice(0, i).trim()] = pair.slice(i + 1).trim();
|
|
102
|
+
});
|
|
103
|
+
store[origin].Cookie = Object.entries(jar)
|
|
104
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
105
|
+
.join("; ");
|
|
106
|
+
note("cookie:" + origin, `captured cookie for ${origin}`);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// The live headers map — for `save` to persist. (Not dereferenced: @file pointers and
|
|
110
|
+
// literals are written back as authored; captured cookies are written as literal values.)
|
|
111
|
+
function getHeaders() {
|
|
112
|
+
return load();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Drain the accumulated one-time notices (for a command to print as confirmations).
|
|
116
|
+
function takeNotices() {
|
|
117
|
+
return _notices.splice(0, _notices.length);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
module.exports = { headersFor, captureCookie, getHeaders, takeNotices, MANIFEST_FILE };
|
package/cli/probe.js
CHANGED
|
@@ -2,6 +2,7 @@ const fs = require("fs");
|
|
|
2
2
|
const path = require("path");
|
|
3
3
|
const { createClient } = require("systemlynx");
|
|
4
4
|
const { createCookieHttpClient } = require("./cookieClient");
|
|
5
|
+
const { takeNotices } = require("./manifestHeaders");
|
|
5
6
|
const log = require("./logger");
|
|
6
7
|
|
|
7
8
|
const cookieHttpClient = createCookieHttpClient();
|
|
@@ -76,6 +77,7 @@ module.exports = async function probe(namespace, argsStr, { json = false, manife
|
|
|
76
77
|
} else {
|
|
77
78
|
log.success("result:");
|
|
78
79
|
console.log(JSON.stringify(result, null, 2));
|
|
80
|
+
takeNotices().forEach((n) => log.info(n));
|
|
79
81
|
}
|
|
80
82
|
return 0;
|
|
81
83
|
} catch (err) {
|
|
@@ -83,6 +85,7 @@ module.exports = async function probe(namespace, argsStr, { json = false, manife
|
|
|
83
85
|
process.stdout.write(JSON.stringify({ serviceId, moduleName, methodName, args, error: err.message }, null, 2) + "\n");
|
|
84
86
|
} else {
|
|
85
87
|
log.error(err.message);
|
|
88
|
+
takeNotices().forEach((n) => log.info(n));
|
|
86
89
|
}
|
|
87
90
|
return 1;
|
|
88
91
|
}
|
package/cli/utils/cli.js
CHANGED
|
@@ -13,7 +13,9 @@ const HELP_TEXT = `
|
|
|
13
13
|
flush Wipe the log file and stop streaming [alias: clearlogs]
|
|
14
14
|
connect [url|projectCode] Connect a service URL, reconnect a stored project, or connect all
|
|
15
15
|
connect <url> --manifest Connect via plugin manifest — registers under real projectCode
|
|
16
|
+
connect <url> --manifest --save Connect, then persist the connection (services + headers + cookie) to the manifest
|
|
16
17
|
disconnect [projectCode] [serviceId] Remove a project or service from the UI store
|
|
18
|
+
manifest save Persist session manifest — services, auth headers, cookies [interactive]
|
|
17
19
|
manifest clean Re-probe manifest entries, remove stale ones
|
|
18
20
|
probe <ServiceId.Module.method> [args] Call a service method ad-hoc
|
|
19
21
|
open [projectCode] [namespace] Open the browser UI
|
|
@@ -26,7 +28,9 @@ const HELP_TEXT = `
|
|
|
26
28
|
--verbose test: full results and args for all phases; list: expand hierarchy
|
|
27
29
|
--manifest connect: use plugin manifest to get real projectCode
|
|
28
30
|
--manifest <path> probe: path to manifest file (default: ./systemview.manifest.json)
|
|
29
|
-
--header "Name: Value" Extra request header (repeatable)
|
|
31
|
+
--header "Name: Value" Extra request header (repeatable; overrides manifest headers).
|
|
32
|
+
For a standing token, add it to the manifest "headers"
|
|
33
|
+
(literal or "@file") — see docs/cli.md.
|
|
30
34
|
--skip <pattern> Exclude tests matching pattern (repeatable)
|
|
31
35
|
--bail Stop after first failure
|
|
32
36
|
--dry-run Print which tests would run without executing
|
|
@@ -42,6 +46,7 @@ const HELP_TEXT = `
|
|
|
42
46
|
--filter missing=<field> → only entries where field is absent
|
|
43
47
|
--or <field=value> logs: OR filter on a field (repeatable)
|
|
44
48
|
--include <field> logs: include extra field as a column (repeatable)
|
|
49
|
+
--save connect: persist this connection to the manifest (headers + cookie tag along)
|
|
45
50
|
--save [path] logs: append streamed entries to a local snapshot file
|
|
46
51
|
--saved logs: read from local snapshot instead of live service
|
|
47
52
|
--save-limit <n> logs: max entries to keep in snapshot (default 500)
|
package/package.json
CHANGED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
@font-face{font-family:SF Mono;src:url(/static/media/FontsFree-Net-SFMono-Regular.9647425ef282c28529df.ttf) format("ttf")}@font-face{font-family:Malkor;src:url(/static/media/Malkor-Regular.f55d6a829566789554a5.ttf) format("ttf")}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}code{font-family:SF Mono,system-ui,source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}
|
|
2
|
-
|
|
3
|
-
/*!
|
|
4
|
-
* Bootstrap Grid v4.0.0 (https://getbootstrap.com)
|
|
5
|
-
* Copyright 2011-2018 The Bootstrap Authors
|
|
6
|
-
* Copyright 2011-2018 Twitter, Inc.
|
|
7
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
8
|
-
*/.textbox{flex:1 1}.textbox input,.textbox textarea{font-size:15px;padding:7px;width:100%}.link{color:#282d33;font-size:16px;text-decoration:none}.link:hover{text-decoration:underline}.expandable-list{text-indent:10px}.expandable-list__items--hidden{display:none}.expandable-list__button{display:flex;text-align:left}.expandable-list__button a,.expandable-list__button>span{align-items:center;display:flex}.list{color:#343542;display:flex;flex-direction:column;line-height:20px;padding:6px 0 6px 6px;text-align:left;text-indent:29px}.expandable-icon{cursor:pointer;font-family:sans-serif;font-size:11px}.server-module__methods{display:flex}.server-module__methods--selected-true{background:linear-gradient(90deg,#deefe8 69%,#fff);background:linear-gradient(90deg,#d8d7e9 69%,#fff);border-radius:5px 2px 2px 5px;font-weight:700}.server-module__methods--selected-true>a{color:#575fc1}.server-module__docs-icon{display:inline;margin-left:auto}.server-module__docs-icon img{width:23px!important}.server-module__name--plugin a{color:#4caf50;font-weight:700}.system-nav{max-height:100vh;overflow:auto;padding:3rem 1rem}.system-nav__section{margin:21px 10px}.system-nav__object-title{display:inline}.system-nav__service-info{flex:1 1;min-width:0}.system-nav__url-row{align-items:center;display:flex;gap:5px;min-width:0}.system-nav__status-dot{background:#ccc;border-radius:50%;flex-shrink:0;height:7px;width:7px}.system-nav__status-dot--live{background:#4caf50}.system-nav__status-dot--down{background:#e05757}.system-nav__status-dot--unknown{background:#ccc}.system-nav__service-url{color:#607d8b!important;font-size:13px;text-decoration:none;word-break:break-all}.system-nav__link{align-items:center;display:flex;margin-left:3px;width:100%}.system-nav__link--project>a{color:#3f51b5!important;font-weight:700}.system-nav__link--selected-true{background:linear-gradient(90deg,#deefe8 69%,#fff);background:linear-gradient(90deg,#d8d7e9 69%,#fff);border-radius:5px 2px 2px 5px}.system-nav__link--selected-true>a{color:#575fc1!important;font-weight:700}.system-nav__link:hover .system-nav__delete-btn{opacity:1}.system-nav__delete-btn{align-items:center;background:none;border:none;border-radius:3px;color:#aaa;cursor:pointer;display:flex;flex-shrink:0;justify-content:center;margin-left:auto;opacity:0;padding:4px 5px;transition:opacity .15s,color .15s,background .15s}.system-nav__delete-btn:hover{background:#e53e3e14;color:#e53e3e;opacity:1}.doc-tabs{border-bottom:2px solid #e0e0e8;display:flex;gap:0;margin-bottom:16px}.doc-tab{background:none;border:none;border-bottom:2px solid #0000;color:#888;cursor:pointer;font-size:13px;margin-bottom:-2px;padding:6px 16px}.doc-tab--active{border-bottom-color:#6886ba;color:#6886ba;font-weight:600}.doc-tab:hover:not(.doc-tab--active){color:#555}.inline-logs{max-height:calc(100vh - 220px);overflow-y:auto}.inline-logs__empty{color:#aaa;font-size:13px;padding:16px 4px}.documentation-view{color:#000;padding-top:2rem}.documentation-view__parameter{color:#3dceac;font-weight:700}.documentation-view__data-table{margin-bottom:30px}.documentation-view__title{align-items:flex-start;color:#454c69;display:flex;margin-left:4px}.documentation-view__parentheses{font-size:26px}.description-box{width:100%}.description-box__textbox{background:#fff;border:none;border-bottom:1px solid #07625a;border-radius:2px;color:#000;font-size:13px;font-size:15px;font-weight:500;max-width:100%;min-height:70vh;min-width:100%;outline:none;padding:38px;resize:none}.edit-box{background:#fff;border:2px solid #f1f1f1;border-radius:13px;max-height:80vh;overflow:scroll;width:100%}.edit-box--read:hover{border:2px dashed #8b97ba;cursor:pointer}.edit-box__main{border:2px dashed #0000}.edit-box__form--hidden,.edit-box__main--hidden{display:none}.edit-box__button{display:flex;flex-direction:row;justify-content:flex-end;padding:6px 15px;width:100%}.button{background:linear-gradient(180deg,#f9f9f9 5%,#e9e9e9);border:1px solid;border-radius:3px;color:#666;cursor:pointer;display:inline-block;font-family:Arial;font-size:15px;font-weight:700;margin:4px 10px;padding:6px 24px;text-decoration:none;text-shadow:0 1px 0 #fff}.button:hover{background:linear-gradient(180deg,#e9e9e9 5%,#f9f9f9);background-color:#e9e9e9}.button:active{position:relative;top:1px}.clear-button{align-self:flex-end;background:#607d8b;border-radius:17px;color:#fff;font-weight:600;padding:0 8px}.clear-button>img{padding-top:2px;width:13px}.title{color:#0e886b;font-family:sans-serif;font-size:28px;position:relative}.markdown{background-color:#fff;font-size:15px;line-height:1.6;padding:30px}.markdown>:first-child{margin-top:0!important}.markdown>:last-child{margin-bottom:0!important}.markdown a{color:#4183c4}.markdown a.absent{color:#c00}.markdown a.anchor{bottom:0;cursor:pointer;display:block;left:0;margin-left:-30px;padding-left:30px;position:absolute;top:0}.markdown h1,.markdown h2,.markdown h3,.markdown h4,.markdown h5,.markdown h6{-webkit-font-smoothing:antialiased;color:#5960b6!important;cursor:text;font-weight:700;margin:20px 0 10px;padding:0;position:relative}.markdown h1:hover a.anchor,.markdown h2:hover a.anchor,.markdown h3:hover a.anchor,.markdown h4:hover a.anchor,.markdown h5:hover a.anchor,.markdown h6:hover a.anchor{text-decoration:none}.markdown h1 code,.markdown h1 tt,.markdown h2 code,.markdown h2 tt,.markdown h3 code,.markdown h3 tt,.markdown h4 code,.markdown h4 tt,.markdown h5 code,.markdown h5 tt,.markdown h6 code,.markdown h6 tt{font-size:inherit}.markdown h1{color:#000;font-size:28px}.markdown h2{border-bottom:1px solid #ccc;color:#000;font-size:24px}.markdown h3{font-size:18px}.markdown h4{font-size:16px}.markdown h5,.markdown h6{font-size:14px}.markdown h6{color:#777}.markdown blockquote,.markdown dl,.markdown li,.markdown ol,.markdown p,.markdown pre,.markdown table,.markdown ul{margin:15px 0}.markdown hr{border:0;border-bottom:1px solid;color:#ccc;height:4px;padding:0}.markdown a:first-child h1,.markdown a:first-child h2,.markdown a:first-child h3,.markdown a:first-child h4,.markdown a:first-child h5,.markdown a:first-child h6,.markdown>h1:first-child,.markdown>h1:first-child+h2,.markdown>h2:first-child,.markdown>h3:first-child,.markdown>h4:first-child,.markdown>h5:first-child,.markdown>h6:first-child{margin-top:0;padding-top:0}.markdown h1 p,.markdown h2 p,.markdown h3 p,.markdown h4 p,.markdown h5 p,.markdown h6 p{margin-top:0}.markdown li p.first{display:inline-block}.markdown li{margin:0}.markdown ol,.markdown ul{padding-left:30px}.markdown ol :first-child,.markdown ul :first-child{margin-top:0}.markdown dl{padding:0}.markdown dl dt{font-size:14px;font-style:italic;font-weight:700;margin:15px 0 5px;padding:0}.markdown dl dt:first-child{padding:0}.markdown dl dt>:first-child{margin-top:0}.markdown dl dt>:last-child{margin-bottom:0}.markdown dl dd{margin:0 0 15px;padding:0 15px}.markdown dl dd>:first-child{margin-top:0}.markdown dl dd>:last-child{margin-bottom:0}.markdown blockquote{border-left:3px solid #c3c3c3;color:#777;font-size:14px;text-indent:8px}.markdown blockquote>:first-child{margin-top:0}.markdown blockquote>:last-child{margin-bottom:0}.markdown table{border-collapse:collapse;padding:0}.markdown table tr{background-color:#fff;border-top:1px solid #ccc;margin:0;padding:0}.markdown table tr:nth-child(2n){background-color:#f8f8f8}.markdown table tr th{font-weight:700}.markdown table tr td,.markdown table tr th{border:1px solid #ccc;margin:0;padding:6px 13px}.markdown table tr td :first-child,.markdown table tr th :first-child{margin-top:0}.markdown table tr td :last-child,.markdown table tr th :last-child{margin-bottom:0}.markdown img{max-width:100%}.markdown span.frame,.markdown span.frame>span{display:block;overflow:hidden}.markdown span.frame>span{border:1px solid #ddd;float:left;margin:13px 0 0;padding:7px;width:auto}.markdown span.frame span img{display:block;float:left}.markdown span.frame span span{clear:both;color:#333;display:block;padding:5px 0 0}.markdown span.align-center{clear:both;display:block;overflow:hidden}.markdown span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown span.align-center span img{margin:0 auto;text-align:center}.markdown span.align-right{clear:both;display:block;overflow:hidden}.markdown span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown span.align-right span img{margin:0;text-align:right}.markdown span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown span.float-left span{margin:13px 0 0}.markdown span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown code,.markdown tt{background-color:#efeeee;border-radius:3px;color:#3f51b5;font-size:14px;margin:0 2px;padding:2px 3px;white-space:nowrap}.markdown pre code{background:#0000;border:none;margin:0;padding:0;white-space:pre}.markdown .highlight pre,.markdown pre{font-size:13px}.markdown pre code,.markdown pre tt{background-color:#0000;border:none}.markdown sup{font-size:.83em;line-height:0;vertical-align:super}.markdown *{-webkit-print-color-adjust:exact}@media screen and (min-width:914px){.markdown body{margin:0 auto;width:854px}}@media print{.markdown pre,.markdown table{page-break-inside:avoid}.markdown pre{word-wrap:break-word}}.logs-table-header{display:flex;width:100%}.logs-table-header .log-th{flex:1 1}.logs-table{font-family:monospace;font-size:13px;width:100%}.logs-table .log-row{display:flex;width:100%}.logs-table .log-row--expanded{display:block}.logs-table .log-cell{flex:1 1}.log-th{background:#f5f5fa;border-bottom:2px solid #e0e0e8;color:#888;font-size:11px;font-weight:700;letter-spacing:.04em;padding:7px 10px;text-align:left;text-transform:uppercase;white-space:nowrap}.log-th--time{min-width:80px}.log-th--project,.log-th--service{min-width:130px}.log-th--method{min-width:160px}.log-th--level{min-width:70px}.log-th--traceid{color:#9494b7;flex:0 0 110px;font-size:10px;letter-spacing:.02em}.log-th--dynamic{flex:0 0 120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.log-th--dynamic,.log-th--filtered{color:#7070a0;font-style:normal;font-weight:600;letter-spacing:0;text-transform:none}.log-row{border-bottom:1px solid #ebebf0}.log-row--dim .log-level{opacity:.55}.log-row--clickable{cursor:pointer}.log-row--clickable:hover .log-cell{background:#e4e4f4}.log-row--active .log-cell{background:#d0d0ec!important;opacity:1!important}.log-row--expanded{background:#f7f7fb;cursor:pointer}.log-row--expanded:hover{background:#eeeef8}.log-cell{padding:5px 10px;vertical-align:top;white-space:nowrap}.log-cell--time{color:#888;min-width:80px}.log-cell--project,.log-cell--service{color:#57a;min-width:130px}.log-cell--method{color:#333;min-width:160px}.log-cell--level{min-width:70px}.log-cell--msg{color:#555;max-width:360px;white-space:normal}.log-cell--traceid{color:#9494b7;flex:0 0 110px;font-family:monospace;font-size:10px}.log-cell--dynamic{color:#7070a0;flex:0 0 100px;font-size:11px;overflow:hidden;text-overflow:ellipsis}.log-cell--filtered{color:#7070a0;font-weight:600}.log-level{border-radius:3px;display:inline-block;font-size:11px;font-weight:600;padding:1px 6px;text-transform:uppercase}.log-level--dim{background:#eee;color:#999}.log-level--info,.log-level--log{background:#e8f0fe;color:#3367d6}.log-level--warn{background:#fef9e7;color:#d4a017}.log-level--error{background:#fdecea;color:#c62828}.log-level--debug{background:#e8f5e9;color:#2e7d32}@keyframes log-row-appear{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}.log-row--new{animation:log-row-appear .35s ease-out}.log-duration{color:#999;font-size:11px;margin-left:6px}.log-cell--detail{padding:0!important}.log-data-wrap{position:relative}.log-data-copy{background:#ffffff1f;border:1px solid #fff3;border-radius:4px;color:#cdd6f4;cursor:pointer;font-size:11px;padding:2px 8px;position:absolute;right:14px;top:10px;z-index:1}.log-data-copy:hover{background:#ffffff38}.log-data{background:#1e1e2e;border-radius:4px;color:#cdd6f4;font-family:monospace;font-size:12px;margin:0;max-height:60vh;overflow:auto;padding:10px 14px}.logs-page{background:#f5f5f5;display:flex;flex-direction:column;height:100vh;overflow:hidden;padding-top:61px}.logs-back{background:none;border:none;color:#6886ba;cursor:pointer;font-size:13px;left:20px;padding:0;position:absolute}.logs-back:hover{text-decoration:underline}.logs-title{margin-right:10px}.logs-heading,.logs-title{color:#6886ba;font-family:Malkor;font-size:28px;text-shadow:1px 1px 2px #d6cbca}.logs-heading{margin-left:10px}.logs-sticky-area{background:#fff;border-bottom:1px solid #e0e0e8;flex-shrink:0;min-height:80px}.logs-toolbar{align-items:center;background:#fff;border-bottom:1px solid #f0f0f0;display:flex;gap:10px;padding:10px 20px}.logs-toolbar select{background:#fafafa;border:1px solid #ccc;border-radius:4px;color:#333;font-size:13px;padding:4px 8px}.logs-count{color:#999}.logs-count,.logs-quick-filter{font-family:monospace;font-size:12px}.logs-quick-filter{align-items:center;background:#e8f0fe;border:1px solid #6886ba;border-radius:12px;color:#3367d6;cursor:pointer;display:inline-flex;gap:5px;padding:3px 10px}.logs-quick-filter:hover{background:#d0e0fc}.logs-quick-filter--or{background:#e8f5e9;border-color:#4caf50;color:#2e7d32}.logs-quick-filter--or:hover{background:#d4edda}.logs-filter-op{color:#9494b7;font-size:11px;font-weight:700;padding:0 2px}.logs-filter-op,.logs-filter-paren{font-family:monospace;-webkit-user-select:none;user-select:none}.logs-filter-paren{color:#b0b0cc;font-size:13px;font-weight:400}.logs-reset-btn{background:#fff;border:1px solid #9494b7;border-radius:4px;color:#9494b7;cursor:pointer;font-size:13px;padding:4px 14px}.logs-reset-btn:hover{background:#9494b7;color:#fff}.logs-clear-btn{background:#fff;border:1px solid #d9534f;border-radius:4px;color:#d9534f;cursor:pointer;font-size:13px;margin-left:0;padding:4px 14px}.logs-clear-btn:hover{background:#d9534f;color:#fff}.dashboard{background:#fff;min-height:180px;padding:10px 20px}.dashboard__panels{align-items:flex-start;display:flex;flex-wrap:nowrap;gap:12px;overflow-x:auto;padding-bottom:6px}.dashboard__add{align-self:flex-start;background:#f0f0f8;border:1px dashed #9494b7;border-radius:4px;color:#6886ba;cursor:pointer;font-size:12px;margin-top:2px;padding:5px 12px}.dashboard__add:hover{background:#e4e4f0}.dash-panel{background:#fafafa;border:1px solid #e0e0e8;border-radius:6px;display:flex;flex-direction:column;max-width:260px;min-width:180px;overflow:hidden}.dash-panel.dash-panel--wide{max-width:420px}.dash-panel__header{align-items:center;background:#f0f0f8;color:#555;display:flex;flex-shrink:0;font-size:12px;font-weight:600;gap:6px;justify-content:space-between;padding:7px 10px}.dash-panel__field-select{background:#0000;border:none;color:#444;cursor:pointer;flex:1 1;font-size:12px;min-width:0}.dash-panel__remove{background:none;border:none;color:#aaa;cursor:pointer;flex-shrink:0;font-size:14px;line-height:1;padding:0 2px}.dash-panel__remove:hover{color:#c62828}.dash-panel__body{max-height:150px;overflow-y:auto}.dash-panel__table{border-collapse:collapse;font-family:monospace;font-size:12px;width:100%}.dash-panel__row{cursor:pointer}.dash-panel__row:hover td{background:#e8e8f4}.dash-panel__row--active td{background:#d0d8f0}.dash-panel__row--faded{cursor:default;opacity:.35;pointer-events:none}.dash-panel__val{color:#333;max-width:180px;overflow:hidden;padding:4px 10px;text-overflow:ellipsis;white-space:nowrap}.dash-panel__count{color:#6886ba;font-weight:600;padding:4px 10px 4px 0;text-align:right;white-space:nowrap}.dash-panel__empty{color:#bbb;font-size:12px;margin:0;padding:8px 10px}.field-analyzer__crumbs{flex:1 1;font-size:11px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.field-analyzer__crumb{color:#6886ba;cursor:pointer;font-weight:600}.field-analyzer__crumb:hover{text-decoration:underline}.field-analyzer__crumb--leaf{color:#777;cursor:default;font-weight:400}.field-analyzer__crumb--leaf:hover{text-decoration:none}.field-analyzer__drill{color:#9494b7;font-size:10px}.field-analyzer__search{background:#0000;border:none;color:#333;font-family:monospace;font-size:12px;outline:none;padding:0;width:100%}.field-analyzer__search::placeholder{color:#bbb;font-style:italic}.field-analyzer__apply{color:#6886ba;cursor:pointer;font-weight:700}.field-analyzer__apply:hover{color:#3367d6}.field-analyzer__conj{align-items:center;background:#e8f0fe;border:1px solid;border-radius:3px;color:#3367d6;cursor:pointer;display:flex;flex-shrink:0;font-family:monospace;font-size:11px;font-weight:700;height:20px;justify-content:center;padding:0;width:20px}.field-analyzer__conj:hover{opacity:.75}.field-analyzer__conj--or{background:#e8f5e9;color:#2e7d32}.dash-panel__row--search{background:#f7f7fb;border-bottom:1px solid #e0e0e8}.dash-panel__row--search:hover td{background:#f0f0f8}.dash-panel__row--date .dash-panel__val--date-label{color:#9494b7;font-size:11px;font-style:italic;width:36px}.dash-panel__row--date .dash-panel__val--date-input{padding:3px 6px}.dash-panel__row--date .dash-panel__val--date-input input[type=datetime-local]{background:#f7f7fb;border:1px solid #d0d0e8;border-radius:3px;color:#333;font-family:monospace;font-size:11px;padding:2px 4px;width:100%}.dash-panel__row--date .dash-panel__val--date-input input[type=datetime-local]:focus{border-color:#9494b7;outline:none}.dash-panel__row--presence{cursor:pointer}.dash-panel__row--presence .dash-panel__val--presence{color:#9494b7;font-size:11px;font-style:italic}.dash-panel__row--presence:hover td{background:#eeeef8}.dash-panel__row--divider td{background:#e0e0e8;height:1px;padding:0}.logs-body{flex:1 1;overflow-x:auto;overflow-y:auto;padding-bottom:50vh}.logs-monitor-btn{background:#fff;border:1px solid #9494b7;border-radius:4px;color:#9494b7;cursor:pointer;font-family:monospace;font-size:13px;padding:4px 12px}.logs-monitor-btn:hover{background:#f0f0f8}.logs-monitor-btn--on{background:#e8f5e9;border-color:#4caf50;color:#2e7d32}.logs-monitor-btn--on:hover{background:#d4edda}.logs-empty{color:#aaa;font-size:14px;padding:24px 20px}.expandable-section{margin-bottom:6px;width:100%}.expandable-section__items--hidden{display:none}.expandable-section__title{display:flex;margin-bottom:7px;position:relative}.expandable-section__title__btn{cursor:pointer}.expandable-section__btn--hide-true{visibility:hidden}.test-caption{align-items:center;display:flex;font-family:sans-serif;font-size:16px;font-weight:400;margin:0 4px;padding:0 8px;width:100%}.test-caption__title{color:#0d8065}.test-caption__description-input{flex:1 1;padding-left:5px}.test-caption__description-input input{background:#e9e9e9;border:none;border-radius:41px;color:#5a77e5;color:#676767;font-size:16px;line-height:19px;text-indent:10px;text-overflow:ellipsis;width:104%}.test-caption__description-input input::placeholder{color:#bebebe;font-style:italic;font-weight:400}.test-caption__description-input--visible-false{display:none}.auto-complete{display:inline;display:initial;position:relative}.auto-complete__suggestions{box-shadow:1px 3px 4px #736c6c;display:grid;font-family:monospace;left:0;max-height:365px;overflow-y:auto;position:absolute;top:19px;z-index:1}.auto-complete__suggestion{background:#fff;cursor:pointer;display:inline-flex;padding:6px 7px;width:calc(300px + 1rem)}.auto-complete__suggestion--active,.auto-complete__suggestion:hover:not(.auto-complete__suggestion--empty){background-color:#cbcbff;background-color:#dadaed;color:#5960b6;color:#3f495d;font-weight:100;font-weight:700}.auto-complete__suggestion--empty{justify-content:center}.json-text-box{position:relative}.json-text-box__textbox{border:1px solid #8ea8eb;margin-top:6px;max-width:100%;min-height:100px;min-width:100%}.json-text-box__btn-container{position:absolute;right:1px;top:9px}.json-text-box__btn{border-radius:1px;cursor:pointer;font-family:system-ui;font-weight:500;margin-left:4px;padding:2px 6px}.json-text-box__btn:active{position:relative;top:1px}.json-text-box__btn--is-json-true{background:#25d0a8;color:#fff}.json-text-box__btn--is-json-false{background:#cfc2c2;color:#8c3c3c;text-decoration:line-through}.json-text-box__btn--cancel{background:#ff6b6b;color:#fff}.type-selector{-webkit-appearance:none;appearance:none;background:none;border:none;color:blue;cursor:pointer;font-family:SF Mono,monospace;outline:none}.switch{display:inline-block;height:33px;position:relative;width:60px}.switch input{height:0;opacity:0;width:0}.slider{background-color:#a78686;background-color:#6e6e78;bottom:0;cursor:pointer;left:0;right:0;top:0}.slider,.slider:before{position:absolute;transition:.4s}.slider:before{background-color:#fff;bottom:4px;content:"";height:26px;left:4px;width:26px}input:checked+.slider{background-color:#29ab8c}input:focus+.slider{box-shadow:0 0 1px #29ab8c}input:checked+.slider:before{transform:translateX(26px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}.args{display:inline;width:100%}.args__add-btn{background:#5a77e5;border-radius:21px;color:#fff;font-family:monospace;font-size:16px;font-weight:700;line-height:16px;margin:0 5px;padding:0 3px}.args__data{background:#cecee3;border-radius:7px;margin:2px;padding:11px;position:relative}.args__data__delete-btn{border-radius:0 7px 0 0!important;padding:0 5px 1px!important;right:0!important;top:0!important}.args__name{white-space:nowrap}.args__name__text{background:#5a77e5;border-radius:100px;color:#fff;cursor:pointer;display:inline-block;font-weight:700;margin:1px 0;padding:2px 10px}.args__from-container{display:flex}.args__form--is12{margin-top:10px}.args__form__undefined{color:#5a5a5a}.args__form__input{background:none;border:none;border-bottom:1px solid #9797d1;font-family:monospace;font-size:14px}.args__form__input--number{color:#9741ed;font-weight:700}.args__form__input--string,.args__form__input--target{color:#cf5f2e;font-style:italic;height:31px;max-height:320px;max-width:100%;min-height:31px;min-width:100%;text-indent:5px}.args__form__input--target{color:#009572;font-weight:700}.args__form__input--date{color:#9f4040;margin-top:6px}.args__form__value--boolean{font-weight:700;position:relative;top:7px}.args__form__value--boolean--true{color:#2eab8c;margin-right:5px}.args__form__value--boolean--false{color:#d52518}.args__quote{color:#209cff;font-size:21px;line-height:1px}.args__type{text-align:center}.args__name-display{display:inline-block;margin-right:4px}.args__expand-btn{color:#0035cf61;text-shadow:1px 1px 1px #cfcfcf}.args__add-json-btn{border-radius:2px;color:#0d8065;padding:2px 3px;position:absolute;right:0;top:6px}.args__add-json-btn:hover{text-decoration:underline}.args__json-txb--show-false{display:none!important}.args__value{padding:14px}.args__value--hide{display:none}.args__value__number{color:#9741ed;font-weight:700}.args__value__string{color:#cf5f2e;white-space:pre-line}.args__value__date{color:#9f4040}.args__value__undefined{color:#5a5a5a}.args__value__object{padding:0}.args__value__boolean{font-weight:700}.args__value__boolean--true{color:#207844}.args__value__boolean--false{color:#cf1515}.scratchpad{--text-length:auto;overflow-wrap:anywhere;width:100%}.scratchpad__test-data-container{position:relative;width:100%}.scratchpad__test-data{background:#e9e9e9;border-radius:5px 5px 0 0;padding:25px 15px}.scratchpad__test-data__parentheses{font-size:19px}.scratchpad__response-data{background:#fff;border-left:1px solid #e9e9e9;border-right:1px solid #e9e9e9;padding:12px 15px;position:relative}.scratchpad__response-data--visible-false{display:none}.scratchpad__response-data__clear-btn{color:#c50000;font-family:sans-serif;position:absolute;right:9px;top:5px}.scratchpad__response-value{align-items:flex-start;color:#223a95;color:#a954ff;display:flex;flex-wrap:wrap;font-family:FS Mono,monospace;font-weight:500;margin:5px 0 0 5px}.scratchpad__response-value span.collapsed-icon{left:7px;position:relative;top:2px}.scratchpad__response-type{color:#a954ff;font-size:15px;font-weight:700}.scratchpad__btn-container{position:absolute;right:4px;top:4px}.scratchpad__btn-container>span{margin:0 5px}.scratchpad__run-test-btn{cursor:pointer}.scratchpad__test-method-input{background:none;border:none;color:#223a95;font-family:SF Mono,monospace;font-size:17px;max-width:100%;text-indent:0;text-overflow:clip;width:var(--text-length)}.scratchpad__test-method-input:focus{background:#fff}.scratchpad__eval-btn{bottom:3px;color:#3f51b5;font-size:15px;font-weight:700;position:absolute;right:7px}.doc-icon{display:inline-flex;vertical-align:middle}.doc-icon img{width:20px}.delete-button{background:#fff;border-radius:40px;color:#c50000;font-family:system-ui;font-weight:300;padding:6px 3px}.error-message{color:#ff5722;font-family:monospace;padding:4px 25px;word-break:break-word}.error-message__message-container{background:#ededed}.error-message__message{background:#ededed;border-radius:5px;padding:6px 23px}.error-message__namespace{color:#b136c6;font-weight:600}.error-message__expected{color:#0b8b22;font-weight:700}.validation-input{display:flex;margin:3px 0}.validation-input__input,.validation-input__selector{background:none;border:none;font-family:monospace;font-size:14px}.validation-input__selector{-webkit-appearance:none;appearance:none;border-right:none;color:#009688;cursor:pointer;font-weight:700;outline:none;padding:3px;text-indent:5px}.validation-input__selector:hover{background:#b3c1e8;border-radius:33px}.validation-input__input{color:#0d8065;outline:none;padding:4px}.validation-input__value--boolean{font-weight:700;position:relative;top:7px}.validation-input__value--boolean--true{color:#207844}.validation-input__value--boolean--false{color:#cf1515}input:-webkit-autofill{border:3px solid blue}input:autofill{border:3px solid blue}.count{background:#dcdcdc;border-radius:12px;color:#777!important;font-size:14px;font-weight:700;margin-left:5px;padding:0 9px}.count,.count__stat{display:inline-block}.count__stat{padding:3px 0}.count__error{background:#ffc4b1;color:#f44336!important}.count__caution{color:#bcb047!important}.count__passed{background:#6fc878;color:#fff!important}.test-container__title-section{display:flex;font-size:16px;margin:0 4px;padding:0 8px;width:100%}.test-container__test-description-input{flex:1 1}.test-container__test-description-input input{background:none;border:none;color:#5a77e5;font-weight:700;text-overflow:ellipsis;width:105%}.multi-test-section{width:100%}.multi-test-section__test-data{background:#dadada;border-radius:5px;padding:12px 15px;width:100%}.multi-test-section__add-btn{background:#cecee3;border-radius:21px;color:#5960b6;font-family:monospace;font-size:16px;font-weight:700;padding:0 4px}.evaluations{background:#25d0a8;background:#76b1f7;background:#ced8f4;border-radius:0 0 4px 4px;font-family:monospace;overflow-wrap:anywhere;padding:12px 18px}.evaluations--visible-false{display:none}.evaluations__row{margin:4px;padding:8px 5px}.evaluations__title{--type-width:auto;margin-left:10px;width:100%}.evaluations__title select{width:var(--type-width)}.evaluations__input>input{background:#a5ffda;border:1px solid #383836;box-sizing:border-box;margin:8px 0;padding:6px 9px;width:100%}.evaluations__input--visible-false{display:none}.evaluations__add-validation-btn{background:#5a77ca;border-radius:16px;color:#fff;font-weight:700;padding:0 5px 1px}.evaluations__validation-container{display:inline-grid;margin-left:4px}.evaluations__add-btn-container{display:inline-grid}.evaluations__validation{border-bottom:1px solid #9797d1}.evaluations__validation__delete-btn{color:#6565a1;display:inline;font-family:system-ui;font-size:15px;margin-left:6px}.evaluations__validation__delete-btn:hover{color:#c30f0f}.evaluations__validation__input{display:inline-flex}.evaluations__type-error-msg{display:none}.evaluations__type-error-msg--true{display:inline;display:initial}.evaluations--error-true,.evaluations--error-true>*{color:#cd4343;font-weight:700}.evaluations__total{color:gray}.evaluations__checkbox{cursor:pointer}.evaluations__index-button{align-items:center;display:flex;flex-direction:row}.evaluations__index-button.btn:hover{color:#2326fe;color:#ff5722;color:#c717e5;color:#1131df;font-weight:700}.evaluations__index-button--indexed-true{font-weight:700}.evaluations__namespace{display:inline-flex;flex-wrap:wrap}.evaluations__index-input{height:15px;width:45px}.evaluations__brackets{align-self:baseline;color:#000;font-size:14px;font-weight:700}.evaluations__index-checkbox{cursor:pointer}.evaluations__random{align-self:baseline;color:#2b9b2c;font-style:italic;font-weight:700}.evaluations__clear-error{color:gray;font-size:16px}.evaluations__clear-error:hover{color:#000}.evaluations__add-index-btn{color:#2776ff;font-size:16px;font-weight:700}.test__buttons{justify-content:space-between;margin-bottom:3px}.test__buttons>span>span{margin:0 5px}.test__buttons>span{background:#e9e9e9;border-radius:41px;font-family:Helvetica,arial,sans-serif;margin-right:3px;padding:2px 11px}.test-panel{font-size:14px;max-height:100vh;overflow:auto;padding:2rem 1rem}.test-panel__section{margin-bottom:6px}.test-panel__section>section{width:100%}.test-panel__error-message{align-items:center;background:#e4d554;background:#d4d4d4;color:#c02a2a;display:flex;font-weight:700;padding:2px 8px!important}.test-panel__error-message--hide-true{opacity:0}.test-panel__error-message--error-false{color:green}.save-icon{height:16px}.test-summary{border:1px solid #dfdfdf;border-bottom:1px solid #e8e8e8;border-top:none;padding:8px 5px}.test-summary:last-child{border-bottom:1px solid #dfdfdf}.test-summary__actions{display:flex;font-weight:300;padding:3px 0}.test-summary__action-text{flex:1 1}.test-summary__method{align-items:flex-start;color:#223a95;color:#a954ff;display:flex;flex-wrap:wrap;font-family:FS Mono,monospace;font-weight:500;margin-bottom:10px;margin-left:10px}.test-summary__method span.collapsed-icon{left:7px;position:relative;top:2px}.test-summary__validations .expandable-icon{align-self:flex-end;margin-left:3px}.test-summary__failed-validations{color:#ff5722;font-family:monospace;padding:4px 25px}.test-summary__failed-validations--namespace{color:#a954ff;font-weight:700}.test-summary__header{align-items:center;display:flex}.test-summary__parameter{background:#fff;border:1px solid #fce8ff;border-radius:4px;display:inline-flex}.test-summary__comma{align-self:flex-end;color:green;font-size:17;font-weight:700;margin-right:3px}.test-summary__parentheses{align-self:flex-end;font-size:15px;font-weight:bolder;position:relative;top:-1px}.test-summary__results{color:#a954ff;font-weight:700}.test-summary__arrow{margin-right:10px}.test-summary__caption--Main{font-weight:700}.test-saved-section{border-top:1px solid #e9e9e9;padding-top:10px;width:100%}.test-saved-section__test-data{background:#dcdcdc;padding:12px 15px;width:100%}.test-saved-section__test-container{margin:5px 0}.test-saved-section__test-row{align-items:center;background:#e9e9e9;border:1px solid #e9e9e9;display:flex;padding:4px 5px}.test-saved-section__test-index{color:#4caf50;color:#3d3d3d;flex:1 1;font-size:14px;font-weight:600;padding:0 8px}.test-saved-section__test-title{color:#236382;flex:5 1}.test-saved-section__buttons{align-items:center;display:flex;flex:2 1;flex-direction:row;justify-content:space-around}.test-saved-section__top-buttons{flex:none;width:77px}.test-saved-section__clear-button{align-self:flex-end;background:#607d8b;border-radius:17px;color:#fff;font-weight:600;padding:0 8px}.test-saved-section__clear-button>img{padding-top:2px;width:13px}.test-saved-section__delete-prompt{color:#c02a2a;font-weight:700}.test-saved-section__delete-btn{background:gray;border-radius:4px;color:#fff;margin:0 5px;padding:0 6px}.test-saved-section__delete-btn--yes:hover{color:#c02a2a}.react-json-view{font-size:14px}.status-indicator{align-items:center;align-self:center;background:#22886b;background:#292936;border-radius:41px;color:#e9e9e9;color:#3bcaa1;display:flex;font-family:sans-serif;font-weight:500;font-weight:700;line-height:19px;margin:0 5px;padding:3px 0;text-align:center;text-overflow:ellipsis}.status-indicator__title{padding:0 13px}.status-indicator__clear-button{border-radius:0 40px 40px 0;color:#fff;display:flex!important;font-family:system-ui;padding:0 11px 1px 0}.status-indicator__clear-button:hover{color:#f10;font-weight:300}
|
|
9
|
-
/*!
|
|
10
|
-
* Bootstrap Grid v4.0.0 (https://getbootstrap.com)
|
|
11
|
-
* Copyright 2011-2018 The Bootstrap Authors
|
|
12
|
-
* Copyright 2011-2018 Twitter, Inc.
|
|
13
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
14
|
-
*/html{-ms-overflow-style:scrollbar;box-sizing:border-box}*,:after,:before{box-sizing:inherit}.container{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media(min-width:576px){.container{max-width:540px}}@media(min-width:768px){.container{max-width:720px}}@media(min-width:992px){.container{max-width:960px}}@media(min-width:1200px){.container{max-width:1140px}}.container-fluid{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.no-gutters{margin-left:0;margin-right:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-left:0;padding-right:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{min-height:1px;padding-left:15px;padding-right:15px;position:relative;width:100%}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;max-width:none;width:auto}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media(min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;max-width:none;width:auto}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media(min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;max-width:none;width:auto}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media(min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;max-width:none;width:auto}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media(min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;max-width:none;width:auto}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media(min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media(min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media(min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media(min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media(min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media(min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media(min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media(min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.system-viewer{background:#f5f5f5;height:100vh;overflow:hidden;padding-top:61px}.system-viewer>div{max-width:100vw}.btn{cursor:pointer;display:inline-block}.btn:active{transform:translateY(-2px)}.delete-btn{background:#fff;border-radius:0 40px 40px 0;color:#c50000;font-family:system-ui;font-weight:300;opacity:0;padding:0 6px 2px;position:absolute;right:-4px;top:1px}.delete-btn:hover{opacity:1}.page-header{align-items:center;background:#fff;border-bottom:1px solid #9494b7;display:flex;height:62px;justify-content:center;padding:0 35px;position:absolute;top:0;width:100vw}.logs-nav-link{background:#f4f6fb;border:1.5px solid #b0bed8;border-radius:20px;color:#6886ba;font-family:Malkor;font-size:16px;padding:5px 16px;position:absolute;right:35px;text-decoration:none;transition:background .15s,border-color .15s}.logs-nav-link:hover{background:#e4eaf8;border-color:#6886ba}.scroll-buffer{height:20vh}::-webkit-input-placeholder{font-style:italic}:-moz-placeholder,::-moz-placeholder{font-style:italic}:-ms-input-placeholder{font-style:italic}@keyframes bounce{to{transform:scale(1.2)}}
|
|
15
|
-
/*# sourceMappingURL=main.1916c1d1.css.map*/
|