The Page Agent is an AI assistant built into Bytebase. It lives in a floating chat window that’s available on every page — ask it anything in plain language, and it helps you get it done.
Bytebase has a lot of features, and it’s not always obvious how to accomplish what you’re trying to do — even when the feature you need is already there. You might know what you want (archive old rows, grant a teammate access to a project, fix a failing plan check) but not which page to open, which buttons to click, or which settings control the behavior you’re after. Or maybe you know exactly how to do it — you’d just rather hand it off and review the result instead of clicking through the flow yourself.The Page Agent is designed for both. It understands how Bytebase works end to end, so it can:
Show you the way — walk you through a workflow step by step when you want to do it yourself.
Do it for you — take the actions directly when you’d rather describe the outcome and check the result.
You stay in control: the agent shows each step it takes so you can follow along, and you can stop or redirect it at any time.
The Page Agent uses the same AI provider configuration as the rest of Bytebase. If you haven’t enabled it yet, follow the steps in AI Assistant to configure your OpenAI, Claude, Gemini, or Azure OpenAI credentials.Once AI is configured, the Page Agent is available from any page in the Bytebase console. Click the agent toggle in the dashboard header to open the chat window.
Chat window — A floating panel available from any page in the console. It stays open as you move between pages.
Agent loop — Runs in your browser. When you ask a question, the agent thinks about what to do, takes an action (reading the page, calling an API, navigating somewhere), observes the result, and repeats until it has a complete answer. Each step is shown in the chat.
AI backend — Bytebase routes your conversation to the AI provider configured in your workspace settings. Your credentials never leave your server.
The Page Agent operates within Bytebase’s existing safety mechanisms:
Uses your permissions. The agent can only perform actions your account is authorized for. If you can’t drop a table, neither can the agent.
Goes through the normal approval flow. Schema changes the agent creates are regular Bytebase issues — they respect your project’s approval policies, plan checks, and rollout gates. The agent cannot bypass these.
Audit-logged under your account. Every API call, issue creation, and permission change is recorded in the audit log with your user name.
Controlled by workspace AI settings. The Page Agent is available only when AI is enabled in your workspace. Disabling AI Assistant in Settings > General turns off the Page Agent along with other AI features.
Your issue failed a SQL review check and you want help understanding and fixing the violation.
You: Help me fix this plan check error.
Agent:(Reads the current page to inspect the issue and SQL review results)
Agent: The SQL review flagged a violation: “Do not apply functions or perform calculations on indexed fields in the WHERE clause.” The problem is in your INSERT…SELECT statement:
Wrapping created_at in YEAR() prevents the database from using the index on that column, forcing a full table scan. Here’s a rewrite that keeps the index usable:
INSERT INTO orders_archive (id, customer_id, created_at)SELECT id, customer_id, created_atFROM ordersWHERE created_at >= '2023-01-01' AND created_at < '2024-01-01';
Want me to update the SQL in the editor and re-run the check?
Other things you can ask:
“Why did the SQL review fail on this issue?”
“The plan check says I have a naming convention error — can you fix it?”
“Rewrite my migration to pass all the review checks”
A teammate needs access to a project, and you want to set it up without navigating to settings.
You: Give alice@example.com developer access to the Payment project.
Agent: I’ll add Alice as a project developer. Let me look up the project members API.
(Discovers the project IAM API → calls it to add the role binding)
Agent: Done! alice@example.com now has the Project Developer role on the Payment project. She can view databases, create issues, and run queries in SQL Editor.
The agent uses AI to plan and execute actions. Always review what it did — issue created, SQL written, permissions granted — before moving on.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Bytebase Docs","colors":{"primary":"#2b66ff","light":"#4faaff","dark":"#1c49be"},"logo":{"light":"https://mintcdn.com/dbx/vw8BbfZhlW9y-cr_/images/logo/logo-full.png?fit=max\u0026auto=format\u0026n=vw8BbfZhlW9y-cr_\u0026q=85\u0026s=894c5021793b82b6bcef8b09cef3d85d","dark":"https://mintcdn.com/dbx/vw8BbfZhlW9y-cr_/images/logo/logo-full-white.png?fit=max\u0026auto=format\u0026n=vw8BbfZhlW9y-cr_\u0026q=85\u0026s=9f660755d7e64c8f3d4882e66589af29"},"favicon":"https://mintcdn.com/dbx/otHCKEZkOwO4gA2D/favicon.svg?fit=max\u0026auto=format\u0026n=otHCKEZkOwO4gA2D\u0026q=85\u0026s=a7e205f761697f5ffcec570fa5de78b0","navbar":{"links":[{"href":"https://www.bytebase.com","label":"bytebase.com"}],"primary":{"type":"button","label":"Try Cloud","href":"https://cloud.bytebase.com/"}},"footer":{"socials":{"x":"https://x.com/bytebase","github":"https://github.com/bytebase/bytebase","linkedin":"https://linkedin.com/company/bytebase"}},"seo":{"metatags":{"canonical":"https://docs.bytebase.com"}},"icons":{"library":"lucide"},"integrations":{"ga4":{"measurementId":"G-4BZ4JH7449"}},"errors":{"404":{"redirect":false}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"dbx","hasAudioNarration":false,"actualSubdomain":"dbx","customDomains":["docs.bytebase.com"],"gitSource":{"type":"github","owner":"bytebase","repo":"bytebase.com","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae03028c71f9056d945c05b","collectionId":"ff67c486-1c2b-4d7a-a0ba-22e76946bc7c","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae03028c71f9056d945c05b"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae03028c71f9056d945c05b","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Changelog","count":53},{"language":"default","tag":"Change Management","count":46},{"language":"default","tag":"Get Started","count":43},{"language":"default","tag":"Tutorials","count":41},{"language":"default","tag":"Administration","count":32},{"language":"default","tag":"GitOps Workflow","count":24},{"language":"default","tag":"Access Control","count":23},{"language":"default","tag":"Security","count":19},{"language":"default","tag":"UI-Driven Workflow","count":15},{"language":"default","tag":"Install","count":11}]},"assistantConfig":{"enableAskAiButton":true,"enableAskAiSearchBar":false,"deflection":{"enabled":true,"email":"help@bytebase.com"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"demo-embed.css","content":".demo-embed{position:relative;display:block;margin:1.5rem 0;border:0;border-radius:0;cursor:zoom-in;text-decoration:none!important}.demo-embed img{display:block;width:100%;margin:0!important;border-radius:0!important}.demo-embed::after{content:\"Play the interactive demo\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);padding:.5rem .875rem .5rem 2.25rem;border:1px solid rgb(228 228 231);border-radius:9999px;background:rgb(255 255 255/.96) no-repeat .875rem center/1rem 1rem url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2318181b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M3 16v3a2 2 0 0 0 2 2h3M16 21h3a2 2 0 0 0 2-2v-3'/%3E%3C/svg%3E\");color:rgb(24 24 27);font-size:.8125rem;font-weight:500;line-height:1.25rem;box-shadow:0 2px 8px rgb(0 0 0/.12);transition:transform .15s ease}.demo-embed:hover::after{transform:translate(-50%,-50%) scale(1.04)}.demo-dialog{position:fixed;inset:0;margin:auto;width:min(96vw,calc((100vh - 5rem)*792/480),1352px);max-width:none;max-height:none;padding:0;border:0;background:0 0;box-shadow:none;overflow:visible}.demo-dialog::backdrop{background:rgb(255 255 255/.85);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}html.dark .demo-dialog::backdrop{background:rgb(9 9 11/.85)}.demo-dialog iframe{display:block;width:100%;aspect-ratio:792/480;border:0}.demo-dialog__close{position:fixed;top:1rem;right:1rem;display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;border:1px solid rgb(228 228 231);border-radius:9999px;background:#fff;color:rgb(24 24 27);font-size:1.25rem;line-height:1;cursor:pointer}html.dark .demo-dialog__close{border-color:rgb(63 63 70);background:rgb(24 24 27);color:#fff}"}],"page":{"pagePath":"page-agent","slug":"/page-agent","pageMetadata":{"title":"Page Agent","description":null,"href":"/page-agent"},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,blockquote:`blockquote`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,OptimizedImage,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`The Page Agent is an AI assistant built into Bytebase. It lives in a floating chat window that’s available on every page — ask it anything in plain language, and it helps you get it done.`}),`\n`,_jsx(Heading,{level:`2`,id:`why-we-built-it`,children:`Why we built it`}),`\n`,_jsx(_components.p,{children:`Bytebase has a lot of features, and it’s not always obvious how to accomplish what you’re trying to do — even when the feature you need is already there. You might know what you want (archive old rows, grant a teammate access to a project, fix a failing plan check) but not which page to open, which buttons to click, or which settings control the behavior you’re after. Or maybe you know exactly how to do it — you’d just rather hand it off and review the result instead of clicking through the flow yourself.`}),`\n`,_jsx(_components.p,{children:`The Page Agent is designed for both. It understands how Bytebase works end to end, so it can:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Show you the way`}),` — walk you through a workflow step by step when you want to do it yourself.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Do it for you`}),` — take the actions directly when you’d rather describe the outcome and check the result.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`You stay in control: the agent shows each step it takes so you can follow along, and you can stop or redirect it at any time.`}),`\n`,_jsx(Heading,{level:`2`,id:`setup`,children:`Setup`}),`\n`,_jsxs(_components.p,{children:[`The Page Agent uses the same AI provider configuration as the rest of Bytebase. If you haven’t enabled it yet, follow the steps in `,_jsx(_components.a,{href:`/ai-assistant`,children:`AI Assistant`}),` to configure your OpenAI, Claude, Gemini, or Azure OpenAI credentials.`]}),`\n`,_jsx(_components.p,{children:`Once AI is configured, the Page Agent is available from any page in the Bytebase console. Click the agent toggle in the dashboard header to open the chat window.`}),`\n`,_jsx(Heading,{level:`2`,id:`how-it-works`,children:`How it works`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/dbx/-bvKq6_FvNEiLdMQ/content/docs/page-agent/architecture.svg?fit=max\u0026auto=format\u0026n=-bvKq6_FvNEiLdMQ\u0026q=85\u0026s=7f17858a164a69fff518d979fa92bdac`,alt:`Page Agent Architecture`,\"data-og-width\":`1070`,width:`1070`,\"data-og-height\":`320`,height:`320`,\"data-path\":`content/docs/page-agent/architecture.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/dbx/-bvKq6_FvNEiLdMQ/content/docs/page-agent/architecture.svg?w=280\u0026fit=max\u0026auto=format\u0026n=-bvKq6_FvNEiLdMQ\u0026q=85\u0026s=a2a5eadb38a82c80b850267536e977a6 280w, https://mintcdn.com/dbx/-bvKq6_FvNEiLdMQ/content/docs/page-agent/architecture.svg?w=560\u0026fit=max\u0026auto=format\u0026n=-bvKq6_FvNEiLdMQ\u0026q=85\u0026s=3722baeb07691a0015663188cee0a238 560w, https://mintcdn.com/dbx/-bvKq6_FvNEiLdMQ/content/docs/page-agent/architecture.svg?w=840\u0026fit=max\u0026auto=format\u0026n=-bvKq6_FvNEiLdMQ\u0026q=85\u0026s=d9ee8c34c1d752f53bcbe0073501908c 840w, https://mintcdn.com/dbx/-bvKq6_FvNEiLdMQ/content/docs/page-agent/architecture.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=-bvKq6_FvNEiLdMQ\u0026q=85\u0026s=b03ee68f5eb81b850acabe8e2aefd86d 1100w, https://mintcdn.com/dbx/-bvKq6_FvNEiLdMQ/content/docs/page-agent/architecture.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=-bvKq6_FvNEiLdMQ\u0026q=85\u0026s=149af118f9f769aaf8c05fd686bb46a6 1650w, https://mintcdn.com/dbx/-bvKq6_FvNEiLdMQ/content/docs/page-agent/architecture.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=-bvKq6_FvNEiLdMQ\u0026q=85\u0026s=22e99e9cc0783a910023d9c7749924a3 2500w`}),`\n`,_jsx(_components.p,{children:`The Page Agent has three layers:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Chat window`}),` — A floating panel available from any page in the console. It stays open as you move between pages.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Agent loop`}),` — Runs in your browser. When you ask a question, the agent thinks about what to do, takes an action (reading the page, calling an API, navigating somewhere), observes the result, and repeats until it has a complete answer. Each step is shown in the chat.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`AI backend`}),` — Bytebase routes your conversation to the AI provider configured in your workspace settings. Your credentials never leave your server.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`capabilities`,children:`Capabilities`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Capability`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Read the current page`})}),_jsx(_components.td,{children:`Understands which page you’re on, what project, database, or issue you’re viewing, and what state the UI is in`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Call Bytebase APIs`})}),_jsx(_components.td,{children:`Queries and updates data directly — listing databases, creating issues, checking deployment status, and more`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Navigate`})}),_jsx(_components.td,{children:`Goes to any page in the console on your behalf`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Interact with the UI`})}),_jsx(_components.td,{children:`Clicks buttons, fills form fields, selects options — useful on pages with unsaved state like editors and creation forms`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Discover APIs`})}),_jsx(_components.td,{children:`Browses the full Bytebase API catalog to find the right endpoint for a task`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Load workflow guides`})}),_jsx(_components.td,{children:`Pulls in step-by-step instructions for common multi-step tasks like running queries, creating schema changes, or granting permissions`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`controls-and-audit`,children:`Controls and audit`}),`\n`,_jsx(_components.p,{children:`The Page Agent operates within Bytebase’s existing safety mechanisms:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Uses your permissions.`}),` The agent can only perform actions your account is authorized for. If you can’t drop a table, neither can the agent.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Goes through the normal approval flow.`}),` Schema changes the agent creates are regular Bytebase issues — they respect your project’s approval policies, plan checks, and rollout gates. The agent cannot bypass these.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Audit-logged under your account.`}),` Every API call, issue creation, and permission change is recorded in the audit log with your user name.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Controlled by workspace AI settings.`}),` The Page Agent is available only when AI is enabled in your workspace. Disabling `,_jsx(_components.a,{href:`/ai-assistant`,children:`AI Assistant`}),` in `,_jsx(_components.strong,{children:`Settings > General`}),` turns off the Page Agent along with other AI features.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`use-cases`,children:`Use cases`}),`\n`,_jsx(Heading,{level:`3`,id:`fixing-a-plan-check-error`,children:`Fixing a plan check error`}),`\n`,_jsx(_components.p,{children:`Your issue failed a SQL review check and you want help understanding and fixing the violation.`}),`\n`,_jsxs(_components.blockquote,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`You:`}),` Help me fix this plan check error.`,_jsx(`br`,{}),_jsx(`br`,{}),`\n`,_jsx(_components.strong,{children:`Agent:`}),` `,_jsx(_components.em,{children:`(Reads the current page to inspect the issue and SQL review results)`}),_jsx(`br`,{}),_jsx(`br`,{}),`\n`,_jsx(_components.strong,{children:`Agent:`}),` The SQL review flagged a violation: `,_jsx(_components.strong,{children:`“Do not apply functions or perform calculations on indexed fields in the WHERE clause.”`}),` The problem is in your INSERT…SELECT statement:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`INSERT INTO`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` orders_archive (id, customer_id, created_at)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`SELECT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` id, customer_id, created_at`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`FROM`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` orders`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`WHERE`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` YEAR`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(created_at) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 2023`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Wrapping `,_jsx(_components.code,{children:`created_at`}),` in `,_jsx(_components.code,{children:`YEAR()`}),` prevents the database from using the index on that column, forcing a full table scan. Here’s a rewrite that keeps the index usable:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`INSERT INTO`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` orders_archive (id, customer_id, created_at)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`SELECT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` id, customer_id, created_at`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`FROM`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` orders`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`WHERE`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` created_at `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '2023-01-01'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` AND`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` created_at `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '2024-01-01'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Want me to update the SQL in the editor and re-run the check?`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Other things you can ask:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`“Why did the SQL review fail on this issue?”`}),`\n`,_jsx(_components.li,{children:`“The plan check says I have a naming convention error — can you fix it?”`}),`\n`,_jsx(_components.li,{children:`“Rewrite my migration to pass all the review checks”`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`granting-permissions`,children:`Granting permissions`}),`\n`,_jsx(_components.p,{children:`A teammate needs access to a project, and you want to set it up without navigating to settings.`}),`\n`,_jsxs(_components.blockquote,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`You:`}),` Give `,_jsx(_components.a,{href:`mailto:alice@example.com`,children:`alice@example.com`}),` developer access to the Payment project.`,_jsx(`br`,{}),_jsx(`br`,{}),`\n`,_jsx(_components.strong,{children:`Agent:`}),` I’ll add Alice as a project developer. Let me look up the project members API.\n`,_jsx(_components.em,{children:`(Discovers the project IAM API → calls it to add the role binding)`}),_jsx(`br`,{}),_jsx(`br`,{}),`\n`,_jsx(_components.strong,{children:`Agent:`}),` Done! `,_jsx(_components.a,{href:`mailto:alice@example.com`,children:`alice@example.com`}),` now has the `,_jsx(_components.strong,{children:`Project Developer`}),` role on the Payment project. She can view databases, create issues, and run queries in SQL Editor.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Other things you can ask:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`“Who has access to the Production environment?”`}),`\n`,_jsxs(_components.li,{children:[`“Remove `,_jsx(_components.a,{href:`mailto:bob@example.com`,children:`bob@example.com`}),` from the HR project”`]}),`\n`,_jsxs(_components.li,{children:[`“What roles does `,_jsx(_components.a,{href:`mailto:alice@example.com`,children:`alice@example.com`}),` have?”`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`querying-data-across-your-workspace`,children:`Querying data across your workspace`}),`\n`,_jsx(_components.p,{children:`Get a quick overview of resources without clicking through multiple pages.`}),`\n`,_jsxs(_components.blockquote,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`You:`}),` What databases are in the “Payment” project?`,_jsx(`br`,{}),_jsx(`br`,{}),`\n`,_jsx(_components.strong,{children:`Agent:`}),` Let me check.\n`,_jsx(_components.em,{children:`(Calls the Bytebase API to list databases in the Payment project)`}),_jsx(`br`,{}),_jsx(`br`,{}),`\n`,_jsx(_components.strong,{children:`Agent:`}),` The Payment project has 4 databases:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Database`}),_jsx(_components.th,{children:`Environment`}),_jsx(_components.th,{children:`Engine`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`payment_prod`}),_jsx(_components.td,{children:`Production`}),_jsx(_components.td,{children:`PostgreSQL 15`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`payment_staging`}),_jsx(_components.td,{children:`Staging`}),_jsx(_components.td,{children:`PostgreSQL 15`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`payment_dev`}),_jsx(_components.td,{children:`Dev`}),_jsx(_components.td,{children:`PostgreSQL 15`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`payment_analytics`}),_jsx(_components.td,{children:`Production`}),_jsx(_components.td,{children:`ClickHouse`})]})]})]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Other things you can ask:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`“How many pending issues are there in the HR project?”`}),`\n`,_jsx(_components.li,{children:`“Show me all PostgreSQL instances”`}),`\n`,_jsx(_components.li,{children:`“What SQL review policies are configured for production?”`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`tips`,children:`Tips`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Be specific.`}),` “Add a NOT NULL varchar(255) column called `,_jsx(_components.code,{children:`display_name`}),` to the `,_jsx(_components.code,{children:`users`}),` table in staging” works better than “change the users table.”`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Ask follow-ups.`}),` The agent remembers the full conversation, so “now do the same for production” works after a staging change.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Let it navigate.`}),` You don’t need to be on the right page first — the agent will go where it needs to.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Watch the tool calls.`}),` The chat shows each API call or UI action the agent takes, so you always know what happened.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`important-notes`,children:`Important notes`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`The agent uses AI to plan and execute actions. Always review what it did — issue created, SQL written, permissions granted — before moving on.`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Page Agent","description":null,"href":"/page-agent"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Why we built it","slug":"why-we-built-it","depth":2,"children":[]},{"title":"Setup","slug":"setup","depth":2,"children":[]},{"title":"How it works","slug":"how-it-works","depth":2,"children":[]},{"title":"Capabilities","slug":"capabilities","depth":2,"children":[]},{"title":"Controls and audit","slug":"controls-and-audit","depth":2,"children":[]},{"title":"Use cases","slug":"use-cases","depth":2,"children":[{"title":"Fixing a plan check error","slug":"fixing-a-plan-check-error","depth":3,"children":[]},{"title":"Granting permissions","slug":"granting-permissions","depth":3,"children":[]},{"title":"Querying data across your workspace","slug":"querying-data-across-your-workspace","depth":3,"children":[]}]},{"title":"Tips","slug":"tips","depth":2,"children":[]},{"title":"Important notes","slug":"important-notes","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/dbx/9053740759cb8dde/demo-embed.js"],"subdomain":"dbx","siteName":"Bytebase Docs","title":"Page Agent - Bytebase Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-22T16:36:47.168Z","originalFileLocation":"page-agent.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"application-name\" content=\"Bytebase Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Page Agent - Bytebase Docs\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Bytebase Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.bytebase.com/page-agent\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://dbx.mintlify.app/_mintlify/api/og/v2?division=AI\u0026amp;title=Page+Agent\u0026amp;theme=83d7e50c9104a5d993880fba\u0026amp;signature=80cd955f59600b484368d514657907924c7cc2e6c8afc6fd32186abf61384b32\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Page Agent - Bytebase Docs\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://dbx.mintlify.app/_mintlify/api/og/v2?division=AI\u0026amp;title=Page+Agent\u0026amp;theme=83d7e50c9104a5d993880fba\u0026amp;signature=80cd955f59600b484368d514657907924c7cc2e6c8afc6fd32186abf61384b32\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Bytebase Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2b66ff\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.bytebase.com/page-agent\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/page-agent.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.bytebase.com/#organization\",\"name\":\"Bytebase Docs\",\"url\":\"https://docs.bytebase.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/dbx/vw8BbfZhlW9y-cr_/images/logo/logo-full.png?fit=max\u0026auto=format\u0026n=vw8BbfZhlW9y-cr_\u0026q=85\u0026s=894c5021793b82b6bcef8b09cef3d85d\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.bytebase.com#website\",\"name\":\"Bytebase Docs\",\"url\":\"https://docs.bytebase.com\",\"publisher\":{\"@id\":\"https://docs.bytebase.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.bytebase.com/page-agent#webpage\",\"url\":\"https://docs.bytebase.com/page-agent\",\"name\":\"Page Agent\",\"dateModified\":\"2026-10-22T16:36:47.168Z\",\"isPartOf\":{\"@id\":\"https://docs.bytebase.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.bytebase.com/page-agent#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.bytebase.com/page-agent#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"AI\",\"item\":\"https://docs.bytebase.com/ai-assistant\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Page Agent\",\"item\":\"https://docs.bytebase.com/page-agent\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.bytebase.com/page-agent#article\",\"headline\":\"Page Agent\",\"name\":\"Page Agent\",\"url\":\"https://docs.bytebase.com/page-agent\",\"mainEntityOfPage\":{\"@id\":\"https://docs.bytebase.com/page-agent#webpage\"},\"dateModified\":\"2026-10-22T16:36:47.168Z\",\"publisher\":{\"@id\":\"https://docs.bytebase.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.bytebase.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Bytebase Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Bytebase Docs","nav":{"global":{"anchors":[]},"tabs":[{"tab":"Get Started","pages":[{"title":"Get Started","href":"/introduction/what-is-bytebase"}]},{"tab":"Change Management","pages":[{"title":"Change Management","href":"/change-database/change-workflow"}]},{"tab":"Access Control","pages":[{"title":"Access Control","href":"/security/database-permission/overview"}]},{"tab":"Administration","groups":[{"group":"AI","pages":[{"title":"AI Assistant","description":null,"href":"/ai-assistant"},{"title":"Page Agent","href":"/page-agent"},{"title":"Model Context Protocol (MCP)","description":null,"href":"/integrations/mcp"}]},{"group":"Security","pages":[{"title":"Users \u0026 Groups","href":"/administration/user-groups/overview"},{"title":"Service Account","href":"/administration/service-account"},{"group":"Workload Identity","pages":[{"title":"Overview","href":"/administration/workload-identity/overview"},{"title":"Workload Identity for GitHub Actions","href":"/administration/workload-identity/github-actions"},{"title":"Workload Identity for GitLab CI/CD","href":"/administration/workload-identity/gitlab-ci"}]},{"title":"Roles and Permissions","href":"/administration/roles"},{"group":"Single Sign-On","pages":[{"title":"Overview","href":"/administration/sso/overview"},{"title":"OAuth 2.0","href":"/administration/sso/oauth2"},{"title":"OpenID Connect (OIDC)","href":"/administration/sso/oidc"},{"title":"OIDC with Microsoft Entra ID","href":"/administration/sso/oidc-entra-id"},{"title":"LDAP","href":"/administration/sso/ldap"},{"title":"IdP-Initiated Flow","href":"/administration/sso/idp-initiated"}]},{"group":"SCIM","pages":[{"title":"Overview","href":"/administration/scim/overview"},{"title":"Entra ID","href":"/administration/scim/entra-id"},{"title":"Okta","href":"/administration/scim/okta"}]},{"title":"Password Restriction","href":"/administration/password"},{"title":"Two-factor Authentication","href":"/administration/2fa"},{"title":"Sign-in Restriction","href":"/administration/sign-in-restriction"},{"title":"Recover Administrator Access","href":"/administration/admin-recovery"}]},{"group":"General","pages":[{"title":"Audit Log","href":"/security/audit-log"},{"title":"Manage License","href":"/administration/license"},{"title":"Database Change Mode","href":"/administration/mode"},{"title":"Environment Policy","href":"/change-database/environment-policy/overview"},{"title":"Database Group","href":"/administration/database-group"},{"title":"Customize Logo","href":"/administration/customize-logo"},{"title":"Watermark","href":"/security/watermark"},{"title":"Announcement Banner","href":"/administration/announcement"},{"title":"Archive","href":"/administration/archive"},{"title":"Terraform Provider","href":"/integrations/terraform/overview"}]}]},{"tab":"Tutorials","pages":[{"title":"Tutorials","href":"/tutorials/risks-best-practice"}]},{"tab":"API Reference","href":"https://api.bytebase.com"},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/bytebase-3-24-0"}]}]},"title":"Page Agent - Bytebase Docs","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-CVZVK4hN.js","lightbox-handle-r17bVUz3.js"]}