Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 12092 байт. Загружен за: 0сек.
Проверяемая страница не запрещена в robots.txt.
Цепочка редиректов для файла robots.txt:
http://prompt.ql.app/robots.txt
302 Found
https://prompt.ql.app/robots.txt
200 OK
Показать содержимое robots.txt
<!doctype html>
<html lang="en">
<head>
<!-- Google Tag Manager -->
<!-- Task: security/integrity-protections-q6 — SRI intentionally NOT applied to
gtm.js. Its contents change whenever the GTM container is republished, so
a pinned integrity hash would block the script after the next config
update and silently break analytics. We rely on CSP allow-listing of
www.googletagmanager.com instead (see tools/docker/default.conf). -->
<script>
(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-PWWRVV9K');
</script>
<!-- End Google Tag Manager -->
<base href="/" />
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, viewport-fit=cover">
<!-- Task: android-boot-loader-inset-jump — flip Capacitor's Android inset handling to
edge-to-edge BEFORE the first paint.
@capacitor/android's SystemBars plugin (insetsHandling: 'css') runs in two layout
phases. Until `hasViewportCover` is true it pads the WebView's parent by the system
bar insets and reports `--safe-area-inset-*` as 0px; after, it drops that padding,
the WebView spans the whole window, and the real insets arrive as CSS vars. The flag
is only set by the plugin's `onDOMReady`, which native-bridge.js binds to
DOMContentLoaded — and DOMContentLoaded waits for the deferred app-bundle module
script, ~915ms in on a Galaxy S24.
Measured cost of flipping that late: dropping the parent padding translates the
WebView surface up by the 34dp status-bar inset immediately, but the WebView's
re-layout to the taller viewport and the CSS var injection land ~183ms (11 frames at
60fps) later. In that window the page is composited at its old height from the new
origin, so the boot loader visibly jumps up 34dp and drops back. Calling onDOMReady
ourselves here — the meta viewport above it is parsed, which is all the plugin's
check reads — moves the whole transition before anything is painted.
Guarded: the interface only exists on Android under this plugin, and the plugin's own
DOMContentLoaded call is idempotent, so if it ever goes away this is a no-op and we
are back to the current behaviour. -->
<script>
try {
if (window.CapacitorSystemBarsAndroidInterface) {
window.CapacitorSystemBarsAndroidInterface.onDOMReady();
}
} catch (e) {
/* non-fatal: boot must never depend on this */
}
</script>
<!-- TODO(security/integrity-protections-q6): Add an equivalent CSP meta
policy for Capacitor iOS/Android builds that load this HTML directly
and bypass the nginx response headers used by the web deployment. -->
<!-- Task: security/add-sri-google-fonts — Self-hosted font assets use ./
so they resolve correctly when the app is deployed under a subpath. -->
<link rel="preload" href="./fonts/archivo-normal-latin.woff2" as="font" type="font/woff2" crossorigin />
<link rel="preload" href="./fonts/geist-latin.woff2" as="font" type="font/woff2" crossorigin />
<link rel="preload" href="./fonts/geist-mono-latin.woff2" as="font" type="font/woff2" crossorigin />
<link rel="stylesheet" href="./fonts/fonts.css" />
<!-- Perspective.js is now loaded from local packages via Vite -->
<!-- Task: varun/improve-loading-states-ux — Single source of truth for loader CSS.
These classes are reused by the React LoadingMessageUI component. -->
<style>
@keyframes logo-pulse {
0%, 100% { opacity: 0.4; }
50% { opacity: 1; }
}
@keyframes bar-sweep {
0% { left: -55%; }
100% { left: 110%; }
}
.app-loader-logo {
animation: logo-pulse 2.6s ease-in-out infinite;
}
.app-loader-bar-fill {
animation: bar-sweep 2s cubic-bezier(0.4, 0, 0.2, 1) infinite;
}
</style>
<script type="module" crossorigin src="./assets/index-CgOgnTlw.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-NC2l1A8f.css">
</head>
<body>
<div id="root"></div>
<!-- Task: varun/improve-loading-states-ux — HTML loader visible before React mounts.
Removed by LoadingMessageUI on mount for seamless handoff. -->
<script>
(function() {
var isDark = false;
try {
var stored = localStorage.getItem('darkMode');
if (stored && stored.indexOf('dark') !== -1) isDark = true;
} catch(e) {}
var bg = isDark ? '#1a1a1a' : '#fff';
var fg = isDark ? '#e8e8e7' : '#1a1a1a';
var track = isDark ? '#333' : '#e8e8e7';
// Task: whitelabel-boot-branding — per-client loader mark. The white-label Vite
// plugin rewrites the `clientMark` line below to an inlined base64 data URI when
// WL_CLIENT_ID is set; for the public app it stays null and the built-in PromptQL
// glyph below is used. Inline is mandatory — this loader paints before React mounts,
// so a fetch or <img src> would flash and defeat the point.
// Rendered as a CSS mask, not an <img>, so the mark stays theme-recolourable via
// background-color, mirroring how the SVG is recoloured via `fill` (LoadingMessageUI
// repaints whichever form is present on colour-scheme change).
var clientMark = null; /* WL_LOADER_MARK */
// Task: whitelabel-color-loader-mark — full-colour variant, for clients whose brand
// mark is not a monochrome silhouette (a mask would flatten it to a solid blob).
// Rendered as an <img>, so it is deliberately NOT theme-recoloured — and it carries
// no `app-loader-mark` class, which is what keeps LoadingMessageUI's recolour off it.
var clientMarkColor = null; /* WL_LOADER_MARK_COLOR */
var logoHtml = clientMarkColor
? '<img src="' + clientMarkColor + '" alt="" width="48" height="48" style="width:48px;height:48px;object-fit:contain">'
: clientMark ? '<div class="app-loader-mark" style="width:48px;height:48px;background-color:' + fg + ';-webkit-mask:url(' + clientMark + ') center/contain no-repeat;mask:url(' + clientMark + ') center/contain no-repeat"></div>' : null;
var el = document.createElement('div');
el.id = 'initial-loader';
el.style.cssText = 'position:fixed;inset:0;z-index:200;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:20px;background:' + bg;
el.innerHTML = '<div class="app-loader-logo">' + (logoHtml || '<svg width="48" height="48" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M3.5779 8.35741C3.18916 9.28083 3 10.4559 3 11.8828C3 13.1949 3.16831 14.2956 3.51535 15.1877L3.5779 15.356C3.97707 16.2794 4.5237 16.9616 5.2282 17.4024C5.91185 17.8433 6.69976 18.0637 7.59193 18.0637C8.06409 18.0637 8.50645 18.022 8.91604 17.9267L9.08435 17.885C9.54607 17.7688 9.94524 17.5811 10.3027 17.3399C10.6185 17.109 10.8806 16.8364 11.1115 16.5207V21.6308H14.0531V5.91335H11.594L11.5732 6.0176L11.3736 7.44443C11.0057 6.89931 10.544 6.47931 9.97652 6.1859L9.86035 6.12335C9.21989 5.80909 8.51538 5.65121 7.74832 5.65121C6.77125 5.65121 5.93121 5.87164 5.22671 6.3125C4.50135 6.75335 3.95473 7.44591 3.57641 8.3589L3.5779 8.35741ZM11.1115 11.9885C11.1115 12.5545 11.0593 13.0698 10.9536 13.5107L10.9119 13.679C10.8166 14.0364 10.681 14.3507 10.5127 14.6024C10.3027 14.8958 10.0406 15.1162 9.73523 15.2741C9.41947 15.4215 9.03073 15.5049 8.58985 15.5049C7.93897 15.5049 7.44448 15.3783 7.08701 15.1475L7.01403 15.0954C6.67742 14.8541 6.43613 14.4966 6.28868 14.0141L6.2574 13.9202C6.10994 13.4168 6.02654 12.7868 6.02654 12.0421V11.7279C6.02654 10.9087 6.12037 10.2489 6.28868 9.72317C6.44656 9.19891 6.7087 8.83104 7.07659 8.60018L7.08701 8.58976C7.44448 8.34848 7.93748 8.21146 8.58985 8.21146C9.17818 8.21146 9.65183 8.34848 10.0287 8.61061C10.3861 8.88317 10.6587 9.27189 10.8478 9.79615C11.0162 10.31 11.11 10.9504 11.11 11.7264V11.9885H11.1115Z" fill="' + fg + '"/><path d="M16.0319 3V15.0208C16.0319 15.5138 16.1153 15.9859 16.2836 16.458C16.4728 16.9302 16.7886 17.3189 17.219 17.6227C17.6599 17.9265 18.2586 18.0636 18.9944 18.0636C19.2044 18.0636 19.4353 18.0427 19.6781 18.001C19.9193 17.9697 20.1398 17.928 20.3498 17.864C20.5807 17.8223 20.7698 17.7702 20.9277 17.7061L21.0007 17.6748V15.6076H19.8344C19.5291 15.6076 19.3295 15.5346 19.194 15.408C19.057 15.2606 18.984 15.0506 18.984 14.7572V3H16.0319Z" fill="' + fg + '"/></svg>') + '</div><div style="width:136px;height:2px;background:' + track + ';position:relative;overflow:hidden"><div class="app-loader-bar-fill" style="position:absolute;top:0;left:-55%;width:55%;height:100%;background:' + fg + '"></div></div>';
document.body.appendChild(el);
})();
</script>
</body>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PWWRVV9K" height="0" width="0"
style="display: none; visibility: hidden"></iframe></noscript>
<script>
const getEnv = (value, fallback) => {
if (value.startsWith('%VITE')) {
return fallback !== undefined ? fallback : undefined;
} else {
return value;
}
};
window.__env = {
VITE_CONSOLE_BASE_PATH: getEnv('/', '/'),
VITE_PROMPTQL_CONTROL_PLANE_HOST: getEnv('https://data.promptql.pro.hasura.io/graphql'),
VITE_PROMPTQL_CONSOLE_URL: getEnv('https://prompt.ql.app'),
VITE_DDN_CONSOLE_URL: getEnv('%VITE_DDN_CONSOLE_URL%'),
VITE_PROMPTQL_PLAYGROUND_HOST: getEnv('https://playground.promptql.pro.hasura.io'),
VITE_PROMPTQL_API_HOST: getEnv('https://api.promptql.pro.hasura.io'),
VITE_PROMPTQL_EVAL_HOST: getEnv('https://promptql.ddn.hasura.app/evals'),
VITE_CONTROL_PLANE_DATA_HOST: getEnv('data.pro.ql.app'),
VITE_CONTROL_PLANE_DATA_ANON_URL: getEnv('%VITE_CONTROL_PLANE_DATA_ANON_URL%'),
VITE_CONTROL_PLANE_DASHBOARD_HOST: getEnv('cloud.ql.app'),
VITE_CONTROL_PLANE_PROTOCOL: getEnv('https'),
VITE_CONSOLE_SENTRY_DSN: getEnv('https://3c3995a5fe95b4dd128c8a37b93db3a5@o417608.ingest.sentry.io/4506036694220800'),
VITE_ENABLE_SENTRY_LOGS: getEnv('true'),
VITE_POSTHOG_API_HOST: getEnv('https://analytics-posthog.hasura-app.io'),
VITE_POSTHOG_API_TOKEN: getEnv('phc_MZpdcQLGf57lyfOUT0XA93R3jaCxGsqftVt4iI4MyUY'),
VITE_STRIPE_PUBLISHABLE_KEY: getEnv('pk_live_51GwjuzLItHKS20xZhZpTayx4l6Rq1iEQZKGFcZvQqqa6vTkkPRWAdZFLs5BfK0MYuyIazeCwa9xOmWXiTy1LQgvq00JbGst7Ta'),
VITE_LAUNCH_DARKLY_CLIENT_ID: getEnv('6333225ef496a411faa378ad'),
VITE_CONTROL_PLANE_AUTH: getEnv('auth.pro.ql.app'),
VITE_PRIVATE_DDN: getEnv('%VITE_PRIVATE_DDN%'),
VITE_PRIVATE_DDN_OBSERVABILITY_ENABLED: getEnv('%VITE_PRIVATE_DDN_OBSERVABILITY_ENABLED%'),
VITE_OPEN_REPLAY_PROJECT_KEY: getEnv('osTbttJpcGpjFMscJW2p'),
VITE_OPEN_REPLAY_INGEST_POINT: getEnv('https://analytics-openreplay.hasura-app.io/ingest'),
VITE_IS_PROMPTQL_MODE: getEnv('%VITE_IS_PROMPTQL_MODE%'),
VITE_DISABLED_PROJECTS: getEnv('%VITE_DISABLED_PROJECTS%'),
VITE_MONITORING_GRAFANA_HOST: getEnv('https://grafana.metrics.pro.hasura.io/d/cemjjxgew7bwgf/promptql-metrics'),
VITE_WHITE_LABEL_BRAND_NAME: getEnv('%VITE_WHITE_LABEL_BRAND_NAME%'),
VITE_WHITE_LABEL_BRAND_LOGO: getEnv('%VITE_WHITE_LABEL_BRAND_LOGO%'),
VITE_OAUTH_CLIENT_ID: getEnv('2e126f16-0d98-4890-9431-f4065f133e73'),
VITE_AUTH_METHODS: getEnv('%VITE_AUTH_METHODS%'),
VITE_ASSETS_PUBLIC_URL_BASE: getEnv('https://storage.googleapis.com/hasura-promptql-assets-prod'),
VITE_TURNSTILE_SITE_KEY: getEnv('0x4AAAAAADsy_TOiX96NjTFT'),
VITE_RECAPTCHA_SITE_KEY: getEnv('6Lf3jF8tAAAAAPZ0FvXx5-mzEZ09udFny0rUpaVu'),
};
</script>
<!-- End Google Tag Manager (noscript) -->
</html>