From 672c32d33b4d8a16f2a5ff8deb35c6e18e7ad371 Mon Sep 17 00:00:00 2001 From: Oz Date: Mon, 27 Jul 2026 15:02:03 +0000 Subject: [PATCH 001/107] chore: log aeo crosslink audit run 2026-07-27 Co-Authored-By: Oz --- .agents/logs/aeo_crosslink_audit_runs.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.agents/logs/aeo_crosslink_audit_runs.md b/.agents/logs/aeo_crosslink_audit_runs.md index 90f884a2e..cbe235d51 100644 --- a/.agents/logs/aeo_crosslink_audit_runs.md +++ b/.agents/logs/aeo_crosslink_audit_runs.md @@ -7,3 +7,12 @@ This log tracks every run of the `aeo_crosslink_audit` skill — both runs that **Format**: see the `## Run log format` section in `.agents/skills/aeo_crosslink_audit/SKILL.md`. --- +## 2026-07-27 — Snapshot stale + +- **Run**: https://app.warp.dev/conversation/b61aca9e-3f9b-40f4-ae5d-e1448b99160e +- **Source signals**: Peec unavailable, GSC unavailable +- **PR**: N/A +- **Links proposed / added**: N/A +- **Pages touched**: N/A +- **Themes**: none observed +- **No-change reason**: snapshot stale — 33 days old From ab31f691f1b468aef82cd1a308878d0987e60cfd Mon Sep 17 00:00:00 2001 From: rachaelrenk Date: Tue, 28 Jul 2026 00:03:44 +0000 Subject: [PATCH 002/107] chore: log aeo crosslink audit run 2026-07-28 Co-Authored-By: Oz --- .agents/logs/aeo_crosslink_audit_runs.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.agents/logs/aeo_crosslink_audit_runs.md b/.agents/logs/aeo_crosslink_audit_runs.md index cbe235d51..e5e0b735f 100644 --- a/.agents/logs/aeo_crosslink_audit_runs.md +++ b/.agents/logs/aeo_crosslink_audit_runs.md @@ -7,6 +7,16 @@ This log tracks every run of the `aeo_crosslink_audit` skill — both runs that **Format**: see the `## Run log format` section in `.agents/skills/aeo_crosslink_audit/SKILL.md`. --- +## 2026-07-28 — Snapshot stale + +- **Run**: https://app.warp.dev/conversation/d77679e0-e39a-4e60-9e71-f08a6e3acfed +- **Source signals**: Peec unavailable, GSC unavailable +- **PR**: N/A +- **Links proposed / added**: N/A +- **Pages touched**: N/A +- **Themes**: none observed +- **No-change reason**: snapshot stale — 34 days old + ## 2026-07-27 — Snapshot stale - **Run**: https://app.warp.dev/conversation/b61aca9e-3f9b-40f4-ae5d-e1448b99160e From 5d0ece26e0232c21e294c3d8b48d0c7ff84267e2 Mon Sep 17 00:00:00 2001 From: rachaelrenk Date: Tue, 28 Jul 2026 18:13:43 +0000 Subject: [PATCH 003/107] chore: log aeo crosslink audit run 2026-07-28 Co-Authored-By: Oz --- .agents/logs/aeo_crosslink_audit_runs.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.agents/logs/aeo_crosslink_audit_runs.md b/.agents/logs/aeo_crosslink_audit_runs.md index e5e0b735f..a98707874 100644 --- a/.agents/logs/aeo_crosslink_audit_runs.md +++ b/.agents/logs/aeo_crosslink_audit_runs.md @@ -7,6 +7,16 @@ This log tracks every run of the `aeo_crosslink_audit` skill — both runs that **Format**: see the `## Run log format` section in `.agents/skills/aeo_crosslink_audit/SKILL.md`. --- +## 2026-07-28 — PR opened + +- **Run**: https://oz.warp.dev/runs/019fa9e8-cff8-710d-b615-18d88edad918 +- **Source signals**: Peec unavailable, GSC unavailable +- **PR**: https://github.com/warpdotdev/docs/pull/396 +- **Links proposed / added**: 3 proposed, 3 added +- **Pages touched**: src/content/docs/agent-platform/capabilities/slash-commands.mdx, src/content/docs/platform/faqs.mdx, src/content/docs/platform/software-factory.mdx +- **Themes**: agent/cloud-agent pages describe multi-agent coordination but omit links to the orchestration docs +- **No-change reason**: N/A + ## 2026-07-28 — Snapshot stale - **Run**: https://app.warp.dev/conversation/d77679e0-e39a-4e60-9e71-f08a6e3acfed From 46f1886e61c7c03910eb32a4aeb5259caadb816b Mon Sep 17 00:00:00 2001 From: rachaelrenk Date: Tue, 28 Jul 2026 18:38:56 +0000 Subject: [PATCH 004/107] chore: log aeo crosslink audit run 2026-07-28 Co-Authored-By: Oz --- .agents/logs/aeo_crosslink_audit_runs.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.agents/logs/aeo_crosslink_audit_runs.md b/.agents/logs/aeo_crosslink_audit_runs.md index a98707874..e7e716e3c 100644 --- a/.agents/logs/aeo_crosslink_audit_runs.md +++ b/.agents/logs/aeo_crosslink_audit_runs.md @@ -7,6 +7,16 @@ This log tracks every run of the `aeo_crosslink_audit` skill — both runs that **Format**: see the `## Run log format` section in `.agents/skills/aeo_crosslink_audit/SKILL.md`. --- +## 2026-07-28 — No change + +- **Run**: https://oz.warp.dev/runs/019fa9e8-cff8-710d-b615-18d88edad918 +- **Source signals**: Peec unavailable, GSC unavailable +- **PR**: N/A +- **Links proposed / added**: N/A +- **Pages touched**: N/A +- **Themes**: none observed +- **No-change reason**: existing open PR #396 — skipped to avoid duplicate + ## 2026-07-28 — PR opened - **Run**: https://oz.warp.dev/runs/019fa9e8-cff8-710d-b615-18d88edad918 From a5740dd92f2f7588082cfc648e4703d75985ddb8 Mon Sep 17 00:00:00 2001 From: Oz Date: Tue, 28 Jul 2026 18:50:12 +0000 Subject: [PATCH 005/107] chore: log aeo crosslink audit run 2026-07-28 --- .agents/logs/aeo_crosslink_audit_runs.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.agents/logs/aeo_crosslink_audit_runs.md b/.agents/logs/aeo_crosslink_audit_runs.md index e7e716e3c..218e28b77 100644 --- a/.agents/logs/aeo_crosslink_audit_runs.md +++ b/.agents/logs/aeo_crosslink_audit_runs.md @@ -9,6 +9,16 @@ This log tracks every run of the `aeo_crosslink_audit` skill — both runs that --- ## 2026-07-28 — No change +- **Run**: https://app.warp.dev/conversation/356a1693-1140-4ac8-9de2-ef0995c04c60 +- **Source signals**: Peec available, GSC available +- **PR**: N/A +- **Links proposed / added**: 2 proposed, 0 added +- **Pages touched**: N/A +- **Themes**: heavy demand to run and manage multiple agents in parallel and to run Claude Code + Codex together; the CLI-agents overview and Harnesses in Oz pages omit links to the multi-agent guide and orchestration model +- **No-change reason**: existing open AEO cross-link PR #396 — skipped per dedupe rule + +## 2026-07-28 — No change + - **Run**: https://oz.warp.dev/runs/019fa9e8-cff8-710d-b615-18d88edad918 - **Source signals**: Peec unavailable, GSC unavailable - **PR**: N/A From 3c05d7f0b02ddc31bd254337bc1b92e37dce733c Mon Sep 17 00:00:00 2001 From: Oz Date: Mon, 3 Aug 2026 15:09:35 +0000 Subject: [PATCH 006/107] chore: log aeo crosslink audit run 2026-08-03 Co-Authored-By: Oz --- .agents/logs/aeo_crosslink_audit_runs.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.agents/logs/aeo_crosslink_audit_runs.md b/.agents/logs/aeo_crosslink_audit_runs.md index 218e28b77..f8d91dcda 100644 --- a/.agents/logs/aeo_crosslink_audit_runs.md +++ b/.agents/logs/aeo_crosslink_audit_runs.md @@ -7,6 +7,17 @@ This log tracks every run of the `aeo_crosslink_audit` skill — both runs that **Format**: see the `## Run log format` section in `.agents/skills/aeo_crosslink_audit/SKILL.md`. --- + +## 2026-08-03 — PR opened + +- **Run**: https://oz.warp.dev/runs/019fc823-8da1-7c1f-8fea-5be83c7ea3d5 +- **Source signals**: Peec available, GSC available +- **PR**: https://github.com/warpdotdev/docs/pull/453 +- **Links proposed / added**: 7 proposed, 7 added +- **Pages touched**: src/content/docs/platform/faqs.mdx, src/content/docs/agent-platform/capabilities/slash-commands.mdx, src/content/docs/platform/software-factory.mdx, src/content/docs/platform/agents.mdx, src/content/docs/platform/quickstart.mdx +- **Themes**: multi-agent orchestration discovery from FAQs, slash commands, software factory, agents, and cloud quickstart +- **No-change reason**: N/A + ## 2026-07-28 — No change - **Run**: https://app.warp.dev/conversation/356a1693-1140-4ac8-9de2-ef0995c04c60 @@ -56,3 +67,4 @@ This log tracks every run of the `aeo_crosslink_audit` skill — both runs that - **Pages touched**: N/A - **Themes**: none observed - **No-change reason**: snapshot stale — 33 days old + From 8d0d273b135a36988a955c55db0a676c07878a28 Mon Sep 17 00:00:00 2001 From: Oz Date: Mon, 10 Aug 2026 15:13:32 +0000 Subject: [PATCH 007/107] chore: log aeo crosslink audit run 2026-08-10 Co-Authored-By: Oz --- .agents/logs/aeo_crosslink_audit_runs.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.agents/logs/aeo_crosslink_audit_runs.md b/.agents/logs/aeo_crosslink_audit_runs.md index f8d91dcda..fbff9fce5 100644 --- a/.agents/logs/aeo_crosslink_audit_runs.md +++ b/.agents/logs/aeo_crosslink_audit_runs.md @@ -8,6 +8,17 @@ This log tracks every run of the `aeo_crosslink_audit` skill — both runs that --- +## 2026-08-10 — PR opened + +- **Run**: https://oz.warp.dev/runs/019fec30-13d2-7203-99ec-82a84f84c908 +- **Source signals**: Peec available, GSC available +- **PR**: https://github.com/warpdotdev/docs/pull/497 +- **Links proposed / added**: 13 proposed, 13 added +- **Pages touched**: agents/cli-agents/overview.mdx, agents/cli-agents/claude-code.mdx, agents/getting-started/agents-in-warp.mdx, platform/triggers/scheduled-agents.mdx, platform/deployment-patterns.mdx, platform/software-factory.mdx +- **Themes**: schedules/background agents, remote control/observability, multi-agent orchestration journeys +- **No-change reason**: N/A + + ## 2026-08-03 — PR opened - **Run**: https://oz.warp.dev/runs/019fc823-8da1-7c1f-8fea-5be83c7ea3d5 From a3e51c0689c857776ef6a5e2382e781ea7eb479c Mon Sep 17 00:00:00 2001 From: Oz Date: Mon, 17 Aug 2026 15:10:54 +0000 Subject: [PATCH 008/107] chore: log aeo crosslink audit run 2026-08-17 Co-Authored-By: Oz --- .agents/logs/aeo_crosslink_audit_runs.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.agents/logs/aeo_crosslink_audit_runs.md b/.agents/logs/aeo_crosslink_audit_runs.md index fbff9fce5..ed966575d 100644 --- a/.agents/logs/aeo_crosslink_audit_runs.md +++ b/.agents/logs/aeo_crosslink_audit_runs.md @@ -8,6 +8,16 @@ This log tracks every run of the `aeo_crosslink_audit` skill — both runs that --- +## 2026-08-17 — PR opened + +- **Run**: https://app.warp.dev/conversation/79e45390-6945-43b4-aa11-70e9ecd3061c +- **Source signals**: Peec available, GSC available +- **PR**: https://github.com/warpdotdev/docs/pull/546 +- **Links proposed / added**: 11 proposed, 11 added +- **Pages touched**: src/content/docs/platform/environments.mdx, src/content/docs/agents/cli-agents/remote-control.mdx, src/content/docs/agents/getting-started/agents-in-warp.mdx, src/content/docs/platform/viewing-cloud-agent-runs.mdx, src/content/docs/platform/handoff/local-to-cloud.mdx +- **Themes**: overnight cloud runs, session steering/Remote Control, multi-agent orchestration, environments as trigger runtime +- **No-change reason**: N/A + ## 2026-08-10 — PR opened - **Run**: https://oz.warp.dev/runs/019fec30-13d2-7203-99ec-82a84f84c908 From 980c51c516fb8771181ca58cca064cb73facde4c Mon Sep 17 00:00:00 2001 From: Daniel Peng Date: Tue, 28 Jul 2026 15:37:45 -0700 Subject: [PATCH 009/107] fix: upgrade @astrojs/react to v6 for Astro 7 / Vite 8 compatibility (#409) @astrojs/react 5.x targets Astro 6 / Vite 7. Under Vite 8's oxc transform, its React refresh filter claimed Astro's ?lang.ts script virtual modules and forced them to parse as plain JS, breaking any .astro + + From 3532c9311af1de654276fbe7d4a4e0dfcd7b100a Mon Sep 17 00:00:00 2001 From: "oz-by-warp[bot]" <243557089+oz-by-warp[bot]@users.noreply.github.com> Date: Wed, 12 Aug 2026 13:19:18 -0400 Subject: [PATCH 063/107] chore: refresh UI paths snapshot from warp (#505) Add the new Command Palette command "Cycle current tab color" (workspace:cycle_active_tab_color) extracted from warpdotdev/warp. Settings sections and shared-source subpages are unchanged. Full validate_ui_refs --all found 0 issues after the refresh. Co-authored-by: Oz --- .agents/skills/validate_ui_refs/valid_paths.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.agents/skills/validate_ui_refs/valid_paths.json b/.agents/skills/validate_ui_refs/valid_paths.json index 29eb3ee3f..5ab202346 100644 --- a/.agents/skills/validate_ui_refs/valid_paths.json +++ b/.agents/skills/validate_ui_refs/valid_paths.json @@ -1269,6 +1269,10 @@ "name": "workspace:rename_active_pane", "description": "Rename the current pane" }, + { + "name": "workspace:cycle_active_tab_color", + "description": "Cycle current tab color" + }, { "name": "workspace:new_tab_group", "description": "Create new tab group" @@ -1550,5 +1554,5 @@ "description": "Toggle Maximize Code Review Panel" } ], - "generated_at": "2026-08-05T16:59:35.936911+00:00" + "generated_at": "2026-08-12T00:53:01.810914+00:00" } \ No newline at end of file From 64d2dfc211bb42bb39c0d4e5e52f4f525a8f1a31 Mon Sep 17 00:00:00 2001 From: "oz-by-warp[bot]" <243557089+oz-by-warp[bot]@users.noreply.github.com> Date: Wed, 12 Aug 2026 13:20:03 -0400 Subject: [PATCH 064/107] chore: update 404 monitor run log 2026-08-10 (#498) Co-authored-by: Oz --- .agents/logs/weekly_404_monitor_runs.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.agents/logs/weekly_404_monitor_runs.md b/.agents/logs/weekly_404_monitor_runs.md index 78fb571e7..2fdf8f080 100644 --- a/.agents/logs/weekly_404_monitor_runs.md +++ b/.agents/logs/weekly_404_monitor_runs.md @@ -8,6 +8,17 @@ This log tracks every run of the `weekly-404-monitor` skill — both runs that o --- +## 2026-08-10 — No data +- **Total 404s this week**: n/a +- **Total 404s last week**: n/a +- **Trend**: n/a +- **Significant gaps (≥5 hits)**: n/a +- **Redirect candidates processed**: 0 (hits ≥ 5) +- **HIGH-confidence redirects**: 0 +- **PR**: none +- **Oz run**: https://app.warp.dev/conversation/28103b9a-cbdb-4b07-b73e-555b88656028 +- **Notes**: Metabase query failed with HTTP 401 Unauthenticated. `METABASE_API_KEY` is present in environment K5KStCm5aYvhfBJb8cHol6 but is a short placeholder/invalid value, not a real Metabase API key for https://warp.metabaseapp.com. Posted failure notice to #growth-docs. Action needed: replace the secret with a valid Metabase API key and re-run. + ## 2026-08-03 — No PR - **Total 404s this week**: 323 - **Total 404s last week**: 458 From c27fbf59a9d7fc47a77b4d48a528f71cc32e2d35 Mon Sep 17 00:00:00 2001 From: Lili Wilson <56806227+liliwilson@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:40:31 -0700 Subject: [PATCH 065/107] docs: update Slack integration page for Slack Marketplace review (#509) Add behind-login install steps, privacy section, @Warp bot naming, fix environment links. Co-authored-by: Oz Co-authored-by: Hong Yi Chen --- .../docs/platform/integrations/slack.mdx | 99 +++++++++---------- 1 file changed, 46 insertions(+), 53 deletions(-) diff --git a/src/content/docs/platform/integrations/slack.mdx b/src/content/docs/platform/integrations/slack.mdx index 21c05fb59..885d699a3 100644 --- a/src/content/docs/platform/integrations/slack.mdx +++ b/src/content/docs/platform/integrations/slack.mdx @@ -7,21 +7,37 @@ description: >- pull requests. --- -The Slack integration lets your team trigger cloud agents directly from Slack conversations. Tag @Oz in a message or DM the bot to start a cloud agent that clones your repos, works through the task, posts progress updates, and opens pull requests back into the same thread. +The Slack integration lets your team trigger cloud agents directly from Slack conversations. Tag @Warp in a message or DM the bot to start a cloud agent that clones your repos, works through the task, posts progress updates, and opens pull requests back into the same thread. -### Overview +### Get started -The Slack integration lets your team trigger agents directly from conversations in Slack. When you tag **@Oz** in a message or DM the bot, Warp will start an agent in the cloud, clone the repositories defined in your environment, and begin working through the task with full context from your codebase and the Slack thread. +#### Installation -Agents keep you updated as they work, generate pull requests using your GitHub account, and share a link to a live remote session so you can watch or guide the workflow in real time. +1. Log in to the [Oz web app](https://oz.warp.dev). +2. Go to **Integrations** and select **Slack**. +3. Click **Add to Slack**. You'll be prompted to install the Warp app into your Slack workspace. +4. If you haven't yet, create an [environment](/platform/environments/) defining the repos, Docker image, and setup commands agents should use. +5. Start using Warp in Slack by mentioning **@Warp** with a task. -This page explains what the integration does, how it behaves inside Slack, and how to configure it for your Warp team. +Alternatively, install via the [Oz CLI](/reference/cli/): + +``` +oz integration create slack --environment +``` + +The CLI opens a browser window to install the Warp app into your Slack workspace. After installation, the integration is available to all members of your Warp team. + +#### Requirements + +* **Team membership** - The Slack integration requires you to be part of a [Warp team](/knowledge-and-collaboration/teams/). Teams can be created on any plan, including Free. +* **Plan and credits** - Your team must be on a plan that supports integrations (Build, Max, or Business) and have at least 20 credits available. See [Access, Billing, and Identity](/platform/team-access-billing-and-identity/) for details. +* **Infrastructure** - By default, agents run on Warp-hosted infrastructure. Enterprise teams can [self-host agents](/platform/self-hosting/) on their own infrastructure. --- -### Using Oz inside Slack +### Using Warp inside Slack -Tagging @Oz in a message or thread starts an agent run. The agent clones the repositories in your environment, sets up your development environment using your Docker image and setup commands, and begins working with the context from the Slack conversation. Oz posts updates back into the thread as it progresses so you can follow along without opening your terminal. +Tagging @Warp in a message or thread starts an agent run. The agent clones the repositories in your environment, sets up your development environment using your Docker image and setup commands, and begins working with the context from the Slack conversation. The bot posts updates back into the thread as it progresses so you can follow along without opening your terminal. Agents also share a link to an interactive remote session using Warp's [cloud agent session sharing](/platform/viewing-cloud-agent-runs/). Opening this link gives you a live terminal view of the cloud agent running your code. You can interrupt or steer the agent by providing additional instructions, and the agent will pick up where it left off with the new context. @@ -31,24 +47,23 @@ When the work is complete, Warp will create a pull request on your behalf using You can start an agent in three ways: -* **Tag @Oz in a channel message** +* **Tag @Warp in a channel message** - Describe the task, and Oz will begin working with full context from the thread. -* **Tag @Oz inside a thread** + Describe the task, and Warp will begin working with full context from the thread. +* **Tag @Warp inside a thread** - Oz will automatically collect the thread's prior messages and use them as context. -* **DM Oz directly** + Warp will automatically collect the thread's prior messages and use them as context. +* **DM the Warp bot directly** Useful for private tasks or experimentation. -Oz will acknowledge the request in Slack and start running the task immediately. +The bot will acknowledge the request in Slack and start running the task immediately. ### Monitoring agent progress Agents keep you informed directly in Slack via: * Activity updates showing progress throughout the run -* An evolving task list and timeline * Checkpoints indicating major steps completed * A direct link to the Oz run in the [Oz web app](/platform/oz-web-app/), where you can view the full run transcript and metadata * A session-sharing link that opens a live terminal view of the remote agent @@ -81,19 +96,7 @@ Because PRs are created as you, the workflow slots seamlessly into your team’s --- -### Requirements - -* **Team membership** - The Slack integration requires you to be part of a [Warp team](/knowledge-and-collaboration/teams/). Teams can be created on any plan, including Free. -* **Plan and credits** - Your team must be on a plan that supports integrations (Build, Max, or Business) and have at least 20 credits available. See [Access, Billing, and Identity](/platform/team-access-billing-and-identity/) for details. -* **Infrastructure** - By default, agents run on Warp-hosted infrastructure. Enterprise teams can [self-host agents](/platform/self-hosting/) on their own infrastructure. -* **Identity** - You must be logged into Warp with the same email used in your Slack workspace. -* **GitHub authorization** - You must authorize the **Warp GitHub app** the first time you trigger a Slack integration request. - * The repositories involved must be included in your environment and accessible to the Warp GitHub app. - * You must have write access for Warp to open PRs on your behalf. - -### How to configure the Slack integration - -Setup involves two steps, powered by the [Oz CLI](/reference/cli/). +### Configuration #### 1. Create an environment @@ -119,24 +122,18 @@ oz environment create \ This flow analyzes your repos, recommends a Docker image, suggests setup commands, and can build + push a custom image if needed. -See the [Environment Setup](/platform/integrations/) docs for detailed instructions. +See the [Environments](/platform/environments/) docs for detailed instructions. -#### 2. Create the Slack integration +#### 2. Optional: custom prompt -Once your environment is ready, create the integration. - -:::note -For easier setup, use the [Oz web app](https://oz.warp.dev) to configure integrations with a guided flow. -::: - -Alternatively, use the CLI: +You can attach a custom prompt that is applied to every agent run: ``` -oz integration create slack --environment +oz integration create slack \ + --environment \ + --prompt "Always prefix PR titles with '[WARP]' and include detailed test steps." ``` -The CLI will open a browser window to install the Oz app into your Slack workspace. After installation, the integration becomes available to all members of your Warp team. - :::tip If the integration cannot be created or a Slack-triggered run cannot start, use the returned error code to narrow the fix. Common errors include: @@ -144,14 +141,6 @@ If the integration cannot be created or a Slack-triggered run cannot start, use * [`external_authentication_required`](/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/) (missing GitHub or Slack authorization) ::: -You can optionally attach a custom prompt that is applied to every agent run: - -``` -oz integration create slack \ - --environment \ - --prompt "Always prefix PR titles with '[WARP]' and include detailed test steps." -``` - ### Identity mapping and team access * Integrations are scoped to your Warp team. @@ -161,29 +150,33 @@ oz integration create slack \ --- +### Privacy + +The Warp app reads Slack messages only where it is mentioned or directly messaged: the triggering message, its thread history (used as task context), and your Slack profile email (used to map you to your Warp account). Message content is used to run the agent task and is handled per the [Warp Privacy Policy](https://www.warp.dev/privacy), which describes how Warp collects, manages, and stores third-party data. + ### Uninstallation instructions -To remove the Oz app from your Slack workspace: +To remove the Warp app from your Slack workspace: 1. Open Slack and go to **Apps** in the left sidebar. -2. Search for Oz. +2. Search for Warp. 3. Select the app, then open the **About** tab. 4. Click **Configuration**. This will open your workspace’s app configuration page in the browser. 5. Scroll to the bottom and select **Remove App**. 6. Confirm the removal.
-![Warpy is just an internal Slackbot, your Warp slackbot should be called Oz.](../../../../assets/agent-platform/delete-warpy.png) -
The Oz Slackbot in Slack.
+![The Warp Slackbot in a Slack workspace.](../../../../assets/agent-platform/delete-warpy.png) +
The Warp Slackbot in Slack.
-![Confirmation dialog to remove the Oz app from a Slack workspace.](../../../../assets/agent-platform/remove-slack-app.png) +![Confirmation dialog to remove the Warp app from a Slack workspace.](../../../../assets/agent-platform/remove-slack-app.png) Once removed, Slack will immediately disable the integration for all teammates. Events for a disabled integration can return [`integration_disabled`](/reference/api-and-sdk/troubleshooting/errors/integration-disabled/). ### Troubleshooting -If something isn't working—missing repos, Slack not detecting @Oz, PR failures, or environment configuration issues—see the [Integrations Troubleshooting](/platform/integrations/#troubleshooting) page. It covers: +If something isn't working—missing repos, Slack not detecting @Warp, PR failures, or environment configuration issues—see the [Integrations Troubleshooting](/platform/integrations/#troubleshooting) page. It covers: * GitHub authorization and repo access * Docker image pull errors From 579881176bbda63641bb2671fd901cf8a8db865d Mon Sep 17 00:00:00 2001 From: Lili Wilson <56806227+liliwilson@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:46:07 -0700 Subject: [PATCH 066/107] docs: match install steps to Oz web app UI (Connect button) (#510) Co-authored-by: Oz --- src/content/docs/platform/integrations/slack.mdx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/content/docs/platform/integrations/slack.mdx b/src/content/docs/platform/integrations/slack.mdx index 885d699a3..7d4cfb8d3 100644 --- a/src/content/docs/platform/integrations/slack.mdx +++ b/src/content/docs/platform/integrations/slack.mdx @@ -13,11 +13,10 @@ The Slack integration lets your team trigger cloud agents directly from Slack co #### Installation -1. Log in to the [Oz web app](https://oz.warp.dev). -2. Go to **Integrations** and select **Slack**. -3. Click **Add to Slack**. You'll be prompted to install the Warp app into your Slack workspace. -4. If you haven't yet, create an [environment](/platform/environments/) defining the repos, Docker image, and setup commands agents should use. -5. Start using Warp in Slack by mentioning **@Warp** with a task. +1. Log in to the [Oz web app](https://oz.warp.dev) and go to the [Integrations page](https://oz.warp.dev/integrations). +2. Click **Connect** next to **Slack**. You'll be prompted to install the Warp app into your Slack workspace. +3. After installing, you're returned to the Integrations page to finish setup: choose the [environment](/platform/environments/) agents should use, which defines the repos, Docker image, and setup commands. +4. Start using Warp in Slack by mentioning **@Warp** with a task. Alternatively, install via the [Oz CLI](/reference/cli/): From bfd4c36e80259b7da4e7fcc653a2a08acae5823b Mon Sep 17 00:00:00 2001 From: "independabot-soc2[bot]" <295894560+independabot-soc2[bot]@users.noreply.github.com> Date: Wed, 12 Aug 2026 14:59:07 -0400 Subject: [PATCH 067/107] fix: update nanoid to resolve CVE-2026-67213 and repair package-lock.json (#496) * fix: update nanoid to resolve CVE-2026-67213 Co-Authored-By: Oz * fix: regenerate package-lock.json to sync with nanoid override The committed lockfile was out of sync with package.json: it was missing the node_modules/@emnapi/runtime package entry entirely (still referenced by several dependents) and carried unrelated peer flag churn, so npm ci failed with EUSAGE during CI and the Vercel build. Regenerated with npm install on Node 22 (matching CI) so the lockfile only reflects the nanoid 3.3.18 override plus the correct @emnapi/runtime entry. Co-Authored-By: Warp Agent --------- Co-authored-by: Oz Co-authored-by: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Co-authored-by: Warp Agent --- package-lock.json | 6 +++--- package.json | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index baf52de79..fc8163d9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8339,9 +8339,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "funding": [ { "type": "github", diff --git a/package.json b/package.json index 80ce85353..9d9c6ebbd 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,8 @@ "vite": "^8.0.13", "@babel/core": ">=7.29.6", "@astrojs/markdown-remark": "^7.2.0", - "tar": "^7.5.16" + "tar": "^7.5.16", + "nanoid": "^3.3.17" }, "devDependencies": { "@astrojs/check": "^0.9.8", From 13215a65c1c2f268afab8ca41c47b731cbfb0682 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:02:45 -0400 Subject: [PATCH 068/107] Docs: clarify storage.googleapis.com egress uses (#369) * Docs: document storage.googleapis.com egress Co-Authored-By: Oz * docs: clarify storage.googleapis.com uses Co-Authored-By: Oz --------- Co-authored-by: Oz Co-authored-by: Hong Yi Chen --- .../docs/platform/self-hosting/security-and-networking.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/content/docs/platform/self-hosting/security-and-networking.mdx b/src/content/docs/platform/self-hosting/security-and-networking.mdx index 133daf3e6..77e02b9d3 100644 --- a/src/content/docs/platform/self-hosting/security-and-networking.mdx +++ b/src/content/docs/platform/self-hosting/security-and-networking.mdx @@ -54,6 +54,8 @@ Tasks use the following Docker images: * [`warpdotdev/warp-codex-cli-sidecar:latest`](https://hub.docker.com/r/warpdotdev/warp-codex-cli-sidecar) (only if using Codex) * The base image specified by your [environment](/platform/environments/) +**Google Cloud Storage (`storage.googleapis.com`)** — port 443, for downloading managed Docker Sandbox tooling sidecar archives (Warp CLI, computer use, and coding CLI tooling), uploading conversation transcripts so conversations can be resumed locally, and providing attachments to the agent. + **GitHub (`github.com`)** — only with the managed architecture, when using a Warp [environment](/platform/environments/) with configured GitHub repositories. **Linux distribution-specific package repositories** — only with the managed architecture, when using a Warp environment whose base image does not have Git pre-installed. The exact repositories depend on the package manager configuration in the environment's base image. From 8b2e292ef2bb24a63ebbcf8a1d9f5be42b88de8d Mon Sep 17 00:00:00 2001 From: Hong Yi Chen Date: Wed, 12 Aug 2026 15:15:15 -0400 Subject: [PATCH 069/107] docs(skills): missing_docs audit bookkeeping (surface map + snapshot) (#494) * docs: refresh the missing_docs surface map and snapshot Maps newly added warp-server routes as internal, ignores the Warp Agent CLI launch modal flag, fixes the moved CLI configuration doc path, prunes removed .well-known entries, and regenerates the surface snapshot. Co-Authored-By: Warp Agent * docs(skills): missing_docs audit bookkeeping (surface map + snapshot) Maps the warp-server routes surfaced by this audit as internal (Factory scorers, autofix, integrations and benchmarks, OAuth consent/grants/register/ revoke, harness-support commit-snapshot, and the OAuth discovery documents), ignores the Warp Agent CLI launch modal flag, points the Warp Agent CLI zero-state setting at its moved configuration page, teaches the route parser to follow unexported register* helpers, and regenerates the surface snapshot. Co-Authored-By: Warp Agent --------- Co-authored-by: Warp Agent --- .../references/feature_surface_map.md | 66 +++++++++++++++++-- .../references/surface_snapshot.json | 53 +++++++++++++-- .../skills/missing_docs/scripts/audit_docs.py | 17 ++++- 3 files changed, 124 insertions(+), 12 deletions(-) diff --git a/.agents/skills/missing_docs/references/feature_surface_map.md b/.agents/skills/missing_docs/references/feature_surface_map.md index 6e1732a2b..c395f6e07 100644 --- a/.agents/skills/missing_docs/references/feature_surface_map.md +++ b/.agents/skills/missing_docs/references/feature_surface_map.md @@ -325,13 +325,30 @@ GET /.well-known/openid-configuration -> internal # RFC 8414 / RFC 9728 OAuth discovery documents that MCP clients fetch # automatically before authenticating against the hosted Factory MCP endpoint -# (router/handlers/public_api/oauth2.go, registered only when the dogfood-only -# factory_mcp flag is on). They are machine-facing protocol metadata for an -# unreleased product, absent from warp-server's canonical public spec, so they -# are not a documentable public API surface. +# (router/handlers/public_api/oauth2.go, registered by registerMCPDiscoveryRoutes +# only when the dogfood-only factory_mcp flag is on). They are machine-facing +# protocol metadata for an unreleased product, absent from warp-server's +# canonical public spec, so they are not a documentable public API surface. The +# path-suffixed variants implement RFC 8414 section 5 path-aware discovery for +# the /api/v1/mcp/factory resource. GET /.well-known/oauth-authorization-server -> internal +GET /.well-known/oauth-authorization-server/api/v1/mcp/factory -> internal +GET /.well-known/openid-configuration/api/v1/mcp/factory -> internal GET /.well-known/oauth-protected-resource/api/v1/mcp/factory -> internal +# OAuth consent screen, connected-apps (grant) management, token revocation, and +# RFC 7591 dynamic client registration backing the MCP harness OAuth flows +# (router/handlers/public_api/oauth2.go; registration is additionally +# flag-gated). Like the device-flow endpoints above, these are protocol and web +# plumbing rather than a released public REST surface, and they are absent from +# warp-server's canonical public spec. +GET /oauth/consent/info -> internal +POST /oauth/consent -> internal +GET /oauth/grants -> internal +DELETE /oauth/grants/{client_id} -> internal +POST /oauth/register -> internal +POST /oauth/revoke -> internal + # Anonymous-viewer redirect probes (documented exceptions to auth, not API surfaces). GET /agent/sessions/{session_uuid}/redirect -> internal GET /agent/conversations/{conversation_id}/redirect -> internal @@ -361,6 +378,7 @@ POST /harness-support/notify-user -> internal POST /harness-support/finish-task -> internal POST /harness-support/report-shutdown -> internal POST /harness-support/upload-snapshot -> internal +POST /harness-support/commit-snapshot -> internal # Oz Factory REST API (router/handlers/public_api/factory*.go). Factory is a # private, not-yet-released product (the FactoryMcp flag is dogfood and the @@ -403,10 +421,44 @@ PUT /factory/automations/{id}/subscriptions -> internal DELETE /factory/automations/{id}/subscriptions/{subscription_id} -> internal GET /factory/scorers -> internal POST /factory/scorers -> internal +PATCH /factory/scorers/{scorer_id} -> internal +DELETE /factory/scorers/{scorer_id} -> internal +POST /factory/scorers/{scorer_id}/pause -> internal +POST /factory/scorers/{scorer_id}/resume -> internal GET /factory/scorers/{scorer_id}/results -> internal +GET /factory/scorers/{scorer_id}/results/reasons -> internal GET /factory/scorers/{scorer_id}/autofix-config -> internal PUT /factory/scorers/{scorer_id}/autofix-config -> internal DELETE /factory/scorers/{scorer_id}/autofix-config -> internal +GET /factory/runs/{run_id}/scores -> internal +POST /factory/run-scoring/dispatches -> internal +POST /factory/autofix/runs/{autofix_run_id}/file-tasks -> internal +POST /factory/autofix/worker-results/{worker_result_id}/report -> internal +PUT /factory/automations/{id}/subscriptions/{subscription_id} -> internal +GET /factory/{uid}/integrations/github/branches -> internal +GET /factory/{uid}/integrations/github/labels -> internal +GET /factory/{uid}/integrations/github/teams -> internal +GET /factory/{uid}/integrations/github/users -> internal +GET /factory/{uid}/integrations/github/workflows -> internal +GET /factory/{uid}/integrations/linear/issues -> internal +GET /factory/{uid}/integrations/linear/projects -> internal +GET /factory/{uid}/integrations/linear/users -> internal +GET /factory/{uid}/integrations/linear/workflow-states -> internal +GET /factory/{uid}/integrations/slack/conversations -> internal +GET /factory/{uid}/integrations/slack/users -> internal +# Factory benchmark suites and benchmark runs +# (router/handlers/public_api/benchmarks.go). Same unreleased Factory product as +# the routes above, and absent from warp-server's canonical public spec. +GET /factory/{uid}/benchmarks/suites -> internal +POST /factory/{uid}/benchmarks/suites -> internal +GET /factory/{uid}/benchmarks/suites/{suite_uid} -> internal +PATCH /factory/{uid}/benchmarks/suites/{suite_uid} -> internal +DELETE /factory/{uid}/benchmarks/suites/{suite_uid} -> internal +POST /factory/{uid}/benchmarks/suites/{suite_uid}/runs -> internal +GET /factory/{uid}/benchmarks/runs -> internal +GET /factory/{uid}/benchmarks/runs/{run_uid} -> internal +GET /factory/{uid}/benchmarks/runs/{run_uid}/results -> internal +POST /factory/{uid}/benchmarks/runs/{run_uid}/cancel -> internal # Orchestration messaging and lifecycle-event endpoints. These are marked # `x-internal: true` in warp-server's canonical spec (public_api/openapi.yaml), @@ -539,7 +591,7 @@ appearance.zero_state.show_animation -> internal # while the terminal is unfocused (app/src/settings/tui_zero_state.rs). Like the # other zero-state knobs it isn't in the GUI settings UI, so it's documented on # the Warp Agent CLI configuration page instead of the all-settings reference. -appearance.zero_state.freeze_animation_when_unfocused -> src/content/docs/cli/configuration.mdx +appearance.zero_state.freeze_animation_when_unfocused -> src/content/docs/agents/cli/configuration.mdx # Warp Agent CLI-only (crates/warp_tui) push-to-talk key for voice input (surface: # SettingSurfaces::TUI in app/src/settings/tui_voice.rs). The GUI equivalent is the @@ -618,6 +670,10 @@ OpenWarpLaunchModal # One-time launch modal announcing multi-agent orchestration; the feature itself # is documented via RunAgentsTool -> orchestration/multi-agent-runs.mdx. OrchestrationLaunchModal +# One-time launch modal announcing the Warp Agent CLI. Its "Get started" button +# links to the CLI quickstart, and the CLI itself is documented under +# agents/cli/, so the modal has no separate documentable surface. +AgentCliLaunchModal GetStartedTab CreateProjectFlow # Account-first onboarding is an internal login/onboarding flow variant with no diff --git a/.agents/skills/missing_docs/references/surface_snapshot.json b/.agents/skills/missing_docs/references/surface_snapshot.json index ef0377813..6c6c7d5fc 100644 --- a/.agents/skills/missing_docs/references/surface_snapshot.json +++ b/.agents/skills/missing_docs/references/surface_snapshot.json @@ -12,6 +12,7 @@ "APIKeyManagement": "ga", "AccountFirstOnboarding": "ga", "ActiveConversationRequiresInteraction": "ga", + "AgentCliLaunchModal": "ga", "AgentDecidesCommandExecution": "ga", "AgentHarness": "ga", "AgentManagementDetailsView": "ga", @@ -182,6 +183,7 @@ "McpOauth": "ga", "McpServer": "ga", "MinimalistUI": "ga", + "MultiLevelOrchestration": "dogfood", "MultiProfile": "ga", "MultiWorkspace": "dogfood", "NamedAgents": "ga", @@ -202,9 +204,11 @@ "PRCommentsV2": "ga", "PartialNextCommandSuggestions": "other", "PendingUserQueryIndicator": "ga", + "PeriodicHandoffCheckpoints": "other", "PinnedTabs": "ga", "PluggableNotifications": "ga", "PredictAMQueries": "other", + "PricingTransparency": "dogfood", "ProfilesDesignRevamp": "ga", "Projects": "dogfood", "PromptCacheExpiryWarning": "dogfood", @@ -264,7 +268,6 @@ "ToggleBootstrapBlock": "dogfood", "TransferControlTool": "ga", "TrimTrailingBlankLines": "ga", - "TuiCostTransparency": "dogfood", "UIZoom": "ga", "UndoClosedPanes": "ga", "UsageBasedPricing": "ga", @@ -814,15 +817,20 @@ "DELETE /api/v1/agent/schedules/{id}", "DELETE /api/v1/factory/automations/{id}", "DELETE /api/v1/factory/automations/{id}/subscriptions/{subscription_id}", + "DELETE /api/v1/factory/scorers/{scorer_id}", "DELETE /api/v1/factory/scorers/{scorer_id}/autofix-config", "DELETE /api/v1/factory/{uid}", + "DELETE /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}", "DELETE /api/v1/factory/{uid}/source", "DELETE /api/v1/factory/{uid}/tasks/{task_uid}", "DELETE /api/v1/memory_stores/{uid}", "DELETE /api/v1/memory_stores/{uid}/memories/{memoryUid}", + "DELETE /api/v1/oauth/grants/{client_id}", "GET /.well-known/oauth-authorization-server", + "GET /.well-known/oauth-authorization-server/api/v1/mcp/factory", "GET /.well-known/oauth-protected-resource/api/v1/mcp/factory", "GET /.well-known/openid-configuration", + "GET /.well-known/openid-configuration/api/v1/mcp/factory", "GET /api/v1/agent", "GET /api/v1/agent/artifacts/{uid}", "GET /api/v1/agent/artifacts/{uid}/download", @@ -851,12 +859,30 @@ "GET /api/v1/factory/automations", "GET /api/v1/factory/automations/events/{provider}", "GET /api/v1/factory/automations/{id}", + "GET /api/v1/factory/runs/{run_id}/scores", "GET /api/v1/factory/scorers", "GET /api/v1/factory/scorers/{scorer_id}/autofix-config", "GET /api/v1/factory/scorers/{scorer_id}/results", + "GET /api/v1/factory/scorers/{scorer_id}/results/reasons", "GET /api/v1/factory/{uid}", + "GET /api/v1/factory/{uid}/benchmarks/runs", + "GET /api/v1/factory/{uid}/benchmarks/runs/{run_uid}", + "GET /api/v1/factory/{uid}/benchmarks/runs/{run_uid}/results", + "GET /api/v1/factory/{uid}/benchmarks/suites", + "GET /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}", + "GET /api/v1/factory/{uid}/integrations/github/branches", + "GET /api/v1/factory/{uid}/integrations/github/labels", + "GET /api/v1/factory/{uid}/integrations/github/teams", + "GET /api/v1/factory/{uid}/integrations/github/users", + "GET /api/v1/factory/{uid}/integrations/github/workflows", + "GET /api/v1/factory/{uid}/integrations/linear/issues", + "GET /api/v1/factory/{uid}/integrations/linear/projects", "GET /api/v1/factory/{uid}/integrations/linear/teams", "GET /api/v1/factory/{uid}/integrations/linear/teams/{team_id}/labels", + "GET /api/v1/factory/{uid}/integrations/linear/users", + "GET /api/v1/factory/{uid}/integrations/linear/workflow-states", + "GET /api/v1/factory/{uid}/integrations/slack/conversations", + "GET /api/v1/factory/{uid}/integrations/slack/users", "GET /api/v1/factory/{uid}/metrics", "GET /api/v1/factory/{uid}/source", "GET /api/v1/factory/{uid}/syncs", @@ -871,9 +897,13 @@ "GET /api/v1/memory_stores/{uid}/memories/{memoryUid}", "GET /api/v1/memory_stores/{uid}/memories/{memoryUid}/versions", "GET /api/v1/oauth/authorize", + "GET /api/v1/oauth/consent/info", + "GET /api/v1/oauth/grants", "GET /api/v1/oauth/jwks.json", "PATCH /api/v1/agent/runs/{runId}/event-sequence", + "PATCH /api/v1/factory/scorers/{scorer_id}", "PATCH /api/v1/factory/{uid}", + "PATCH /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}", "PATCH /api/v1/factory/{uid}/tasks/{task_uid}", "POST /api/v1/agent/events/{run_id}", "POST /api/v1/agent/handoff/upload-snapshot", @@ -894,13 +924,22 @@ "POST /api/v1/agent/schedules/{id}/resume", "POST /api/v1/agent/tasks/{id}/cancel", "POST /api/v1/factory", + "POST /api/v1/factory/autofix/runs/{autofix_run_id}/file-tasks", + "POST /api/v1/factory/autofix/worker-results/{worker_result_id}/report", "POST /api/v1/factory/automations", "POST /api/v1/factory/avatar", + "POST /api/v1/factory/run-scoring/dispatches", "POST /api/v1/factory/scorers", + "POST /api/v1/factory/scorers/{scorer_id}/pause", + "POST /api/v1/factory/scorers/{scorer_id}/resume", "POST /api/v1/factory/{uid}/apply", + "POST /api/v1/factory/{uid}/benchmarks/runs/{run_uid}/cancel", + "POST /api/v1/factory/{uid}/benchmarks/suites", + "POST /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}/runs", "POST /api/v1/factory/{uid}/plan", "POST /api/v1/factory/{uid}/tasks", "POST /api/v1/harness-support/block-snapshot", + "POST /api/v1/harness-support/commit-snapshot", "POST /api/v1/harness-support/external-conversation", "POST /api/v1/harness-support/finish-task", "POST /api/v1/harness-support/notify-user", @@ -911,13 +950,17 @@ "POST /api/v1/harness-support/upload-snapshot", "POST /api/v1/memory_stores", "POST /api/v1/memory_stores/{uid}/memories", + "POST /api/v1/oauth/consent", "POST /api/v1/oauth/device/auth", + "POST /api/v1/oauth/register", + "POST /api/v1/oauth/revoke", "POST /api/v1/oauth/session", "POST /api/v1/oauth/token", "PUT /api/v1/agent/identities/{uid}", "PUT /api/v1/agent/schedules/{id}", "PUT /api/v1/factory/automations/{id}", "PUT /api/v1/factory/automations/{id}/subscriptions", + "PUT /api/v1/factory/automations/{id}/subscriptions/{subscription_id}", "PUT /api/v1/factory/scorers/{scorer_id}/autofix-config", "PUT /api/v1/factory/{uid}/integrations/linear/teams/{team_id}/labels", "PUT /api/v1/factory/{uid}/source", @@ -936,6 +979,7 @@ "/cloud-agent", "/compact", "/compact-and", + "/connect-grok", "/continue-locally", "/conversations", "/copy-debugging-id", @@ -957,6 +1001,7 @@ "/index", "/init", "/logout", + "/manage-billing", "/mcp", "/model", "/natural-language-detection", @@ -982,6 +1027,7 @@ "/status", "/statusline", "/theme", + "/upgrade", "/usage", "/view-logs", "/vim-mode", @@ -1225,8 +1271,6 @@ "artifacts/:artifactUid", "design", "environments", - "evaluations", - "evaluations/:evaluationId", "integrations", "login", "login/callback", @@ -1321,6 +1365,7 @@ "claude-api": "bundled", "create-skill": "bundled", "create-tab-config": "bundled", + "factory-mcp": "bundled", "modify-settings": "bundled", "oz-platform": "bundled", "pr-comments": "bundled", @@ -1332,5 +1377,5 @@ "verify-ui-change-in-cloud": "dogfood", "warpctrl": "bundled" }, - "changelog_last_version": "2026.07.31" + "changelog_last_version": "2026.08.07" } diff --git a/.agents/skills/missing_docs/scripts/audit_docs.py b/.agents/skills/missing_docs/scripts/audit_docs.py index 16fa5b6cb..ee32cbf14 100755 --- a/.agents/skills/missing_docs/scripts/audit_docs.py +++ b/.agents/skills/missing_docs/scripts/audit_docs.py @@ -745,9 +745,20 @@ def _split_top_level_args(s: str) -> list[str]: return args +def _is_route_registrar(name: str) -> bool: + """Whether a Go function name looks like a route-registration helper. + + Matches both the exported `RegisterFooRoutes` entry points and unexported + helpers like `registerMCPDiscoveryRoutes`, which real handlers use to split + a large registration function up. Missing the unexported ones silently + dropped their routes from the audit universe. + """ + return name.startswith(("Register", "register")) + + def _iter_register_calls(body: str): - """Yield (callee, start_pos, args) for Register*(...) calls, paren-matched.""" - for match in re.finditer(r"\b(Register\w+)\(", body): + """Yield (callee, start_pos, args) for [Rr]egister*(...) calls, paren-matched.""" + for match in re.finditer(r"\b([Rr]egister\w+)\(", body): start = match.end() depth = 1 i = start @@ -911,7 +922,7 @@ def emit(fn_name: str, param_prefix: str): # to hang off the /api/v1 group (conservative default so routes are never # silently dropped). for fn_name in sorted(analyzed): - if fn_name.startswith("Register") and fn_name not in emitted_fns: + if _is_route_registrar(fn_name) and fn_name not in emitted_fns: emit(fn_name, "/api/v1") routes = [] From 626af64dcbe897066bda65c95fcc5a1f39c9b48c Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:23:52 -0600 Subject: [PATCH 070/107] Document Session Sharing data retention, deletion, and access (#511) * Document Session Sharing data retention, deletion, and access Adds a "Data retention and access" section to the Agent Session Sharing page covering: - Shared session data expires automatically about one week after creation (matches the in-app expiry message). - Stopping a share ends live access immediately; there is no separate per-session delete control today, unlike shared Blocks, which support an immediate unshare/delete. - Access is grant-based (owner, invitees, optionally the team, optionally anyone with the link), viewers must sign in, and workspace admins can restrict invites/link sharing. - Sharing a session does not by itself send it to a model; shared sessions are excluded from Warp Drive AI indexing, and an agent only sees shared content when AI features are actively used in that session. - Secret Redaction is not applied to Session Sharing (cross-linked with a caution callout). Also cross-links secret-redaction.mdx and privacy.mdx to the new section instead of duplicating the content. Fixes QUALITY-1606. Co-Authored-By: Warp Agent * Fix unverified claims and callout placement per review - Don't imply stopping a share leaves data in place until expiry; state only that data is removed no later than the one-week expiry (holds true whether purge happens on stop or at expiry). - Don't assert a default for "anyone with the link" access; describe it as an available setting instead. - Give the Secret Redaction caution its own "Secrets in shared sessions" heading instead of nesting it under "AI and shared sessions", and repoint the secret-redaction.mdx cross-link at the new anchor. - Drop the unverified "right away" timing claim from the shared Blocks contrast note, and link to block-sharing.mdx instead of block-basics.mdx since the claim is about unsharing. Co-Authored-By: Warp Agent * Update src/content/docs/agents/local-agents/session-sharing.mdx Co-authored-by: oz-for-oss[bot] <277970191+oz-for-oss[bot]@users.noreply.github.com> * Update src/content/docs/agents/local-agents/session-sharing.mdx Co-authored-by: oz-for-oss[bot] <277970191+oz-for-oss[bot]@users.noreply.github.com> --------- Co-authored-by: warp-agent-staging[bot] Co-authored-by: Danny <16809145+dannyneira@users.noreply.github.com> Co-authored-by: oz-for-oss[bot] <277970191+oz-for-oss[bot]@users.noreply.github.com> --- .../agents/local-agents/session-sharing.mdx | 43 ++++++++++++++++++- .../privacy-and-security/privacy.mdx | 1 + .../privacy-and-security/secret-redaction.mdx | 2 +- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/content/docs/agents/local-agents/session-sharing.mdx b/src/content/docs/agents/local-agents/session-sharing.mdx index 6a1f42167..ada4bec43 100644 --- a/src/content/docs/agents/local-agents/session-sharing.mdx +++ b/src/content/docs/agents/local-agents/session-sharing.mdx @@ -33,7 +33,46 @@ Share the link only with collaborators who should be able to see the session con ## How it works -When you share an agent session, Warp publishes it to the cloud and generates a shareable link. The session stays in sync — any new agent output or terminal activity appears for all viewers in real time. The person who shares the session controls who can view and who can interact. +When you share an agent session, Warp uploads the session's scrollback and live output to Warp's servers and generates a shareable link. Session Sharing works through Warp's servers rather than as a direct, peer-to-peer connection between devices, so the session stays in sync — any new agent output or terminal activity appears for all viewers in real time. The person who shares the session controls who can view and who can interact. + +## Data retention and access + +Understanding how long shared data sticks around, how to stop sharing it, and who can see it helps you decide what's safe to share. + +### How long shared data is kept + +Shared session data expires automatically about one week after you create the share. After that, the link can no longer be opened. This matches the message Warp shows when you try to open an expired link: "Sessions expire after one week and cannot be opened." + +### Stopping a share + +Stopping a share immediately ends live access for every participant — no one can continue watching or interacting once you stop it. The share link can no longer be opened after the one-week expiry. There's currently no separate control to delete a single shared session's data before that expiry. + +:::note +Shared [Blocks](/terminal/blocks/block-sharing/) work differently. Unsharing a Block permanently deletes it. Session shares rely on the one-week expiry instead of an immediate-delete action. +::: + +To remove all of your shared session data through account deletion rather than waiting for the shared-session expiry, delete your Warp account and data. Deletion jobs run every 24 hours, so removal is not immediate. See [Delete your account and data](/support-and-community/privacy-and-security/privacy/#delete-your-account-and-data). + +### Who can access a shared session + +Access to a shared session is based on who you grant it to, not just who has the link: + +* **Owner** - You, the person who started the share, control who can view and interact +* **Invited collaborators** - People you explicitly invite to the session +* **Your team** - Optionally, you can extend access to your whole team +* **Anyone with the link** - Available as a setting when you want broader access + +Viewers must sign in to a Warp account to open a shared session. Workspace admins can disable invites and link sharing for the team by policy. Roles determine what a participant can do once they have access — some participants can only view the session, while others can also steer it by sending commands or agent queries. See [Collaboration and steering](#collaboration-and-steering) below. + +### Secrets in shared sessions + +:::caution +[Secret Redaction](/support-and-community/privacy-and-security/secret-redaction/) isn't applied to Session Sharing. Anything visible in a shared session's scrollback, including values that Secret Redaction would otherwise redact elsewhere, is visible to everyone who can access the share. Treat sharing a session like sharing your screen: review what's in the scrollback before you share it. +::: + +### AI and shared sessions + +Sharing a session doesn't, by itself, send its contents to a model. Shared sessions are excluded from Warp Drive's AI indexing, so a shared session's contents aren't made searchable or citable by agents just because it was shared. An agent only sees a shared session's terminal content when someone actually uses an AI feature inside that session — either you, or a collaborator you've granted edit access to. ## Sharing a session @@ -104,3 +143,5 @@ Multiple participants can join the same session from different machines, browser * [Cloud Agent Session Sharing](/platform/viewing-cloud-agent-runs/) * [Attach agent session context to GitHub PRs](/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs/) * [Session Sharing (terminal)](/knowledge-and-collaboration/session-sharing/) +* [Secret Redaction](/support-and-community/privacy-and-security/secret-redaction/) +* [Privacy and data control](/support-and-community/privacy-and-security/privacy/) diff --git a/src/content/docs/support-and-community/privacy-and-security/privacy.mdx b/src/content/docs/support-and-community/privacy-and-security/privacy.mdx index b966cd56f..56951942a 100644 --- a/src/content/docs/support-and-community/privacy-and-security/privacy.mdx +++ b/src/content/docs/support-and-community/privacy-and-security/privacy.mdx @@ -18,6 +18,7 @@ Our philosophy is complete transparency and control over any data leaving your m * Monitor telemetry in real-time with Warp's native [Network Log](/support-and-community/privacy-and-security/network-log/) * [Opt out](/support-and-community/privacy-and-security/privacy/#how-to-disable-telemetry-and-crash-reporting) of telemetry at any time * Read and audit Warp's client source code at [`warpdotdev/warp`](https://github.com/warpdotdev/warp), open source under [AGPL v3](https://github.com/warpdotdev/warp/blob/master/LICENSE-AGPL) +* See how long [shared session data is kept and who can access it](/agents/local-agents/session-sharing/#data-retention-and-access) ## What telemetry data does Warp collect and why? diff --git a/src/content/docs/support-and-community/privacy-and-security/secret-redaction.mdx b/src/content/docs/support-and-community/privacy-and-security/secret-redaction.mdx index 3e59d785b..224dcc53d 100644 --- a/src/content/docs/support-and-community/privacy-and-security/secret-redaction.mdx +++ b/src/content/docs/support-and-community/privacy-and-security/secret-redaction.mdx @@ -21,7 +21,7 @@ By default, identified secrets will be displayed with a strikethrough visual tre If instead you'd prefer to visually hide the secrets as well, i.e. `echo ********`, the setting to obfuscate secrets with asterisks can be found in **Settings** > **Privacy** > **Secret redaction** > **Hide secrets in blocklist**. -Clicking on a secret will display a tooltip that lets you reveal the secret or copy the secret's contents. When trying to copy terminal output containing secrets, it will be copied as asterisks (e.g. `echo password` becomes `echo ********`) unless revealed or copied from the tooltip. Secret redaction is not applied in [Session Sharing](/knowledge-and-collaboration/session-sharing/). +Clicking on a secret will display a tooltip that lets you reveal the secret or copy the secret's contents. When trying to copy terminal output containing secrets, it will be copied as asterisks (e.g. `echo password` becomes `echo ********`) unless revealed or copied from the tooltip. Secret redaction is not applied in [Session Sharing](/agents/local-agents/session-sharing/#secrets-in-shared-sessions) — treat a shared session like sharing your screen. ## Case sensitivity From 7374f29c07df05cfc6fc5dea5e568d25452428f1 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Thu, 13 Aug 2026 10:51:17 -0400 Subject: [PATCH 071/107] Docs: add Grok 4.6 (and variants) and sweep recent model catalog gaps (#514) * docs: add Grok 4.6, Gemini 3.6 Flash, and other model catalog gaps Co-Authored-By: Warp Agent * chore: revert unintended package-lock.json drift from npm install Co-Authored-By: Warp Agent * docs: remove models not yet released to stable (Muse Spark 1.2, GPT-OSS 120B, Inkling) These are gated behind meta_muse_spark, fireworks_gpt_oss_120b, and fireworks_inkling, which are enabled in staging but not in prod.yaml, so they are not yet GA and should not be documented as publicly available. Co-Authored-By: Warp Agent --------- Co-authored-by: Oz Co-authored-by: Warp Agent --- src/content/docs/agents/inference/model-choice.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/content/docs/agents/inference/model-choice.mdx b/src/content/docs/agents/inference/model-choice.mdx index 11f198d4e..a9d7611c5 100644 --- a/src/content/docs/agents/inference/model-choice.mdx +++ b/src/content/docs/agents/inference/model-choice.mdx @@ -73,6 +73,7 @@ All Auto models perform well across all agent workflows and are ideal if you pre | Claude Opus 5 | `claude-5-opus-low` | Low effort | | Claude Opus 5 | `claude-5-opus-medium` | Medium effort | | Claude Opus 5 | `claude-5-opus-xhigh` | Extra high effort | +| Claude Opus 5 | `claude-5-opus-xhigh-fast` | Fast mode | | Claude Opus 5 | `claude-5-opus-max` | Max effort | | Claude Fable 5 | `claude-5-fable-high` | Default effort | | Claude Fable 5 | `claude-5-fable-low` | Low effort | @@ -113,12 +114,17 @@ Anthropic requires data retention for Claude Fable 5 for safety, abuse monitorin | Model | `model_id` | | --- | --- | | Gemini 3.1 Pro | `gemini-3.1-pro` | +| Gemini 3.6 Flash | `gemini-3.6-flash` | | Gemini 3.5 Flash | `gemini-3.5-flash` | #### xAI | Model | `model_id` | Reasoning Level | | --- | --- | --- | +| Grok 4.6 | `grok-4-6-low` | Low | +| Grok 4.6 | `grok-4-6-medium` | Medium | +| Grok 4.6 | `grok-4-6-high` | High | +| Grok 4.6 | `grok-4-6-xhigh` | Extra High | | Grok 4.5 | `grok-4-5-low` | Low | | Grok 4.5 | `grok-4-5-medium` | Medium | | Grok 4.5 | `grok-4-5-high` | High | From 120cfd60069330002cd8eb5a3e6536f788518435 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Thu, 13 Aug 2026 18:47:29 -0400 Subject: [PATCH 072/107] docs: add Gemini 3.7 Flash to available-models docs (#530) Add Gemini 3.7 Flash (gemini-3.7-flash) to the Google models table on the Model Choice page, and update the Gemini Enterprise BYOLLM example to reference 3.7 Flash as the current Flash example. Co-authored-by: Oz Co-authored-by: Warp Agent --- src/content/docs/agents/inference/model-choice.mdx | 1 + .../enterprise/enterprise-features/byollm-gemini-enterprise.mdx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/content/docs/agents/inference/model-choice.mdx b/src/content/docs/agents/inference/model-choice.mdx index a9d7611c5..770da6856 100644 --- a/src/content/docs/agents/inference/model-choice.mdx +++ b/src/content/docs/agents/inference/model-choice.mdx @@ -114,6 +114,7 @@ Anthropic requires data retention for Claude Fable 5 for safety, abuse monitorin | Model | `model_id` | | --- | --- | | Gemini 3.1 Pro | `gemini-3.1-pro` | +| Gemini 3.7 Flash | `gemini-3.7-flash` | | Gemini 3.6 Flash | `gemini-3.6-flash` | | Gemini 3.5 Flash | `gemini-3.5-flash` | diff --git a/src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx b/src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx index f4c36b531..73c9b75de 100644 --- a/src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx +++ b/src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx @@ -52,7 +52,7 @@ Gemini Enterprise uses **federated, short-lived credentials** instead of API key Gemini Enterprise supports the intersection of models that Warp supports and models available through Vertex AI in your project: -* **Native Gemini models** - Current Gemini Flash, Flash Lite, and Pro families (for example, Gemini 3.1 Pro and Gemini 3.6 Flash). +* **Native Gemini models** - Current Gemini Flash, Flash Lite, and Pro families (for example, Gemini 3.1 Pro and Gemini 3.7 Flash). * **Claude partner models on Vertex AI** - Current Claude Sonnet, Opus, Haiku, and Fable families offered as Vertex AI partner models. To determine which models you can use, see [Model Choice](/agents/inference/model-choice/) for Warp's supported models and the **Models** page of the Admin Panel for your team's Gemini Enterprise enablement. From a773a5542f138e02a5dccb256dfd4ea6fd817e37 Mon Sep 17 00:00:00 2001 From: "oz-by-warp[bot]" <243557089+oz-by-warp[bot]@users.noreply.github.com> Date: Thu, 13 Aug 2026 15:47:48 -0700 Subject: [PATCH 073/107] docs: weekly release updates (2026-08-13) (#529) Co-authored-by: Oz --- src/content/docs/changelog/2026.mdx | 58 +++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/content/docs/changelog/2026.mdx b/src/content/docs/changelog/2026.mdx index f867c376d..3ee814b7b 100644 --- a/src/content/docs/changelog/2026.mdx +++ b/src/content/docs/changelog/2026.mdx @@ -6,6 +6,64 @@ description: >- Submit bugs and feature requests on our [GitHub board!](https://github.com/warpdotdev/Warp/issues/new/choose) +### 2026.08.13 (v0.2026.08.12.21.54) + +**Improvements** + +* Added a customizable action to cycle the active tab color from a keybinding or the Command Palette. ([#14329](https://github.com/warpdotdev/warp/pull/14329)) — [@rasitakyol](https://github.com/rasitakyol) ✨ +* Cloud agent run details now show the platform the run executes on, with a macOS or Linux icon alongside the architecture and runner. ([#14790](https://github.com/warpdotdev/warp/pull/14790)) +* Added completions for `vagrant`, including its nested `box`, `cloud`, `plugin`, and `snapshot` command groups plus dynamic machine and box names. ([#14775](https://github.com/warpdotdev/warp/pull/14775)) +* Added `openssl` command-line completions. ([#14771](https://github.com/warpdotdev/warp/pull/14771)) +* Added inline command completions for the Yandex Cloud CLI (`yc`) and git worktree name suggestions. ([#14767](https://github.com/warpdotdev/warp/pull/14767)) +* Tab autocomplete now follows symlinks to directories in remote/SSH sessions. ([#14746](https://github.com/warpdotdev/warp/pull/14746)) +* Added completions for `journalctl`, including units, boots, journal fields, and syslog identifiers. ([#14742](https://github.com/warpdotdev/warp/pull/14742)) + +**Bug fixes** + +* Fixed a crash in the AI `@` context menu when a workflow's content included multi-byte characters (emoji, CJK, accented Latin) near the preview truncation boundary. ([#14933](https://github.com/warpdotdev/warp/pull/14933)) +* Fixed the MCP tool-call JSON viewer's key/chevron being vertically centered against a tall expanded multi-line string value instead of aligned to its top. ([#14949](https://github.com/warpdotdev/warp/pull/14949)) +* Fixed long-running commands in Warp Agent CLI not accepting keyboard input. ([#14943](https://github.com/warpdotdev/warp/pull/14943)) +* Fixed an issue where an AI response could fail to render entirely if it included a citation of an unrecognized type. ([#14915](https://github.com/warpdotdev/warp/pull/14915)) +* Fixed the code review pane failing to load file content for renamed files with uncommitted changes. ([#14655](https://github.com/warpdotdev/warp/pull/14655)) +* Fixed inactive agent toolbelts continuing to run hidden context chip commands. ([#14854](https://github.com/warpdotdev/warp/pull/14854)) +* Fixed canceled background commands leaving wrapped child processes running. ([#14853](https://github.com/warpdotdev/warp/pull/14853)) +* Prevent stale shared-session links and QR codes from being exposed while a new session is pending. ([#13813](https://github.com/warpdotdev/warp/pull/13813)) — [@rasitakyol](https://github.com/rasitakyol) ✨ +* Fixed combining marks rendering at the wrong position on Linux and Windows. ([#14322](https://github.com/warpdotdev/warp/pull/14322)) — [@SS-Script](https://github.com/SS-Script) ✨ +* Fixed the Find in File field becoming unclickable after pressing Enter in Vim mode. ([#14836](https://github.com/warpdotdev/warp/pull/14836)) +* Fixed background orchestrated agents stealing input focus in Warp Agent CLI when they need user interaction. ([#14829](https://github.com/warpdotdev/warp/pull/14829)) +* Fixed the environment selector showing "New Environment" for agent runs without an environment. ([#14837](https://github.com/warpdotdev/warp/pull/14837)) +* Fixed excessive Git process creation when loading global skills. ([#14830](https://github.com/warpdotdev/warp/pull/14830)) +* Fixed window corners being rounded in fullscreen. ([#14109](https://github.com/warpdotdev/warp/pull/14109)) — [@s1ckoleg](https://github.com/s1ckoleg) ✨ +* Cmd-Up in Agent Mode now navigates user prompts and skips agent-run commands. ([#14685](https://github.com/warpdotdev/warp/pull/14685)) +* macOS Option-click on Warp's green traffic-light button now performs zoom instead of entering fullscreen. ([#14716](https://github.com/warpdotdev/warp/pull/14716)) +* Fixed the dedicated hotkey (Quake mode) window not taking keyboard focus when opened on a different monitor than the main Warp window. ([#14726](https://github.com/warpdotdev/warp/pull/14726)) +* `pkill ` now suggests running process names instead of filesystem paths. ([#14749](https://github.com/warpdotdev/warp/pull/14749)) +* Fixed Warp Agent CLI Tab completions missing desktop completion sources and supported native-shell fallback. ([#14600](https://github.com/warpdotdev/warp/pull/14600)) +* Fixed pasting rich text dropping numeric CSS font weights. ([#14512](https://github.com/warpdotdev/warp/pull/14512)) — [@fbartho](https://github.com/fbartho) ✨ +* Fixed the Warp Agent CLI input occasionally rendering without a cursor after temporary interactions. ([#14747](https://github.com/warpdotdev/warp/pull/14747)) +* Fixed the Warp Agent CLI model picker changing the default model for every session. ([#14737](https://github.com/warpdotdev/warp/pull/14737)) +* Fixed the copy-link menu action doing nothing while a cloud agent session was still setting up. ([#14431](https://github.com/warpdotdev/warp/pull/14431)) +* Running Oz from the command line on macOS no longer puts a bouncing Warp icon in the Dock. ([#14636](https://github.com/warpdotdev/warp/pull/14636)) + +**Oz updates** + +* Fixed background subagent sessions stealing focus from the visible Warp Agent CLI input. ([#14961](https://github.com/warpdotdev/warp/pull/14961)) +* Renamed the Oz agent UI to Warp Agent across the app and CLI. ([#11022](https://github.com/warpdotdev/warp/pull/11022)) +* Fixed keyboard input for long-running commands. ([#14943](https://github.com/warpdotdev/warp/pull/14943)) +* Homebrew installations now show the correct `brew upgrade` command when an update is available. ([#14899](https://github.com/warpdotdev/warp/pull/14899)) +* The Warp Agent CLI's Agents bar now mirrors the GUI's multi-level orchestration: drill into an orchestrating child's level, follow breadcrumbs back up, and see subtree rollup badges. ([#14884](https://github.com/warpdotdev/warp/pull/14884)) +* Background orchestrated agents no longer take focus away from the session you are using. ([#14829](https://github.com/warpdotdev/warp/pull/14829)) +* Fixed excessive Git process creation when loading global skills. ([#14830](https://github.com/warpdotdev/warp/pull/14830)) +* Add a `/connect-grok` TUI slash command that jumps straight into connecting your Grok (X Premium / SuperGrok) account. ([#14759](https://github.com/warpdotdev/warp/pull/14759)) +* Fixed occasional transcript jitter while Agent Mode responses stream in Warp Agent CLI. ([#14750](https://github.com/warpdotdev/warp/pull/14750)) +* Shell Tab completions now share desktop ordering and native fallback behavior. ([#14600](https://github.com/warpdotdev/warp/pull/14600)) +* Fixed the input occasionally rendering without a cursor after temporary interactions. ([#14747](https://github.com/warpdotdev/warp/pull/14747)) +* Model selection now applies only to the current session and identifies the profile default. ([#14737](https://github.com/warpdotdev/warp/pull/14737)) +* Code blocks no longer include box borders, making code easier to select and copy. ([#14738](https://github.com/warpdotdev/warp/pull/14738)) +* Failed cloud agent runs now stay open and attachable for debugging instead of becoming unreachable. ([#14561](https://github.com/warpdotdev/warp/pull/14561)) +* Child agents can now be launched with repository-qualified skill references instead of absolute paths. ([#14271](https://github.com/warpdotdev/warp/pull/14271)) +* Running Oz from the command line on macOS no longer puts a bouncing Warp icon in the Dock. ([#14636](https://github.com/warpdotdev/warp/pull/14636)) + ### 2026.08.07 (v0.2026.08.05.09.03) **Improvements** From ddc3f403b312f101cbc7dd67b19cb8a1775bc3ca Mon Sep 17 00:00:00 2001 From: Danny <16809145+dannyneira@users.noreply.github.com> Date: Fri, 14 Aug 2026 09:24:23 -0600 Subject: [PATCH 074/107] docs: Add Kapa custom chat support handoff (#512) * feat(docs): add Kapa support handoff Co-Authored-By: Warp Agent * fix(docs): harden support handoff Co-Authored-By: Warp Agent * fix(docs): consolidate Vercel header routes Co-Authored-By: Warp Agent * feat(docs): render Kapa answer images Co-Authored-By: Warp Agent * feat(docs): add accessible image lightboxes Co-Authored-By: Warp Agent * refactor(docs): share image lightbox Co-Authored-By: Warp Agent * fix(docs): close image lightbox from empty space Co-Authored-By: Warp Agent * Add Warp Docs MCP connect UI Co-Authored-By: Warp Agent * fix(docs): make MCP endpoint copy-only Co-Authored-By: Warp Agent * fix(docs): hide MCP endpoint text Co-Authored-By: Warp Agent --------- Co-authored-by: Warp Agent Co-authored-by: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> --- .env.example | 23 +- astro.config.mjs | 36 +- package-lock.json | 34 +- src/components/ArticleImageLightbox.astro | 235 ++++++ src/components/CustomHead.astro | 2 + src/components/CustomSidebar.astro | 12 +- src/components/KapaChatLauncher.css | 698 ++++++++++++++++- src/components/KapaChatLauncher.mount.tsx | 0 src/components/KapaChatLauncher.tsx | 908 +++++++++++++++++++++- src/components/KapaLauncher.astro | 10 + src/pages/api/support-handoff.ts | 231 ++++++ src/styles/custom.css | 140 ++++ src/styles/warp-components.css | 12 + vercel.json | 26 +- 14 files changed, 2279 insertions(+), 88 deletions(-) create mode 100644 src/components/ArticleImageLightbox.astro delete mode 100644 src/components/KapaChatLauncher.mount.tsx create mode 100644 src/pages/api/support-handoff.ts diff --git a/.env.example b/.env.example index 02af3a50d..ed587847d 100644 --- a/.env.example +++ b/.env.example @@ -4,11 +4,19 @@ # Values below are PUBLIC (they're shipped to the browser by Astro's # `envField`, and live behind rate limiting / allow-lists on the vendor side). -# Kapa Custom Frontend integration ID for the "Ask AI" button in the header. -# If unset, the Ask AI button is hidden and the site still runs normally. -# Get yours at: https://app.kapa.ai/admin +# Kapa Website Widget integration ID for the "Ask AI" button in the sidebar. +# If unset, docs falls back to the shared widget integration ID used in preview/prod. +# Get yours at: https://app.kapa.ai/admin (Integrations → Widget → Copy integration ID). +# The same value is passed to the widget as `data-website-id`. +# PUBLIC_KAPA_INTEGRATION_ID=f31c5644-dd65-4f49-9762-bf580062afa8 PUBLIC_KAPA_INTEGRATION_ID= +# Optional Kapa project ID used to build internal conversation links in +# "Create ticket" email drafts: +# https://app.kapa.ai//conversations/ +# You can find this in the Kapa dashboard URL while viewing the project. +PUBLIC_KAPA_PROJECT_ID= + # RudderStack analytics — required for docs_404 event tracking and page analytics. # Without these, no analytics events are sent and the weekly 404 monitor will # report zero data. Set both in the Vercel project environment (all environments). @@ -21,3 +29,12 @@ PUBLIC_KAPA_INTEGRATION_ID= # directive in vercel.json (a mismatch silently blocks all events in the browser). PUBLIC_RUDDERSTACK_WRITE_KEY= PUBLIC_RUDDERSTACK_DATA_PLANE_URL= + +# Server-side handoff forwarding endpoint used by /api/support-handoff. +# This should point at the DevX service endpoint that creates Front +# conversations from docs chat handoff requests. +SUPPORT_HANDOFF_ENDPOINT_URL= + +# Required when SUPPORT_HANDOFF_ENDPOINT_URL is set. Docs forwards this only +# to the DevX service as the `?secret=` query parameter, not as a bearer token. +SUPPORT_HANDOFF_SHARED_SECRET= diff --git a/astro.config.mjs b/astro.config.mjs index 12462c7b4..cfad50019 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -28,6 +28,11 @@ export default defineConfig({ access: 'public', optional: true, }), + PUBLIC_KAPA_PROJECT_ID: envField.string({ + context: 'client', + access: 'public', + optional: true, + }), PUBLIC_RUDDERSTACK_WRITE_KEY: envField.string({ context: 'client', access: 'public', @@ -43,6 +48,16 @@ export default defineConfig({ access: 'public', optional: true, }), + SUPPORT_HANDOFF_ENDPOINT_URL: envField.string({ + context: 'server', + access: 'secret', + optional: true, + }), + SUPPORT_HANDOFF_SHARED_SECRET: envField.string({ + context: 'server', + access: 'secret', + optional: true, + }), }, }, integrations: [ @@ -61,15 +76,24 @@ export default defineConfig({ baseUrl: 'https://github.com/warpdotdev/docs/edit/main/', }, lastUpdated: true, - // Soft-wrap long lines by default. Expressive Code defaults to - // `overflow-x: auto` for `
`, which combined with macOS's
-			// auto-hidden scrollbars made wide lines silently truncate.
-			// `wrap: true` adds the `.wrap` class so EC's `white-space: pre-wrap`
-			// kicks in; leading indents are preserved via its `span.indent` rule.
+			// Keep long lines unwrapped so code blocks use horizontal scrolling.
+			// This aligns docs behavior with the side chat renderer and preserves
+			// exact line shape for commands and snippets.
 			expressiveCode: {
 				defaultProps: {
-					wrap: true,
+					wrap: false,
 				},
+				// IMPORTANT: Expressive Code's Vite plugin rewrites Shiki's bundled
+				// theme registry (shiki/dist/themes.mjs) and strips every theme not
+				// listed as a *string* in its `themes` config. Starlight passes its
+				// themes as objects, so the registry is emptied for the entire Vite
+				// module graph — including the Kapa side-chat island, whose runtime
+				// createHighlighter(['github-light', 'github-dark']) then throws
+				// "theme is not included in this bundle" and falls back to plaintext.
+				// Keeping the registry intact restores chat code block highlighting.
+				// Only the requested themes are ever fetched at runtime (lazy chunks),
+				// so this does not bloat the pages served to visitors.
+				removeUnusedThemes: false,
 				// Map languages Shiki doesn't bundle to a safe fallback. PromQL
 				// blocks live in platform/self-hosting/monitoring.mdx;
 				// without this alias every build emits noisy "language could not be
diff --git a/package-lock.json b/package-lock.json
index fc8163d9c..91002c48f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2713,14 +2713,14 @@
       }
     },
     "node_modules/@kapaai/react-sdk": {
-      "version": "0.9.2",
-      "resolved": "https://registry.npmjs.org/@kapaai/react-sdk/-/react-sdk-0.9.2.tgz",
-      "integrity": "sha512-PeqgKL6d0yIkkmPn+1O8TBjH7KGx5HNiH7fhGl0FEV2MfJZBzWNvAOdOm/34VLdpb2Nawe3H1gSURdJ0DG6z7Q==",
+      "version": "0.9.10",
+      "resolved": "https://registry.npmjs.org/@kapaai/react-sdk/-/react-sdk-0.9.10.tgz",
+      "integrity": "sha512-osQyFgBJmhNM207MpB0aZbjs2kjNHjEJbNc5YEReJuyFE72Iydn9CoZGxox2GYRgMIlQ7wljHCzgQqkvR8lXqA==",
       "license": "MIT",
       "dependencies": {
         "@fingerprintjs/fingerprintjs-pro-react": "^2.7.0",
+        "@fingerprintjs/fingerprintjs-pro-spa": "^1.3.0",
         "@hcaptcha/react-hcaptcha": "^1.12.0",
-        "@tanstack/react-query": "^5.74.3",
         "js-cookie": "^3.0.5",
         "tldts": "^7.0.7"
       },
@@ -3778,32 +3778,6 @@
       "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
       "license": "MIT"
     },
-    "node_modules/@tanstack/query-core": {
-      "version": "5.90.20",
-      "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.20.tgz",
-      "integrity": "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==",
-      "license": "MIT",
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/tannerlinsley"
-      }
-    },
-    "node_modules/@tanstack/react-query": {
-      "version": "5.90.21",
-      "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.21.tgz",
-      "integrity": "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==",
-      "license": "MIT",
-      "dependencies": {
-        "@tanstack/query-core": "5.90.20"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/tannerlinsley"
-      },
-      "peerDependencies": {
-        "react": "^18 || ^19"
-      }
-    },
     "node_modules/@tybys/wasm-util": {
       "version": "0.10.3",
       "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
diff --git a/src/components/ArticleImageLightbox.astro b/src/components/ArticleImageLightbox.astro
new file mode 100644
index 000000000..8f96660e8
--- /dev/null
+++ b/src/components/ArticleImageLightbox.astro
@@ -0,0 +1,235 @@
+---
+// A singleton, delegated lightbox for article content and explicit chat image
+// triggers. Event delegation keeps it active for future Starlight client-side
+// swaps without wrapping article images in buttons or changing their layout.
+---
+
+
diff --git a/src/components/CustomHead.astro b/src/components/CustomHead.astro
index e8bd21f19..3f52967cf 100644
--- a/src/components/CustomHead.astro
+++ b/src/components/CustomHead.astro
@@ -3,6 +3,7 @@ import Default from '@astrojs/starlight/components/Head.astro';
 import Analytics from '@vercel/analytics/astro';
 import SpeedInsights from '@vercel/speed-insights/astro';
 import RudderStackAnalytics from './RudderStackAnalytics.astro';
+import ArticleImageLightbox from './ArticleImageLightbox.astro';
 
 // Note: `` (Astro View Transitions) is intentionally NOT
 // enabled here. Starlight's sidebar scroll persistence relies on the browser
@@ -154,6 +155,7 @@ const fontsHref =
   onload="this.media='all'"
 />
 
+
 
 
 
diff --git a/src/components/CustomSidebar.astro b/src/components/CustomSidebar.astro
index 6ab218ca8..954f822f7 100644
--- a/src/components/CustomSidebar.astro
+++ b/src/components/CustomSidebar.astro
@@ -77,9 +77,9 @@ import KapaLauncher from './KapaLauncher.astro';
 			'api': 'API',
 		};
 
-		// Detect Apple platforms once so the Ask AI kbd reads ⌘+I on Macs and
-		// Ctrl+I elsewhere. Mirrors KapaChatLauncher.tsx which binds the same
-		// shortcut via keymatch's `CmdOrCtrl+I`.
+// Detect Apple platforms once so the Ask AI kbd reads ⌘+I on Macs and
+		// Ctrl+I elsewhere. Mirrors KapaLauncher.astro which binds the same
+		// shortcut for opening the Kapa Website Widget.
 		var isMac = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform || '');
 		var modKey = isMac ? '\u2318' : 'Ctrl';
 
@@ -143,9 +143,9 @@ import KapaLauncher from './KapaLauncher.astro';
 				+ ''
 				+ 'Ask AI'
 				+ '';
-			askAi.addEventListener('click', function () {
-				// openPanel() in KapaChatLauncher reads the live search input and
-				// closes the search dialog itself, so we just route the click.
+askAi.addEventListener('click', function () {
+				// KapaLauncher reads the live search input and closes the search
+				// dialog itself, then opens the widget with that query prefilled.
 				var kapaBtn = document.querySelector('.warp-kapa-button');
 				if (kapaBtn) kapaBtn.click();
 			});
diff --git a/src/components/KapaChatLauncher.css b/src/components/KapaChatLauncher.css
index 3aca6dc6c..fd70b9fd4 100644
--- a/src/components/KapaChatLauncher.css
+++ b/src/components/KapaChatLauncher.css
@@ -47,6 +47,188 @@
 	align-items: center;
 	gap: 0.5rem;
 }
+.sl-kapa-mcp-connect__trigger {
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	gap: 0.375rem;
+	min-height: 2rem;
+	padding: 0.375rem 0.625rem;
+	border: 1px solid color-mix(in srgb, var(--sl-color-text-accent), var(--warp-control-border) 48%);
+	border-radius: var(--sl-radius-sm);
+	background: color-mix(in srgb, var(--sl-color-text-accent), var(--warp-control-bg) 88%);
+	color: var(--sl-color-text-accent);
+	font: inherit;
+	font-size: var(--sl-text-xs);
+	font-weight: 600;
+	line-height: 1.2;
+	white-space: nowrap;
+	cursor: pointer;
+	transition:
+		border-color 0.15s ease,
+		background-color 0.15s ease,
+		color 0.15s ease;
+}
+
+.sl-kapa-mcp-connect__trigger svg {
+	width: 0.875rem;
+	height: 0.875rem;
+	flex: none;
+}
+
+.sl-kapa-mcp-connect__trigger:hover,
+.sl-kapa-mcp-connect__trigger[data-state='open'] {
+	border-color: var(--sl-color-text-accent);
+	background: color-mix(in srgb, var(--sl-color-text-accent), var(--warp-control-bg) 78%);
+	color: var(--sl-color-white);
+}
+
+.sl-kapa-mcp-connect__trigger:focus-visible,
+.sl-kapa-mcp-connect__action:focus-visible {
+	outline: 2px solid var(--sl-color-accent-high);
+	outline-offset: 2px;
+}
+
+.sl-kapa-mcp-connect {
+	width: min(24rem, calc(100vw - 1.5rem));
+	max-width: var(--radix-popover-content-available-width);
+	max-height: var(--radix-popover-content-available-height);
+	padding: 0.875rem;
+	border: 1px solid var(--sl-color-gray-5);
+	border-radius: var(--sl-radius-lg);
+	background: color-mix(in srgb, var(--sl-color-black), var(--sl-color-gray-6) 18%);
+	box-shadow: var(--sl-shadow-lg);
+	color: var(--sl-color-gray-2);
+	overflow-y: auto;
+	z-index: 20;
+}
+
+.sl-kapa-mcp-connect__header {
+	display: flex;
+	align-items: flex-start;
+	gap: 0.625rem;
+}
+
+.sl-kapa-mcp-connect__header > svg {
+	width: 1.125rem;
+	height: 1.125rem;
+	margin-top: 0.125rem;
+	color: var(--sl-color-text-accent);
+	flex: none;
+}
+
+.sl-kapa-mcp-connect__title,
+.sl-kapa-mcp-connect__description,
+.sl-kapa-mcp-connect__eyebrow,
+.sl-kapa-mcp-connect__instructions {
+	margin: 0;
+}
+
+.sl-kapa-mcp-connect__title {
+	color: var(--sl-color-white);
+	font-size: var(--sl-text-sm);
+	font-weight: 700;
+	line-height: 1.35;
+}
+
+.sl-kapa-mcp-connect__description,
+.sl-kapa-mcp-connect__instructions {
+	margin-top: 0.25rem;
+	font-size: var(--sl-text-xs);
+	line-height: 1.45;
+}
+
+.sl-kapa-mcp-connect__section {
+	display: flex;
+	flex-direction: column;
+	align-items: stretch;
+	gap: 0.5rem;
+	margin-top: 0.875rem;
+	padding-top: 0.875rem;
+	border-top: 1px solid var(--sl-color-gray-5);
+}
+
+.sl-kapa-mcp-connect__eyebrow {
+	color: var(--sl-color-gray-3);
+	font-size: var(--sl-text-2xs);
+	font-weight: 700;
+	letter-spacing: 0.08em;
+	line-height: 1.2;
+	text-transform: uppercase;
+}
+
+.sl-kapa-mcp-connect__instructions strong {
+	color: var(--sl-color-gray-1);
+}
+
+.sl-kapa-mcp-connect__config {
+	box-sizing: border-box;
+	width: 100%;
+	padding: 0.5rem 0.625rem;
+	border: 1px solid var(--sl-color-gray-5);
+	border-radius: var(--sl-radius-sm);
+	background: color-mix(in srgb, var(--sl-color-black), var(--sl-color-gray-6) 32%);
+	color: var(--sl-color-gray-1);
+	font-family: var(--__sl-font-mono, 'JetBrains Mono', 'SFMono-Regular', monospace);
+	font-size: var(--sl-text-2xs);
+	line-height: 1.5;
+	overflow-wrap: anywhere;
+}
+
+.sl-kapa-mcp-connect__config {
+	white-space: pre-wrap;
+}
+
+
+.sl-kapa-mcp-connect__action {
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	gap: 0.375rem;
+	min-height: 2rem;
+	padding: 0.375rem 0.625rem;
+	border: 1px solid var(--warp-control-border);
+	border-radius: var(--sl-radius-sm);
+	background: var(--warp-control-bg);
+	color: var(--warp-control-text-hover);
+	font: inherit;
+	font-size: var(--sl-text-xs);
+	font-weight: 600;
+	line-height: 1.2;
+	cursor: pointer;
+	transition:
+		border-color 0.15s ease,
+		background-color 0.15s ease,
+		color 0.15s ease;
+}
+
+.sl-kapa-mcp-connect__action:hover {
+	border-color: var(--warp-control-border-hover);
+	background: var(--warp-control-bg-hover);
+	color: var(--sl-color-white);
+}
+
+.sl-kapa-mcp-connect__action--primary {
+	border-color: var(--sl-color-text-accent);
+	background: var(--sl-color-text-accent);
+	color: var(--sl-color-black);
+}
+
+.sl-kapa-mcp-connect__action--primary:hover {
+	border-color: color-mix(in srgb, var(--sl-color-text-accent), var(--sl-color-white) 18%);
+	background: color-mix(in srgb, var(--sl-color-text-accent), var(--sl-color-white) 8%);
+	color: var(--sl-color-black);
+}
+
+.sl-kapa-mcp-connect__action svg {
+	width: 0.875rem;
+	height: 0.875rem;
+	flex: none;
+}
+
+.sl-kapa-mcp-connect__arrow {
+	fill: color-mix(in srgb, var(--sl-color-black), var(--sl-color-gray-6) 18%);
+}
 
 .sl-kapa-icon-button,
 .sl-kapa-feedback__button {
@@ -199,6 +381,208 @@
 	border-radius: var(--sl-radius-sm);
 	padding: 0.1rem 0.3rem;
 }
+.sl-kapa-answer-image-button {
+	position: relative;
+	display: block;
+	box-sizing: border-box;
+	max-width: 100%;
+	margin: 0.875rem 0;
+	padding: 0;
+	border: 1px solid var(--sl-color-gray-5);
+	border-radius: var(--sl-radius-md);
+	background: var(--sl-color-black);
+	cursor: zoom-in;
+	overflow: hidden;
+}
+
+.sl-kapa-answer-image {
+	display: block;
+	box-sizing: border-box;
+	max-width: 100%;
+	height: auto;
+	background: var(--sl-color-black);
+	object-fit: contain;
+	box-shadow: 0 0.25rem 0.75rem rgb(0 0 0 / 0.18);
+}
+.sl-kapa-answer-image-button__overlay {
+	position: absolute;
+	inset: auto 0 0;
+	padding: 1.25rem 0.75rem 0.5rem;
+	background: linear-gradient(transparent, rgb(0 0 0 / 0.7));
+	color: var(--sl-color-white);
+	font-size: var(--sl-text-xs);
+	font-weight: 600;
+	line-height: 1.2;
+	opacity: 0;
+	transform: translateY(0.25rem);
+	transition:
+		opacity 0.15s ease,
+		transform 0.15s ease;
+	pointer-events: none;
+}
+
+.sl-kapa-answer-image-button:hover .sl-kapa-answer-image-button__overlay,
+.sl-kapa-answer-image-button:focus-visible .sl-kapa-answer-image-button__overlay {
+	opacity: 1;
+	transform: translateY(0);
+}
+
+.sl-kapa-answer-image-button:focus-visible {
+	outline: 2px solid var(--sl-color-accent-high);
+	outline-offset: 2px;
+}
+
+.sl-kapa-answer-image-fallback {
+	display: flex;
+	box-sizing: border-box;
+	align-items: center;
+	min-height: 3rem;
+	max-width: 100%;
+	margin: 0.875rem 0;
+	padding: 0.625rem 0.75rem;
+	border: 1px dashed var(--sl-color-gray-4);
+	border-radius: var(--sl-radius-md);
+	background: color-mix(in srgb, var(--sl-color-black), var(--sl-color-gray-6) 30%);
+	color: var(--sl-color-gray-3);
+	font-size: var(--sl-text-xs);
+	line-height: 1.4;
+	overflow-wrap: anywhere;
+}
+
+:root[data-theme='light'] .sl-kapa-answer-image {
+	background: var(--sl-color-white);
+	box-shadow: 0 0.25rem 0.75rem rgb(0 0 0 / 0.1);
+}
+:root[data-theme='light'] .sl-kapa-answer-image-button {
+	border-color: color-mix(in srgb, var(--sl-color-gray-5), var(--sl-color-black) 15%);
+	background: var(--sl-color-white);
+}
+
+:root[data-theme='light'] .sl-kapa-answer-image-fallback {
+	border-color: color-mix(in srgb, var(--sl-color-gray-4), var(--sl-color-black) 25%);
+	background: color-mix(in srgb, var(--sl-color-white), var(--sl-color-gray-6) 10%);
+	color: var(--sl-color-gray-3);
+}
+
+.sl-kapa-codeblock {
+	position: relative;
+	margin: 0.85rem 0;
+	max-width: 100%;
+}
+
+/* Chat-only copy control. Deliberately avoids EC's `.copy` class so EC CSS
+   (`button::after` mask) and EC JS never attach a second icon/handler. Visual
+   tokens match docs frosted-glass copy buttons in warp-components.css §2. */
+.sl-kapa-codeblock__copy-wrap {
+	position: absolute;
+	inset-block-start: 0.5rem;
+	inset-inline-end: 0.5rem;
+	z-index: 2;
+	display: flex;
+	align-items: center;
+	gap: 0.25rem;
+	pointer-events: none;
+}
+
+.sl-kapa-codeblock__copy {
+	pointer-events: auto;
+	position: relative;
+	box-sizing: border-box;
+	width: 2rem;
+	height: 2rem;
+	margin: 0;
+	padding: 0;
+	border-radius: var(--sl-radius-sm);
+	border: 1px solid rgba(255, 255, 255, 0.1);
+	background: rgba(255, 255, 255, 0.08);
+	backdrop-filter: blur(8px);
+	cursor: pointer;
+	opacity: 0.4;
+	transition:
+		opacity 0.15s ease,
+		background-color 0.15s ease,
+		border-color 0.15s ease;
+}
+
+.sl-kapa-codeblock:hover .sl-kapa-codeblock__copy,
+.sl-kapa-codeblock:focus-within .sl-kapa-codeblock__copy {
+	opacity: 0.75;
+}
+
+.sl-kapa-codeblock__copy:hover,
+.sl-kapa-codeblock__copy:focus-visible {
+	opacity: 1;
+	background: rgba(255, 255, 255, 0.16);
+	border-color: rgba(255, 255, 255, 0.18);
+}
+
+.sl-kapa-codeblock__copy:focus-visible {
+	outline: 2px solid var(--sl-color-accent-high);
+	outline-offset: 2px;
+}
+
+.sl-kapa-codeblock__copy-icon {
+	position: absolute;
+	inset: 0.475rem;
+	background-color: var(--sl-color-white, #f9f8f6);
+	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.75'%3E%3Cpath d='M3 19a2 2 0 0 1-1-2V2a2 2 0 0 1 1-1h13a2 2 0 0 1 2 1'/%3E%3Crect x='6' y='5' width='16' height='18' rx='1.5' ry='1.5'/%3E%3C/svg%3E");
+	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.75'%3E%3Cpath d='M3 19a2 2 0 0 1-1-2V2a2 2 0 0 1 1-1h13a2 2 0 0 1 2 1'/%3E%3Crect x='6' y='5' width='16' height='18' rx='1.5' ry='1.5'/%3E%3C/svg%3E");
+	-webkit-mask-repeat: no-repeat;
+	mask-repeat: no-repeat;
+	-webkit-mask-position: center;
+	mask-position: center;
+	-webkit-mask-size: contain;
+	mask-size: contain;
+}
+
+.sl-kapa-codeblock__copy-feedback {
+	pointer-events: none;
+	user-select: none;
+	font-size: var(--sl-text-2xs);
+	line-height: 1.2;
+	padding: 0.2rem 0.4rem;
+	border-radius: var(--sl-radius-sm);
+	background: color-mix(in srgb, var(--sl-color-accent) 85%, black);
+	color: var(--sl-color-white);
+	white-space: nowrap;
+}
+
+:root[data-theme='light'] .sl-kapa-codeblock__copy {
+	background: rgba(0, 0, 0, 0.04);
+	border: 1px solid rgba(0, 0, 0, 0.08);
+	opacity: 0.6;
+}
+
+:root[data-theme='light'] .sl-kapa-codeblock__copy:hover,
+:root[data-theme='light'] .sl-kapa-codeblock__copy:focus-visible {
+	background: rgba(0, 0, 0, 0.08);
+	border-color: rgba(0, 0, 0, 0.12);
+	opacity: 1;
+}
+
+:root[data-theme='light'] .sl-kapa-codeblock__copy-icon {
+	background-color: var(--sl-color-white, #0a0d12);
+}
+
+.sl-kapa-codeblock pre {
+	margin: 0;
+	padding: var(--ec-codePadBlk) var(--ec-codePadInl);
+	overflow-x: auto;
+	overflow-y: hidden;
+	white-space: pre;
+}
+
+.sl-kapa-codeblock code {
+	font-family: var(--__sl-font-mono, 'JetBrains Mono', 'SFMono-Regular', monospace);
+	display: block;
+	min-width: max-content;
+}
+
+/* Shiki separates `.line` spans with literal newline characters, which
+   `white-space: pre` (set on the pre above) already renders as line
+   breaks. The spans must stay inline — giving them `display: block`
+   would add a second break per line and double-space the code. */
+
 
 .sl-kapa-thinking {
 	display: flex;
@@ -249,18 +633,73 @@
 
 .sl-kapa-feedback {
 	display: flex;
+	flex-wrap: wrap;
+	align-items: center;
 	gap: 0.5rem;
 	margin-top: 0.875rem;
 }
+.sl-kapa-feedback__handoff {
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	height: 2.25rem;
+	padding: 0 0.75rem;
+	border: 1px solid var(--sl-color-gray-5);
+	border-radius: var(--sl-radius-sm);
+	background: var(--sl-color-black);
+	color: var(--sl-color-gray-1);
+	font: inherit;
+	font-size: var(--sl-text-xs);
+	font-weight: 500;
+	cursor: pointer;
+	transition:
+		border-color 0.15s ease,
+		background-color 0.15s ease,
+		color 0.15s ease;
+}
+
+.sl-kapa-feedback__handoff:hover {
+	border-color: var(--warp-control-border-hover);
+	background: var(--warp-control-bg-hover);
+	color: var(--sl-color-white);
+}
+
+.sl-kapa-feedback__handoff:focus-visible {
+	outline: 2px solid var(--sl-color-accent-high);
+	outline-offset: 2px;
+}
+.sl-kapa-feedback__handoff--submit {
+	background: var(--sl-color-text-accent);
+	border-color: var(--sl-color-text-accent);
+	color: var(--sl-color-black);
+}
+
+.sl-kapa-feedback__handoff--submit:hover:not(:disabled) {
+	border-color: color-mix(in srgb, var(--sl-color-text-accent), var(--sl-color-white) 18%);
+	background: color-mix(in srgb, var(--sl-color-text-accent), var(--sl-color-white) 8%);
+	color: var(--sl-color-black);
+}
+
+.sl-kapa-feedback__handoff--ghost {
+	background: transparent;
+}
 
 .sl-kapa-error {
-	border: 1px solid color-mix(in srgb, #ef4444, var(--sl-color-black) 35%);
-	background: rgb(127 29 29 / 0.2);
-	color: #fecaca;
+	border: 1px solid rgb(248 113 113 / 0.8);
+	background: rgb(254 226 226 / 0.9);
+	color: #991b1b;
 	border-radius: var(--sl-radius-lg);
 	padding: 0.875rem 1rem;
 }
 
+@media (prefers-color-scheme: dark) {
+	.sl-kapa-error {
+		border: 1px solid color-mix(in srgb, #ef4444, var(--sl-color-black) 35%);
+		background: rgb(127 29 29 / 0.2);
+		color: #fecaca;
+	}
+}
+
 .sl-kapa-panel__footer {
 	position: relative;
 	padding: 1rem;
@@ -337,6 +776,228 @@
 	opacity: 0.5;
 	cursor: not-allowed;
 }
+.sl-kapa-handoff-inline {
+	margin-top: 0.75rem;
+	padding-top: 0.75rem;
+	border-top: 1px solid var(--sl-color-gray-5);
+	display: flex;
+	flex-direction: column;
+	gap: 0.5rem;
+}
+
+.sl-kapa-handoff-inline label {
+	font-size: var(--sl-text-xs);
+	font-weight: 600;
+	color: var(--sl-color-gray-2);
+}
+
+.sl-kapa-handoff-inline__row {
+	display: grid;
+	grid-template-columns: minmax(0, 1fr) auto auto;
+	gap: 0.5rem;
+}
+
+.sl-kapa-handoff-inline input {
+	width: 100%;
+	min-width: 0;
+	height: 2.25rem;
+	border: 1px solid var(--sl-color-gray-5);
+	border-radius: var(--sl-radius-sm);
+	background: var(--sl-color-black);
+	color: var(--sl-color-white);
+	padding: 0 0.625rem;
+	font: inherit;
+	font-size: var(--sl-text-sm);
+}
+
+.sl-kapa-handoff-inline input::placeholder {
+	color: var(--sl-color-gray-3);
+}
+
+.sl-kapa-handoff-inline input:focus-visible {
+	outline: 2px solid var(--sl-color-accent-high);
+	outline-offset: 2px;
+}
+
+.sl-kapa-handoff-inline__status {
+	margin: 0;
+	font-size: var(--sl-text-xs);
+	line-height: 1.4;
+}
+
+.sl-kapa-handoff-inline__status--success {
+	color: #14532d;
+	background: rgb(220 252 231 / 0.9);
+	border: 1px solid rgb(74 222 128 / 0.7);
+	padding: 0.375rem 0.5rem;
+	border-radius: var(--sl-radius-sm);
+}
+
+.sl-kapa-handoff-inline__status--error {
+	color: #b91c1c;
+	background: rgb(254 226 226 / 0.9);
+	border: 1px solid rgb(248 113 113 / 0.8);
+	padding: 0.375rem 0.5rem;
+	border-radius: var(--sl-radius-sm);
+}
+
+.sl-kapa-handoff-inline__status a {
+	color: inherit;
+	text-decoration: underline;
+}
+
+@media (prefers-color-scheme: dark) {
+	.sl-kapa-handoff-inline__status--success {
+		color: #86efac;
+		background: rgb(20 83 45 / 0.35);
+		border-color: rgb(74 222 128 / 0.45);
+	}
+	.sl-kapa-handoff-inline__status--error {
+		color: #fecaca;
+		background: rgb(127 29 29 / 0.3);
+		border-color: rgb(248 113 113 / 0.5);
+	}
+}
+
+.sl-kapa-handoff {
+	margin-top: 0.75rem;
+	display: flex;
+	flex-direction: column;
+	gap: 0.625rem;
+}
+
+.sl-kapa-handoff__toggle {
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	gap: 0.5rem;
+	width: 100%;
+	height: 2.5rem;
+	padding: 0 0.875rem;
+	border: 1px solid var(--sl-color-gray-5);
+	border-radius: var(--sl-radius-sm);
+	background: var(--sl-color-black);
+	color: var(--sl-color-gray-1);
+	font: inherit;
+	font-size: var(--sl-text-sm);
+	font-weight: 500;
+	cursor: pointer;
+	transition:
+		border-color 0.15s ease,
+		background-color 0.15s ease,
+		color 0.15s ease;
+}
+
+.sl-kapa-handoff__toggle svg {
+	width: 0.95rem;
+	height: 0.95rem;
+	flex: none;
+}
+
+.sl-kapa-handoff__toggle:hover {
+	border-color: var(--warp-control-border-hover);
+	background: var(--warp-control-bg-hover);
+	color: var(--sl-color-white);
+}
+
+.sl-kapa-handoff__toggle:focus-visible {
+	outline: 2px solid var(--sl-color-accent-high);
+	outline-offset: 2px;
+}
+
+.sl-kapa-handoff__form {
+	display: flex;
+	flex-direction: column;
+	gap: 0.5rem;
+	padding: 0.75rem;
+	border: 1px solid var(--sl-color-gray-5);
+	border-radius: var(--sl-radius-lg);
+	background: color-mix(in srgb, var(--sl-color-black), var(--sl-color-gray-6) 28%);
+}
+
+.sl-kapa-handoff__form label {
+	display: flex;
+	flex-direction: column;
+	gap: 0.25rem;
+}
+
+.sl-kapa-handoff__form label span {
+	font-size: var(--sl-text-2xs);
+	color: var(--sl-color-gray-3);
+}
+
+.sl-kapa-handoff__form input,
+.sl-kapa-handoff__form textarea {
+	width: 100%;
+	border: 1px solid var(--sl-color-gray-5);
+	border-radius: var(--sl-radius-sm);
+	background: var(--sl-color-black);
+	color: var(--sl-color-white);
+	padding: 0.5rem 0.625rem;
+	font: inherit;
+	font-size: var(--sl-text-sm);
+}
+
+.sl-kapa-handoff__form textarea {
+	resize: vertical;
+	min-height: 4rem;
+}
+
+.sl-kapa-handoff__form input::placeholder,
+.sl-kapa-handoff__form textarea::placeholder {
+	color: var(--sl-color-gray-3);
+}
+
+.sl-kapa-handoff__form input:focus-visible,
+.sl-kapa-handoff__form textarea:focus-visible {
+	outline: 2px solid var(--sl-color-accent-high);
+	outline-offset: 2px;
+}
+
+.sl-kapa-handoff__submit {
+	margin-top: 0.25rem;
+	height: 2.5rem;
+	border: 1px solid var(--sl-color-text-accent);
+	border-radius: var(--sl-radius-sm);
+	background: var(--sl-color-text-accent);
+	color: var(--sl-color-black);
+	font: inherit;
+	font-size: var(--sl-text-sm);
+	font-weight: 600;
+	cursor: pointer;
+	transition:
+		border-color 0.15s ease,
+		background-color 0.15s ease;
+}
+
+.sl-kapa-handoff__submit:hover:not(:disabled) {
+	border-color: color-mix(in srgb, var(--sl-color-text-accent), var(--sl-color-white) 18%);
+	background: color-mix(in srgb, var(--sl-color-text-accent), var(--sl-color-white) 8%);
+}
+
+.sl-kapa-handoff__submit:focus-visible {
+	outline: 2px solid var(--sl-color-accent-high);
+	outline-offset: 2px;
+}
+
+.sl-kapa-handoff__submit:disabled {
+	opacity: 0.55;
+	cursor: not-allowed;
+}
+
+.sl-kapa-handoff__status {
+	margin: 0;
+	font-size: var(--sl-text-xs);
+	line-height: 1.4;
+}
+
+.sl-kapa-handoff__status--success {
+	color: #86efac;
+}
+
+.sl-kapa-handoff__status--error {
+	color: #fecaca;
+}
 
 /* Hide the reCAPTCHA badge */
 .grecaptcha-badge {
@@ -431,6 +1092,37 @@
 		flex-direction: column;
 		align-items: flex-start;
 	}
+
+	.sl-kapa-panel__header {
+		padding-inline: 0.75rem;
+	}
+
+	.sl-kapa-panel__header-actions {
+		gap: 0.25rem;
+	}
+
+	.sl-kapa-mcp-connect__trigger {
+		padding-inline: 0.5rem;
+	}
+}
+
+@media (max-width: 22rem) {
+	.sl-kapa-mcp-connect__trigger span {
+		position: absolute;
+		width: 1px;
+		height: 1px;
+		padding: 0;
+		margin: -1px;
+		overflow: hidden;
+		clip: rect(0, 0, 0, 0);
+		white-space: nowrap;
+		border: 0;
+	}
+
+	.sl-kapa-mcp-connect__trigger {
+		width: 2rem;
+		padding: 0;
+	}
 }
 
 @keyframes sl-kapa-spin {
diff --git a/src/components/KapaChatLauncher.mount.tsx b/src/components/KapaChatLauncher.mount.tsx
deleted file mode 100644
index e69de29bb..000000000
diff --git a/src/components/KapaChatLauncher.tsx b/src/components/KapaChatLauncher.tsx
index d4e1bcb9b..e395acf80 100644
--- a/src/components/KapaChatLauncher.tsx
+++ b/src/components/KapaChatLauncher.tsx
@@ -1,14 +1,24 @@
-import type { FormEvent, MouseEvent } from 'react';
+import type { FormEvent, MouseEvent, ReactElement, ReactNode } from 'react';
 import * as Popover from '@radix-ui/react-popover';
-import { useEffect, useMemo, useRef, useState } from 'react';
-import { KapaProvider, useChat } from '@kapaai/react-sdk';
-import { PUBLIC_KAPA_INTEGRATION_ID } from 'astro:env/client';
+import {
+	Children,
+	isValidElement,
+	useEffect,
+	useMemo,
+	useRef,
+	useState,
+} from 'react';
+import { CaptchaAction, KapaProvider, useCaptcha, useChat } from '@kapaai/react-sdk';
+import { PUBLIC_KAPA_INTEGRATION_ID, PUBLIC_KAPA_PROJECT_ID } from 'astro:env/client';
 import { isMac, keymatch } from 'keymatch';
 import ReactMarkdown from 'react-markdown';
 import {
 	LuExternalLink,
+	LuCheck,
+	LuCopy,
 	LuLoaderCircle,
 	LuMessageSquare,
+	LuPlug,
 	LuSend,
 	LuSquarePen,
 	LuThumbsDown,
@@ -18,10 +28,496 @@ import {
 import './KapaChatLauncher.css';
 
 const integrationId = PUBLIC_KAPA_INTEGRATION_ID;
+const projectId = PUBLIC_KAPA_PROJECT_ID?.trim() || '';
 const title = 'Ask Warp';
 const welcomeMessage = 'What do you want to know about Warp?';
+const uncertaintyThreshold = 0.15;
+const conversationLengthThreshold = 3;
+const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+const warpDocsMcpUrl = 'https://warp.mcp.kapa.ai';
+const warpDocsMcpConfig = JSON.stringify(
+	{
+		'Warp Docs': {
+			url: warpDocsMcpUrl,
+		},
+	},
+	null,
+	2
+);
 
 type FeedbackReaction = 'upvote' | 'downvote';
+type McpCopyTarget = 'config' | 'url';
+type GenericRecord = Record;
+type HandoffApiSuccess = {
+	message?: string;
+};
+
+function isObject(value: unknown): value is GenericRecord {
+	return typeof value === 'object' && value !== null;
+}
+
+function readNumberField(record: GenericRecord, key: string) {
+	const value = record[key];
+	if (typeof value === 'number' && Number.isFinite(value)) return value;
+	if (typeof value === 'string') {
+		const parsed = Number(value);
+		if (Number.isFinite(parsed)) return parsed;
+	}
+	return null;
+}
+
+function readBooleanField(record: GenericRecord, key: string) {
+	const value = record[key];
+	if (typeof value === 'boolean') return value;
+	if (typeof value === 'string') {
+		const normalized = value.trim().toLowerCase();
+		if (normalized === 'true') return true;
+		if (normalized === 'false') return false;
+	}
+	return null;
+}
+
+function getUncertaintyScore(metadata: unknown) {
+	if (!isObject(metadata)) return null;
+	return (
+		readNumberField(metadata, 'uncertainty') ??
+		readNumberField(metadata, 'uncertainty_score') ??
+		readNumberField(metadata, 'uncertaintyScore')
+	);
+}
+
+function isAnswerUncertain(metadata: unknown) {
+	if (!isObject(metadata)) return false;
+	const flag =
+		readBooleanField(metadata, 'is_uncertain') ??
+		readBooleanField(metadata, 'isUncertain');
+	if (flag === true) return true;
+	const score = getUncertaintyScore(metadata);
+	return score !== null ? score >= uncertaintyThreshold : false;
+}
+
+function isValidEmailAddress(value: string) {
+	return emailPattern.test(value.trim());
+}
+function getChatErrorMessage(error: unknown) {
+	const message = typeof error === 'string' ? error : String(error ?? '');
+	const normalized = message.toLowerCase();
+	const looksLikeBlockedNetworkError =
+		normalized.includes('network error while fetching answer') ||
+		normalized.includes('failed to fetch') ||
+		normalized.includes('err_blocked_by_client');
+	if (looksLikeBlockedNetworkError) {
+		return "Couldn't reach the chat service. If you use an ad blocker or privacy extension, allow kapa.ai and proxy.kapa.ai, then try again.";
+	}
+	return message;
+}
+
+const CHAT_LANGUAGE_ALIASES: Record = {
+	shell: 'bash',
+	zsh: 'bash',
+	pwsh: 'powershell',
+	plaintext: 'text',
+};
+
+function normalizeChatLanguage(language: string): string {
+	return CHAT_LANGUAGE_ALIASES[language.toLowerCase()] ?? language.toLowerCase();
+}
+
+function inferLanguageFromCode(codeText: string, fallbackLanguage: string): string {
+	if (fallbackLanguage !== 'text') return fallbackLanguage;
+	const sample = codeText.trim();
+	if (!sample) return fallbackLanguage;
+	const commandLikePattern =
+		/^(sudo|apt|apt-get|dnf|yum|zypper|pacman|curl|wget|git|npm|pnpm|yarn|cargo|python|node|brew|sh|bash)\b/m;
+	if (commandLikePattern.test(sample)) return 'bash';
+	return fallbackLanguage;
+}
+
+function escapeHtml(value: string): string {
+	return value.replace(/&/g, '&').replace(//g, '>');
+}
+
+async function copyTextToClipboard(text: string): Promise {
+	try {
+		if (navigator.clipboard?.writeText) {
+			await navigator.clipboard.writeText(text);
+			return true;
+		}
+	} catch {
+		// Fall through to execCommand fallback.
+	}
+	try {
+		const pre = document.createElement('pre');
+		Object.assign(pre.style, {
+			opacity: '0',
+			pointerEvents: 'none',
+			position: 'absolute',
+			overflow: 'hidden',
+			left: '0',
+			top: '0',
+			width: '20px',
+			height: '20px',
+			webkitUserSelect: 'auto',
+			userSelect: 'all',
+		});
+		pre.setAttribute('aria-hidden', 'true');
+		pre.textContent = text;
+		document.body.appendChild(pre);
+		const range = document.createRange();
+		range.selectNode(pre);
+		const selection = window.getSelection();
+		if (!selection) {
+			document.body.removeChild(pre);
+			return false;
+		}
+		selection.removeAllRanges();
+		selection.addRange(range);
+		const ok = document.execCommand('copy');
+		selection.removeAllRanges();
+		document.body.removeChild(pre);
+		return ok;
+	} catch {
+		return false;
+	}
+}
+
+type MarkdownCodeProps = { className?: string; children?: ReactNode };
+
+// react-markdown v9+ no longer passes an `inline` flag to the `code`
+// component. The reliable way to tell fenced blocks apart from inline
+// code is nesting: fenced blocks are always rendered as 
, so
+// we intercept `pre` (block) and leave bare `code` (inline) untouched.
+function extractCodeElement(children: ReactNode): ReactElement | null {
+	const items = Array.isArray(children) ? children : [children];
+	for (const item of items) {
+		if (isValidElement(item)) return item;
+	}
+	return null;
+}
+
+function markdownChildrenToText(children: ReactNode): string {
+	return (Array.isArray(children) ? children.join('') : String(children ?? '')).replace(/\n$/, '');
+}
+type ChatMarkdownImageProps = {
+	alt?: string;
+	src?: string;
+	title?: string;
+};
+
+function isImageOnlyMarkdownLink(children: ReactNode) {
+	const items = Children.toArray(children).filter(
+		(child) => typeof child !== 'string' || child.trim().length > 0
+	);
+	return (
+		items.length === 1 &&
+		isValidElement(items[0]) &&
+		items[0].type === ChatMarkdownImage
+	);
+}
+
+function ChatMarkdownLink({
+	children,
+	href,
+	title,
+}: {
+	children?: ReactNode;
+	href?: string;
+	title?: string;
+}) {
+	// Kapa sometimes wraps an image in its source link. Keep ordinary links,
+	// but remove the image-only wrapper so the thumbnail can be a real button.
+	if (isImageOnlyMarkdownLink(children)) {
+		return <>{children};
+	}
+
+	return (
+		
+			{children}
+		
+	);
+}
+
+function ChatMarkdownImage({ alt, src, title }: ChatMarkdownImageProps) {
+	const [hasFailed, setHasFailed] = useState(false);
+	const imageAlt = alt?.trim() || 'Image from Kapa answer';
+
+	useEffect(() => {
+		setHasFailed(false);
+	}, [src]);
+
+	if (!src || hasFailed) {
+		return (
+			
+				Image unavailable
+			
+		);
+	}
+
+	// `src` has already passed react-markdown's default safe URL transformation.
+	// Image-only Markdown links are unwrapped above to avoid nesting this button
+	// inside an anchor. Ordinary text links retain their original behavior.
+	const image = (
+		{imageAlt} setHasFailed(true)}
+		/>
+	);
+
+	return (
+		
+	);
+}
+const highlightCache = new Map();
+const highlightInFlight = new Map>();
+let highlightRequestQueue: Promise = Promise.resolve();
+type ShikiModule = typeof import('shiki');
+type ShikiHighlighter = Awaited>;
+let shikiHighlighterPromise: Promise | null = null;
+const SHIKI_LANGUAGES = new Set([
+	'bash',
+	'powershell',
+	'json',
+	'javascript',
+	'typescript',
+	'tsx',
+	'jsx',
+	'python',
+	'go',
+	'rust',
+	'yaml',
+	'markdown',
+	'html',
+	'css',
+	'text',
+]);
+
+async function getShikiHighlighter(): Promise {
+	if (!shikiHighlighterPromise) {
+		shikiHighlighterPromise = import('shiki/bundle/full').then(({ createHighlighter }) =>
+			createHighlighter({
+				themes: ['github-light', 'github-dark'],
+				langs: [...SHIKI_LANGUAGES],
+			})
+		);
+	}
+	return shikiHighlighterPromise;
+}
+
+async function requestHighlightedPre({
+	code,
+	language,
+	theme,
+}: {
+	code: string;
+	language: string;
+	theme: 'dark' | 'light';
+}): Promise {
+	const cacheKey = `${theme}:${language}:${code}`;
+	if (highlightCache.has(cacheKey)) {
+		return highlightCache.get(cacheKey) ?? null;
+	}
+	const existing = highlightInFlight.get(cacheKey);
+	if (existing) return existing;
+
+	const requestPromise = new Promise((resolve, reject) => {
+		const run = async () => {
+			try {
+				const highlighter = await getShikiHighlighter();
+				const shikiLanguage = SHIKI_LANGUAGES.has(language) ? language : 'text';
+				const html = highlighter.codeToHtml(code, {
+					lang: shikiLanguage,
+					theme: theme === 'light' ? 'github-light' : 'github-dark',
+				});
+				const preMatch = html.match(/]*>[\s\S]*?<\/pre>/i);
+				const preHtml = preMatch?.[0] ?? null;
+				highlightCache.set(cacheKey, preHtml);
+				resolve(preHtml);
+			} catch (error) {
+				reject(error);
+			}
+		};
+
+		highlightRequestQueue = highlightRequestQueue
+			.then(run)
+			.catch(() => run())
+			.then(() => undefined, () => undefined);
+	});
+
+	highlightInFlight.set(cacheKey, requestPromise);
+	requestPromise.then(
+		() => {
+			highlightInFlight.delete(cacheKey);
+		},
+		() => {
+			highlightInFlight.delete(cacheKey);
+		}
+	);
+	return requestPromise;
+}
+
+function ChatCodeBlock({
+	className,
+	codeText,
+	deferHighlight,
+}: {
+	className?: string;
+	codeText: string;
+	deferHighlight?: boolean;
+}) {
+	const language = className?.replace('language-', '') ?? 'text';
+	const normalizedLanguage = inferLanguageFromCode(
+		codeText,
+		normalizeChatLanguage(language)
+	);
+	const isTerminalLanguage = ['bash', 'sh', 'shell', 'zsh', 'powershell'].includes(normalizedLanguage);
+	const [highlighted, setHighlighted] = useState<{ key: string; preHtml: string } | null>(null);
+	const [isDarkTheme, setIsDarkTheme] = useState(true);
+	const [isCopied, setIsCopied] = useState(false);
+	const copiedResetRef = useRef(null);
+
+	useEffect(() => {
+		const root = document.documentElement;
+		const updateTheme = () => {
+			const explicitTheme = root.dataset.theme;
+			if (explicitTheme === 'light') {
+				setIsDarkTheme(false);
+				return;
+			}
+			if (explicitTheme === 'dark') {
+				setIsDarkTheme(true);
+				return;
+			}
+			setIsDarkTheme(window.matchMedia('(prefers-color-scheme: dark)').matches);
+		};
+
+		updateTheme();
+		const observer = new MutationObserver(updateTheme);
+		observer.observe(root, { attributes: true, attributeFilter: ['data-theme'] });
+		return () => observer.disconnect();
+	}, []);
+
+	useEffect(() => {
+		return () => {
+			if (copiedResetRef.current !== null) {
+				window.clearTimeout(copiedResetRef.current);
+			}
+		};
+	}, []);
+
+	const theme = isDarkTheme ? 'dark' : 'light';
+	const highlightKey = `${theme}:${normalizedLanguage}:${codeText}`;
+
+	useEffect(() => {
+		// While the answer is still streaming, the code text changes on every
+		// token. Requesting a highlight per token causes the block to churn
+		// between plaintext and highlighted DOM (visible flicker), so wait
+		// until streaming settles and highlight the final text once.
+		if (deferHighlight) return;
+		const controller = new AbortController();
+		(async (): Promise => {
+			try {
+				const preHtml = await requestHighlightedPre({
+					code: codeText,
+					language: normalizedLanguage,
+					theme,
+				});
+				if (!controller.signal.aborted && preHtml) {
+					setHighlighted({ key: `${theme}:${normalizedLanguage}:${codeText}`, preHtml });
+				}
+			} catch (error) {
+				if (!controller.signal.aborted) {
+					console.warn('[kapa-chat] code highlighting failed; using plaintext fallback', error);
+				}
+			}
+		})();
+
+		return () => {
+			controller.abort();
+		};
+	}, [codeText, deferHighlight, theme, normalizedLanguage]);
+
+	// Only use highlighted HTML that matches the *current* code text and
+	// theme; otherwise render the plaintext fallback. This prevents stale
+	// highlighted content from flashing while new text is streaming in.
+	const highlightedPreHtml = highlighted?.key === highlightKey ? highlighted.preHtml : null;
+
+	const onCopy = async () => {
+		const ok = await copyTextToClipboard(codeText);
+		if (!ok) return;
+		setIsCopied(true);
+		if (copiedResetRef.current !== null) {
+			window.clearTimeout(copiedResetRef.current);
+		}
+		copiedResetRef.current = window.setTimeout(() => {
+			setIsCopied(false);
+			copiedResetRef.current = null;
+		}, 1500);
+	};
+
+	return (
+		
+
+
+ + {isTerminalLanguage ? Terminal window : null} +
+ {highlightedPreHtml ? ( +
+ ) : ( +
+						
+					
+ )} + {/* Dedicated chat copy control — intentionally NOT EC's `.copy` + class. Reusing EC markup stacked EC's CSS mask icon on top of + any residual SVG and produced a double clipboard. One button, + one icon (CSS mask), one click handler. */} +
+ + {isCopied ? 'Copied!' : ''} + + {isCopied ? Copied! : null} + +
+
+
+ ); +} function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversation }: { title: string; @@ -33,11 +529,20 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio const [query, setQuery] = useState(''); const [hasStartedConversation, setHasStartedConversation] = useState(false); const [isAppleDevice, setIsAppleDevice] = useState(false); + const [storedThreadId, setStoredThreadId] = useState(null); + const [downvotedAnswerIds, setDownvotedAnswerIds] = useState>({}); + const [handoffEmailInput, setHandoffEmailInput] = useState(''); + const [handoffQaId, setHandoffQaId] = useState(null); + const [handoffErrorMessage, setHandoffErrorMessage] = useState(null); + const [handoffSuccessMessage, setHandoffSuccessMessage] = useState(null); + const [isSubmittingHandoff, setIsSubmittingHandoff] = useState(false); + const [copiedMcpValue, setCopiedMcpValue] = useState(null); const messagesRef = useRef(null); const dialogRef = useRef(null); const triggerRef = useRef(null); const closeButtonRef = useRef(null); const inputRef = useRef(null); + const mcpCopyResetRef = useRef(null); const { addFeedback, conversation, @@ -45,16 +550,62 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio isGeneratingAnswer, isPreparingAnswer, submitQuery, + threadId, } = useChat(); + const { executeCaptcha } = useCaptcha(); + useEffect(() => { setIsAppleDevice(isMac()); }, []); + useEffect(() => { + return () => { + if (mcpCopyResetRef.current !== null) { + window.clearTimeout(mcpCopyResetRef.current); + } + }; + }, []); + + useEffect(() => { + const savedThreadId = localStorage.getItem('warp_docs_kapa_thread_id'); + if (savedThreadId) { + setStoredThreadId(savedThreadId); + } + }, []); + + useEffect(() => { + if (!threadId) return; + setStoredThreadId(threadId); + localStorage.setItem('warp_docs_kapa_thread_id', threadId); + }, [threadId]); useEffect(() => { if (!isOpen || !messagesRef.current) return; messagesRef.current.scrollTop = messagesRef.current.scrollHeight; }, [conversation.length, isOpen]); + useEffect(() => { + if (!isOpen || !messagesRef.current) return; + if (!isGeneratingAnswer && !isPreparingAnswer) return; + messagesRef.current.scrollTop = messagesRef.current.scrollHeight; + }, [conversation, isGeneratingAnswer, isOpen, isPreparingAnswer]); + + useEffect(() => { + if (!handoffQaId || !isOpen) return; + const frame = window.requestAnimationFrame(() => { + const inlineForm = document.getElementById(`sl-kapa-handoff-inline-${handoffQaId}`); + if (!inlineForm) return; + inlineForm.scrollIntoView({ + behavior: 'smooth', + block: 'nearest', + }); + const emailInput = inlineForm.querySelector('input[type="email"]'); + emailInput?.focus(); + }); + return () => { + window.cancelAnimationFrame(frame); + }; + }, [handoffQaId, isOpen, conversation.length]); + useEffect(() => { const dialog = dialogRef.current; if (!dialog) return; @@ -107,6 +658,7 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio const submit = () => { const value = query.trim(); if (!value || isBusy) return; + closeHandoffForm(); submitQuery(value); setHasStartedConversation(true); setQuery(''); @@ -119,6 +671,123 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio const feedback = (questionAnswerId: string, reaction: FeedbackReaction) => { addFeedback(questionAnswerId, reaction); + if (reaction === 'downvote') { + setDownvotedAnswerIds((current) => ({ ...current, [questionAnswerId]: true })); + } + }; + + const isDownvoted = (qaId: string | null | undefined, reaction: string | null | undefined) => { + if (!qaId) return false; + return reaction === 'downvote' || downvotedAnswerIds[qaId] === true; + }; + + const shouldShowHandoffForAnswer = (qa: { + id?: string | null; + answer?: string | null; + metadata?: unknown; + reaction?: string | null; + }) => { + if (!qa.answer?.trim()) return false; + const conversationLengthTriggered = conversation.length >= conversationLengthThreshold; + const downvoteTriggered = isDownvoted(qa.id ?? null, qa.reaction ?? null); + const uncertaintyTriggered = isAnswerUncertain(qa.metadata); + return conversationLengthTriggered || downvoteTriggered || uncertaintyTriggered; + }; + + const buildConversationTranscript = () => { + if (!conversation.length) return 'No conversation history yet.'; + return conversation + .map((qa, index) => { + const sources = qa.sources?.length + ? `\nSources:\n${qa.sources.map((source) => `- ${source.title}: ${source.source_url}`).join('\n')}` + : ''; + return `Q${index + 1}: ${qa.question}\nA${index + 1}: ${qa.answer || '(no answer generated yet)'}${sources}`; + }) + .join('\n\n'); + }; + + const buildConversationLink = (currentThreadId: string | null) => { + if (!projectId || !currentThreadId) return null; + return `https://app.kapa.ai/${projectId}/conversations/${currentThreadId}`; + }; + + const openHandoffForm = (qaId: string) => { + setHandoffQaId(qaId); + setHandoffErrorMessage(null); + setHandoffSuccessMessage(null); + }; + + const closeHandoffForm = () => { + setHandoffQaId(null); + setHandoffErrorMessage(null); + setHandoffSuccessMessage(null); + }; + + const submitSupportHandoff = async (qa: { id?: string | null; question?: string }) => { + if (isSubmittingHandoff) return; + const userEmail = handoffEmailInput.trim().toLowerCase(); + if (!isValidEmailAddress(userEmail)) { + setHandoffErrorMessage('Enter a valid email address to continue.'); + return; + } + const localStorageThreadId = localStorage.getItem('warp_docs_kapa_thread_id'); + const activeThreadId = threadId || storedThreadId || localStorageThreadId; + if (!activeThreadId) { + setHandoffErrorMessage('Missing Kapa thread context; please send another message and try again.'); + return; + } + + const question = qa.question?.trim(); + if (!question) { + setHandoffErrorMessage('Missing question context for handoff.'); + return; + } + + const conversationLink = buildConversationLink(activeThreadId); + + setIsSubmittingHandoff(true); + setHandoffErrorMessage(null); + setHandoffSuccessMessage(null); + try { + let captcha; + try { + captcha = await executeCaptcha(CaptchaAction.FeedbackSubmit); + } catch { + setHandoffErrorMessage('Captcha verification could not be completed. Please try again.'); + return; + } + if (!captcha?.token || !captcha?.key) { + setHandoffErrorMessage('Captcha verification did not return a token. Please try again.'); + return; + } + const response = await fetch('/api/support-handoff', { + method: 'POST', + headers: { + 'content-type': 'application/json', + }, + body: JSON.stringify({ + user_email: userEmail, + question, + page_url: window.location.href, + conversation_transcript: buildConversationTranscript(), + kapa_project_id: projectId || null, + kapa_thread_id: activeThreadId, + kapa_conversation_url: conversationLink || null, + captcha_token: captcha.token, + captcha_header: captcha.key, + }), + }); + const payload: HandoffApiSuccess & { message?: string } = await response.json().catch(() => ({})); + if (!response.ok) { + setHandoffErrorMessage(payload.message || 'Could not create support ticket. Please try again.'); + return; + } + setHandoffSuccessMessage(payload.message || 'Support ticket created successfully.'); + } catch { + setHandoffErrorMessage('Could not reach support handoff service. Please try again.'); + } finally { + setIsSubmittingHandoff(false); + } }; const openPanel = () => { @@ -137,9 +806,10 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio // Legacy fallback: earlier callers stashed the query on window before // triggering us. Kept as a belt-and-braces guard in case any path // still uses it. - if (!pendingQuery && (window as any).__warpAskAiQuery) { - pendingQuery = (window as any).__warpAskAiQuery; - delete (window as any).__warpAskAiQuery; + const windowWithAskQuery = window as Window & { __warpAskAiQuery?: string }; + if (!pendingQuery && windowWithAskQuery.__warpAskAiQuery) { + pendingQuery = windowWithAskQuery.__warpAskAiQuery; + delete windowWithAskQuery.__warpAskAiQuery; } setIsOpen(true); @@ -155,6 +825,19 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio const closePanel = () => { dialogRef.current?.close(); }; + const copyMcpValue = async (target: McpCopyTarget) => { + const value = target === 'config' ? warpDocsMcpConfig : warpDocsMcpUrl; + const copied = await copyTextToClipboard(value); + if (!copied) return; + setCopiedMcpValue(target); + if (mcpCopyResetRef.current !== null) { + window.clearTimeout(mcpCopyResetRef.current); + } + mcpCopyResetRef.current = window.setTimeout(() => { + setCopiedMcpValue(null); + mcpCopyResetRef.current = null; + }, 1500); + }; const restoreFocus = () => { window.requestAnimationFrame(() => { @@ -198,8 +881,8 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio onClose={onDialogClose} onClick={onDialogClick} > -
-
+
+
+ + + + + +
+
+
+

Use in Warp

+

+ In Warp, go to Settings > Agents >{' '} + MCP servers, click + Add, and paste the + configuration. +

+ {warpDocsMcpConfig} + +
+
+

Use in another MCP client

+

+ Copy the official MCP URL for Claude, ChatGPT, and other compatible clients. +

+ +
+ + {copiedMcpValue === 'config' + ? 'Warp Docs MCP configuration copied to clipboard.' + : copiedMcpValue === 'url' + ? 'Warp Docs MCP URL copied to clipboard.' + : ''} + + +
+
-
+
-
+
{!hasConversation && (

Ask a question

@@ -236,7 +1009,40 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio
{qa.question}
{qa.answer ? ( - {qa.answer} + ; inline code + // arrives as a bare . react-markdown v9+ removed the + // `inline` prop, so nesting is the only reliable signal. + pre({ children }) { + const codeElement = extractCodeElement(children); + if (!codeElement) { + return
{children}
; + } + const codeClassName = + typeof codeElement.props.className === 'string' + ? codeElement.props.className + : undefined; + const codeText = markdownChildrenToText(codeElement.props.children); + const isStreamingAnswer = + isBusy && conversation[conversation.length - 1]?.id === qa.id; + return ( + + ); + }, + code({ className, children }) { + return {children}; + }, + }} + > + {qa.answer} +
) : (
+ ) : null} + {handoffQaId === qa.id && !isBusy && shouldShowHandoffForAnswer(qa) ? ( +
+ +
{ + event.preventDefault(); + void submitSupportHandoff(qa); + }} + > + setHandoffEmailInput(event.target.value)} + required + /> + + +
+ {handoffErrorMessage ? ( +

+ {handoffErrorMessage} +

+ ) : null} + {handoffSuccessMessage ? ( +

+ {handoffSuccessMessage} +

+ ) : null}
) : null}
))} - {error ?
{error}
: null} -
-
+ {error ?
{getChatErrorMessage(error)}
: null} +
+
- - + + ); @@ -353,7 +1219,13 @@ export default function KapaChatLauncher({ autoOpen = false }: { autoOpen?: bool const [sessionAutoOpen, setSessionAutoOpen] = useState(autoOpen); const callbacks = useMemo( () => ({ - askAI: {}, + askAI: { + onAnswerGenerationCompleted: (data: { threadId?: string | null }) => { + if (data.threadId) { + localStorage.setItem('warp_docs_kapa_thread_id', data.threadId); + } + }, + }, }), [] ); diff --git a/src/components/KapaLauncher.astro b/src/components/KapaLauncher.astro index 028bc96f5..a978012c4 100644 --- a/src/components/KapaLauncher.astro +++ b/src/components/KapaLauncher.astro @@ -2,7 +2,17 @@ // The button sits to the right of the sidebar search pill (see // CustomSidebar.astro), rendering as `[icon] Ask` at one type-scale step // smaller than search so it reads as the secondary affordance. +import { Code } from 'astro-expressive-code/components'; import KapaChatLauncher from './KapaChatLauncher'; --- + +{/* + Hidden Expressive Code block so EC frame CSS variables/assets exist on + every page. Chat copy buttons are owned by KapaChatLauncher (not EC's + `.copy` markup) to avoid double icons. +*/} + diff --git a/src/pages/api/support-handoff.ts b/src/pages/api/support-handoff.ts new file mode 100644 index 000000000..89ecba92a --- /dev/null +++ b/src/pages/api/support-handoff.ts @@ -0,0 +1,231 @@ +import type { APIRoute } from 'astro'; +import { SUPPORT_HANDOFF_ENDPOINT_URL, SUPPORT_HANDOFF_SHARED_SECRET } from 'astro:env/server'; + +export const prerender = false; + +type HandoffPayload = { + user_email?: unknown; + question?: unknown; + page_url?: unknown; + conversation_transcript?: unknown; + kapa_project_id?: unknown; + kapa_thread_id?: unknown; + kapa_conversation_url?: unknown; + captcha_token?: unknown; + captcha_header?: unknown; +}; + +const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; +const KAPA_ID_PATTERN = /^[a-zA-Z0-9_-]{1,128}$/; +const MAX_QUESTION_LENGTH = 4_000; +const MAX_TRANSCRIPT_LENGTH = 50_000; +const MAX_PAGE_URL_LENGTH = 2_048; +const MAX_CAPTCHA_TOKEN_LENGTH = 4_096; +const ALLOWED_PAGE_URL_HOSTS = new Set(['docs.warp.dev', 'localhost']); +const DOCS_PREVIEW_HOSTNAME_PATTERN = /^docs-[a-z0-9]+(?:-[a-z0-9]+)*-warpdotdev\.vercel\.app$/; +const ALLOWED_CAPTCHA_HEADERS = new Set(['X-RECAPTCHA-ENTERPRISE-TOKEN', 'X-HCAPTCHA-TOKEN']); +const RATE_LIMIT_WINDOW_MS = 10 * 60 * 1000; +const RATE_LIMIT_MAX_REQUESTS = 5; +const rateLimitStore = new Map(); + +function asTrimmedString(value: unknown) { + return typeof value === 'string' ? value.trim() : ''; +} + +function jsonError(message: string, status = 400) { + return new Response(JSON.stringify({ message }), { + status, + headers: { 'content-type': 'application/json' }, + }); +} + +function buildKapaConversationUrl(kapaProjectId: string, kapaThreadId: string) { + return `https://app.kapa.ai/${kapaProjectId}/conversations/${kapaThreadId}`; +} + +function isAllowedPageUrl(url: string) { + if (url.length > MAX_PAGE_URL_LENGTH) return false; + try { + const parsed = new URL(url); + if (!['http:', 'https:'].includes(parsed.protocol)) return false; + return isAllowedHostname(parsed.hostname); + } catch { + return false; + } +} + +function isAllowedHostname(hostname: string) { + const lowercasedHostname = hostname.toLowerCase(); + if (ALLOWED_PAGE_URL_HOSTS.has(lowercasedHostname)) return true; + return DOCS_PREVIEW_HOSTNAME_PATTERN.test(lowercasedHostname); +} + +function isAllowedRequestOrigin(request: Request) { + const originHeader = request.headers.get('origin'); + if (!originHeader) return false; + try { + const parsedOrigin = new URL(originHeader); + if (!['http:', 'https:'].includes(parsedOrigin.protocol)) return false; + return isAllowedHostname(parsedOrigin.hostname); + } catch { + return false; + } +} + +function getClientIp(request: Request) { + // Vercel overwrites `x-forwarded-for` and strips external values to prevent + // spoofing: https://vercel.com/docs/headers/request-headers#x-forwarded-for + const forwardedFor = request.headers.get('x-forwarded-for'); + if (forwardedFor) { + const firstIp = forwardedFor.split(',')[0]?.trim(); + if (firstIp) return firstIp; + } + const connectingIp = request.headers.get('cf-connecting-ip')?.trim(); + if (connectingIp) return connectingIp; + const realIp = request.headers.get('x-real-ip')?.trim(); + if (realIp) return realIp; + return 'unknown'; +} + +function isRateLimited(clientIp: string) { + const now = Date.now(); + const existing = rateLimitStore.get(clientIp); + if (!existing || existing.resetAt <= now) { + rateLimitStore.set(clientIp, { count: 1, resetAt: now + RATE_LIMIT_WINDOW_MS }); + return false; + } + existing.count += 1; + if (existing.count > RATE_LIMIT_MAX_REQUESTS) { + return true; + } + rateLimitStore.set(clientIp, existing); + return false; +} + +export const POST: APIRoute = async ({ request }) => { + const supportHandoffEndpointUrl = SUPPORT_HANDOFF_ENDPOINT_URL?.trim() || ''; + const supportHandoffSharedSecret = SUPPORT_HANDOFF_SHARED_SECRET?.trim() || ''; + if (!supportHandoffEndpointUrl || !supportHandoffSharedSecret) { + return jsonError('Support handoff is not configured.', 503); + } + if (!isAllowedRequestOrigin(request)) { + return jsonError('Request origin is not allowed.', 403); + } + const clientIp = getClientIp(request); + if (isRateLimited(clientIp)) { + return jsonError('Too many support handoff attempts. Please try again later.', 429); + } + + let payload: HandoffPayload; + try { + payload = (await request.json()) as HandoffPayload; + } catch { + return jsonError('Invalid JSON payload.'); + } + + const userEmail = asTrimmedString(payload.user_email).toLowerCase(); + if (!EMAIL_PATTERN.test(userEmail)) { + return jsonError('Please enter a valid email address.'); + } + + const question = asTrimmedString(payload.question); + const pageUrl = asTrimmedString(payload.page_url); + const conversationTranscript = asTrimmedString(payload.conversation_transcript); + const kapaProjectId = asTrimmedString(payload.kapa_project_id); + const kapaThreadId = asTrimmedString(payload.kapa_thread_id); + const suppliedKapaConversationUrl = asTrimmedString(payload.kapa_conversation_url); + const captchaToken = asTrimmedString(payload.captcha_token); + const captchaHeader = asTrimmedString(payload.captcha_header); + + if (!question) return jsonError('A question is required.'); + if (question.length > MAX_QUESTION_LENGTH) return jsonError('Question is too long.'); + if (!pageUrl) return jsonError('The current page URL is required.'); + if (!isAllowedPageUrl(pageUrl)) return jsonError('Page URL is invalid or not allowed.'); + if (!conversationTranscript) return jsonError('Conversation transcript is required.'); + if (conversationTranscript.length > MAX_TRANSCRIPT_LENGTH) { + return jsonError('Conversation transcript is too long.'); + } + if (!kapaThreadId) return jsonError('Kapa thread ID is required.'); + if (!KAPA_ID_PATTERN.test(kapaThreadId)) return jsonError('Kapa thread ID is invalid.'); + if (!captchaToken) return jsonError('Captcha verification is required.'); + if (captchaToken.length > MAX_CAPTCHA_TOKEN_LENGTH) return jsonError('Captcha token is invalid.'); + if (!ALLOWED_CAPTCHA_HEADERS.has(captchaHeader)) return jsonError('Captcha token header is invalid.'); + if (kapaProjectId && !KAPA_ID_PATTERN.test(kapaProjectId)) { + return jsonError('Kapa project ID is invalid.'); + } + const derivedKapaConversationUrl = + kapaProjectId && kapaThreadId + ? buildKapaConversationUrl(kapaProjectId, kapaThreadId) + : ''; + if (kapaProjectId) { + if ( + suppliedKapaConversationUrl && + suppliedKapaConversationUrl !== derivedKapaConversationUrl + ) { + return jsonError('Kapa conversation URL does not match project/thread values.'); + } + } else if (suppliedKapaConversationUrl) { + return jsonError('Kapa project ID is required when a Kapa conversation URL is supplied.'); + } + + const forwardPayload = { + user_email: userEmail, + question, + page_url: pageUrl, + conversation_transcript: conversationTranscript, + kapa_project_id: kapaProjectId || null, + kapa_thread_id: kapaThreadId, + kapa_conversation_url: derivedKapaConversationUrl || null, + source: 'docs-kapa-custom-chat', + }; + + // DevX `gcp_front_docs_handoff` validates the shared secret the same way + // Front webhooks do: as a `?secret=` query param (see + // helper_flask.validate_front_webhook_secret). Bearer alone is ignored. + const upstreamUrl = new URL(supportHandoffEndpointUrl); + upstreamUrl.searchParams.set('secret', supportHandoffSharedSecret); + + const forwardHeaders: HeadersInit = { + 'content-type': 'application/json', + [captchaHeader]: captchaToken, + }; + + let upstreamResponse: Response; + try { + upstreamResponse = await fetch(upstreamUrl.toString(), { + method: 'POST', + headers: forwardHeaders, + body: JSON.stringify(forwardPayload), + }); + } catch { + return jsonError('Failed to reach support handoff service.', 502); + } + + let upstreamData: unknown = null; + try { + upstreamData = await upstreamResponse.json(); + } catch { + upstreamData = null; + } + + if (!upstreamResponse.ok) { + const upstreamMessage = + upstreamData && + typeof upstreamData === 'object' && + 'message' in upstreamData && + typeof upstreamData.message === 'string' + ? upstreamData.message + : 'Support handoff failed.'; + return jsonError(upstreamMessage, upstreamResponse.status); + } + + return new Response( + JSON.stringify({ + message: 'Message sent to Warp Support.', + }), + { + status: 200, + headers: { 'content-type': 'application/json' }, + } + ); +}; diff --git a/src/styles/custom.css b/src/styles/custom.css index 8afdcb559..bafecc856 100644 --- a/src/styles/custom.css +++ b/src/styles/custom.css @@ -315,6 +315,146 @@ body { margin-left: auto; margin-right: auto; } +/* Article images are enhanced by ArticleImageLightbox.astro with keyboard + dialog controls while this class adds a layout-neutral zoom affordance. + The script scopes enhancement to main docs content and honors + `data-no-lightbox` on the image or any ancestor. */ +.sl-markdown-content img[data-docs-image-lightbox-image] { + cursor: zoom-in; + transition: box-shadow 0.15s ease; +} + +@media (hover: hover) { + .sl-markdown-content img[data-docs-image-lightbox-image]:hover { + box-shadow: 0 0 0 2px var(--sl-color-accent-high); + } +} +.sl-markdown-content img[data-warp-image-lightbox-trigger]:focus-visible, +.sl-markdown-content a[data-warp-image-lightbox-trigger]:focus-visible img { + outline: 2px solid var(--sl-color-accent-high); + outline-offset: 3px; +} + +html.docs-image-lightbox-open, +body.docs-image-lightbox-open { + overflow: hidden; +} + +.docs-image-lightbox { + position: fixed; + inset: 0; + z-index: 100; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: 100%; + max-width: none; + height: 100%; + max-height: none; + margin: 0; + padding: 1.5rem; + border: 0; + background: rgb(0 0 0 / 0.76); + backdrop-filter: blur(8px); + overflow: hidden; +} + +.docs-image-lightbox[hidden] { + display: none; +} +.docs-image-lightbox::backdrop { + background: transparent; +} + +.docs-image-lightbox__content { + position: relative; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: min(100%, 90rem); + height: 100%; + min-width: 0; + min-height: 0; + padding: 3.25rem 0 0; +} + +.docs-image-lightbox__image { + display: block; + max-width: 100%; + max-height: 100%; + width: auto; + height: auto; + border: 1px solid rgb(255 255 255 / 0.22); + border-radius: var(--sl-radius-md); + background: var(--sl-color-black); + object-fit: contain; + box-shadow: 0 1rem 2.5rem rgb(0 0 0 / 0.45); +} + +.docs-image-lightbox__close { + position: absolute; + top: 0; + right: 0; + z-index: 1; + display: inline-flex; + align-items: center; + justify-content: center; + width: 2.75rem; + height: 2.75rem; + padding: 0; + border: 1px solid rgb(255 255 255 / 0.25); + border-radius: var(--sl-radius-sm); + background: rgb(0 0 0 / 0.45); + color: var(--sl-color-white); + cursor: pointer; +} + +.docs-image-lightbox__close:hover { + border-color: rgb(255 255 255 / 0.5); + background: rgb(0 0 0 / 0.7); +} + +.docs-image-lightbox__close:focus-visible { + outline: 2px solid var(--sl-color-accent-high); + outline-offset: 2px; +} + +.docs-image-lightbox__close svg { + width: 1.25rem; + height: 1.25rem; +} + +.docs-image-lightbox__fallback { + max-width: min(100%, 24rem); + padding: 0.75rem 1rem; + border: 1px dashed var(--sl-color-gray-4); + border-radius: var(--sl-radius-md); + background: color-mix(in srgb, var(--sl-color-black), var(--sl-color-gray-6) 30%); + color: var(--sl-color-gray-3); +} + +:root[data-theme='light'] .docs-image-lightbox { + background: rgb(241 245 249 / 0.8); +} + +:root[data-theme='light'] .docs-image-lightbox__image { + border-color: rgb(15 23 42 / 0.2); + background: var(--sl-color-black); + box-shadow: 0 1rem 2.5rem rgb(15 23 42 / 0.24); +} + +:root[data-theme='light'] .docs-image-lightbox__close { + border-color: rgb(15 23 42 / 0.2); + background: rgb(255 255 255 / 0.8); + color: var(--sl-color-white); +} + +:root[data-theme='light'] .docs-image-lightbox__close:hover { + border-color: rgb(15 23 42 / 0.4); + background: var(--sl-color-black); +} .sl-markdown-content figcaption { margin-top: 0.5rem; diff --git a/src/styles/warp-components.css b/src/styles/warp-components.css index 38e3ce3e5..2169c61c0 100644 --- a/src/styles/warp-components.css +++ b/src/styles/warp-components.css @@ -179,6 +179,18 @@ pre.astro-code, .sl-markdown-content pre { overflow-x: auto; + overflow-y: hidden; + white-space: pre; +} + +.expressive-code pre code, +.sl-kapa-codeblock pre code { + display: block; + min-width: max-content; +} + +.expressive-code pre { + scrollbar-width: thin; } /* Code block copy button — frosted glass effect (Scalar pattern) */ diff --git a/vercel.json b/vercel.json index e8c2eeefd..fbfc579ee 100644 --- a/vercel.json +++ b/vercel.json @@ -29,39 +29,21 @@ }, { "key": "Content-Security-Policy", - "value": "default-src 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://www.google.com https://www.gstatic.com https://cdn.jsdelivr.net https://cdn.rudderlabs.com https://polyfill-fastly.io; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: https:; frame-src https://www.youtube-nocookie.com https://www.loom.com https://drive.google.com https://www.google.com; connect-src 'self' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://*.kapa.ai https://www.google.com https://app.warp.dev https://api.rudderstack.com; frame-ancestors 'none'" + "value": "default-src 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://www.google.com https://www.gstatic.com https://cdn.jsdelivr.net https://cdn.rudderlabs.com https://polyfill-fastly.io https://widget.kapa.ai https://hcaptcha.com https://*.hcaptcha.com https://js.hcaptcha.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: https:; frame-src https://www.youtube-nocookie.com https://www.loom.com https://drive.google.com https://www.google.com https://hcaptcha.com https://*.hcaptcha.com; connect-src 'self' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://*.kapa.ai https://kapa-widget-proxy-la7dkmplpq-uc.a.run.app https://www.google.com https://app.warp.dev https://api.rudderstack.com https://cdn.rudderlabs.com https://hcaptcha.com https://*.hcaptcha.com; frame-ancestors 'none'" } ] }, { - "source": "/api", + "source": "/api/:path*", "headers": [ { "key": "Content-Security-Policy", - "value": "default-src 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://www.google.com https://www.gstatic.com https://cdn.jsdelivr.net https://cdn.rudderlabs.com https://polyfill-fastly.io; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: https:; frame-src https://www.youtube-nocookie.com https://www.loom.com https://drive.google.com https://www.google.com; connect-src 'self' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://*.kapa.ai https://www.google.com https://app.warp.dev https://api.rudderstack.com; frame-ancestors 'none'" + "value": "default-src 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://www.google.com https://www.gstatic.com https://cdn.jsdelivr.net https://cdn.rudderlabs.com https://polyfill-fastly.io https://widget.kapa.ai https://hcaptcha.com https://*.hcaptcha.com https://js.hcaptcha.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: https:; frame-src https://www.youtube-nocookie.com https://www.loom.com https://drive.google.com https://www.google.com https://hcaptcha.com https://*.hcaptcha.com; connect-src 'self' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://*.kapa.ai https://kapa-widget-proxy-la7dkmplpq-uc.a.run.app https://www.google.com https://app.warp.dev https://api.rudderstack.com https://cdn.rudderlabs.com https://hcaptcha.com https://*.hcaptcha.com; frame-ancestors 'none'" } ] }, { - "source": "/api/(.*)", - "headers": [ - { - "key": "Content-Security-Policy", - "value": "default-src 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://www.google.com https://www.gstatic.com https://cdn.jsdelivr.net https://cdn.rudderlabs.com https://polyfill-fastly.io; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: https:; frame-src https://www.youtube-nocookie.com https://www.loom.com https://drive.google.com https://www.google.com; connect-src 'self' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://*.kapa.ai https://www.google.com https://app.warp.dev https://api.rudderstack.com; frame-ancestors 'none'" - } - ] - }, - { - "source": "/_astro/(.*)", - "headers": [ - { - "key": "Cache-Control", - "value": "public, max-age=31536000, immutable" - } - ] - }, - { - "source": "/assets/(.*)", + "source": "/:directory(_astro|assets)/:path(.*)", "headers": [ { "key": "Cache-Control", From c82a03a1b6ee8701d475cf340b85dbb3a47c1df3 Mon Sep 17 00:00:00 2001 From: Guy Scherzer Date: Fri, 14 Aug 2026 10:45:06 -0700 Subject: [PATCH 075/107] docs: document WARP_SKILL_DIRS for cloud agent runs (#506) * docs: document WARP_SKILL_DIRS for cloud agent runs Documents the WARP_SKILL_DIRS environment variable that indexes extra skill directories at personal-skill precedence during cloud runs, and links to it from the skill locations section. Co-Authored-By: Warp Agent * docs: correct third-party harness support for WARP_SKILL_DIRS Claude Code and Codex cloud runs publish WARP_SKILL_DIRS skills into their own skill roots before launch, so these harnesses discover them natively rather than ignoring the variable. Also trims the redundant Invalid entries bullet per review feedback. Co-Authored-By: Warp --------- Co-authored-by: hongyi-chen Co-authored-by: Warp Agent Co-authored-by: Hong Yi Chen Co-authored-by: warp-agent-staging[bot] <240773466+warp-agent-staging[bot]@users.noreply.github.com> --- .../docs/agents/capabilities/skills.mdx | 4 ++++ src/content/docs/platform/skills-as-agents.mdx | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/content/docs/agents/capabilities/skills.mdx b/src/content/docs/agents/capabilities/skills.mdx index 6c30edcdf..8e3b6db0e 100644 --- a/src/content/docs/agents/capabilities/skills.mdx +++ b/src/content/docs/agents/capabilities/skills.mdx @@ -292,6 +292,10 @@ Understanding when to use each level: * Cross-project automation (git workflows, documentation templates) * Professional standards you apply everywhere +### Extra directories for cloud runs + +[Cloud agents](/platform/) discover skills from the repositories in their [environment](/platform/environments/). To index skills that live outside those repositories — for example, skills baked into a custom Docker image — set the `WARP_SKILL_DIRS` environment variable. See [extra skill directories in cloud runs](/platform/skills-as-agents/#extra-skill-directories-in-cloud-runs). + ## Creating skills ### Step 1: Choose a location diff --git a/src/content/docs/platform/skills-as-agents.mdx b/src/content/docs/platform/skills-as-agents.mdx index e82edecf6..ce131df7e 100644 --- a/src/content/docs/platform/skills-as-agents.mdx +++ b/src/content/docs/platform/skills-as-agents.mdx @@ -54,6 +54,24 @@ For cloud agent runs (`oz agent run-cloud`), skills are discovered from reposito You can also list available skills programmatically using the `GET /agent` endpoint. See the [Oz API](/reference/api-and-sdk/) reference for details. ::: +### Extra skill directories in cloud runs + +Skills that don't live in a cloned repository's standard skill directories can still be indexed. Set the `WARP_SKILL_DIRS` environment variable to a comma-separated list of skill directories, and a cloud run picks them up alongside the skills it discovers from your repositories. This is useful for skills baked into a custom Docker image, mounted from shared storage, or installed by a setup step outside a repo. + +Set the variable in the environment's Docker image so it's present when the agent starts: + +```dockerfile title="Dockerfile" +ENV WARP_SKILL_DIRS="/opt/team-skills,tooling/skills" +``` + +How the value is interpreted: + +* **Directory layout** - Each entry is a skills directory whose direct children are skill folders containing a `SKILL.md`, the same layout as `.agents/skills/`. Point the variable at the parent directory, not at an individual skill folder. +* **Path resolution** - A leading `~` expands to the home directory. Relative entries resolve against the run's working directory rather than the agent process's current directory, so they stay stable even when setup steps change directories. +* **Precedence** - Skills loaded this way are treated as personal (home) skills, so they stay in scope for the whole run regardless of which directory the agent is working in. Repository skills of the same name still appear separately, as described in [skill name conflicts](/agents/capabilities/skills/#skill-name-conflicts). + +The Warp Agent harness reads `WARP_SKILL_DIRS` directly. For [third-party harnesses](/platform/harnesses/) such as Claude Code and Codex, a cloud run publishes each of these skills into that harness's own skill root before launch, so the harness discovers them through its native skill system. + --- ## Running skill-based agents From 6943edbeaf6290f72c3e67eaf0dbf886fd4f0103 Mon Sep 17 00:00:00 2001 From: Hong Yi Chen Date: Fri, 14 Aug 2026 13:58:55 -0400 Subject: [PATCH 076/107] docs: document the new Warp Agent CLI slash commands (#493) --- src/content/docs/agents/cli/configuration.mdx | 2 +- src/content/docs/agents/cli/index.mdx | 10 ++++++++++ .../docs/agents/cli/input-and-shell-commands.mdx | 4 ++++ src/content/docs/agents/cli/models-and-usage.mdx | 4 ++-- src/content/docs/agents/cli/reference.mdx | 15 +++++++++++++-- .../docs/agents/inference/grok-subscription.mdx | 2 ++ 6 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/content/docs/agents/cli/configuration.mdx b/src/content/docs/agents/cli/configuration.mdx index f1da1b076..7b6e15df3 100644 --- a/src/content/docs/agents/cli/configuration.mdx +++ b/src/content/docs/agents/cli/configuration.mdx @@ -97,7 +97,7 @@ Choose which items appear and in what order: 3. Press `←` and `→` to move the highlighted item earlier or later in the row. 4. Press `Esc` to save and close. Press `Ctrl+C` to cancel without saving. -Your choices are saved to the settings file, so the layout persists across sessions. +Your choices are saved to the settings file, so the layout persists across sessions. To start over, run `/reset-statusline`, which restores the default items and ordering. ## Start screen diff --git a/src/content/docs/agents/cli/index.mdx b/src/content/docs/agents/cli/index.mdx index 3cb8bfaf6..949963081 100644 --- a/src/content/docs/agents/cli/index.mdx +++ b/src/content/docs/agents/cli/index.mdx @@ -48,6 +48,16 @@ You sign in once, and the CLI stays signed in across sessions. * **Sign in with an API key** - In non-interactive environments such as CI, authenticate with a Warp API key through the `WARP_API_KEY` environment variable or the `--api-key` flag. See [command-line flags](/agents/cli/reference/#command-line-flags). * **Sign out** - Run `/logout`. The CLI returns to its login screen and opens Warp's web sign-out page, so your browser session is signed out too. +## Checking your account, plan, and billing + +The CLI has slash commands for the account details you'd otherwise look up in the Warp app or the {VARS.WEB_APP}. + +* **Session and account status** - Run `/status` to open a read-only panel with the installed version, the current conversation's name and ID, the working directory, and the organization and email you're signed in as. Press `Esc` to close it. Include these details when you report a problem. +* **Upgrade your plan** - Run `/upgrade` to open Warp's upgrade page in your browser. +* **Manage team billing** - Run `/manage-billing` to open your team's billing page in your browser. The command is listed only when you administer billing for your team. + +For how usage is metered as you work, see [models and usage](/agents/cli/models-and-usage/#usage-and-cost). + ## Automatic updates The CLI updates automatically. While it runs, it periodically checks for a newer version, downloads it in the background, and stages it without interrupting your session. The staged version takes effect the next time you launch `warp`. When an update is ready, the start screen shows an "update installed, restart to apply" notice next to the version. diff --git a/src/content/docs/agents/cli/input-and-shell-commands.mdx b/src/content/docs/agents/cli/input-and-shell-commands.mdx index 6587fc4bb..eb256a607 100644 --- a/src/content/docs/agents/cli/input-and-shell-commands.mdx +++ b/src/content/docs/agents/cli/input-and-shell-commands.mdx @@ -23,6 +23,10 @@ The full editing and selection table is in the [keyboard shortcuts reference](/a Core `Ctrl` and `Alt` bindings are cross-platform. Shortcuts that use `Alt` require some macOS terminals' Option-as-Alt (Meta) setting. Command-modified shortcuts require a terminal with the Kitty keyboard protocol enabled. ::: +### Vim mode + +If you prefer modal editing, run `/vim-mode` to toggle Vim keybindings in the input. The setting persists across sessions. Turn on the [statusline](/agents/cli/configuration/#statusline) Vim mode item to see the active mode (such as `NOR` or `INS`) while you type. + ## Slash commands Type `/` at the start of an empty input to open the slash command menu. Entries for toggles and pickers show their current state, for example `/theme (currently auto: Dark)` or `/auto-approve (currently off)`. diff --git a/src/content/docs/agents/cli/models-and-usage.mdx b/src/content/docs/agents/cli/models-and-usage.mdx index 78838eefa..41b14f6f1 100644 --- a/src/content/docs/agents/cli/models-and-usage.mdx +++ b/src/content/docs/agents/cli/models-and-usage.mdx @@ -24,10 +24,10 @@ Run `/api-keys` to open the key management menu. It lists each provider with its * **Set a key** - Press `Enter` on OpenAI, Anthropic, or Google and enter the key. Input is masked, so the key never appears in your transcript or shell history, and it's saved to your device's secure storage. Warp does not store provider keys on its servers. * **Replace or clear a key** - On a connected provider, `Enter` loads the stored key (still masked) for editing, and saving an empty field clears it. `Ctrl+X` clears the highlighted provider's key from the list. -* **Connect X Premium or SuperGrok** - Press `Enter` on the subscription row and the CLI opens your browser to sign in to your xAI account. `Ctrl+X` disconnects it. +* **Connect X Premium or SuperGrok** - Press `Enter` on the subscription row and the CLI opens your browser to sign in to your xAI account. `Ctrl+X` disconnects it. Running `/connect-grok` jumps straight to this row and starts the sign-in. * **Warp credit fallback** - Press `Enter` to toggle whether a request that fails through your key is retried with Warp credits. See [failover and fallback behavior](/agents/inference/bring-your-own-api-key/#failover-and-fallback-behavior). -You can also store or clear keys outside a session with the `--set-provider-api-key` and `--clear-provider-api-key` flags. See the [{VARS.WARP_CLI} reference](/agents/cli/reference/#command-line-flags). X Premium/SuperGrok connections can only be managed through `/api-keys`. +You can also store or clear keys outside a session with the `--set-provider-api-key` and `--clear-provider-api-key` flags. See the [{VARS.WARP_CLI} reference](/agents/cli/reference/#command-line-flags). X Premium/SuperGrok connections can only be managed from inside a session, with `/api-keys` or `/connect-grok`. :::note Warp's built-in Auto models always consume Warp credits, even with BYOK configured. To bill through your own account, select a specific provider model, or use a [custom router](/agents/inference/custom-routers/#using-your-own-api-keys-byok) whose targets your keys cover. See [BYOK usage and billing behavior](/agents/inference/bring-your-own-api-key/#byok-usage-and-billing-behavior) for the full rules. diff --git a/src/content/docs/agents/cli/reference.mdx b/src/content/docs/agents/cli/reference.mdx index fc8088c74..752efe138 100644 --- a/src/content/docs/agents/cli/reference.mdx +++ b/src/content/docs/agents/cli/reference.mdx @@ -124,6 +124,7 @@ Type `/` at the start of the input to open the slash command menu. Commands that | `/auto-approve` | | Toggle auto-approve for agent actions | | `/clear` | `[prompt]` | Clear the transcript and start a new conversation | | `/compact` | `[instructions]` | Free up context by summarizing the conversation history | +| `/connect-grok` | | Connect an X Premium or SuperGrok subscription for Grok models | | `/conversations` | | Open conversation history | | `/copy-debugging-id` | | Copy the current conversation's debugging information to the clipboard | | `/cost` | | Toggle per-response credit usage details | @@ -131,20 +132,30 @@ Type `/` at the start of the input to open the slash command menu. Commands that | `/exit` | | Exit the CLI | | `/export-to-clipboard` | | Export the current conversation to the clipboard as Markdown | | `/export-to-file` | `[filename]` | Export the current conversation to a Markdown file | +| `/fork` | `[prompt]` | Fork the current conversation into a copy, optionally sending a prompt in the copy | | `/handoff` | `[prompt]` | Hand off this conversation to a cloud agent | | `/logout` | | Log out of Warp | +| `/manage-billing` | | Open your team's billing page in the browser | | `/mcp` | | View and manage MCP servers | | `/model` | | Switch the base agent model | | `/natural-language-detection` | | Toggle natural language detection for shell input | | `/new` | `[prompt]` | Start a new conversation (alias for `/agent`) | +| `/orchestrate` | `[task]` | Break a task into subtasks and run them in parallel with multiple agents. See [multi-agent orchestration](/agents/cli/cloud-and-orchestration/#multi-agent-orchestration) | | `/plan` | `[task]` | Ask the agent to research and create a plan for a task | +| `/reset-statusline` | | Restore the statusline to its default items and ordering | | `/skills` | | Browse skills in scope and insert one into the input | +| `/status` | | Show session and account status | | `/statusline` | | Configure the statusline | | `/theme` | `` | Set the color theme | -| `/version` | | Show the installed version | +| `/upgrade` | | Open the Warp upgrade page in the browser | | `/view-logs` | | Bundle your logs into a zip archive | +| `/vim-mode` | | Toggle Vim keybindings in the input | | `/voice` | | Start voice input | +Some commands appear only when they apply to your account. `/manage-billing` is listed when you administer billing for your team, and opens that team's billing page; it isn't available to members without billing access. `/connect-grok` opens the same subscription row as [`/api-keys`](/agents/cli/models-and-usage/#bring-your-own-api-key) and starts the xAI sign-in directly. + +`/status` opens a read-only panel with the installed version, the current conversation's name and ID, the working directory, and the organization and email you're signed in as. Press `Esc` to close it, and include those details when you report a problem. + Skills also appear in the same menu under their own names, so you can invoke a skill directly as `/skill-name`. [Customizing the CLI](/agents/cli/configuration/) covers how skills are discovered. ## Keyboard shortcuts @@ -283,7 +294,7 @@ The sign-in attempt was rejected or timed out. The error message in the CLI name The CLI updates automatically. Installed builds check for updates in the background, download new versions, and apply them the next time you launch `warp`. A running session is never interrupted. -To check which version you're running, use `/version` in a session, or run: +To check which version you're running, use `/status` in a session, or run: ```bash warp --version diff --git a/src/content/docs/agents/inference/grok-subscription.mdx b/src/content/docs/agents/inference/grok-subscription.mdx index 1e393db02..b48e5ccd5 100644 --- a/src/content/docs/agents/inference/grok-subscription.mdx +++ b/src/content/docs/agents/inference/grok-subscription.mdx @@ -35,6 +35,8 @@ Once connected, supported Grok models show a **key icon** in the model picker, i 3. Approve the connection in your browser. The page confirms with "Grok connected," and back in Warp the row shows a "Connected on..." timestamp. 4. Select a Grok model with the key icon from the model picker in your prompt input. Connecting a subscription doesn't change your selected model, so this last step is what actually routes your requests through your subscription. See [Model choice](/agents/inference/model-choice/) for the list of available models. +In the [Warp Agent CLI](/agents/cli/), run `/connect-grok` instead. It starts the same xAI sign-in from your session, and `/api-keys` shows the connection state afterward. See [models and usage in the Warp Agent CLI](/agents/cli/models-and-usage/#bring-your-own-api-key). + ## Usage and billing behavior When a Grok model with the key icon is selected: From 40bf13f11db076d8358272e0ab5bcb73b416977f Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Fri, 14 Aug 2026 12:15:19 -0600 Subject: [PATCH 077/107] fix: collapse 742 trailing-slash redirect pairs into single rules (#532) vercel.json held 744 pairs of redirects that were byte-identical apart from the trailing slash, with the same destination and status code. Each pair costs two of the 2048 routes Vercel allows per deployment, and main had been sitting close enough to that ceiling that ordinary PRs were failing to deploy (see 27380fdf and the fix on #503). Collapse each pair into one rule using the ':path(.*)'-adjacent '(/?)' suffix, which matches both the bare path and the trailing-slash form. redirects: 2029 -> 1287 config routes: 2034 -> 1292 (cap 2048) Behavior is unchanged. Vercel matches redirect sources literally: a with-slash-only rule 404s the no-slash form and vice versa, verified against production on /agent-platform/capabilities/web-search and /agents/using-agents/model-choice. The '(/?)' form was verified on a preview deployment to match both forms while staying anchored, so '/xextra', '/x/deeper', and '/prefix/x' all still miss. Two safety guards: - Only plain-literal pairs with identical destination- Only plain-literal pairs with identical destination- Only plain-litar- Only plain-literal pairs with identical destination- Only plainsting the with-slash form up to the position of the no-slash form could jump it ahead of a wildcard that currently wins. Any pair with a rule betw wildcard that currently wins. Any pair with aorm is s wildcard that currently wins. Any pair with a rule betw wildcard tund /errors/:code and /university/(.*) and are left as-is. Equivalence is proven rather than assumedEquivalence is proven rather thhe original file resolve to the same destination before and after. Co-authored-by: Warp Agent --- vercel.json | 5528 +++++++++------------------------------------------ 1 file changed, 909 insertions(+), 4619 deletions(-) diff --git a/vercel.json b/vercel.json index fbfc579ee..7fdbed702 100644 --- a/vercel.json +++ b/vercel.json @@ -118,12 +118,7 @@ "statusCode": 308 }, { - "source": "/agent-platform/capabilities/computer-use", - "destination": "/agents/capabilities/computer-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/capabilities/computer-use/", + "source": "/agent-platform/capabilities/computer-use(/?)", "destination": "/agents/capabilities/computer-use/", "statusCode": 308 }, @@ -378,182 +373,182 @@ "statusCode": 308 }, { - "source": "/advanced/command-line-flags", + "source": "/advanced/command-line-flags(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts", + "source": "/agent-platform/agent-concepts(/?)", "destination": "/agent-platform/capabilities/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/agent-profiles-permissions", + "source": "/agent-platform/agent-concepts/agent-profiles-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/codebase-context", + "source": "/agent-platform/agent-concepts/codebase-context(/?)", "destination": "/agent-platform/capabilities/codebase-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/full-terminal-use", + "source": "/agent-platform/agent-concepts/full-terminal-use(/?)", "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/mcp", + "source": "/agent-platform/agent-concepts/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/model-choice", + "source": "/agent-platform/agent-concepts/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/planning", + "source": "/agent-platform/agent-concepts/planning(/?)", "destination": "/agent-platform/capabilities/planning/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/rules", + "source": "/agent-platform/agent-concepts/rules(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/skills", + "source": "/agent-platform/agent-concepts/skills(/?)", "destination": "/agent-platform/capabilities/skills/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/slash-commands", + "source": "/agent-platform/agent-concepts/slash-commands(/?)", "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/task-lists", + "source": "/agent-platform/agent-concepts/task-lists(/?)", "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/web-search", + "source": "/agent-platform/agent-concepts/web-search(/?)", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode", + "source": "/agent-platform/agent-mode(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/active-ai", + "source": "/agent-platform/agent-mode/active-ai(/?)", "destination": "/agent-platform/local-agents/active-ai/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context", + "source": "/agent-platform/agent-mode/agent-context(/?)", "destination": "/agent-platform/local-agents/agent-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/blocks-as-context", + "source": "/agent-platform/agent-mode/agent-context/blocks-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/images-as-context", + "source": "/agent-platform/agent-mode/agent-context/images-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/selection-as-context", + "source": "/agent-platform/agent-mode/agent-context/selection-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/urls-as-context", + "source": "/agent-platform/agent-mode/agent-context/urls-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/using-to-add-context", + "source": "/agent-platform/agent-mode/agent-context/using-to-add-context(/?)", "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agents-overview", + "source": "/agent-platform/agent-mode/agents-overview(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/ambient-agents-session-sharing", + "source": "/agent-platform/agent-mode/ambient-agents-session-sharing(/?)", "destination": "/platform/viewing-cloud-agent-runs/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/code-diffs-in-agent-conversations", + "source": "/agent-platform/agent-mode/code-diffs-in-agent-conversations(/?)", "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/full-terminal-use", + "source": "/agent-platform/agent-mode/full-terminal-use(/?)", "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/generate", + "source": "/agent-platform/agent-mode/generate(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interacting-with-agents", + "source": "/agent-platform/agent-mode/interacting-with-agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interacting-with-agents/agent-modality-beta", + "source": "/agent-platform/agent-mode/interacting-with-agents/agent-modality-beta(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interacting-with-agents/conversation-forking", + "source": "/agent-platform/agent-mode/interacting-with-agents/conversation-forking(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interacting-with-agents/voice", + "source": "/agent-platform/agent-mode/interacting-with-agents/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interactive-code-review", + "source": "/agent-platform/agent-mode/interactive-code-review(/?)", "destination": "/agent-platform/local-agents/interactive-code-review/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/model-choice", + "source": "/agent-platform/agent-mode/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/task-lists", + "source": "/agent-platform/agent-mode/task-lists(/?)", "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/third-party-cli-agents", + "source": "/agent-platform/agent-mode/third-party-cli-agents(/?)", "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/web-search", + "source": "/agent-platform/agent-mode/web-search(/?)", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/active-ai", + "source": "/agent-platform/agent-platform/active-ai(/?)", "destination": "/agent-platform/local-agents/active-ai/", "statusCode": 308 }, @@ -568,37 +563,37 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agent-modality-beta", + "source": "/agent-platform/agent-platform/agent-modality-beta(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agent/agents-overview", + "source": "/agent-platform/agent-platform/agent/agents-overview(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agent/using-agents/agent-profiles-permissions", + "source": "/agent-platform/agent-platform/agent/using-agents/agent-profiles-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agents-md", + "source": "/agent-platform/agent-platform/agents-md(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agents-overview", + "source": "/agent-platform/agent-platform/agents-overview(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/ai", + "source": "/agent-platform/agent-platform/ai(/?)", "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/ai-faqs", + "source": "/agent-platform/agent-platform/ai-faqs(/?)", "destination": "/agent-platform/getting-started/faqs/", "statusCode": 308 }, @@ -608,47 +603,47 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/ai-model-choice", + "source": "/agent-platform/agent-platform/ai-model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/ambient-agents/ambient-agents-overview", + "source": "/agent-platform/agent-platform/ambient-agents/ambient-agents-overview(/?)", "destination": "/platform/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/autonomy", + "source": "/agent-platform/agent-platform/autonomy(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/autonomy/agent-permissions", + "source": "/agent-platform/agent-platform/autonomy/agent-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/autonomy/run-to-completion", + "source": "/agent-platform/agent-platform/autonomy/run-to-completion(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/cloud-agents/cloud-agents-platform", + "source": "/agent-platform/agent-platform/cloud-agents/cloud-agents-platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/cloud-agents/warp-platform", + "source": "/agent-platform/agent-platform/cloud-agents/warp-platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/conversation-forking", + "source": "/agent-platform/agent-platform/conversation-forking(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/full-terminal-use", + "source": "/agent-platform/agent-platform/full-terminal-use(/?)", "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, @@ -658,32 +653,32 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/generate", + "source": "/agent-platform/agent-platform/generate(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/integrations/github-actions/readme", + "source": "/agent-platform/agent-platform/integrations/github-actions/readme(/?)", "destination": "/platform/integrations/github-actions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/integrations/integrations-overview", + "source": "/agent-platform/agent-platform/integrations/integrations-overview(/?)", "destination": "/platform/integrations/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/model-choice", + "source": "/agent-platform/agent-platform/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/slash-commands", + "source": "/agent-platform/agent-platform/slash-commands(/?)", "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents", + "source": "/agent-platform/agent-platform/using-agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, @@ -698,7 +693,7 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context", + "source": "/agent-platform/agent-platform/using-agents/agent-context(/?)", "destination": "/agent-platform/local-agents/agent-context/", "statusCode": 308 }, @@ -708,7 +703,7 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/blocks-as-context", + "source": "/agent-platform/agent-platform/using-agents/agent-context/blocks-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, @@ -718,42 +713,42 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/images-as-context", + "source": "/agent-platform/agent-platform/using-agents/agent-context/images-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/selection-as-context", + "source": "/agent-platform/agent-platform/using-agents/agent-context/selection-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/urls-as-context", + "source": "/agent-platform/agent-platform/using-agents/agent-context/urls-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/using-to-add-context", + "source": "/agent-platform/agent-platform/using-agents/agent-context/using-to-add-context(/?)", "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-conversations", + "source": "/agent-platform/agent-platform/using-agents/agent-conversations(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-conversations/conversation-forking", + "source": "/agent-platform/agent-platform/using-agents/agent-conversations/conversation-forking(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-permissions", + "source": "/agent-platform/agent-platform/using-agents/agent-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-profiles-permissions", + "source": "/agent-platform/agent-platform/using-agents/agent-profiles-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, @@ -768,12 +763,12 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-tasklists", + "source": "/agent-platform/agent-platform/using-agents/agent-tasklists(/?)", "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/managing-agents", + "source": "/agent-platform/agent-platform/using-agents/managing-agents(/?)", "destination": "/platform/managing-cloud-agents/", "statusCode": 308 }, @@ -783,7 +778,7 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/model-choice", + "source": "/agent-platform/agent-platform/using-agents/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, @@ -803,567 +798,567 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/planning", + "source": "/agent-platform/agent-platform/using-agents/planning(/?)", "destination": "/agent-platform/capabilities/planning/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/third-party-cli-agents", + "source": "/agent-platform/agent-platform/using-agents/third-party-cli-agents(/?)", "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/web-search", + "source": "/agent-platform/agent-platform/using-agents/web-search(/?)", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/voice", + "source": "/agent-platform/agent-platform/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/warp-ai", + "source": "/agent-platform/agent-platform/warp-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agents/active-ai", + "source": "/agent-platform/agents/active-ai(/?)", "destination": "/agent-platform/local-agents/active-ai/", "statusCode": 308 }, { - "source": "/agent-platform/agents/agent-modality-beta", + "source": "/agent-platform/agents/agent-modality-beta(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/agents/agents-md", + "source": "/agent-platform/agents/agents-md(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agents/agents-overview", + "source": "/agent-platform/agents/agents-overview(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai", + "source": "/agent-platform/agents/ai(/?)", "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai-commander", + "source": "/agent-platform/agents/ai-commander(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai-commands", + "source": "/agent-platform/agents/ai-commands(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai-faqs", + "source": "/agent-platform/agents/ai-faqs(/?)", "destination": "/agent-platform/getting-started/faqs/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai-getting-started", + "source": "/agent-platform/agents/ai-getting-started(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agents/autonomy", + "source": "/agent-platform/agents/autonomy(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agents/autonomy/agent-permissions", + "source": "/agent-platform/agents/autonomy/agent-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agents/autonomy/run-to-completion", + "source": "/agent-platform/agents/autonomy/run-to-completion(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agents/full-terminal-use", + "source": "/agent-platform/agents/full-terminal-use(/?)", "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, { - "source": "/agent-platform/agents/generate", + "source": "/agent-platform/agents/generate(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agents/model-choice", + "source": "/agent-platform/agents/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agents/slash-commands", + "source": "/agent-platform/agents/slash-commands(/?)", "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents", + "source": "/agent-platform/agents/using-agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-context", + "source": "/agent-platform/agents/using-agents/agent-context(/?)", "destination": "/agent-platform/local-agents/agent-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-context/blocks-as-context", + "source": "/agent-platform/agents/using-agents/agent-context/blocks-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-context/images-as-context", + "source": "/agent-platform/agents/using-agents/agent-context/images-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-context/selection-as-context", + "source": "/agent-platform/agents/using-agents/agent-context/selection-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-context/urls-as-context", + "source": "/agent-platform/agents/using-agents/agent-context/urls-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-context/using-to-add-context", + "source": "/agent-platform/agents/using-agents/agent-context/using-to-add-context(/?)", "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-conversations", + "source": "/agent-platform/agents/using-agents/agent-conversations(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-conversations/conversation-forking", + "source": "/agent-platform/agents/using-agents/agent-conversations/conversation-forking(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-profiles-permissions", + "source": "/agent-platform/agents/using-agents/agent-profiles-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-tasklists", + "source": "/agent-platform/agents/using-agents/agent-tasklists(/?)", "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/managing-agents", + "source": "/agent-platform/agents/using-agents/managing-agents(/?)", "destination": "/platform/managing-cloud-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/model-choice", + "source": "/agent-platform/agents/using-agents/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/planning", + "source": "/agent-platform/agents/using-agents/planning(/?)", "destination": "/agent-platform/capabilities/planning/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/profiles", + "source": "/agent-platform/agents/using-agents/profiles(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/third-party-cli-agents", + "source": "/agent-platform/agents/using-agents/third-party-cli-agents(/?)", "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/web-search", + "source": "/agent-platform/agents/using-agents/web-search(/?)", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/agents/voice", + "source": "/agent-platform/agents/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/agents/warp-ai", + "source": "/agent-platform/agents/warp-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agents/warp-ai/agent-mode", + "source": "/agent-platform/agents/warp-ai/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/ai", + "source": "/agent-platform/ai(/?)", "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agent-platform/ai-features/ai-commands", + "source": "/agent-platform/ai-features/ai-commands(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/ai-features/model-choice", + "source": "/agent-platform/ai-features/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/ai/warp-ai", + "source": "/agent-platform/ai/warp-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/ambient-agents", + "source": "/agent-platform/ambient-agents(/?)", "destination": "/platform/", "statusCode": 308 }, { - "source": "/agent-platform/ambient-agents/agent-secrets", + "source": "/agent-platform/ambient-agents/agent-secrets(/?)", "destination": "/platform/secrets/", "statusCode": 308 }, { - "source": "/agent-platform/ambient-agents/ambient-agents-overview", + "source": "/agent-platform/ambient-agents/ambient-agents-overview(/?)", "destination": "/platform/", "statusCode": 308 }, { - "source": "/agent-platform/ambient-agents/managing-ambient-agents", + "source": "/agent-platform/ambient-agents/managing-ambient-agents(/?)", "destination": "/platform/managing-cloud-agents/", "statusCode": 308 }, { - "source": "/agent-platform/ambient-agents/managing-ambient-agents/scheduled-agents", + "source": "/agent-platform/ambient-agents/managing-ambient-agents/scheduled-agents(/?)", "destination": "/platform/triggers/scheduled-agents/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/agent-session-sharing", + "source": "/agent-platform/cloud-agents/agent-session-sharing(/?)", "destination": "/agent-platform/local-agents/session-sharing/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/cloud-agent-secrets", + "source": "/agent-platform/cloud-agents/cloud-agent-secrets(/?)", "destination": "/platform/secrets/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/cloud-agents-faqs", + "source": "/agent-platform/cloud-agents/cloud-agents-faqs(/?)", "destination": "/platform/faqs/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/cloud-agents-overview", + "source": "/agent-platform/cloud-agents/cloud-agents-overview(/?)", "destination": "/platform/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/cloud-agents-platform", + "source": "/agent-platform/cloud-agents/cloud-agents-platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/cloud-agents-session-sharing", + "source": "/agent-platform/cloud-agents/cloud-agents-session-sharing(/?)", "destination": "/platform/viewing-cloud-agent-runs/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/managed-worker-reference", + "source": "/agent-platform/cloud-agents/managed-worker-reference(/?)", "destination": "/platform/self-hosting/reference/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/managed-worker-reference/direct-backend", + "source": "/agent-platform/cloud-agents/managed-worker-reference/direct-backend(/?)", "destination": "/platform/self-hosting/managed-direct/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/managed-worker-reference/docker-connectivity", + "source": "/agent-platform/cloud-agents/managed-worker-reference/docker-connectivity(/?)", "destination": "/platform/self-hosting/managed-docker/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/managed-worker-reference/helm-chart", + "source": "/agent-platform/cloud-agents/managed-worker-reference/helm-chart(/?)", "destination": "/platform/self-hosting/managed-kubernetes/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/managed-worker-reference/kubernetes-backend", + "source": "/agent-platform/cloud-agents/managed-worker-reference/kubernetes-backend(/?)", "destination": "/platform/self-hosting/managed-kubernetes/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/managed-worker-reference/private-docker-registries", + "source": "/agent-platform/cloud-agents/managed-worker-reference/private-docker-registries(/?)", "destination": "/platform/self-hosting/managed-docker/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/warp-platform", + "source": "/agent-platform/cloud-agents/warp-platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/code/code-review/interactive-code-review", + "source": "/agent-platform/code/code-review/interactive-code-review(/?)", "destination": "/agent-platform/local-agents/interactive-code-review/", "statusCode": 308 }, { - "source": "/agent-platform/code/codebase-context", + "source": "/agent-platform/code/codebase-context(/?)", "destination": "/agent-platform/capabilities/codebase-context/", "statusCode": 308 }, { - "source": "/agent-platform/code/reviewing-code", + "source": "/agent-platform/code/reviewing-code(/?)", "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, { - "source": "/agent-platform/features/agent-mode", + "source": "/agent-platform/features/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/agent-mode/agents-md", + "source": "/agent-platform/features/agent-mode/agents-md(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/agents", + "source": "/agent-platform/features/agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai", + "source": "/agent-platform/features/ai(/?)", "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-agents", + "source": "/agent-platform/features/ai-agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-agents", + "source": "/agent-platform/features/ai-and-agents(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-agents/agents", + "source": "/agent-platform/features/ai-and-agents/agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-ask-warp", + "source": "/agent-platform/features/ai-and-ask-warp(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-ask-warp-ai", + "source": "/agent-platform/features/ai-and-ask-warp-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-session-history/warp-ai", + "source": "/agent-platform/features/ai-and-session-history/warp-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-stack-overflow/agent-mode", + "source": "/agent-platform/features/ai-and-stack-overflow/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-warpdrive/warp-ai", + "source": "/agent-platform/features/ai-and-warpdrive/warp-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-command", + "source": "/agent-platform/features/ai-command(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-command-search", + "source": "/agent-platform/features/ai-command-search(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-command-search/limits", + "source": "/agent-platform/features/ai-command-search/limits(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-command-search/model-choice", + "source": "/agent-platform/features/ai-command-search/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-command-suggestions", + "source": "/agent-platform/features/ai-command-suggestions(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-command/model-choice", + "source": "/agent-platform/features/ai-command/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-commands", + "source": "/agent-platform/features/ai-commands(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-features", + "source": "/agent-platform/features/ai-features(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-features/ai-chat", + "source": "/agent-platform/features/ai-features/ai-chat(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/agent", + "source": "/agent-platform/features/ai/agent(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/agent-mode", + "source": "/agent-platform/features/ai/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/agents", + "source": "/agent-platform/features/ai/agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/ai-models-and-providers", + "source": "/agent-platform/features/ai/ai-models-and-providers(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/ai-setup", + "source": "/agent-platform/features/ai/ai-setup(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/assistant", + "source": "/agent-platform/features/ai/assistant(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/commands", + "source": "/agent-platform/features/ai/commands(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/commands-and-agents", + "source": "/agent-platform/features/ai/commands-and-agents(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/commands/agent-mode", + "source": "/agent-platform/features/ai/commands/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/commands/agents", + "source": "/agent-platform/features/ai/commands/agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/commands/ai-agent", + "source": "/agent-platform/features/ai/commands/ai-agent(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/commands/ai-commands-overview", + "source": "/agent-platform/features/ai/commands/ai-commands-overview(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/get-started-with-warp-ai", + "source": "/agent-platform/features/ai/get-started-with-warp-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/model-choice", + "source": "/agent-platform/features/ai/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/using-ai", + "source": "/agent-platform/features/ai/using-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/using-warp-ai", + "source": "/agent-platform/features/ai/using-warp-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/generate", + "source": "/agent-platform/features/generate(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/integrations/mcp", + "source": "/agent-platform/features/integrations/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/features/knowledge", + "source": "/agent-platform/features/knowledge(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/features/model-choice", + "source": "/agent-platform/features/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/features/terminal-ai", + "source": "/agent-platform/features/terminal-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/terminal-ai/ai-models", + "source": "/agent-platform/features/terminal-ai/ai-models(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/features/voice", + "source": "/agent-platform/features/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai", + "source": "/agent-platform/features/warp-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/active-ai", + "source": "/agent-platform/features/warp-ai/active-ai(/?)", "destination": "/agent-platform/local-agents/active-ai/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/agent-mode", + "source": "/agent-platform/features/warp-ai/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, @@ -1373,142 +1368,142 @@ "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/agent-modea", + "source": "/agent-platform/features/warp-ai/agent-modea(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/ai-command-search", + "source": "/agent-platform/features/warp-ai/ai-command-search(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/ai-command-suggestions", + "source": "/agent-platform/features/warp-ai/ai-command-suggestions(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/generate", + "source": "/agent-platform/features/warp-ai/generate(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/knowledge", + "source": "/agent-platform/features/warp-ai/knowledge(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/mcp", + "source": "/agent-platform/features/warp-ai/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/rules", + "source": "/agent-platform/features/warp-ai/rules(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/voice", + "source": "/agent-platform/features/warp-ai/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/getting-started/quickstart-guide/agents-in-warp", + "source": "/agent-platform/getting-started/quickstart-guide/agents-in-warp(/?)", "destination": "/agent-platform/getting-started/agents-in-warp/", "statusCode": 308 }, { - "source": "/agent-platform/integrations", + "source": "/agent-platform/integrations(/?)", "destination": "/platform/integrations/", "statusCode": 308 }, { - "source": "/agent-platform/integrations-overview", + "source": "/agent-platform/integrations-overview(/?)", "destination": "/platform/integrations/", "statusCode": 308 }, { - "source": "/agent-platform/integrations/github-actions", + "source": "/agent-platform/integrations/github-actions(/?)", "destination": "/platform/integrations/github-actions/", "statusCode": 308 }, { - "source": "/agent-platform/integrations/github-actions/demo-issue-triage-bot", + "source": "/agent-platform/integrations/github-actions/demo-issue-triage-bot(/?)", "destination": "/platform/integrations/quickstart-github-actions/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/integrations/demo-issue-triage-bot", + "source": "/agent-platform/cloud-agents/integrations/demo-issue-triage-bot(/?)", "destination": "/platform/integrations/quickstart-github-actions/", "statusCode": 308 }, { - "source": "/agent-platform/integrations/integrations-overview", + "source": "/agent-platform/integrations/integrations-overview(/?)", "destination": "/platform/integrations/", "statusCode": 308 }, { - "source": "/agent-platform/integrations/integrations-overview/team-access-billing-and-identity-permissions", + "source": "/agent-platform/integrations/integrations-overview/team-access-billing-and-identity-permissions(/?)", "destination": "/platform/team-access-billing-and-identity/", "statusCode": 308 }, { - "source": "/agent-platform/integrations/linear", + "source": "/agent-platform/integrations/linear(/?)", "destination": "/platform/integrations/linear/", "statusCode": 308 }, { - "source": "/agent-platform/integrations/slack", + "source": "/agent-platform/integrations/slack(/?)", "destination": "/platform/integrations/slack/", "statusCode": 308 }, { - "source": "/agent-platform/knowledge-and-collaboration/mcp", + "source": "/agent-platform/knowledge-and-collaboration/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/knowledge-and-collaboration/rules", + "source": "/agent-platform/knowledge-and-collaboration/rules(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/knowledge-and-collaboration/session-sharing/agent-session-sharing", + "source": "/agent-platform/knowledge-and-collaboration/session-sharing/agent-session-sharing(/?)", "destination": "/agent-platform/local-agents/session-sharing/", "statusCode": 308 }, { - "source": "/agent-platform/knowledge-and-collaboration/session-sharing/ambient-agents-session-sharing", + "source": "/agent-platform/knowledge-and-collaboration/session-sharing/ambient-agents-session-sharing(/?)", "destination": "/platform/viewing-cloud-agent-runs/", "statusCode": 308 }, { - "source": "/agent-platform/knowledge-and-collaboration/warp-drive/model-context-protocol-mcp", + "source": "/agent-platform/knowledge-and-collaboration/warp-drive/model-context-protocol-mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents", + "source": "/agent-platform/local-agents(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/agent-notifications", + "source": "/agent-platform/local-agents/agent-notifications(/?)", "destination": "/agent-platform/capabilities/agent-notifications/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/agents-overview", + "source": "/agent-platform/local-agents/agents-overview(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/ambient-agents-session-sharing", + "source": "/agent-platform/local-agents/ambient-agents-session-sharing(/?)", "destination": "/platform/viewing-cloud-agent-runs/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/code-diffs-in-agent-conversations", + "source": "/agent-platform/local-agents/code-diffs-in-agent-conversations(/?)", "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, @@ -1518,282 +1513,282 @@ "statusCode": 308 }, { - "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality", + "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality-beta", + "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality-beta(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/third-party-cli-agents", + "source": "/agent-platform/local-agents/third-party-cli-agents(/?)", "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/platform", + "source": "/agent-platform/platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/platform/deployment-patterns", + "source": "/agent-platform/platform/deployment-patterns(/?)", "destination": "/platform/deployment-patterns/", "statusCode": 308 }, { - "source": "/agent-platform/platform/environments", + "source": "/agent-platform/platform/environments(/?)", "destination": "/platform/environments/", "statusCode": 308 }, { - "source": "/agent-platform/platform/integrations/integrations-overview", + "source": "/agent-platform/platform/integrations/integrations-overview(/?)", "destination": "/platform/integrations/", "statusCode": 308 }, { - "source": "/agent-platform/platform/team-access-billing-and-identity-permissions", + "source": "/agent-platform/platform/team-access-billing-and-identity-permissions(/?)", "destination": "/platform/team-access-billing-and-identity/", "statusCode": 308 }, { - "source": "/agent-platform/platform/warp-platform", + "source": "/agent-platform/platform/warp-platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/settings/ai-agents", + "source": "/agent-platform/settings/ai-agents(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/terminal-ai/getting-started", + "source": "/agent-platform/terminal-ai/getting-started(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/terminal/ai", + "source": "/agent-platform/terminal/ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/terminal/ai/agent-mode", + "source": "/agent-platform/terminal/ai/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/terminal/warp-ai", + "source": "/agent-platform/terminal/warp-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/third-party-agents/claude-code", + "source": "/agent-platform/third-party-agents/claude-code(/?)", "destination": "/agent-platform/cli-agents/claude-code/", "statusCode": 308 }, { - "source": "/agent-platform/third-party-agents/codex", + "source": "/agent-platform/third-party-agents/codex(/?)", "destination": "/agent-platform/cli-agents/codex/", "statusCode": 308 }, { - "source": "/agent-platform/third-party-agents/opencode", + "source": "/agent-platform/third-party-agents/opencode(/?)", "destination": "/agent-platform/cli-agents/opencode/", "statusCode": 308 }, { - "source": "/agent-platform/third-party-agents/overview", + "source": "/agent-platform/third-party-agents/overview(/?)", "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/third-party-agents/remote-control", + "source": "/agent-platform/third-party-agents/remote-control(/?)", "destination": "/agent-platform/cli-agents/remote-control/", "statusCode": 308 }, { - "source": "/agent-platform/third-party-agents/rich-input", + "source": "/agent-platform/third-party-agents/rich-input(/?)", "destination": "/agent-platform/cli-agents/rich-input/", "statusCode": 308 }, { - "source": "/agent-platform/using-agents/managing-agents", + "source": "/agent-platform/using-agents/managing-agents(/?)", "destination": "/platform/managing-cloud-agents/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/active-ai", + "source": "/agent-platform/warp-agents/active-ai(/?)", "destination": "/agent-platform/local-agents/active-ai/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context/blocks-as-context", + "source": "/agent-platform/warp-agents/agent-context/blocks-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context/images-as-context", + "source": "/agent-platform/warp-agents/agent-context/images-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context/selection-as-context", + "source": "/agent-platform/warp-agents/agent-context/selection-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context/urls-as-context", + "source": "/agent-platform/warp-agents/agent-context/urls-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context/using-to-add-context", + "source": "/agent-platform/warp-agents/agent-context/using-to-add-context(/?)", "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-notifications", + "source": "/agent-platform/warp-agents/agent-notifications(/?)", "destination": "/agent-platform/capabilities/agent-notifications/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-profiles-permissions", + "source": "/agent-platform/warp-agents/agent-profiles-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview", + "source": "/agent-platform/warp-agents/capabilities-overview(/?)", "destination": "/agent-platform/capabilities/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/cloud-conversations", + "source": "/agent-platform/warp-agents/cloud-conversations(/?)", "destination": "/agent-platform/local-agents/cloud-conversations/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/code-diffs", + "source": "/agent-platform/warp-agents/code-diffs(/?)", "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/codebase-context", + "source": "/agent-platform/warp-agents/codebase-context(/?)", "destination": "/agent-platform/capabilities/codebase-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/computer-use", + "source": "/agent-platform/warp-agents/computer-use(/?)", "destination": "/agent-platform/capabilities/computer-use/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/full-terminal-use", + "source": "/agent-platform/warp-agents/full-terminal-use(/?)", "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/interacting-with-agents/conversation-forking", + "source": "/agent-platform/warp-agents/interacting-with-agents/conversation-forking(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/interacting-with-agents/terminal-and-agent-modes", + "source": "/agent-platform/warp-agents/interacting-with-agents/terminal-and-agent-modes(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/interacting-with-agents/voice", + "source": "/agent-platform/warp-agents/interacting-with-agents/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/interactive-code-review", + "source": "/agent-platform/warp-agents/interactive-code-review(/?)", "destination": "/agent-platform/local-agents/interactive-code-review/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/mcp", + "source": "/agent-platform/warp-agents/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/model-choice", + "source": "/agent-platform/warp-agents/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/planning", + "source": "/agent-platform/warp-agents/planning(/?)", "destination": "/agent-platform/capabilities/planning/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/rules", + "source": "/agent-platform/warp-agents/rules(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/session-sharing", + "source": "/agent-platform/warp-agents/session-sharing(/?)", "destination": "/agent-platform/local-agents/session-sharing/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/skills", + "source": "/agent-platform/warp-agents/skills(/?)", "destination": "/agent-platform/capabilities/skills/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/slash-commands", + "source": "/agent-platform/warp-agents/slash-commands(/?)", "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/task-lists", + "source": "/agent-platform/warp-agents/task-lists(/?)", "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/web-search", + "source": "/agent-platform/warp-agents/web-search(/?)", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/warp-ai", + "source": "/agent-platform/warp-ai(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/warp-ai/assistant", + "source": "/agent-platform/warp-ai/assistant(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/warp-ai/get-started", + "source": "/agent-platform/warp-ai/get-started(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/warp-platform", + "source": "/agent-platform/warp-platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/appearance/app-icons", + "source": "/appearance/app-icons(/?)", "destination": "/terminal/appearance/app-icons/", "statusCode": 308 }, { - "source": "/appearance/blocks-behavior", + "source": "/appearance/blocks-behavior(/?)", "destination": "/terminal/appearance/blocks-behavior/", "statusCode": 308 }, { - "source": "/appearance/compact-mode", + "source": "/appearance/compact-mode(/?)", "destination": "/terminal/appearance/blocks-behavior/", "statusCode": 308 }, { - "source": "/appearance/custom-themes", + "source": "/appearance/custom-themes(/?)", "destination": "/terminal/appearance/custom-themes/", "statusCode": 308 }, @@ -1803,17 +1798,17 @@ "statusCode": 308 }, { - "source": "/appearance/input-position", + "source": "/appearance/input-position(/?)", "destination": "/terminal/appearance/input-position/", "statusCode": 308 }, { - "source": "/appearance/pane-dimming", + "source": "/appearance/pane-dimming(/?)", "destination": "/terminal/appearance/pane-dimming/", "statusCode": 308 }, { - "source": "/appearance/prompt", + "source": "/appearance/prompt(/?)", "destination": "/terminal/appearance/prompt/", "statusCode": 308 }, @@ -1823,92 +1818,92 @@ "statusCode": 308 }, { - "source": "/appearance/size-opacity-blurring", + "source": "/appearance/size-opacity-blurring(/?)", "destination": "/terminal/appearance/size-opacity-blurring/", "statusCode": 308 }, { - "source": "/appearance/tab-indicators", + "source": "/appearance/tab-indicators(/?)", "destination": "/terminal/appearance/tabs-behavior/", "statusCode": 308 }, { - "source": "/appearance/tabs-behavior", + "source": "/appearance/tabs-behavior(/?)", "destination": "/terminal/appearance/tabs-behavior/", "statusCode": 308 }, { - "source": "/appearance/text-fonts-cursor", + "source": "/appearance/text-fonts-cursor(/?)", "destination": "/terminal/appearance/text-fonts-cursor/", "statusCode": 308 }, { - "source": "/appearance/themes", + "source": "/appearance/themes(/?)", "destination": "/terminal/appearance/themes/", "statusCode": 308 }, { - "source": "/appearance/transparency-and-blurring", + "source": "/appearance/transparency-and-blurring(/?)", "destination": "/terminal/appearance/size-opacity-blurring/", "statusCode": 308 }, { - "source": "/changelog/changelog/rss", + "source": "/changelog/changelog/rss(/?)", "destination": "/changelog/rss.xml", "statusCode": 308 }, { - "source": "/changelog/getting-started/changelog", + "source": "/changelog/getting-started/changelog(/?)", "destination": "/changelog/", "statusCode": 308 }, { - "source": "/changelog/help/changelog", + "source": "/changelog/help/changelog(/?)", "destination": "/changelog/", "statusCode": 308 }, { - "source": "/changelog/release-notes", + "source": "/changelog/release-notes(/?)", "destination": "/changelog/", "statusCode": 308 }, { - "source": "/changelog/rss", + "source": "/changelog/rss(/?)", "destination": "/changelog/rss.xml", "statusCode": 308 }, { - "source": "/changelog/url/docs.warp.dev/getting-started/changelog", + "source": "/changelog/url/docs.warp.dev/getting-started/changelog(/?)", "destination": "/changelog/", "statusCode": 308 }, { - "source": "/changelog/warp/getting-started/changelog", + "source": "/changelog/warp/getting-started/changelog(/?)", "destination": "/changelog/", "statusCode": 308 }, { - "source": "/code-editor", + "source": "/code-editor(/?)", "destination": "/code/code-editor/", "statusCode": 308 }, { - "source": "/code/code-overview", + "source": "/code/code-overview(/?)", "destination": "/code/overview/", "statusCode": 308 }, { - "source": "/code/code-review/interactive-code-review", + "source": "/code/code-review/interactive-code-review(/?)", "destination": "/code/code-review/", "statusCode": 308 }, { - "source": "/code/reviewing-code", + "source": "/code/reviewing-code(/?)", "destination": "/code/code-review/", "statusCode": 308 }, { - "source": "/configuration", + "source": "/configuration(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, @@ -1923,122 +1918,122 @@ "statusCode": 308 }, { - "source": "/features", + "source": "/features(/?)", "destination": "/", "statusCode": 308 }, { - "source": "/features/accessibility", + "source": "/features/accessibility(/?)", "destination": "/terminal/more-features/accessibility/", "statusCode": 308 }, { - "source": "/features/advanced/settings", + "source": "/features/advanced/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/features/appearance", + "source": "/features/appearance(/?)", "destination": "/terminal/appearance/", "statusCode": 308 }, { - "source": "/features/appearance/compact-mode", + "source": "/features/appearance/compact-mode(/?)", "destination": "/terminal/appearance/blocks-behavior/", "statusCode": 308 }, { - "source": "/features/appearance/custom-themes", + "source": "/features/appearance/custom-themes(/?)", "destination": "/terminal/appearance/custom-themes/", "statusCode": 308 }, { - "source": "/features/appearance/prompt", + "source": "/features/appearance/prompt(/?)", "destination": "/terminal/appearance/prompt/", "statusCode": 308 }, { - "source": "/features/appearance/themes", + "source": "/features/appearance/themes(/?)", "destination": "/terminal/appearance/themes/", "statusCode": 308 }, { - "source": "/features/blocks", + "source": "/features/blocks(/?)", "destination": "/terminal/blocks/", "statusCode": 308 }, { - "source": "/features/blocks/background-blocks", + "source": "/features/blocks/background-blocks(/?)", "destination": "/terminal/blocks/background-blocks/", "statusCode": 308 }, { - "source": "/features/blocks/block-actions", + "source": "/features/blocks/block-actions(/?)", "destination": "/terminal/blocks/block-actions/", "statusCode": 308 }, { - "source": "/features/blocks/block-basics", + "source": "/features/blocks/block-basics(/?)", "destination": "/terminal/blocks/block-basics/", "statusCode": 308 }, { - "source": "/features/blocks/block-filtering", + "source": "/features/blocks/block-filtering(/?)", "destination": "/terminal/blocks/block-filtering/", "statusCode": 308 }, { - "source": "/features/blocks/block-sharing", + "source": "/features/blocks/block-sharing(/?)", "destination": "/terminal/blocks/block-sharing/", "statusCode": 308 }, { - "source": "/features/blocks/sticky-command-header", + "source": "/features/blocks/sticky-command-header(/?)", "destination": "/terminal/blocks/sticky-command-header/", "statusCode": 308 }, { - "source": "/features/command-completions", + "source": "/features/command-completions(/?)", "destination": "/terminal/command-completions/", "statusCode": 308 }, { - "source": "/features/command-completions/autosuggestions", + "source": "/features/command-completions/autosuggestions(/?)", "destination": "/terminal/command-completions/autosuggestions/", "statusCode": 308 }, { - "source": "/features/command-completions/completions", + "source": "/features/command-completions/completions(/?)", "destination": "/terminal/command-completions/completions/", "statusCode": 308 }, { - "source": "/features/command-history", + "source": "/features/command-history(/?)", "destination": "/terminal/entry/command-history/", "statusCode": 308 }, { - "source": "/features/command-inspector", + "source": "/features/command-inspector(/?)", "destination": "/terminal/editor/command-inspector/", "statusCode": 308 }, { - "source": "/features/command-palette", + "source": "/features/command-palette(/?)", "destination": "/terminal/command-palette/", "statusCode": 308 }, { - "source": "/features/command-search", + "source": "/features/command-search(/?)", "destination": "/terminal/entry/command-search/", "statusCode": 308 }, { - "source": "/features/compact-mode", + "source": "/features/compact-mode(/?)", "destination": "/terminal/appearance/blocks-behavior/", "statusCode": 308 }, { - "source": "/features/completions", + "source": "/features/completions(/?)", "destination": "/terminal/command-completions/completions/", "statusCode": 308 }, @@ -2053,162 +2048,162 @@ "statusCode": 308 }, { - "source": "/features/customize/custom-keyboard-shortcuts", + "source": "/features/customize/custom-keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/features/editor", + "source": "/features/editor(/?)", "destination": "/terminal/editor/", "statusCode": 308 }, { - "source": "/features/editor/alias-expansion", + "source": "/features/editor/alias-expansion(/?)", "destination": "/terminal/editor/alias-expansion/", "statusCode": 308 }, { - "source": "/features/editor/command-corrections", + "source": "/features/editor/command-corrections(/?)", "destination": "/terminal/entry/command-corrections/", "statusCode": 308 }, { - "source": "/features/editor/command-inspector", + "source": "/features/editor/command-inspector(/?)", "destination": "/terminal/editor/command-inspector/", "statusCode": 308 }, { - "source": "/features/editor/syntax-error-highlighting", + "source": "/features/editor/syntax-error-highlighting(/?)", "destination": "/terminal/editor/syntax-error-highlighting/", "statusCode": 308 }, { - "source": "/features/editor/vim", + "source": "/features/editor/vim(/?)", "destination": "/terminal/editor/vim/", "statusCode": 308 }, { - "source": "/features/entry", + "source": "/features/entry(/?)", "destination": "/terminal/entry/", "statusCode": 308 }, { - "source": "/features/entry/command-corrections", + "source": "/features/entry/command-corrections(/?)", "destination": "/terminal/entry/command-corrections/", "statusCode": 308 }, { - "source": "/features/entry/command-history", + "source": "/features/entry/command-history(/?)", "destination": "/terminal/entry/command-history/", "statusCode": 308 }, { - "source": "/features/entry/command-search", + "source": "/features/entry/command-search(/?)", "destination": "/terminal/entry/command-search/", "statusCode": 308 }, { - "source": "/features/entry/synchronized-inputs", + "source": "/features/entry/synchronized-inputs(/?)", "destination": "/terminal/entry/synchronized-inputs/", "statusCode": 308 }, { - "source": "/features/entry/workflows", + "source": "/features/entry/workflows(/?)", "destination": "/terminal/entry/yaml-workflows/", "statusCode": 308 }, { - "source": "/features/entry/yaml-workflows", + "source": "/features/entry/yaml-workflows(/?)", "destination": "/terminal/entry/yaml-workflows/", "statusCode": 308 }, { - "source": "/features/files-and-links", + "source": "/features/files-and-links(/?)", "destination": "/terminal/more-features/files-and-links/", "statusCode": 308 }, { - "source": "/features/find", + "source": "/features/find(/?)", "destination": "/terminal/blocks/find/", "statusCode": 308 }, { - "source": "/features/full-screen-apps", + "source": "/features/full-screen-apps(/?)", "destination": "/terminal/more-features/full-screen-apps/", "statusCode": 308 }, { - "source": "/features/global-hotkey", + "source": "/features/global-hotkey(/?)", "destination": "/terminal/windows/global-hotkey/", "statusCode": 308 }, { - "source": "/features/hotkey-window", + "source": "/features/hotkey-window(/?)", "destination": "/terminal/windows/global-hotkey/", "statusCode": 308 }, { - "source": "/features/integrations", + "source": "/features/integrations(/?)", "destination": "/terminal/integrations-and-plugins/", "statusCode": 308 }, { - "source": "/features/integrations-and-plugins", + "source": "/features/integrations-and-plugins(/?)", "destination": "/terminal/integrations-and-plugins/", "statusCode": 308 }, { - "source": "/features/integrations/urls-and-deep-links", + "source": "/features/integrations/urls-and-deep-links(/?)", "destination": "/terminal/more-features/uri-scheme/", "statusCode": 308 }, { - "source": "/features/keybindings", + "source": "/features/keybindings(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/features/keyboard-input", + "source": "/features/keyboard-input(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/features/keyboard-shortcuts", + "source": "/features/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/features/knowledge", + "source": "/features/knowledge(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/features/launch-configurations", + "source": "/features/launch-configurations(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/features/linux", + "source": "/features/linux(/?)", "destination": "/terminal/more-features/linux/", "statusCode": 308 }, { - "source": "/features/markdown-viewer", + "source": "/features/markdown-viewer(/?)", "destination": "/terminal/more-features/markdown-viewer/", "statusCode": 308 }, { - "source": "/features/notifications", + "source": "/features/notifications(/?)", "destination": "/terminal/more-features/notifications/", "statusCode": 308 }, { - "source": "/features/overview", + "source": "/features/overview(/?)", "destination": "/", "statusCode": 308 }, { - "source": "/features/prompt", + "source": "/features/prompt(/?)", "destination": "/terminal/appearance/prompt/", "statusCode": 308 }, @@ -2233,227 +2228,227 @@ "statusCode": 308 }, { - "source": "/features/quit-warning", + "source": "/features/quit-warning(/?)", "destination": "/terminal/more-features/quit-warning/", "statusCode": 308 }, { - "source": "/features/session-management-and-restoration", + "source": "/features/session-management-and-restoration(/?)", "destination": "/terminal/sessions/", "statusCode": 308 }, { - "source": "/features/session-management/launch-configurations", + "source": "/features/session-management/launch-configurations(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/features/session-management/session-navigation", + "source": "/features/session-management/session-navigation(/?)", "destination": "/terminal/sessions/session-navigation/", "statusCode": 308 }, { - "source": "/features/session-management/session-restoration", + "source": "/features/session-management/session-restoration(/?)", "destination": "/terminal/sessions/session-restoration/", "statusCode": 308 }, { - "source": "/features/session-sharing", + "source": "/features/session-sharing(/?)", "destination": "/knowledge-and-collaboration/session-sharing/", "statusCode": 308 }, { - "source": "/features/sessions", + "source": "/features/sessions(/?)", "destination": "/terminal/sessions/", "statusCode": 308 }, { - "source": "/features/sessions/README", + "source": "/features/sessions/README(/?)", "destination": "/terminal/sessions/", "statusCode": 308 }, { - "source": "/features/sessions/launch-configurations", + "source": "/features/sessions/launch-configurations(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/features/sessions/quit-warning-modal", + "source": "/features/sessions/quit-warning-modal(/?)", "destination": "/terminal/more-features/quit-warning/", "statusCode": 308 }, { - "source": "/features/sessions/session-navigation", + "source": "/features/sessions/session-navigation(/?)", "destination": "/terminal/sessions/session-navigation/", "statusCode": 308 }, { - "source": "/features/sessions/session-restoration", + "source": "/features/sessions/session-restoration(/?)", "destination": "/terminal/sessions/session-restoration/", "statusCode": 308 }, { - "source": "/features/sessions/sharing-sessions", + "source": "/features/sessions/sharing-sessions(/?)", "destination": "/knowledge-and-collaboration/session-sharing/", "statusCode": 308 }, { - "source": "/features/settings", + "source": "/features/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/features/settings-sync", + "source": "/features/settings-sync(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/features/settings/configuration-files", + "source": "/features/settings/configuration-files(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/features/smart-select", + "source": "/features/smart-select(/?)", "destination": "/terminal/more-features/text-selection/", "statusCode": 308 }, { - "source": "/features/split-panes", + "source": "/features/split-panes(/?)", "destination": "/terminal/windows/split-panes/", "statusCode": 308 }, { - "source": "/features/ssh", + "source": "/features/ssh(/?)", "destination": "/terminal/warpify/ssh-legacy/", "statusCode": 308 }, { - "source": "/features/subshells", + "source": "/features/subshells(/?)", "destination": "/terminal/warpify/subshells/", "statusCode": 308 }, { - "source": "/features/system-settings", + "source": "/features/system-settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/features/tabs", + "source": "/features/tabs(/?)", "destination": "/terminal/windows/tabs/", "statusCode": 308 }, { - "source": "/features/teams", + "source": "/features/teams(/?)", "destination": "/knowledge-and-collaboration/teams/", "statusCode": 308 }, { - "source": "/features/terminal-features", + "source": "/features/terminal-features(/?)", "destination": "/terminal/blocks/", "statusCode": 308 }, { - "source": "/features/the-input-editor", + "source": "/features/the-input-editor(/?)", "destination": "/terminal/editor/", "statusCode": 308 }, { - "source": "/features/themes", + "source": "/features/themes(/?)", "destination": "/terminal/appearance/themes/", "statusCode": 308 }, { - "source": "/features/themes/custom-themes", + "source": "/features/themes/custom-themes(/?)", "destination": "/terminal/appearance/custom-themes/", "statusCode": 308 }, { - "source": "/features/uri-scheme", + "source": "/features/uri-scheme(/?)", "destination": "/terminal/more-features/uri-scheme/", "statusCode": 308 }, { - "source": "/features/warp-ai/code", + "source": "/features/warp-ai/code(/?)", "destination": "/code/overview/", "statusCode": 308 }, { - "source": "/features/warp-ai/knowledge", + "source": "/features/warp-ai/knowledge(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/features/warp-ai/mcp", + "source": "/features/warp-ai/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/features/warp-ai/rules", + "source": "/features/warp-ai/rules(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/features/warp-drive", + "source": "/features/warp-drive(/?)", "destination": "/knowledge-and-collaboration/warp-drive/", "statusCode": 308 }, { - "source": "/features/warp-drive/environment-variables", + "source": "/features/warp-drive/environment-variables(/?)", "destination": "/knowledge-and-collaboration/warp-drive/environment-variables/", "statusCode": 308 }, { - "source": "/features/warp-drive/notebooks", + "source": "/features/warp-drive/notebooks(/?)", "destination": "/knowledge-and-collaboration/warp-drive/notebooks/", "statusCode": 308 }, { - "source": "/features/warp-drive/prompts", + "source": "/features/warp-drive/prompts(/?)", "destination": "/knowledge-and-collaboration/warp-drive/prompts/", "statusCode": 308 }, { - "source": "/features/warp-drive/warp-drive-on-the-web", + "source": "/features/warp-drive/warp-drive-on-the-web(/?)", "destination": "/knowledge-and-collaboration/warp-drive/web/", "statusCode": 308 }, { - "source": "/features/warp-drive/warp-drive-on-the-web-beta", + "source": "/features/warp-drive/warp-drive-on-the-web-beta(/?)", "destination": "/knowledge-and-collaboration/warp-drive/web/", "statusCode": 308 }, { - "source": "/features/warp-drive/workflows", + "source": "/features/warp-drive/workflows(/?)", "destination": "/knowledge-and-collaboration/warp-drive/workflows/", "statusCode": 308 }, { - "source": "/features/warpify", + "source": "/features/warpify(/?)", "destination": "/terminal/warpify/", "statusCode": 308 }, { - "source": "/features/warpify/ssh", + "source": "/features/warpify/ssh(/?)", "destination": "/terminal/warpify/ssh/", "statusCode": 308 }, { - "source": "/features/warpify/ssh-legacy", + "source": "/features/warpify/ssh-legacy(/?)", "destination": "/terminal/warpify/ssh-legacy/", "statusCode": 308 }, { - "source": "/features/warpify/subshells", + "source": "/features/warpify/subshells(/?)", "destination": "/terminal/warpify/subshells/", "statusCode": 308 }, { - "source": "/features/windows", + "source": "/features/windows(/?)", "destination": "/terminal/windows/", "statusCode": 308 }, { - "source": "/features/windows/global-hotkey", + "source": "/features/windows/global-hotkey(/?)", "destination": "/terminal/windows/global-hotkey/", "statusCode": 308 }, @@ -2463,37 +2458,37 @@ "statusCode": 308 }, { - "source": "/features/windows/split-panes", + "source": "/features/windows/split-panes(/?)", "destination": "/terminal/windows/split-panes/", "statusCode": 308 }, { - "source": "/features/windows/tabs", + "source": "/features/windows/tabs(/?)", "destination": "/terminal/windows/tabs/", "statusCode": 308 }, { - "source": "/features/windows/~", + "source": "/features/windows/~(/?)", "destination": "/terminal/windows/", "statusCode": 308 }, { - "source": "/features/workflows", + "source": "/features/workflows(/?)", "destination": "/terminal/entry/yaml-workflows/", "statusCode": 308 }, { - "source": "/features/workflows/block-metrics/shortcuts", + "source": "/features/workflows/block-metrics/shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/features/working-directory", + "source": "/features/working-directory(/?)", "destination": "/terminal/more-features/working-directory/", "statusCode": 308 }, { - "source": "/features/workspaces", + "source": "/features/workspaces(/?)", "destination": "/terminal/sessions/", "statusCode": 308 }, @@ -2503,37 +2498,37 @@ "statusCode": 308 }, { - "source": "/getting-started/account-and-login", + "source": "/getting-started/account-and-login(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/coding-in-warp", + "source": "/getting-started/coding-in-warp(/?)", "destination": "/getting-started/quickstart/coding-in-warp/", "statusCode": 308 }, { - "source": "/getting-started/customizing-warp", + "source": "/getting-started/customizing-warp(/?)", "destination": "/getting-started/quickstart/customizing-warp/", "statusCode": 308 }, { - "source": "/getting-started/customizing-warp/settings", + "source": "/getting-started/customizing-warp/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/getting-started/download-and-install", + "source": "/getting-started/download-and-install(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/downloading-warp", + "source": "/getting-started/downloading-warp(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/getting-started-with-warp", + "source": "/getting-started/getting-started-with-warp(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, @@ -2558,132 +2553,132 @@ "statusCode": 308 }, { - "source": "/getting-started/getting-started-with-warp-on-linux", + "source": "/getting-started/getting-started-with-warp-on-linux(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/guides/shortcuts", + "source": "/getting-started/guides/shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/getting-started/how-to-use-warp", + "source": "/getting-started/how-to-use-warp(/?)", "destination": "/", "statusCode": 308 }, { - "source": "/getting-started/installation", + "source": "/getting-started/installation(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/installation-and-setup", + "source": "/getting-started/installation-and-setup(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/installation/linux", + "source": "/getting-started/installation/linux(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/installing-warp", + "source": "/getting-started/installing-warp(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/installing-warp-on-linux", + "source": "/getting-started/installing-warp-on-linux(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/launch-configurations", + "source": "/getting-started/launch-configurations(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/getting-started/launching-warp", + "source": "/getting-started/launching-warp(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/linux", + "source": "/getting-started/linux(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/linux-installation", + "source": "/getting-started/linux-installation(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/mac-permissions", + "source": "/getting-started/mac-permissions(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/quickstart-guide", + "source": "/getting-started/quickstart-guide(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/quickstart-guide/README", + "source": "/getting-started/quickstart-guide/README(/?)", "destination": "/quickstart/", "statusCode": 308 }, { - "source": "/getting-started/quickstart-guide/agents-in-warp", + "source": "/getting-started/quickstart-guide/agents-in-warp(/?)", "destination": "/agent-platform/getting-started/agents-in-warp/", "statusCode": 308 }, { - "source": "/getting-started/quickstart-guide/coding-in-warp", + "source": "/getting-started/quickstart-guide/coding-in-warp(/?)", "destination": "/getting-started/quickstart/coding-in-warp/", "statusCode": 308 }, { - "source": "/getting-started/quickstart-guide/customizing-warp", + "source": "/getting-started/quickstart-guide/customizing-warp(/?)", "destination": "/getting-started/quickstart/customizing-warp/", "statusCode": 308 }, { - "source": "/getting-started/quickstart-guide/installation-and-setup", + "source": "/getting-started/quickstart-guide/installation-and-setup(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/settings", + "source": "/getting-started/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/getting-started/syncing-your-terminal", + "source": "/getting-started/syncing-your-terminal(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/getting-started/terminal", + "source": "/getting-started/terminal(/?)", "destination": "/terminal/blocks/", "statusCode": 308 }, { - "source": "/getting-started/using-warp-with-shells", + "source": "/getting-started/using-warp-with-shells(/?)", "destination": "/getting-started/supported-shells/", "statusCode": 308 }, { - "source": "/getting-started/what-is-warp", + "source": "/getting-started/what-is-warp(/?)", "destination": "/", "statusCode": 308 }, { - "source": "/guide/ssh-guide", + "source": "/guide/ssh-guide(/?)", "destination": "/terminal/warpify/ssh/", "statusCode": 308 }, { - "source": "/guides/ssh-quickstart", + "source": "/guides/ssh-quickstart(/?)", "destination": "/terminal/warpify/ssh/", "statusCode": 308 }, @@ -2693,162 +2688,162 @@ "statusCode": 308 }, { - "source": "/how-does-warp-compare/performance", + "source": "/how-does-warp-compare/performance(/?)", "destination": "/terminal/comparisons/performance/", "statusCode": 308 }, { - "source": "/how-does-warp-compare/terminal-features", + "source": "/how-does-warp-compare/terminal-features(/?)", "destination": "/terminal/comparisons/terminal-features/", "statusCode": 308 }, { - "source": "/installation", + "source": "/installation(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/installation/linux", + "source": "/installation/linux(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/keyboard-shortcuts", + "source": "/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/knowledge-and-collaboration/warp-drive/warp-drive-as-agent-mode-context", + "source": "/knowledge-and-collaboration/warp-drive/warp-drive-as-agent-mode-context(/?)", "destination": "/knowledge-and-collaboration/warp-drive/agent-mode-context/", "statusCode": 308 }, { - "source": "/knowledge-and-collaboration/warp-drive/warp-drive-on-the-web", + "source": "/knowledge-and-collaboration/warp-drive/warp-drive-on-the-web(/?)", "destination": "/knowledge-and-collaboration/warp-drive/web/", "statusCode": 308 }, { - "source": "/knowledge-and-collaboration/workflows", + "source": "/knowledge-and-collaboration/workflows(/?)", "destination": "/knowledge-and-collaboration/warp-drive/workflows/", "statusCode": 308 }, { - "source": "/quick-start", + "source": "/quick-start(/?)", "destination": "/quickstart/", "statusCode": 308 }, { - "source": "/readme", + "source": "/readme(/?)", "destination": "/", "statusCode": 308 }, { - "source": "/reference/agent-api-and-sdk", + "source": "/reference/agent-api-and-sdk(/?)", "destination": "/reference/api-and-sdk/", "statusCode": 308 }, { - "source": "/reference/ambient-agents/mcp-servers-for-agents", + "source": "/reference/ambient-agents/mcp-servers-for-agents(/?)", "destination": "/reference/cli/mcp-servers/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/agent", + "source": "/reference/api-and-sdk/agent(/?)", "destination": "/api#tag/agent", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/agent-1", + "source": "/reference/api-and-sdk/agent-1(/?)", "destination": "/api", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/schedules", + "source": "/reference/api-and-sdk/schedules(/?)", "destination": "/api#tag/schedules", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/authentication_required", + "source": "/reference/api-and-sdk/troubleshooting/errors/authentication_required(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/authentication-required/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/budget_exceeded", + "source": "/reference/api-and-sdk/troubleshooting/errors/budget_exceeded(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/budget-exceeded/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/content_policy_violation", + "source": "/reference/api-and-sdk/troubleshooting/errors/content_policy_violation(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/content-policy-violation/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/environment_setup_failed", + "source": "/reference/api-and-sdk/troubleshooting/errors/environment_setup_failed(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/external_authentication_required", + "source": "/reference/api-and-sdk/troubleshooting/errors/external_authentication_required(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/agent_process_failed", + "source": "/reference/api-and-sdk/troubleshooting/errors/agent_process_failed(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/agent-process-failed/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/feature_not_available", + "source": "/reference/api-and-sdk/troubleshooting/errors/feature_not_available(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/feature-not-available/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/infrastructure_timeout", + "source": "/reference/api-and-sdk/troubleshooting/errors/infrastructure_timeout(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/infrastructure-timeout/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/insufficient_credits", + "source": "/reference/api-and-sdk/troubleshooting/errors/insufficient_credits(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/integration_disabled", + "source": "/reference/api-and-sdk/troubleshooting/errors/integration_disabled(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/integration-disabled/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/integration_not_configured", + "source": "/reference/api-and-sdk/troubleshooting/errors/integration_not_configured(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/integration-not-configured/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/internal_error", + "source": "/reference/api-and-sdk/troubleshooting/errors/internal_error(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/internal-error/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/invalid_request", + "source": "/reference/api-and-sdk/troubleshooting/errors/invalid_request(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/invalid-request/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/not_authorized", + "source": "/reference/api-and-sdk/troubleshooting/errors/not_authorized(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/not-authorized/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/operation_not_supported", + "source": "/reference/api-and-sdk/troubleshooting/errors/operation_not_supported(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/operation-not-supported/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/resource_not_found", + "source": "/reference/api-and-sdk/troubleshooting/errors/resource_not_found(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/resource-not-found/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/resource_unavailable", + "source": "/reference/api-and-sdk/troubleshooting/errors/resource_unavailable(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/resource-unavailable/", "statusCode": 308 }, @@ -2868,22 +2863,22 @@ "statusCode": 308 }, { - "source": "/reference/cli/integrations-and-environments", + "source": "/reference/cli/integrations-and-environments(/?)", "destination": "/reference/cli/integration-setup/", "statusCode": 308 }, { - "source": "/reference/cli/mcp-for-cloud-agents", + "source": "/reference/cli/mcp-for-cloud-agents(/?)", "destination": "/reference/cli/mcp-servers/", "statusCode": 308 }, { - "source": "/reference/cli/mcp-servers-for-cloud-agents", + "source": "/reference/cli/mcp-servers-for-cloud-agents(/?)", "destination": "/reference/cli/mcp-servers/", "statusCode": 308 }, { - "source": "/reference/developers/cli", + "source": "/reference/developers/cli(/?)", "destination": "/reference/cli/", "statusCode": 308 }, @@ -2903,7 +2898,7 @@ "statusCode": 308 }, { - "source": "/reference/integrations/integrations-overview/integrations-and-environments", + "source": "/reference/integrations/integrations-overview/integrations-and-environments(/?)", "destination": "/reference/cli/integration-setup/", "statusCode": 308 }, @@ -2913,17 +2908,17 @@ "statusCode": 308 }, { - "source": "/reference/keybindings", + "source": "/reference/keybindings(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/reference/keyboard-shortcuts", + "source": "/reference/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/reference/platform/agent-api-and-sdk", + "source": "/reference/platform/agent-api-and-sdk(/?)", "destination": "/reference/api-and-sdk/", "statusCode": 308 }, @@ -2933,22 +2928,22 @@ "statusCode": 308 }, { - "source": "/reference/platform/agent-api-and-sdk/agent", + "source": "/reference/platform/agent-api-and-sdk/agent(/?)", "destination": "/reference/api-and-sdk/", "statusCode": 308 }, { - "source": "/reference/platform/agent-api-and-sdk/agent-1", + "source": "/reference/platform/agent-api-and-sdk/agent-1(/?)", "destination": "/reference/api-and-sdk/", "statusCode": 308 }, { - "source": "/reference/platform/agent-api-and-sdk/demo-sentry-monitoring-with-sdk", + "source": "/reference/platform/agent-api-and-sdk/demo-sentry-monitoring-with-sdk(/?)", "destination": "/reference/api-and-sdk/demo-sentry-monitoring-with-sdk/", "statusCode": 308 }, { - "source": "/reference/platform/cli", + "source": "/reference/platform/cli(/?)", "destination": "/reference/cli/", "statusCode": 308 }, @@ -2958,62 +2953,62 @@ "statusCode": 308 }, { - "source": "/reference/platform/cli/api-keys", + "source": "/reference/platform/cli/api-keys(/?)", "destination": "/reference/cli/api-keys/", "statusCode": 308 }, { - "source": "/reference/platform/cli/integrations-and-environments", + "source": "/reference/platform/cli/integrations-and-environments(/?)", "destination": "/reference/cli/integration-setup/", "statusCode": 308 }, { - "source": "/reference/platform/cli/troubleshooting", + "source": "/reference/platform/cli/troubleshooting(/?)", "destination": "/reference/cli/troubleshooting/", "statusCode": 308 }, { - "source": "/reference/platform/warp-platform", + "source": "/reference/platform/warp-platform(/?)", "destination": "/reference/", "statusCode": 308 }, { - "source": "/reference/settings", + "source": "/reference/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/session-sharing", + "source": "/session-sharing(/?)", "destination": "/knowledge-and-collaboration/session-sharing/", "statusCode": 308 }, { - "source": "/settings", + "source": "/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/settings-menu/overview", + "source": "/settings-menu/overview(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/settings-overview", + "source": "/settings-overview(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/settings/features", + "source": "/settings/features(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/settings/keyboard-shortcuts", + "source": "/settings/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/shortcuts", + "source": "/shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, @@ -3023,47 +3018,47 @@ "statusCode": 308 }, { - "source": "/support-and-community/features/network-log", + "source": "/support-and-community/features/network-log(/?)", "destination": "/support-and-community/privacy-and-security/network-log/", "statusCode": 308 }, { - "source": "/support-and-community/features/secret-redaction", + "source": "/support-and-community/features/secret-redaction(/?)", "destination": "/support-and-community/privacy-and-security/secret-redaction/", "statusCode": 308 }, { - "source": "/support-and-community/getting-started/privacy", + "source": "/support-and-community/getting-started/privacy(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/getting-started/refer-a-friend", + "source": "/support-and-community/getting-started/refer-a-friend(/?)", "destination": "/support-and-community/community/refer-a-friend/", "statusCode": 308 }, { - "source": "/support-and-community/getting-started/warp-preview-and-alpha-program", + "source": "/support-and-community/getting-started/warp-preview-and-alpha-program(/?)", "destination": "/support-and-community/community/warp-preview-and-alpha-program/", "statusCode": 308 }, { - "source": "/support-and-community/help", + "source": "/support-and-community/help(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, { - "source": "/support-and-community/help/ai-features/bring-your-own-llm", + "source": "/support-and-community/help/ai-features/bring-your-own-llm(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, { - "source": "/support-and-community/help/faq/billing-and-payments", + "source": "/support-and-community/help/faq/billing-and-payments(/?)", "destination": "/support-and-community/plans-and-billing/pricing-faqs/", "statusCode": 308 }, { - "source": "/support-and-community/help/known-issues", + "source": "/support-and-community/help/known-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, @@ -3093,22 +3088,22 @@ "statusCode": 308 }, { - "source": "/support-and-community/help/licenses", + "source": "/support-and-community/help/licenses(/?)", "destination": "/support-and-community/community/open-source-licenses/", "statusCode": 308 }, { - "source": "/support-and-community/help/plans-subscriptions-and-pricing", + "source": "/support-and-community/help/plans-subscriptions-and-pricing(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-community/help/releasing-and-updating", + "source": "/support-and-community/help/releasing-and-updating(/?)", "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", "statusCode": 308 }, { - "source": "/support-and-community/help/sending-us-feedback", + "source": "/support-and-community/help/sending-us-feedback(/?)", "destination": "/support-and-community/troubleshooting-and-support/sending-us-feedback/", "statusCode": 308 }, @@ -3118,7 +3113,7 @@ "statusCode": 308 }, { - "source": "/support-and-community/help/troubleshooting-login-issues", + "source": "/support-and-community/help/troubleshooting-login-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", "statusCode": 308 }, @@ -3128,7 +3123,7 @@ "statusCode": 308 }, { - "source": "/support-and-community/help/uninstalling-warp", + "source": "/support-and-community/help/uninstalling-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", "statusCode": 308 }, @@ -3138,7 +3133,7 @@ "statusCode": 308 }, { - "source": "/support-and-community/help/updating-warp", + "source": "/support-and-community/help/updating-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", "statusCode": 308 }, @@ -3148,67 +3143,67 @@ "statusCode": 308 }, { - "source": "/support-and-community/help/using-warp-offline", + "source": "/support-and-community/help/using-warp-offline(/?)", "destination": "/support-and-community/troubleshooting-and-support/using-warp-offline/", "statusCode": 308 }, { - "source": "/support-and-community/known-issues", + "source": "/support-and-community/known-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, { - "source": "/support-and-community/plans-and-billing/overages-legacy", + "source": "/support-and-community/plans-and-billing/overages-legacy(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/plans-pricing-and-billing", + "source": "/support-and-community/plans-pricing-and-billing(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-community/plans-pricing-and-billing/add-on-credits", + "source": "/support-and-community/plans-pricing-and-billing/add-on-credits(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/plans-pricing-and-billing/ai-credits", + "source": "/support-and-community/plans-pricing-and-billing/ai-credits(/?)", "destination": "/support-and-community/plans-and-billing/credits/", "statusCode": 308 }, { - "source": "/support-and-community/plans-pricing-and-billing/bring-your-own-api-key", + "source": "/support-and-community/plans-pricing-and-billing/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, { - "source": "/support-and-community/plans-pricing-and-billing/overages-legacy", + "source": "/support-and-community/plans-pricing-and-billing/overages-legacy(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/plans-pricing-and-billing/pricing-faqs", + "source": "/support-and-community/plans-pricing-and-billing/pricing-faqs(/?)", "destination": "/support-and-community/plans-and-billing/pricing-faqs/", "statusCode": 308 }, { - "source": "/support-and-community/privacy", + "source": "/support-and-community/privacy(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/privacy-and-security", + "source": "/support-and-community/privacy-and-security(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/privacy/network-log", + "source": "/support-and-community/privacy/network-log(/?)", "destination": "/support-and-community/privacy-and-security/network-log/", "statusCode": 308 }, { - "source": "/support-and-community/privacy/privacy", + "source": "/support-and-community/privacy/privacy(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, @@ -3223,27 +3218,27 @@ "statusCode": 308 }, { - "source": "/support-and-community/privacy/secret-redaction", + "source": "/support-and-community/privacy/secret-redaction(/?)", "destination": "/support-and-community/privacy-and-security/secret-redaction/", "statusCode": 308 }, { - "source": "/support-and-community/security-and-privacy/data-handling", + "source": "/support-and-community/security-and-privacy/data-handling(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/security-and-privacy/data-ownership", + "source": "/support-and-community/security-and-privacy/data-ownership(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing", + "source": "/support-and-community/support-and-billing(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/known-issues", + "source": "/support-and-community/support-and-billing/known-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, @@ -3278,27 +3273,27 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/licenses", + "source": "/support-and-community/support-and-billing/licenses(/?)", "destination": "/support-and-community/community/open-source-licenses/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/licenses-intro", + "source": "/support-and-community/support-and-billing/licenses-intro(/?)", "destination": "/support-and-community/community/open-source-licenses/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-billing/bring-your-own-api-key", + "source": "/support-and-community/support-and-billing/plans-and-billing/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing", + "source": "/support-and-community/support-and-billing/plans-and-pricing(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/add-on-credits", + "source": "/support-and-community/support-and-billing/plans-and-pricing/add-on-credits(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, @@ -3308,12 +3303,12 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/ai-credits", + "source": "/support-and-community/support-and-billing/plans-and-pricing/ai-credits(/?)", "destination": "/support-and-community/plans-and-billing/credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/ai-requests", + "source": "/support-and-community/support-and-billing/plans-and-pricing/ai-requests(/?)", "destination": "/support-and-community/plans-and-billing/credits/", "statusCode": 308 }, @@ -3328,7 +3323,7 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/bring-your-own-api-key", + "source": "/support-and-community/support-and-billing/plans-and-pricing/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, @@ -3343,7 +3338,7 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/pricing-faqs", + "source": "/support-and-community/support-and-billing/plans-and-pricing/pricing-faqs(/?)", "destination": "/support-and-community/plans-and-billing/pricing-faqs/", "statusCode": 308 }, @@ -3358,27 +3353,27 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/reload-credits-add-on-credits", + "source": "/support-and-community/support-and-billing/plans-and-pricing/reload-credits-add-on-credits(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/usage-overages", + "source": "/support-and-community/support-and-billing/plans-and-pricing/usage-overages(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-prilling/bring-your-own-api-key", + "source": "/support-and-community/support-and-billing/plans-and-prilling/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/pricing-faqs", + "source": "/support-and-community/support-and-billing/pricing-faqs(/?)", "destination": "/support-and-community/plans-and-billing/pricing-faqs/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/sending-us-feedback", + "source": "/support-and-community/support-and-billing/sending-us-feedback(/?)", "destination": "/support-and-community/troubleshooting-and-support/sending-us-feedback/", "statusCode": 308 }, @@ -3398,12 +3393,12 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/subscription-management", + "source": "/support-and-community/support-and-billing/subscription-management(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/troubleshooting-login-issues", + "source": "/support-and-community/support-and-billing/troubleshooting-login-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", "statusCode": 308 }, @@ -3423,77 +3418,77 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/uninstalling-warp", + "source": "/support-and-community/support-and-billing/uninstalling-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/updating-warp", + "source": "/support-and-community/support-and-billing/updating-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/using-warp-offline", + "source": "/support-and-community/support-and-billing/using-warp-offline(/?)", "destination": "/support-and-community/troubleshooting-and-support/using-warp-offline/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-and-billing/ai-credits", + "source": "/support-and-community/support-and-community/plans-and-billing/ai-credits(/?)", "destination": "/support-and-community/plans-and-billing/credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing", + "source": "/support-and-community/support-and-community/plans-pricing-and-billing(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/add-on-credits", + "source": "/support-and-community/support-and-community/plans-pricing-and-billing/add-on-credits(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/ai-credits", + "source": "/support-and-community/support-and-community/plans-pricing-and-billing/ai-credits(/?)", "destination": "/support-and-community/plans-and-billing/credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/bring-your-own-api-key", + "source": "/support-and-community/support-and-community/plans-pricing-and-billing/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/overages-legacy", + "source": "/support-and-community/support-and-community/plans-pricing-and-billing/overages-legacy(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/pricing-faqs", + "source": "/support-and-community/support-and-community/plans-pricing-and-billing/pricing-faqs(/?)", "destination": "/support-and-community/plans-and-billing/pricing-faqs/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/privacy-and-security/privacy", + "source": "/support-and-community/support-and-community/privacy-and-security/privacy(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/troubleshooting", + "source": "/support-and-community/troubleshooting(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, { - "source": "/support-and-community/troubleshooting-and-support/uninstalling-warp", + "source": "/support-and-community/troubleshooting-and-support/uninstalling-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", "statusCode": 308 }, { - "source": "/support-and-community/troubleshooting/common-issues", + "source": "/support-and-community/troubleshooting/common-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, { - "source": "/support-and-community/troubleshooting/general-troubleshooting", + "source": "/support-and-community/troubleshooting/general-troubleshooting(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, @@ -3503,7 +3498,7 @@ "statusCode": 308 }, { - "source": "/terminal/command-input/command-suggestions", + "source": "/terminal/command-input/command-suggestions(/?)", "destination": "/terminal/command-completions/completions/", "statusCode": 308 }, @@ -3513,462 +3508,462 @@ "statusCode": 308 }, { - "source": "/terminal/keybindings", + "source": "/terminal/keybindings(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/terminal/keyboard-shortcuts", + "source": "/terminal/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/terminal/sessions/tab-configs", + "source": "/terminal/sessions/tab-configs(/?)", "destination": "/terminal/windows/tab-configs/", "statusCode": 308 }, { - "source": "/terminal/shortcuts", + "source": "/terminal/shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/terminal/universal-input", + "source": "/terminal/universal-input(/?)", "destination": "/terminal/input/classic-input/", "statusCode": 308 }, { - "source": "/terminal/universal-input/classic-input", + "source": "/terminal/universal-input/classic-input(/?)", "destination": "/terminal/input/classic-input/", "statusCode": 308 }, { - "source": "/terminal/windows/keyboard-shortcuts", + "source": "/terminal/windows/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/terminal/windows/keyboard-shortcuts-windows", + "source": "/terminal/windows/keyboard-shortcuts-windows(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/terminal/windows/windows-shortcuts", + "source": "/terminal/windows/windows-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/warp-quickstart", + "source": "/warp-quickstart(/?)", "destination": "/quickstart/", "statusCode": 308 }, { - "source": "/warp-terminal-101/settings", + "source": "/warp-terminal-101/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/warp/code/code-editor/code-editor-vim-keybindings", + "source": "/warp/code/code-editor/code-editor-vim-keybindings(/?)", "destination": "/code/code-editor/code-editor-vim-keybindings/", "statusCode": 308 }, { - "source": "/warp/code/code-editor/file-tree", + "source": "/warp/code/code-editor/file-tree(/?)", "destination": "/code/code-editor/file-tree/", "statusCode": 308 }, { - "source": "/warp/code/code-editor/find-and-replace", + "source": "/warp/code/code-editor/find-and-replace(/?)", "destination": "/code/code-editor/find-and-replace/", "statusCode": 308 }, { - "source": "/warp/code/code-editor/language-server-protocol", + "source": "/warp/code/code-editor/language-server-protocol(/?)", "destination": "/code/code-editor/language-server-protocol/", "statusCode": 308 }, { - "source": "/warp/code/code-review", + "source": "/warp/code/code-review(/?)", "destination": "/code/code-review/", "statusCode": 308 }, { - "source": "/warp/code/git-worktrees", + "source": "/warp/code/git-worktrees(/?)", "destination": "/code/git-worktrees/", "statusCode": 308 }, { - "source": "/warp/code/overview", + "source": "/warp/code/overview(/?)", "destination": "/code/overview/", "statusCode": 308 }, { - "source": "/warp/code/ssh-feature-support", + "source": "/warp/code/ssh-feature-support(/?)", "destination": "/code/ssh-feature-support/", "statusCode": 308 }, { - "source": "/warp/getting-started/coding-in-warp", + "source": "/warp/getting-started/coding-in-warp(/?)", "destination": "/getting-started/quickstart/coding-in-warp/", "statusCode": 308 }, { - "source": "/warp/getting-started/customizing-warp", + "source": "/warp/getting-started/customizing-warp(/?)", "destination": "/getting-started/quickstart/customizing-warp/", "statusCode": 308 }, { - "source": "/warp/getting-started/installation-and-setup", + "source": "/warp/getting-started/installation-and-setup(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/warp/getting-started/keyboard-shortcuts", + "source": "/warp/getting-started/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/warp/getting-started/migrate-to-warp", + "source": "/warp/getting-started/migrate-to-warp(/?)", "destination": "/getting-started/migrate-to-warp/", "statusCode": 308 }, { - "source": "/warp/getting-started/quickstart", + "source": "/warp/getting-started/quickstart(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/warp/getting-started/supported-shells", + "source": "/warp/getting-started/supported-shells(/?)", "destination": "/getting-started/supported-shells/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/admin-panel", + "source": "/warp/knowledge-and-collaboration/admin-panel(/?)", "destination": "/knowledge-and-collaboration/admin-panel/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/teams", + "source": "/warp/knowledge-and-collaboration/teams(/?)", "destination": "/knowledge-and-collaboration/teams/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/agent-mode-context", + "source": "/warp/knowledge-and-collaboration/warp-drive/agent-mode-context(/?)", "destination": "/knowledge-and-collaboration/warp-drive/agent-mode-context/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/ai-objects", + "source": "/warp/knowledge-and-collaboration/warp-drive/ai-objects(/?)", "destination": "/knowledge-and-collaboration/warp-drive/ai-objects/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/environment-variables", + "source": "/warp/knowledge-and-collaboration/warp-drive/environment-variables(/?)", "destination": "/knowledge-and-collaboration/warp-drive/environment-variables/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/notebooks", + "source": "/warp/knowledge-and-collaboration/warp-drive/notebooks(/?)", "destination": "/knowledge-and-collaboration/warp-drive/notebooks/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/prompts", + "source": "/warp/knowledge-and-collaboration/warp-drive/prompts(/?)", "destination": "/knowledge-and-collaboration/warp-drive/prompts/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/web", + "source": "/warp/knowledge-and-collaboration/warp-drive/web(/?)", "destination": "/knowledge-and-collaboration/warp-drive/web/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/workflows", + "source": "/warp/knowledge-and-collaboration/warp-drive/workflows(/?)", "destination": "/knowledge-and-collaboration/warp-drive/workflows/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/app-icons", + "source": "/warp/terminal/appearance/app-icons(/?)", "destination": "/terminal/appearance/app-icons/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/blocks-behavior", + "source": "/warp/terminal/appearance/blocks-behavior(/?)", "destination": "/terminal/appearance/blocks-behavior/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/custom-themes", + "source": "/warp/terminal/appearance/custom-themes(/?)", "destination": "/terminal/appearance/custom-themes/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/input-position", + "source": "/warp/terminal/appearance/input-position(/?)", "destination": "/terminal/appearance/input-position/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/pane-dimming", + "source": "/warp/terminal/appearance/pane-dimming(/?)", "destination": "/terminal/appearance/pane-dimming/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/prompt", + "source": "/warp/terminal/appearance/prompt(/?)", "destination": "/terminal/appearance/prompt/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/size-opacity-blurring", + "source": "/warp/terminal/appearance/size-opacity-blurring(/?)", "destination": "/terminal/appearance/size-opacity-blurring/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/tabs-behavior", + "source": "/warp/terminal/appearance/tabs-behavior(/?)", "destination": "/terminal/appearance/tabs-behavior/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/text-fonts-cursor", + "source": "/warp/terminal/appearance/text-fonts-cursor(/?)", "destination": "/terminal/appearance/text-fonts-cursor/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/themes", + "source": "/warp/terminal/appearance/themes(/?)", "destination": "/terminal/appearance/themes/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/background-blocks", + "source": "/warp/terminal/blocks/background-blocks(/?)", "destination": "/terminal/blocks/background-blocks/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/block-actions", + "source": "/warp/terminal/blocks/block-actions(/?)", "destination": "/terminal/blocks/block-actions/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/block-basics", + "source": "/warp/terminal/blocks/block-basics(/?)", "destination": "/terminal/blocks/block-basics/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/block-filtering", + "source": "/warp/terminal/blocks/block-filtering(/?)", "destination": "/terminal/blocks/block-filtering/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/block-sharing", + "source": "/warp/terminal/blocks/block-sharing(/?)", "destination": "/terminal/blocks/block-sharing/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/find", + "source": "/warp/terminal/blocks/find(/?)", "destination": "/terminal/blocks/find/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/sticky-command-header", + "source": "/warp/terminal/blocks/sticky-command-header(/?)", "destination": "/terminal/blocks/sticky-command-header/", "statusCode": 308 }, { - "source": "/warp/terminal/command-completions/autosuggestions", + "source": "/warp/terminal/command-completions/autosuggestions(/?)", "destination": "/terminal/command-completions/autosuggestions/", "statusCode": 308 }, { - "source": "/warp/terminal/command-completions/completions", + "source": "/warp/terminal/command-completions/completions(/?)", "destination": "/terminal/command-completions/completions/", "statusCode": 308 }, { - "source": "/warp/terminal/command-palette", + "source": "/warp/terminal/command-palette(/?)", "destination": "/terminal/command-palette/", "statusCode": 308 }, { - "source": "/warp/terminal/comparisons/performance", + "source": "/warp/terminal/comparisons/performance(/?)", "destination": "/terminal/comparisons/performance/", "statusCode": 308 }, { - "source": "/warp/terminal/comparisons/terminal-features", + "source": "/warp/terminal/comparisons/terminal-features(/?)", "destination": "/terminal/comparisons/terminal-features/", "statusCode": 308 }, { - "source": "/warp/terminal/editor/alias-expansion", + "source": "/warp/terminal/editor/alias-expansion(/?)", "destination": "/terminal/editor/alias-expansion/", "statusCode": 308 }, { - "source": "/warp/terminal/editor/command-inspector", + "source": "/warp/terminal/editor/command-inspector(/?)", "destination": "/terminal/editor/command-inspector/", "statusCode": 308 }, { - "source": "/warp/terminal/editor/syntax-error-highlighting", + "source": "/warp/terminal/editor/syntax-error-highlighting(/?)", "destination": "/terminal/editor/syntax-error-highlighting/", "statusCode": 308 }, { - "source": "/warp/terminal/editor/vim", + "source": "/warp/terminal/editor/vim(/?)", "destination": "/terminal/editor/vim/", "statusCode": 308 }, { - "source": "/warp/terminal/entry/command-corrections", + "source": "/warp/terminal/entry/command-corrections(/?)", "destination": "/terminal/entry/command-corrections/", "statusCode": 308 }, { - "source": "/warp/terminal/entry/command-history", + "source": "/warp/terminal/entry/command-history(/?)", "destination": "/terminal/entry/command-history/", "statusCode": 308 }, { - "source": "/warp/terminal/entry/command-search", + "source": "/warp/terminal/entry/command-search(/?)", "destination": "/terminal/entry/command-search/", "statusCode": 308 }, { - "source": "/warp/terminal/entry/synchronized-inputs", + "source": "/warp/terminal/entry/synchronized-inputs(/?)", "destination": "/terminal/entry/synchronized-inputs/", "statusCode": 308 }, { - "source": "/warp/terminal/entry/yaml-workflows", + "source": "/warp/terminal/entry/yaml-workflows(/?)", "destination": "/terminal/entry/yaml-workflows/", "statusCode": 308 }, { - "source": "/warp/terminal/input/classic-input", + "source": "/warp/terminal/input/classic-input(/?)", "destination": "/terminal/input/classic-input/", "statusCode": 308 }, { - "source": "/warp/terminal/integrations-and-plugins", + "source": "/warp/terminal/integrations-and-plugins(/?)", "destination": "/terminal/integrations-and-plugins/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/accessibility", + "source": "/warp/terminal/more-features/accessibility(/?)", "destination": "/terminal/more-features/accessibility/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/audible-bell", + "source": "/warp/terminal/more-features/audible-bell(/?)", "destination": "/terminal/more-features/audible-bell/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/files-and-links", + "source": "/warp/terminal/more-features/files-and-links(/?)", "destination": "/terminal/more-features/files-and-links/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/full-screen-apps", + "source": "/warp/terminal/more-features/full-screen-apps(/?)", "destination": "/terminal/more-features/full-screen-apps/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/linux", + "source": "/warp/terminal/more-features/linux(/?)", "destination": "/terminal/more-features/linux/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/markdown-viewer", + "source": "/warp/terminal/more-features/markdown-viewer(/?)", "destination": "/terminal/more-features/markdown-viewer/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/notifications", + "source": "/warp/terminal/more-features/notifications(/?)", "destination": "/terminal/more-features/notifications/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/quit-warning", + "source": "/warp/terminal/more-features/quit-warning(/?)", "destination": "/terminal/more-features/quit-warning/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/settings-sync", + "source": "/warp/terminal/more-features/settings-sync(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/text-selection", + "source": "/warp/terminal/more-features/text-selection(/?)", "destination": "/terminal/more-features/text-selection/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/uri-scheme", + "source": "/warp/terminal/more-features/uri-scheme(/?)", "destination": "/terminal/more-features/uri-scheme/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/working-directory", + "source": "/warp/terminal/more-features/working-directory(/?)", "destination": "/terminal/more-features/working-directory/", "statusCode": 308 }, { - "source": "/warp/terminal/sessions/launch-configurations", + "source": "/warp/terminal/sessions/launch-configurations(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/warp/terminal/sessions/session-navigation", + "source": "/warp/terminal/sessions/session-navigation(/?)", "destination": "/terminal/sessions/session-navigation/", "statusCode": 308 }, { - "source": "/warp/terminal/sessions/session-restoration", + "source": "/warp/terminal/sessions/session-restoration(/?)", "destination": "/terminal/sessions/session-restoration/", "statusCode": 308 }, { - "source": "/warp/terminal/settings/all-settings", + "source": "/warp/terminal/settings/all-settings(/?)", "destination": "/getting-started/quickstart/customizing-warp/", "statusCode": 308 }, { - "source": "/warp/terminal/warpify/ssh", + "source": "/warp/terminal/warpify/ssh(/?)", "destination": "/terminal/warpify/ssh/", "statusCode": 308 }, { - "source": "/warp/terminal/warpify/ssh-legacy", + "source": "/warp/terminal/warpify/ssh-legacy(/?)", "destination": "/terminal/warpify/ssh-legacy/", "statusCode": 308 }, { - "source": "/warp/terminal/warpify/subshells", + "source": "/warp/terminal/warpify/subshells(/?)", "destination": "/terminal/warpify/subshells/", "statusCode": 308 }, { - "source": "/warp/terminal/windows/global-hotkey", + "source": "/warp/terminal/windows/global-hotkey(/?)", "destination": "/terminal/windows/global-hotkey/", "statusCode": 308 }, { - "source": "/warp/terminal/windows/split-panes", + "source": "/warp/terminal/windows/split-panes(/?)", "destination": "/terminal/windows/split-panes/", "statusCode": 308 }, { - "source": "/warp/terminal/windows/tab-configs", + "source": "/warp/terminal/windows/tab-configs(/?)", "destination": "/terminal/windows/tab-configs/", "statusCode": 308 }, { - "source": "/warp/terminal/windows/tabs", + "source": "/warp/terminal/windows/tabs(/?)", "destination": "/terminal/windows/tabs/", "statusCode": 308 }, { - "source": "/warp/terminal/windows/vertical-tabs", + "source": "/warp/terminal/windows/vertical-tabs(/?)", "destination": "/terminal/windows/vertical-tabs/", "statusCode": 308 }, @@ -4308,112 +4303,112 @@ "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/integrations/github-actions/quickstart-github-actions", + "source": "/agent-platform/cloud-agents/integrations/github-actions/quickstart-github-actions(/?)", "destination": "/platform/integrations/github-actions/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context", + "source": "/agent-platform/warp-agents/agent-context(/?)", "destination": "/agent-platform/local-agents/agent-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context/mcp", + "source": "/agent-platform/warp-agents/agent-context/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/agent-notifications", + "source": "/agent-platform/warp-agents/capabilities-overview/agent-notifications(/?)", "destination": "/agent-platform/capabilities/agent-notifications/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/agent-profiles-permissions", + "source": "/agent-platform/warp-agents/capabilities-overview/agent-profiles-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/cloud-conversations", + "source": "/agent-platform/warp-agents/capabilities-overview/cloud-conversations(/?)", "destination": "/agent-platform/local-agents/cloud-conversations/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/codebase-context", + "source": "/agent-platform/warp-agents/capabilities-overview/codebase-context(/?)", "destination": "/agent-platform/capabilities/codebase-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/computer-use", + "source": "/agent-platform/warp-agents/capabilities-overview/computer-use(/?)", "destination": "/agent-platform/capabilities/computer-use/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/full-terminal-use", + "source": "/agent-platform/warp-agents/capabilities-overview/full-terminal-use(/?)", "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/model-choice", + "source": "/agent-platform/warp-agents/capabilities-overview/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/planning", + "source": "/agent-platform/warp-agents/capabilities-overview/planning(/?)", "destination": "/agent-platform/capabilities/planning/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/rules", + "source": "/agent-platform/warp-agents/capabilities-overview/rules(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/session-sharing", + "source": "/agent-platform/warp-agents/capabilities-overview/session-sharing(/?)", "destination": "/agent-platform/local-agents/session-sharing/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/skills", + "source": "/agent-platform/warp-agents/capabilities-overview/skills(/?)", "destination": "/agent-platform/capabilities/skills/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/slash-commands", + "source": "/agent-platform/warp-agents/capabilities-overview/slash-commands(/?)", "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/task-lists", + "source": "/agent-platform/warp-agents/capabilities-overview/task-lists(/?)", "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/web-search", + "source": "/agent-platform/warp-agents/capabilities-overview/web-search(/?)", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/interacting-with-agents", + "source": "/agent-platform/warp-agents/interacting-with-agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/interacting-with-agents/code-diffs", + "source": "/agent-platform/warp-agents/interacting-with-agents/code-diffs(/?)", "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/warp-agents", + "source": "/agent-platform/warp-agents/warp-agents(/?)", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/getting-started/quickstart", + "source": "/getting-started/quickstart(/?)", "destination": "/quickstart/", "statusCode": 308 }, { - "source": "/guides/agent-workflows/how-to-run-3-agents-in-parallel-summarize-logs-\\+-analyze-pr-\\+-modify-ui", + "source": "/guides/agent-workflows/how-to-run-3-agents-in-parallel-summarize-logs-\\+-analyze-pr-\\+-modify-ui(/?)", "destination": "/guides/agent-workflows/how-to-run-3-agents-in-parallel-summarize-logs-analyze-pr-modify-ui/", "statusCode": 308 }, @@ -4423,4428 +4418,763 @@ "statusCode": 308 }, { - "source": "/guides/build-an-app-in-warp/building-a-slackbot", + "source": "/guides/build-an-app-in-warp/building-a-slackbot(/?)", "destination": "/platform/integrations/slack/", "statusCode": 308 }, { - "source": "/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-\\+-railway", + "source": "/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-\\+-railway(/?)", "destination": "/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-railway/", "statusCode": 308 }, { - "source": "/guides/configuration/how-to-create-project-rules-for-an-existing-project-astro-\\+-typescript-\\+-tailwind", + "source": "/guides/configuration/how-to-create-project-rules-for-an-existing-project-astro-\\+-typescript-\\+-tailwind(/?)", "destination": "/guides/configuration/how-to-create-project-rules-for-an-existing-project-astro-typescript-tailwind/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/how-to-analyze-cloud-run-logs-gcloud", + "source": "/guides/devops-and-infrastructure/how-to-analyze-cloud-run-logs-gcloud(/?)", "destination": "/guides/devops/how-to-analyze-cloud-run-logs-gcloud/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/how-to-create-a-production-ready-docker-setup", + "source": "/guides/devops-and-infrastructure/how-to-create-a-production-ready-docker-setup(/?)", "destination": "/guides/devops/how-to-create-a-production-ready-docker-setup/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/how-to-create-priority-matrix-for-database-optimization", + "source": "/guides/devops-and-infrastructure/how-to-create-priority-matrix-for-database-optimization(/?)", "destination": "/guides/devops/how-to-create-priority-matrix-for-database-optimization/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/how-to-generate-unit-and-security-tests-to-debug-faster", + "source": "/guides/devops-and-infrastructure/how-to-generate-unit-and-security-tests-to-debug-faster(/?)", "destination": "/guides/devops/how-to-generate-unit-and-security-tests-to-debug-faster/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/how-to-prevent-secrets-from-leaking", + "source": "/guides/devops-and-infrastructure/how-to-prevent-secrets-from-leaking(/?)", "destination": "/guides/devops/how-to-prevent-secrets-from-leaking/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/how-to-write-sql-commands-inside-a-postgres-repl", + "source": "/guides/devops-and-infrastructure/how-to-write-sql-commands-inside-a-postgres-repl(/?)", "destination": "/guides/devops/how-to-write-sql-commands-inside-a-postgres-repl/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/improve-your-kubernetes-workflow-kubectl-\\+-helm", + "source": "/guides/devops-and-infrastructure/improve-your-kubernetes-workflow-kubectl-\\+-helm(/?)", "destination": "/guides/devops/improve-your-kubernetes-workflow-kubectl-helm/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/context7-mcp-update-astro-project-with-best-practices", + "source": "/guides/external-tools-and-integrations/context7-mcp-update-astro-project-with-best-practices(/?)", "destination": "/guides/external-tools/context7-mcp-update-astro-project-with-best-practices/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/figma-remote-mcp-create-a-website-from-a-figma-file-from-scratch", + "source": "/guides/external-tools-and-integrations/figma-remote-mcp-create-a-website-from-a-figma-file-from-scratch(/?)", "destination": "/guides/external-tools/figma-remote-mcp-create-a-website-from-a-figma-file-from-scratch/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/github-mcp-summarizing-open-prs-and-creating-gh-issues", + "source": "/guides/external-tools-and-integrations/github-mcp-summarizing-open-prs-and-creating-gh-issues(/?)", "destination": "/guides/external-tools/github-mcp-summarizing-open-prs-and-creating-gh-issues/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/how-to-set-up-claude-code", + "source": "/guides/external-tools-and-integrations/how-to-set-up-claude-code(/?)", "destination": "/guides/external-tools/how-to-set-up-claude-code/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/how-to-set-up-codex-cli", + "source": "/guides/external-tools-and-integrations/how-to-set-up-codex-cli(/?)", "destination": "/guides/external-tools/how-to-set-up-codex-cli/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/how-to-set-up-gemini-cli", + "source": "/guides/external-tools-and-integrations/how-to-set-up-gemini-cli(/?)", "destination": "/guides/external-tools/how-to-set-up-gemini-cli/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/how-to-set-up-ollama", + "source": "/guides/external-tools-and-integrations/how-to-set-up-ollama(/?)", "destination": "/guides/external-tools/how-to-set-up-ollama/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/how-to-set-up-opencode", + "source": "/guides/external-tools-and-integrations/how-to-set-up-opencode(/?)", "destination": "/guides/external-tools/how-to-set-up-opencode/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/linear-mcp-retrieve-issue-data", + "source": "/guides/external-tools-and-integrations/linear-mcp-retrieve-issue-data(/?)", "destination": "/guides/external-tools/linear-mcp-retrieve-issue-data/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/linear-mcp-updating-tickets-with-a-lean-build-approach", + "source": "/guides/external-tools-and-integrations/linear-mcp-updating-tickets-with-a-lean-build-approach(/?)", "destination": "/guides/external-tools/linear-mcp-updating-tickets-with-a-lean-build-approach/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/puppeteer-mcp-scraping-amazon-web-reviews", + "source": "/guides/external-tools-and-integrations/puppeteer-mcp-scraping-amazon-web-reviews(/?)", "destination": "/guides/external-tools/puppeteer-mcp-scraping-amazon-web-reviews/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/sentry-mcp-fix-sentry-error-in-empower-website", + "source": "/guides/external-tools-and-integrations/sentry-mcp-fix-sentry-error-in-empower-website(/?)", "destination": "/guides/external-tools/sentry-mcp-fix-sentry-error-in-empower-website/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up", + "source": "/guides/external-tools-and-integrations/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up(/?)", "destination": "/guides/external-tools/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/using-mcp-servers-with-warp", + "source": "/guides/external-tools-and-integrations/using-mcp-servers-with-warp(/?)", "destination": "/guides/external-tools/using-mcp-servers-with-warp/", "statusCode": 308 }, { - "source": "/guides/frontend-and-ui/how-to-actually-code-ui-that-matches-your-mockup-react-\\+-tailwind", + "source": "/guides/frontend-and-ui/how-to-actually-code-ui-that-matches-your-mockup-react-\\+-tailwind(/?)", "destination": "/guides/frontend/how-to-actually-code-ui-that-matches-your-mockup-react-tailwind/", "statusCode": 308 }, { - "source": "/guides/frontend-and-ui/how-to-replace-a-ui-element-in-warp-rust-codebase", + "source": "/guides/frontend-and-ui/how-to-replace-a-ui-element-in-warp-rust-codebase(/?)", "destination": "/guides/frontend/how-to-replace-a-ui-element-in-warp-rust-codebase/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/api-and-sdk", + "source": "/reference/api-and-sdk/api-and-sdk(/?)", "destination": "/reference/api-and-sdk/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/models", + "source": "/reference/api-and-sdk/models(/?)", "destination": "/reference/api-and-sdk/", "statusCode": 308 }, { - "source": "/reference/cli/cli", + "source": "/reference/cli/cli(/?)", "destination": "/reference/cli/", "statusCode": 308 }, { - "source": "/support-and-community/privacy-security-and-licensing/network-log", + "source": "/support-and-community/privacy-security-and-licensing/network-log(/?)", "destination": "/support-and-community/privacy-and-security/network-log/", "statusCode": 308 }, { - "source": "/support-and-community/privacy-security-and-licensing/open-source-licenses", + "source": "/support-and-community/privacy-security-and-licensing/open-source-licenses(/?)", "destination": "/support-and-community/community/open-source-licenses/", "statusCode": 308 }, { - "source": "/support-and-community/privacy-security-and-licensing/privacy", + "source": "/support-and-community/privacy-security-and-licensing/privacy(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/privacy-security-and-licensing/secret-redaction", + "source": "/support-and-community/privacy-security-and-licensing/secret-redaction(/?)", "destination": "/support-and-community/privacy-and-security/secret-redaction/", "statusCode": 308 }, { - "source": "/terminal/classic-input", + "source": "/terminal/classic-input(/?)", "destination": "/terminal/input/classic-input/", "statusCode": 308 }, { - "source": "/terminal/terminal-features", + "source": "/terminal/terminal-features(/?)", "destination": "/terminal/comparisons/terminal-features/", "statusCode": 308 }, { - "source": "/terminal/windows/launch-configurations", + "source": "/terminal/windows/launch-configurations(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/agents/agents-overview", + "source": "/agents/agents-overview(/?)", "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agents/ai", + "source": "/agents/ai(/?)", "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agents/ai-faqs", + "source": "/agents/ai-faqs(/?)", "destination": "/agent-platform/getting-started/faqs/", "statusCode": 308 }, { - "source": "/agents/autonomy", + "source": "/agents/autonomy(/?)", "destination": "/agent-platform/getting-started/agents-in-warp/", "statusCode": 308 }, { - "source": "/agents/using-agents/agent-context/blocks-as-context", + "source": "/agents/using-agents/agent-context/blocks-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, { - "source": "/agents/using-agents/agent-context/images-as-context", + "source": "/agents/using-agents/agent-context/images-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { - "source": "/agents/using-agents/agent-context/urls-as-context", + "source": "/agents/using-agents/agent-context/urls-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", "statusCode": 308 }, { - "source": "/agents/using-agents/agent-context/using-to-add-context", + "source": "/agents/using-agents/agent-context/using-to-add-context(/?)", "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { - "source": "/agents/using-agents/agent-conversations/conversation-forking", + "source": "/agents/using-agents/agent-conversations/conversation-forking(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agents/using-agents/managing-agents", + "source": "/agents/using-agents/managing-agents(/?)", "destination": "/platform/managing-cloud-agents/", "statusCode": 308 }, { - "source": "/agents/voice", + "source": "/agents/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/ambient-agents/ambient-agents-overview", + "source": "/ambient-agents/ambient-agents-overview(/?)", "destination": "/platform/", "statusCode": 308 }, { - "source": "/ambient-agents/managing-ambient-agents", + "source": "/ambient-agents/managing-ambient-agents(/?)", "destination": "/platform/managing-cloud-agents/", "statusCode": 308 }, { - "source": "/getting-started/readme", + "source": "/getting-started/readme(/?)", "destination": "/", "statusCode": 308 }, { - "source": "/getting-started/readme-1/coding-in-warp", + "source": "/getting-started/readme-1/coding-in-warp(/?)", "destination": "/getting-started/quickstart/coding-in-warp/", "statusCode": 308 }, { - "source": "/getting-started/readme-1/customizing-warp", + "source": "/getting-started/readme-1/customizing-warp(/?)", "destination": "/getting-started/quickstart/customizing-warp/", "statusCode": 308 }, { - "source": "/getting-started/readme-1/installation-and-setup", + "source": "/getting-started/readme-1/installation-and-setup(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/readme/coding-in-warp", + "source": "/getting-started/readme/coding-in-warp(/?)", "destination": "/getting-started/quickstart/coding-in-warp/", "statusCode": 308 }, { - "source": "/getting-started/readme/customizing-warp", + "source": "/getting-started/readme/customizing-warp(/?)", "destination": "/getting-started/quickstart/customizing-warp/", "statusCode": 308 }, { - "source": "/getting-started/readme/installation-and-setup", + "source": "/getting-started/readme/installation-and-setup(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/platform/warp-platform", + "source": "/platform/warp-platform(/?)", "destination": "/reference/", "statusCode": 308 }, { - "source": "/support-and-billing/known-issues", + "source": "/support-and-billing/known-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, { - "source": "/support-and-billing/plans-and-pricing", + "source": "/support-and-billing/plans-and-pricing(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-billing/plans-and-pricing/add-on-credits", + "source": "/support-and-billing/plans-and-pricing/add-on-credits(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-billing/plans-and-pricing/bring-your-own-api-key", + "source": "/support-and-billing/plans-and-pricing/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, { - "source": "/support-and-billing/plans-and-pricing/pricing-faqs", + "source": "/support-and-billing/plans-and-pricing/pricing-faqs(/?)", "destination": "/support-and-community/plans-and-billing/pricing-faqs/", "statusCode": 308 }, { - "source": "/support-and-billing/plans-and-pricing/reload-credits-add-on-credits", + "source": "/support-and-billing/plans-and-pricing/reload-credits-add-on-credits(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-billing/sending-us-feedback", + "source": "/support-and-billing/sending-us-feedback(/?)", "destination": "/support-and-community/troubleshooting-and-support/sending-us-feedback/", "statusCode": 308 }, { - "source": "/support-and-billing/troubleshooting-login-issues", + "source": "/support-and-billing/troubleshooting-login-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", "statusCode": 308 }, { - "source": "/support-and-billing/uninstalling-warp", + "source": "/support-and-billing/uninstalling-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", "statusCode": 308 }, { - "source": "/support-and-billing/updating-warp", + "source": "/support-and-billing/updating-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/agent/", - "destination": "/api#tag/agent", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/schedules/", - "destination": "/api#tag/schedules", + "source": "/errors/", + "destination": "/reference/api-and-sdk/troubleshooting/errors/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/agent-1/", - "destination": "/api", + "source": "/errors/:code/", + "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", "statusCode": 308 }, { - "source": "/advanced/command-line-flags/", - "destination": "/terminal/sessions/launch-configurations/", + "source": "/getting-started/about-warps-ai/", + "destination": "/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/", - "destination": "/agent-platform/capabilities/", + "source": "/getting-started/introduction/", + "destination": "/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/agent-profiles-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "source": "/what-is-warp/", + "destination": "/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/codebase-context/", - "destination": "/agent-platform/capabilities/codebase-context/", + "source": "/warp/getting-started/what-is-warp/", + "destination": "/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/full-terminal-use/", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "source": "/university/(.*)", + "destination": "/guides/$1", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/mcp/", - "destination": "/agent-platform/capabilities/mcp/", + "source": "/platform/cli", + "destination": "/reference/cli/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/model-choice/", - "destination": "/agent-platform/inference/model-choice/", + "source": "/support-and-community/plans-and-billing/plans-and-pricing", + "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/planning/", - "destination": "/agent-platform/capabilities/planning/", + "source": "/knowledge-and-collaboration/mcp", + "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/rules/", - "destination": "/agent-platform/capabilities/rules/", + "source": "/getting-started/readme-1", + "destination": "/quickstart/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/skills/", - "destination": "/agent-platform/capabilities/skills/", + "source": "/support-and-billing/plans-and-pricing/ai-credits", + "destination": "/support-and-community/plans-and-billing/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/slash-commands/", - "destination": "/agent-platform/capabilities/slash-commands/", + "source": "/getting-started/changelog", + "destination": "/changelog/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/task-lists/", - "destination": "/agent-platform/capabilities/task-lists/", + "source": "/university", + "destination": "/guides/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/web-search/", - "destination": "/agent-platform/capabilities/web-search/", + "source": "/code/codebase-context", + "destination": "/agent-platform/capabilities/codebase-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/", - "destination": "/agent-platform/local-agents/overview/", + "source": "/platform/environments", + "destination": "/platform/environments/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/active-ai/", - "destination": "/agent-platform/local-agents/active-ai/", + "source": "/agents/using-agents/model-choice", + "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/", - "destination": "/agent-platform/local-agents/agent-context/", + "source": "/getting-started/readme/agents-in-warp", + "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/blocks-as-context/", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", + "source": "/privacy/privacy", + "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/images-as-context/", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", + "source": "/agents/using-agents/third-party-cli-agents", + "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/selection-as-context/", - "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", + "source": "/knowledge-and-collaboration/rules", + "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/urls-as-context/", - "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", + "source": "/agent-platform/agent/skills", + "destination": "/agent-platform/capabilities/skills/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/using-to-add-context/", - "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", + "source": "/community/refer-a-friend", + "destination": "/support-and-community/community/refer-a-friend/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agents-overview/", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent/using-agents/model-choice", + "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/ambient-agents-session-sharing/", - "destination": "/platform/viewing-cloud-agent-runs/", + "source": "/agent-platform/agent/using-agents", + "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/code-diffs-in-agent-conversations/", - "destination": "/agent-platform/local-agents/code-diffs/", + "source": "/agents/using-agents/planning", + "destination": "/agent-platform/capabilities/planning/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/full-terminal-use/", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "source": "/support-and-community/plans-and-billing/ai-credits", + "destination": "/support-and-community/plans-and-billing/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/generate/", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent/using-agents/agent-conversations", + "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interacting-with-agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "source": "/community/warp-preview-and-alpha-program", + "destination": "/support-and-community/community/warp-preview-and-alpha-program/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interacting-with-agents/agent-modality-beta/", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", + "source": "/agent-platform/warps-agent/capabilities-overview/skills", + "destination": "/agent-platform/capabilities/skills/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interacting-with-agents/conversation-forking/", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", + "source": "/guides/integrations/how-to-set-up-claude-code", + "destination": "/guides/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interacting-with-agents/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "source": "/agents/using-agents/agent-conversations", + "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interactive-code-review/", - "destination": "/agent-platform/local-agents/interactive-code-review/", + "source": "/agents/using-agents/agent-profiles-permissions", + "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/model-choice/", - "destination": "/agent-platform/inference/model-choice/", + "source": "/integrations/integrations-overview", + "destination": "/platform/integrations/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/task-lists/", - "destination": "/agent-platform/capabilities/task-lists/", + "source": "/agents/using-agents", + "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/third-party-cli-agents/", - "destination": "/agent-platform/cli-agents/overview/", + "source": "/agent-platform/warps-agent/capabilities-overview/model-choice", + "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/web-search/", - "destination": "/agent-platform/capabilities/web-search/", + "source": "/platform/agent-api-and-sdk", + "destination": "/reference/api-and-sdk/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/active-ai/", - "destination": "/agent-platform/local-agents/active-ai/", + "source": "/support-and-billing/using-warp-offline", + "destination": "/support-and-community/troubleshooting-and-support/using-warp-offline/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agent-modality-beta/", + "source": "/agent-platform/warps-agent/interacting-with-agents/terminal-and-agent-modes", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agent/agents-overview/", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/third-party-agents", + "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agent/using-agents/agent-profiles-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "source": "/agents/full-terminal-use", + "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agents-md/", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent/ai-faqs", + "destination": "/agent-platform/getting-started/faqs/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agents-overview/", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent/using-agents/managing-agents", + "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/ai/", - "destination": "/agent-platform/", + "source": "/agent-platform/warps-agent/agent-context/mcp", + "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/ai-faqs/", - "destination": "/agent-platform/getting-started/faqs/", + "source": "/agents/slash-commands", + "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/ai-model-choice/", - "destination": "/agent-platform/inference/model-choice/", + "source": "/privacy/secret-redaction", + "destination": "/support-and-community/privacy-and-security/secret-redaction/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/ambient-agents/ambient-agents-overview/", - "destination": "/platform/", + "source": "/support-and-billing/licenses", + "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/autonomy/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "source": "/agent-platform/agent/slash-commands", + "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/autonomy/agent-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "source": "/ambient-agents/agent-secrets", + "destination": "/platform/secrets/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/autonomy/run-to-completion/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "source": "/integrations/slack", + "destination": "/platform/integrations/slack/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/cloud-agents/cloud-agents-platform/", - "destination": "/platform/overview/", + "source": "/agents/using-agents/agent-tasklists", + "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/cloud-agents/warp-platform/", - "destination": "/platform/overview/", + "source": "/agent-platform/agent/using-agents/agent-context/images-as-context", + "destination": "/agent-platform/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/conversation-forking/", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", + "source": "/agent-platform/getting-started", + "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/full-terminal-use/", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "source": "/integrations/github-actions", + "destination": "/platform/integrations/github-actions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/generate/", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent/using-agents/agent-conversations/conversation-forking", + "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/integrations/github-actions/readme/", - "destination": "/platform/integrations/github-actions/", + "source": "/agent-platform/agent/using-agents/agent-profiles-permissions", + "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/integrations/integrations-overview/", - "destination": "/platform/integrations/", + "source": "/agent-platform/warps-agent/capabilities-overview/rules", + "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/model-choice/", - "destination": "/agent-platform/inference/model-choice/", + "source": "/agent-platform/warps-agent/capabilities-overview/session-sharing", + "destination": "/agent-platform/local-agents/session-sharing/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/slash-commands/", - "destination": "/agent-platform/capabilities/slash-commands/", + "source": "/agent-platform/warps-agent/interacting-with-agents/voice", + "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "source": "/agents/active-ai", + "destination": "/agent-platform/local-agents/active-ai/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/", - "destination": "/agent-platform/local-agents/agent-context/", + "source": "/agent-platform/local-agents/interacting-with-agents/code-diffs", + "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/blocks-as-context/", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", + "source": "/integrations/linear", + "destination": "/platform/integrations/linear/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/images-as-context/", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", + "source": "/platform/cli/integrations-and-environments", + "destination": "/platform/integrations/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/selection-as-context/", - "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", + "source": "/privacy/network-log", + "destination": "/support-and-community/privacy-and-security/network-log/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/urls-as-context/", - "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", + "source": "/agent-platform/agent/using-agents/agent-context", + "destination": "/agent-platform/local-agents/agent-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/using-to-add-context/", - "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", + "source": "/agent-platform/local-agents/interacting-with-agents/code-diffs-in-agent-conversations", + "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-conversations/", + "source": "/agent-platform/warps-agent/interacting-with-agents", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-conversations/conversation-forking/", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", + "source": "/ambient-agents/mcp-servers-for-agents", + "destination": "/platform/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "source": "/agent-platform/agent/agents-overview", + "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-profiles-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "source": "/agent-platform/agent/voice", + "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-tasklists/", - "destination": "/agent-platform/capabilities/task-lists/", + "source": "/agent-platform/warps-agent/capabilities-overview/full-terminal-use", + "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/managing-agents/", - "destination": "/platform/managing-cloud-agents/", + "source": "/agent-platform/warps-agent/interacting-with-agents/code-diffs", + "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/model-choice/", - "destination": "/agent-platform/inference/model-choice/", + "source": "/agents/using-agents/agent-context", + "destination": "/agent-platform/local-agents/agent-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/planning/", - "destination": "/agent-platform/capabilities/planning/", + "source": "/knowledge-and-collaboration/session-sharing/agent-session-sharing", + "destination": "/knowledge-and-collaboration/session-sharing/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/third-party-cli-agents/", - "destination": "/agent-platform/cli-agents/overview/", + "source": "/agent-platform/warps-agent/warp-agents", + "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/web-search/", + "source": "/agents/using-agents/web-search", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "source": "/platform/deployment-patterns", + "destination": "/platform/deployment-patterns/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/warps-agent/agent-context/images-as-context", + "destination": "/agent-platform/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/active-ai/", - "destination": "/agent-platform/local-agents/active-ai/", + "source": "/agent-platform/warps-agent/capabilities-overview/agent-profiles-permissions", + "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agents/agent-modality-beta/", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", + "source": "/agent-platform/warps-agent/capabilities-overview/slash-commands", + "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/agents/agents-md/", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agents", + "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agent-platform/agents/agents-overview/", + "source": "/agents/agent-modality-beta", "destination": "/agent-platform/local-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai/", - "destination": "/agent-platform/", + "source": "/guides/integrations/how-to-set-up-opencode", + "destination": "/guides/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai-commander/", - "destination": "/agent-platform/local-agents/overview/", + "source": "/help/troubleshooting-login-issues", + "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai-commands/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/ai-faqs/", - "destination": "/agent-platform/getting-started/faqs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/ai-getting-started/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/autonomy/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/autonomy/agent-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/autonomy/run-to-completion/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/full-terminal-use/", - "destination": "/agent-platform/capabilities/full-terminal-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/generate/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/slash-commands/", - "destination": "/agent-platform/capabilities/slash-commands/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-context/", - "destination": "/agent-platform/local-agents/agent-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-context/blocks-as-context/", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-context/images-as-context/", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-context/selection-as-context/", - "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-context/urls-as-context/", - "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-context/using-to-add-context/", - "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-conversations/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-conversations/conversation-forking/", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-profiles-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-tasklists/", - "destination": "/agent-platform/capabilities/task-lists/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/managing-agents/", - "destination": "/platform/managing-cloud-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/planning/", - "destination": "/agent-platform/capabilities/planning/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/profiles/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/third-party-cli-agents/", - "destination": "/agent-platform/cli-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/web-search/", - "destination": "/agent-platform/capabilities/web-search/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/warp-ai/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ai/", - "destination": "/agent-platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ai-features/ai-commands/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ai-features/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ai/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ambient-agents/", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ambient-agents/agent-secrets/", - "destination": "/platform/secrets/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ambient-agents/ambient-agents-overview/", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ambient-agents/managing-ambient-agents/", - "destination": "/platform/managing-cloud-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ambient-agents/managing-ambient-agents/scheduled-agents/", - "destination": "/platform/triggers/scheduled-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/agent-session-sharing/", - "destination": "/agent-platform/local-agents/session-sharing/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/cloud-agent-secrets/", - "destination": "/platform/secrets/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/cloud-agents-faqs/", - "destination": "/platform/faqs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/cloud-agents-overview/", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/cloud-agents-platform/", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/cloud-agents-session-sharing/", - "destination": "/platform/viewing-cloud-agent-runs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/warp-platform/", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/code/code-review/interactive-code-review/", - "destination": "/agent-platform/local-agents/interactive-code-review/", - "statusCode": 308 - }, - { - "source": "/agent-platform/code/codebase-context/", - "destination": "/agent-platform/capabilities/codebase-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/code/reviewing-code/", - "destination": "/agent-platform/local-agents/code-diffs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/agent-mode/agents-md/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/", - "destination": "/agent-platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-agents/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-agents/agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-ask-warp/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-ask-warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-session-history/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-stack-overflow/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-warpdrive/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-command/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-command-search/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-command-search/limits/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-command-search/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-command-suggestions/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-command/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-commands/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-features/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-features/ai-chat/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/agent/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/ai-models-and-providers/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/ai-setup/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/assistant/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/commands/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/commands-and-agents/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/commands/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/commands/agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/commands/ai-agent/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/commands/ai-commands-overview/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/get-started-with-warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/using-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/using-warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/generate/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/integrations/mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/knowledge/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/terminal-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/terminal-ai/ai-models/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/active-ai/", - "destination": "/agent-platform/local-agents/active-ai/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/agent-modea/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/ai-command-search/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/ai-command-suggestions/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/generate/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/knowledge/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/rules/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/getting-started/quickstart-guide/agents-in-warp/", - "destination": "/agent-platform/getting-started/agents-in-warp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/", - "destination": "/platform/integrations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations-overview/", - "destination": "/platform/integrations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/github-actions/", - "destination": "/platform/integrations/github-actions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/github-actions/demo-issue-triage-bot/", - "destination": "/platform/integrations/quickstart-github-actions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/integrations/demo-issue-triage-bot/", - "destination": "/platform/integrations/quickstart-github-actions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/integrations-overview/", - "destination": "/platform/integrations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/integrations-overview/team-access-billing-and-identity-permissions/", - "destination": "/platform/team-access-billing-and-identity/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/linear/", - "destination": "/platform/integrations/linear/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/slack/", - "destination": "/platform/integrations/slack/", - "statusCode": 308 - }, - { - "source": "/agent-platform/knowledge-and-collaboration/mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/knowledge-and-collaboration/rules/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/knowledge-and-collaboration/session-sharing/agent-session-sharing/", - "destination": "/agent-platform/local-agents/session-sharing/", - "statusCode": 308 - }, - { - "source": "/agent-platform/knowledge-and-collaboration/session-sharing/ambient-agents-session-sharing/", - "destination": "/platform/viewing-cloud-agent-runs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/knowledge-and-collaboration/warp-drive/model-context-protocol-mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/agent-notifications/", - "destination": "/agent-platform/capabilities/agent-notifications/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/agents-overview/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/ambient-agents-session-sharing/", - "destination": "/platform/viewing-cloud-agent-runs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/code-diffs-in-agent-conversations/", - "destination": "/agent-platform/local-agents/code-diffs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality-beta/", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/third-party-cli-agents/", - "destination": "/agent-platform/cli-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/platform/", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/platform/deployment-patterns/", - "destination": "/platform/deployment-patterns/", - "statusCode": 308 - }, - { - "source": "/agent-platform/platform/environments/", - "destination": "/platform/environments/", - "statusCode": 308 - }, - { - "source": "/agent-platform/platform/integrations/integrations-overview/", - "destination": "/platform/integrations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/platform/team-access-billing-and-identity-permissions/", - "destination": "/platform/team-access-billing-and-identity/", - "statusCode": 308 - }, - { - "source": "/agent-platform/platform/warp-platform/", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/settings/ai-agents/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/terminal-ai/getting-started/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/terminal/ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/terminal/ai/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/terminal/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents/claude-code/", - "destination": "/agent-platform/cli-agents/claude-code/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents/codex/", - "destination": "/agent-platform/cli-agents/codex/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents/opencode/", - "destination": "/agent-platform/cli-agents/opencode/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents/overview/", - "destination": "/agent-platform/cli-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents/remote-control/", - "destination": "/agent-platform/cli-agents/remote-control/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents/rich-input/", - "destination": "/agent-platform/cli-agents/rich-input/", - "statusCode": 308 - }, - { - "source": "/agent-platform/using-agents/managing-agents/", - "destination": "/platform/managing-cloud-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-ai/assistant/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-ai/get-started/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-platform/", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/appearance/app-icons/", - "destination": "/terminal/appearance/app-icons/", - "statusCode": 308 - }, - { - "source": "/appearance/blocks-behavior/", - "destination": "/terminal/appearance/blocks-behavior/", - "statusCode": 308 - }, - { - "source": "/appearance/compact-mode/", - "destination": "/terminal/appearance/blocks-behavior/", - "statusCode": 308 - }, - { - "source": "/appearance/custom-themes/", - "destination": "/terminal/appearance/custom-themes/", - "statusCode": 308 - }, - { - "source": "/appearance/input-position/", - "destination": "/terminal/appearance/input-position/", - "statusCode": 308 - }, - { - "source": "/appearance/pane-dimming/", - "destination": "/terminal/appearance/pane-dimming/", - "statusCode": 308 - }, - { - "source": "/appearance/prompt/", - "destination": "/terminal/appearance/prompt/", - "statusCode": 308 - }, - { - "source": "/appearance/size-opacity-blurring/", - "destination": "/terminal/appearance/size-opacity-blurring/", - "statusCode": 308 - }, - { - "source": "/appearance/tab-indicators/", - "destination": "/terminal/appearance/tabs-behavior/", - "statusCode": 308 - }, - { - "source": "/appearance/tabs-behavior/", - "destination": "/terminal/appearance/tabs-behavior/", - "statusCode": 308 - }, - { - "source": "/appearance/text-fonts-cursor/", - "destination": "/terminal/appearance/text-fonts-cursor/", - "statusCode": 308 - }, - { - "source": "/appearance/themes/", - "destination": "/terminal/appearance/themes/", - "statusCode": 308 - }, - { - "source": "/appearance/transparency-and-blurring/", - "destination": "/terminal/appearance/size-opacity-blurring/", - "statusCode": 308 - }, - { - "source": "/changelog/changelog/rss/", - "destination": "/changelog/rss.xml", - "statusCode": 308 - }, - { - "source": "/changelog/getting-started/changelog/", - "destination": "/changelog/", - "statusCode": 308 - }, - { - "source": "/changelog/help/changelog/", - "destination": "/changelog/", - "statusCode": 308 - }, - { - "source": "/changelog/release-notes/", - "destination": "/changelog/", - "statusCode": 308 - }, - { - "source": "/changelog/rss/", - "destination": "/changelog/rss.xml", - "statusCode": 308 - }, - { - "source": "/changelog/url/docs.warp.dev/getting-started/changelog/", - "destination": "/changelog/", - "statusCode": 308 - }, - { - "source": "/changelog/warp/getting-started/changelog/", - "destination": "/changelog/", - "statusCode": 308 - }, - { - "source": "/code-editor/", - "destination": "/code/code-editor/", - "statusCode": 308 - }, - { - "source": "/code/code-overview/", - "destination": "/code/overview/", - "statusCode": 308 - }, - { - "source": "/code/code-review/interactive-code-review/", - "destination": "/code/code-review/", - "statusCode": 308 - }, - { - "source": "/code/reviewing-code/", - "destination": "/code/code-review/", - "statusCode": 308 - }, - { - "source": "/configuration/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/errors/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/", - "statusCode": 308 - }, - { - "source": "/errors/:code/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", - "statusCode": 308 - }, - { - "source": "/features/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/features/accessibility/", - "destination": "/terminal/more-features/accessibility/", - "statusCode": 308 - }, - { - "source": "/features/advanced/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/features/appearance/", - "destination": "/terminal/appearance/", - "statusCode": 308 - }, - { - "source": "/features/appearance/compact-mode/", - "destination": "/terminal/appearance/blocks-behavior/", - "statusCode": 308 - }, - { - "source": "/features/appearance/custom-themes/", - "destination": "/terminal/appearance/custom-themes/", - "statusCode": 308 - }, - { - "source": "/features/appearance/prompt/", - "destination": "/terminal/appearance/prompt/", - "statusCode": 308 - }, - { - "source": "/features/appearance/themes/", - "destination": "/terminal/appearance/themes/", - "statusCode": 308 - }, - { - "source": "/features/blocks/", - "destination": "/terminal/blocks/", - "statusCode": 308 - }, - { - "source": "/features/blocks/background-blocks/", - "destination": "/terminal/blocks/background-blocks/", - "statusCode": 308 - }, - { - "source": "/features/blocks/block-actions/", - "destination": "/terminal/blocks/block-actions/", - "statusCode": 308 - }, - { - "source": "/features/blocks/block-basics/", - "destination": "/terminal/blocks/block-basics/", - "statusCode": 308 - }, - { - "source": "/features/blocks/block-filtering/", - "destination": "/terminal/blocks/block-filtering/", - "statusCode": 308 - }, - { - "source": "/features/blocks/block-sharing/", - "destination": "/terminal/blocks/block-sharing/", - "statusCode": 308 - }, - { - "source": "/features/blocks/sticky-command-header/", - "destination": "/terminal/blocks/sticky-command-header/", - "statusCode": 308 - }, - { - "source": "/features/command-completions/", - "destination": "/terminal/command-completions/", - "statusCode": 308 - }, - { - "source": "/features/command-completions/autosuggestions/", - "destination": "/terminal/command-completions/autosuggestions/", - "statusCode": 308 - }, - { - "source": "/features/command-completions/completions/", - "destination": "/terminal/command-completions/completions/", - "statusCode": 308 - }, - { - "source": "/features/command-history/", - "destination": "/terminal/entry/command-history/", - "statusCode": 308 - }, - { - "source": "/features/command-inspector/", - "destination": "/terminal/editor/command-inspector/", - "statusCode": 308 - }, - { - "source": "/features/command-palette/", - "destination": "/terminal/command-palette/", - "statusCode": 308 - }, - { - "source": "/features/command-search/", - "destination": "/terminal/entry/command-search/", - "statusCode": 308 - }, - { - "source": "/features/compact-mode/", - "destination": "/terminal/appearance/blocks-behavior/", - "statusCode": 308 - }, - { - "source": "/features/completions/", - "destination": "/terminal/command-completions/completions/", - "statusCode": 308 - }, - { - "source": "/features/customize/custom-keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/features/editor/", - "destination": "/terminal/editor/", - "statusCode": 308 - }, - { - "source": "/features/editor/alias-expansion/", - "destination": "/terminal/editor/alias-expansion/", - "statusCode": 308 - }, - { - "source": "/features/editor/command-corrections/", - "destination": "/terminal/entry/command-corrections/", - "statusCode": 308 - }, - { - "source": "/features/editor/command-inspector/", - "destination": "/terminal/editor/command-inspector/", - "statusCode": 308 - }, - { - "source": "/features/editor/syntax-error-highlighting/", - "destination": "/terminal/editor/syntax-error-highlighting/", - "statusCode": 308 - }, - { - "source": "/features/editor/vim/", - "destination": "/terminal/editor/vim/", - "statusCode": 308 - }, - { - "source": "/features/entry/", - "destination": "/terminal/entry/", - "statusCode": 308 - }, - { - "source": "/features/entry/command-corrections/", - "destination": "/terminal/entry/command-corrections/", - "statusCode": 308 - }, - { - "source": "/features/entry/command-history/", - "destination": "/terminal/entry/command-history/", - "statusCode": 308 - }, - { - "source": "/features/entry/command-search/", - "destination": "/terminal/entry/command-search/", - "statusCode": 308 - }, - { - "source": "/features/entry/synchronized-inputs/", - "destination": "/terminal/entry/synchronized-inputs/", - "statusCode": 308 - }, - { - "source": "/features/entry/workflows/", - "destination": "/terminal/entry/yaml-workflows/", - "statusCode": 308 - }, - { - "source": "/features/entry/yaml-workflows/", - "destination": "/terminal/entry/yaml-workflows/", - "statusCode": 308 - }, - { - "source": "/features/files-and-links/", - "destination": "/terminal/more-features/files-and-links/", - "statusCode": 308 - }, - { - "source": "/features/find/", - "destination": "/terminal/blocks/find/", - "statusCode": 308 - }, - { - "source": "/features/full-screen-apps/", - "destination": "/terminal/more-features/full-screen-apps/", - "statusCode": 308 - }, - { - "source": "/features/global-hotkey/", - "destination": "/terminal/windows/global-hotkey/", - "statusCode": 308 - }, - { - "source": "/features/hotkey-window/", - "destination": "/terminal/windows/global-hotkey/", - "statusCode": 308 - }, - { - "source": "/features/integrations/", - "destination": "/terminal/integrations-and-plugins/", - "statusCode": 308 - }, - { - "source": "/features/integrations-and-plugins/", - "destination": "/terminal/integrations-and-plugins/", - "statusCode": 308 - }, - { - "source": "/features/integrations/urls-and-deep-links/", - "destination": "/terminal/more-features/uri-scheme/", - "statusCode": 308 - }, - { - "source": "/features/keybindings/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/features/keyboard-input/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/features/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/features/knowledge/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/features/launch-configurations/", - "destination": "/terminal/sessions/launch-configurations/", - "statusCode": 308 - }, - { - "source": "/features/linux/", - "destination": "/terminal/more-features/linux/", - "statusCode": 308 - }, - { - "source": "/features/markdown-viewer/", - "destination": "/terminal/more-features/markdown-viewer/", - "statusCode": 308 - }, - { - "source": "/features/notifications/", - "destination": "/terminal/more-features/notifications/", - "statusCode": 308 - }, - { - "source": "/features/overview/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/features/prompt/", - "destination": "/terminal/appearance/prompt/", - "statusCode": 308 - }, - { - "source": "/features/quit-warning/", - "destination": "/terminal/more-features/quit-warning/", - "statusCode": 308 - }, - { - "source": "/features/session-management-and-restoration/", - "destination": "/terminal/sessions/", - "statusCode": 308 - }, - { - "source": "/features/session-management/launch-configurations/", - "destination": "/terminal/sessions/launch-configurations/", - "statusCode": 308 - }, - { - "source": "/features/session-management/session-navigation/", - "destination": "/terminal/sessions/session-navigation/", - "statusCode": 308 - }, - { - "source": "/features/session-management/session-restoration/", - "destination": "/terminal/sessions/session-restoration/", - "statusCode": 308 - }, - { - "source": "/features/session-sharing/", - "destination": "/knowledge-and-collaboration/session-sharing/", - "statusCode": 308 - }, - { - "source": "/features/sessions/", - "destination": "/terminal/sessions/", - "statusCode": 308 - }, - { - "source": "/features/sessions/README/", - "destination": "/terminal/sessions/", - "statusCode": 308 - }, - { - "source": "/features/sessions/launch-configurations/", - "destination": "/terminal/sessions/launch-configurations/", - "statusCode": 308 - }, - { - "source": "/features/sessions/quit-warning-modal/", - "destination": "/terminal/more-features/quit-warning/", - "statusCode": 308 - }, - { - "source": "/features/sessions/session-navigation/", - "destination": "/terminal/sessions/session-navigation/", - "statusCode": 308 - }, - { - "source": "/features/sessions/session-restoration/", - "destination": "/terminal/sessions/session-restoration/", - "statusCode": 308 - }, - { - "source": "/features/sessions/sharing-sessions/", - "destination": "/knowledge-and-collaboration/session-sharing/", - "statusCode": 308 - }, - { - "source": "/features/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/features/settings-sync/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/features/settings/configuration-files/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/features/smart-select/", - "destination": "/terminal/more-features/text-selection/", - "statusCode": 308 - }, - { - "source": "/features/split-panes/", - "destination": "/terminal/windows/split-panes/", - "statusCode": 308 - }, - { - "source": "/features/ssh/", - "destination": "/terminal/warpify/ssh-legacy/", - "statusCode": 308 - }, - { - "source": "/features/subshells/", - "destination": "/terminal/warpify/subshells/", - "statusCode": 308 - }, - { - "source": "/features/system-settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/features/tabs/", - "destination": "/terminal/windows/tabs/", - "statusCode": 308 - }, - { - "source": "/features/teams/", - "destination": "/knowledge-and-collaboration/teams/", - "statusCode": 308 - }, - { - "source": "/features/terminal-features/", - "destination": "/terminal/blocks/", - "statusCode": 308 - }, - { - "source": "/features/the-input-editor/", - "destination": "/terminal/editor/", - "statusCode": 308 - }, - { - "source": "/features/themes/", - "destination": "/terminal/appearance/themes/", - "statusCode": 308 - }, - { - "source": "/features/themes/custom-themes/", - "destination": "/terminal/appearance/custom-themes/", - "statusCode": 308 - }, - { - "source": "/features/uri-scheme/", - "destination": "/terminal/more-features/uri-scheme/", - "statusCode": 308 - }, - { - "source": "/features/warp-ai/code/", - "destination": "/code/overview/", - "statusCode": 308 - }, - { - "source": "/features/warp-ai/knowledge/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/features/warp-ai/mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/features/warp-ai/rules/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/", - "destination": "/knowledge-and-collaboration/warp-drive/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/environment-variables/", - "destination": "/knowledge-and-collaboration/warp-drive/environment-variables/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/notebooks/", - "destination": "/knowledge-and-collaboration/warp-drive/notebooks/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/prompts/", - "destination": "/knowledge-and-collaboration/warp-drive/prompts/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/warp-drive-on-the-web/", - "destination": "/knowledge-and-collaboration/warp-drive/web/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/warp-drive-on-the-web-beta/", - "destination": "/knowledge-and-collaboration/warp-drive/web/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/workflows/", - "destination": "/knowledge-and-collaboration/warp-drive/workflows/", - "statusCode": 308 - }, - { - "source": "/features/warpify/", - "destination": "/terminal/warpify/", - "statusCode": 308 - }, - { - "source": "/features/warpify/ssh/", - "destination": "/terminal/warpify/ssh/", - "statusCode": 308 - }, - { - "source": "/features/warpify/ssh-legacy/", - "destination": "/terminal/warpify/ssh-legacy/", - "statusCode": 308 - }, - { - "source": "/features/warpify/subshells/", - "destination": "/terminal/warpify/subshells/", - "statusCode": 308 - }, - { - "source": "/features/windows/", - "destination": "/terminal/windows/", - "statusCode": 308 - }, - { - "source": "/features/windows/global-hotkey/", - "destination": "/terminal/windows/global-hotkey/", - "statusCode": 308 - }, - { - "source": "/features/windows/split-panes/", - "destination": "/terminal/windows/split-panes/", - "statusCode": 308 - }, - { - "source": "/features/windows/tabs/", - "destination": "/terminal/windows/tabs/", - "statusCode": 308 - }, - { - "source": "/features/windows/~/", - "destination": "/terminal/windows/", - "statusCode": 308 - }, - { - "source": "/features/workflows/", - "destination": "/terminal/entry/yaml-workflows/", - "statusCode": 308 - }, - { - "source": "/features/workflows/block-metrics/shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/features/working-directory/", - "destination": "/terminal/more-features/working-directory/", - "statusCode": 308 - }, - { - "source": "/features/workspaces/", - "destination": "/terminal/sessions/", - "statusCode": 308 - }, - { - "source": "/getting-started/about-warps-ai/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/getting-started/account-and-login/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/coding-in-warp/", - "destination": "/getting-started/quickstart/coding-in-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/customizing-warp/", - "destination": "/getting-started/quickstart/customizing-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/customizing-warp/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/getting-started/download-and-install/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/downloading-warp/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/getting-started-with-warp/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/getting-started-with-warp-on-linux/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/guides/shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/getting-started/how-to-use-warp/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/getting-started/installation/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/installation-and-setup/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/installation/linux/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/installing-warp/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/installing-warp-on-linux/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/introduction/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/getting-started/launch-configurations/", - "destination": "/terminal/sessions/launch-configurations/", - "statusCode": 308 - }, - { - "source": "/getting-started/launching-warp/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/linux/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/linux-installation/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/mac-permissions/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart-guide/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart-guide/README/", - "destination": "/quickstart/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart-guide/agents-in-warp/", - "destination": "/agent-platform/getting-started/agents-in-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart-guide/coding-in-warp/", - "destination": "/getting-started/quickstart/coding-in-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart-guide/customizing-warp/", - "destination": "/getting-started/quickstart/customizing-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart-guide/installation-and-setup/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/getting-started/syncing-your-terminal/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/getting-started/terminal/", - "destination": "/terminal/blocks/", - "statusCode": 308 - }, - { - "source": "/getting-started/using-warp-with-shells/", - "destination": "/getting-started/supported-shells/", - "statusCode": 308 - }, - { - "source": "/getting-started/what-is-warp/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/guide/ssh-guide/", - "destination": "/terminal/warpify/ssh/", - "statusCode": 308 - }, - { - "source": "/guides/ssh-quickstart/", - "destination": "/terminal/warpify/ssh/", - "statusCode": 308 - }, - { - "source": "/how-does-warp-compare/performance/", - "destination": "/terminal/comparisons/performance/", - "statusCode": 308 - }, - { - "source": "/how-does-warp-compare/terminal-features/", - "destination": "/terminal/comparisons/terminal-features/", - "statusCode": 308 - }, - { - "source": "/installation/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/installation/linux/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/knowledge-and-collaboration/warp-drive/warp-drive-as-agent-mode-context/", - "destination": "/knowledge-and-collaboration/warp-drive/agent-mode-context/", - "statusCode": 308 - }, - { - "source": "/knowledge-and-collaboration/warp-drive/warp-drive-on-the-web/", - "destination": "/knowledge-and-collaboration/warp-drive/web/", - "statusCode": 308 - }, - { - "source": "/knowledge-and-collaboration/workflows/", - "destination": "/knowledge-and-collaboration/warp-drive/workflows/", - "statusCode": 308 - }, - { - "source": "/quick-start/", - "destination": "/quickstart/", - "statusCode": 308 - }, - { - "source": "/readme/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/reference/agent-api-and-sdk/", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/ambient-agents/mcp-servers-for-agents/", - "destination": "/reference/cli/mcp-servers/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/authentication_required/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/authentication-required/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/budget_exceeded/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/budget-exceeded/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/content_policy_violation/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/content-policy-violation/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/environment_setup_failed/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/external_authentication_required/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/agent_process_failed/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/agent-process-failed/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/feature_not_available/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/feature-not-available/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/infrastructure_timeout/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/infrastructure-timeout/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/insufficient_credits/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/integration_disabled/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/integration-disabled/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/integration_not_configured/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/integration-not-configured/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/internal_error/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/internal-error/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/invalid_request/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/invalid-request/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/not_authorized/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/not-authorized/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/operation_not_supported/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/operation-not-supported/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/resource_not_found/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/resource-not-found/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/resource_unavailable/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/resource-unavailable/", - "statusCode": 308 - }, - { - "source": "/reference/cli/integrations-and-environments/", - "destination": "/reference/cli/integration-setup/", - "statusCode": 308 - }, - { - "source": "/reference/cli/mcp-for-cloud-agents/", - "destination": "/reference/cli/mcp-servers/", - "statusCode": 308 - }, - { - "source": "/reference/cli/mcp-servers-for-cloud-agents/", - "destination": "/reference/cli/mcp-servers/", - "statusCode": 308 - }, - { - "source": "/reference/developers/cli/", - "destination": "/reference/cli/", - "statusCode": 308 - }, - { - "source": "/reference/integrations/integrations-overview/integrations-and-environments/", - "destination": "/reference/cli/integration-setup/", - "statusCode": 308 - }, - { - "source": "/reference/keybindings/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/reference/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/reference/platform/agent-api-and-sdk/", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/platform/agent-api-and-sdk/agent/", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/platform/agent-api-and-sdk/agent-1/", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/platform/agent-api-and-sdk/demo-sentry-monitoring-with-sdk/", - "destination": "/reference/api-and-sdk/demo-sentry-monitoring-with-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/platform/cli/", - "destination": "/reference/cli/", - "statusCode": 308 - }, - { - "source": "/reference/platform/cli/api-keys/", - "destination": "/reference/cli/api-keys/", - "statusCode": 308 - }, - { - "source": "/reference/platform/cli/integrations-and-environments/", - "destination": "/reference/cli/integration-setup/", - "statusCode": 308 - }, - { - "source": "/reference/platform/cli/troubleshooting/", - "destination": "/reference/cli/troubleshooting/", - "statusCode": 308 - }, - { - "source": "/reference/platform/warp-platform/", - "destination": "/reference/", - "statusCode": 308 - }, - { - "source": "/reference/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/session-sharing/", - "destination": "/knowledge-and-collaboration/session-sharing/", - "statusCode": 308 - }, - { - "source": "/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/settings-menu/overview/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/settings-overview/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/settings/features/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/settings/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/support-and-community/features/network-log/", - "destination": "/support-and-community/privacy-and-security/network-log/", - "statusCode": 308 - }, - { - "source": "/support-and-community/features/secret-redaction/", - "destination": "/support-and-community/privacy-and-security/secret-redaction/", - "statusCode": 308 - }, - { - "source": "/support-and-community/getting-started/privacy/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/getting-started/refer-a-friend/", - "destination": "/support-and-community/community/refer-a-friend/", - "statusCode": 308 - }, - { - "source": "/support-and-community/getting-started/warp-preview-and-alpha-program/", - "destination": "/support-and-community/community/warp-preview-and-alpha-program/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/ai-features/bring-your-own-llm/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/faq/billing-and-payments/", - "destination": "/support-and-community/plans-and-billing/pricing-faqs/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/known-issues/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/licenses/", - "destination": "/support-and-community/community/open-source-licenses/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/plans-subscriptions-and-pricing/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/releasing-and-updating/", - "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/sending-us-feedback/", - "destination": "/support-and-community/troubleshooting-and-support/sending-us-feedback/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/troubleshooting-login-issues/", - "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/uninstalling-warp/", - "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/updating-warp/", - "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/using-warp-offline/", - "destination": "/support-and-community/troubleshooting-and-support/using-warp-offline/", - "statusCode": 308 - }, - { - "source": "/support-and-community/known-issues/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-and-billing/overages-legacy/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-pricing-and-billing/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-pricing-and-billing/add-on-credits/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-pricing-and-billing/ai-credits/", - "destination": "/support-and-community/plans-and-billing/credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-pricing-and-billing/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-pricing-and-billing/overages-legacy/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-pricing-and-billing/pricing-faqs/", - "destination": "/support-and-community/plans-and-billing/pricing-faqs/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy-and-security/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy/network-log/", - "destination": "/support-and-community/privacy-and-security/network-log/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy/privacy/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy/secret-redaction/", - "destination": "/support-and-community/privacy-and-security/secret-redaction/", - "statusCode": 308 - }, - { - "source": "/support-and-community/security-and-privacy/data-handling/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/security-and-privacy/data-ownership/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/known-issues/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/licenses/", - "destination": "/support-and-community/community/open-source-licenses/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/licenses-intro/", - "destination": "/support-and-community/community/open-source-licenses/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-billing/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/add-on-credits/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/ai-credits/", - "destination": "/support-and-community/plans-and-billing/credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/ai-requests/", - "destination": "/support-and-community/plans-and-billing/credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/pricing-faqs/", - "destination": "/support-and-community/plans-and-billing/pricing-faqs/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/reload-credits-add-on-credits/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/usage-overages/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-prilling/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/pricing-faqs/", - "destination": "/support-and-community/plans-and-billing/pricing-faqs/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/sending-us-feedback/", - "destination": "/support-and-community/troubleshooting-and-support/sending-us-feedback/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/subscription-management/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/troubleshooting-login-issues/", - "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/uninstalling-warp/", - "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/updating-warp/", - "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/using-warp-offline/", - "destination": "/support-and-community/troubleshooting-and-support/using-warp-offline/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-and-billing/ai-credits/", - "destination": "/support-and-community/plans-and-billing/credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/add-on-credits/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/ai-credits/", - "destination": "/support-and-community/plans-and-billing/credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/overages-legacy/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/pricing-faqs/", - "destination": "/support-and-community/plans-and-billing/pricing-faqs/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/privacy-and-security/privacy/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/troubleshooting/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/troubleshooting/common-issues/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/troubleshooting/general-troubleshooting/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/terminal/command-input/command-suggestions/", - "destination": "/terminal/command-completions/completions/", - "statusCode": 308 - }, - { - "source": "/terminal/keybindings/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/terminal/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/terminal/sessions/tab-configs/", - "destination": "/terminal/windows/tab-configs/", - "statusCode": 308 - }, - { - "source": "/terminal/shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/terminal/universal-input/", - "destination": "/terminal/input/classic-input/", - "statusCode": 308 - }, - { - "source": "/terminal/universal-input/classic-input/", - "destination": "/terminal/input/classic-input/", - "statusCode": 308 - }, - { - "source": "/terminal/windows/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/terminal/windows/keyboard-shortcuts-windows/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/terminal/windows/windows-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/warp-quickstart/", - "destination": "/quickstart/", - "statusCode": 308 - }, - { - "source": "/warp-terminal-101/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/what-is-warp/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/support-and-community/troubleshooting-and-support/uninstalling-warp/", - "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/active-ai/", - "destination": "/agent-platform/local-agents/active-ai/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/blocks-as-context/", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/images-as-context/", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/selection-as-context/", - "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/urls-as-context/", - "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/using-to-add-context/", - "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-notifications/", - "destination": "/agent-platform/capabilities/agent-notifications/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-profiles-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/", - "destination": "/agent-platform/capabilities/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/cloud-conversations/", - "destination": "/agent-platform/local-agents/cloud-conversations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/code-diffs/", - "destination": "/agent-platform/local-agents/code-diffs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/codebase-context/", - "destination": "/agent-platform/capabilities/codebase-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/computer-use/", - "destination": "/agent-platform/capabilities/computer-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/full-terminal-use/", - "destination": "/agent-platform/capabilities/full-terminal-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/interacting-with-agents/conversation-forking/", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/interacting-with-agents/terminal-and-agent-modes/", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/interacting-with-agents/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/interactive-code-review/", - "destination": "/agent-platform/local-agents/interactive-code-review/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/planning/", - "destination": "/agent-platform/capabilities/planning/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/rules/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/session-sharing/", - "destination": "/agent-platform/local-agents/session-sharing/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/skills/", - "destination": "/agent-platform/capabilities/skills/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/slash-commands/", - "destination": "/agent-platform/capabilities/slash-commands/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/task-lists/", - "destination": "/agent-platform/capabilities/task-lists/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/web-search/", - "destination": "/agent-platform/capabilities/web-search/", - "statusCode": 308 - }, - { - "source": "/warp/code/code-editor/code-editor-vim-keybindings/", - "destination": "/code/code-editor/code-editor-vim-keybindings/", - "statusCode": 308 - }, - { - "source": "/warp/code/code-editor/file-tree/", - "destination": "/code/code-editor/file-tree/", - "statusCode": 308 - }, - { - "source": "/warp/code/code-editor/find-and-replace/", - "destination": "/code/code-editor/find-and-replace/", - "statusCode": 308 - }, - { - "source": "/warp/code/code-editor/language-server-protocol/", - "destination": "/code/code-editor/language-server-protocol/", - "statusCode": 308 - }, - { - "source": "/warp/code/code-review/", - "destination": "/code/code-review/", - "statusCode": 308 - }, - { - "source": "/warp/code/git-worktrees/", - "destination": "/code/git-worktrees/", - "statusCode": 308 - }, - { - "source": "/warp/code/overview/", - "destination": "/code/overview/", - "statusCode": 308 - }, - { - "source": "/warp/code/ssh-feature-support/", - "destination": "/code/ssh-feature-support/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/coding-in-warp/", - "destination": "/getting-started/quickstart/coding-in-warp/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/customizing-warp/", - "destination": "/getting-started/quickstart/customizing-warp/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/installation-and-setup/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/migrate-to-warp/", - "destination": "/getting-started/migrate-to-warp/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/quickstart/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/supported-shells/", - "destination": "/getting-started/supported-shells/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/what-is-warp/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/admin-panel/", - "destination": "/knowledge-and-collaboration/admin-panel/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/teams/", - "destination": "/knowledge-and-collaboration/teams/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/agent-mode-context/", - "destination": "/knowledge-and-collaboration/warp-drive/agent-mode-context/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/ai-objects/", - "destination": "/knowledge-and-collaboration/warp-drive/ai-objects/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/environment-variables/", - "destination": "/knowledge-and-collaboration/warp-drive/environment-variables/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/notebooks/", - "destination": "/knowledge-and-collaboration/warp-drive/notebooks/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/prompts/", - "destination": "/knowledge-and-collaboration/warp-drive/prompts/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/web/", - "destination": "/knowledge-and-collaboration/warp-drive/web/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/workflows/", - "destination": "/knowledge-and-collaboration/warp-drive/workflows/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/app-icons/", - "destination": "/terminal/appearance/app-icons/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/blocks-behavior/", - "destination": "/terminal/appearance/blocks-behavior/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/custom-themes/", - "destination": "/terminal/appearance/custom-themes/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/input-position/", - "destination": "/terminal/appearance/input-position/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/pane-dimming/", - "destination": "/terminal/appearance/pane-dimming/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/prompt/", - "destination": "/terminal/appearance/prompt/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/size-opacity-blurring/", - "destination": "/terminal/appearance/size-opacity-blurring/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/tabs-behavior/", - "destination": "/terminal/appearance/tabs-behavior/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/text-fonts-cursor/", - "destination": "/terminal/appearance/text-fonts-cursor/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/themes/", - "destination": "/terminal/appearance/themes/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/background-blocks/", - "destination": "/terminal/blocks/background-blocks/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/block-actions/", - "destination": "/terminal/blocks/block-actions/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/block-basics/", - "destination": "/terminal/blocks/block-basics/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/block-filtering/", - "destination": "/terminal/blocks/block-filtering/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/block-sharing/", - "destination": "/terminal/blocks/block-sharing/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/find/", - "destination": "/terminal/blocks/find/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/sticky-command-header/", - "destination": "/terminal/blocks/sticky-command-header/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/command-completions/autosuggestions/", - "destination": "/terminal/command-completions/autosuggestions/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/command-completions/completions/", - "destination": "/terminal/command-completions/completions/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/command-palette/", - "destination": "/terminal/command-palette/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/comparisons/performance/", - "destination": "/terminal/comparisons/performance/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/comparisons/terminal-features/", - "destination": "/terminal/comparisons/terminal-features/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/editor/alias-expansion/", - "destination": "/terminal/editor/alias-expansion/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/editor/command-inspector/", - "destination": "/terminal/editor/command-inspector/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/editor/syntax-error-highlighting/", - "destination": "/terminal/editor/syntax-error-highlighting/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/editor/vim/", - "destination": "/terminal/editor/vim/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/entry/command-corrections/", - "destination": "/terminal/entry/command-corrections/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/entry/command-history/", - "destination": "/terminal/entry/command-history/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/entry/command-search/", - "destination": "/terminal/entry/command-search/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/entry/synchronized-inputs/", - "destination": "/terminal/entry/synchronized-inputs/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/entry/yaml-workflows/", - "destination": "/terminal/entry/yaml-workflows/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/input/classic-input/", - "destination": "/terminal/input/classic-input/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/integrations-and-plugins/", - "destination": "/terminal/integrations-and-plugins/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/accessibility/", - "destination": "/terminal/more-features/accessibility/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/audible-bell/", - "destination": "/terminal/more-features/audible-bell/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/files-and-links/", - "destination": "/terminal/more-features/files-and-links/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/full-screen-apps/", - "destination": "/terminal/more-features/full-screen-apps/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/linux/", - "destination": "/terminal/more-features/linux/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/markdown-viewer/", - "destination": "/terminal/more-features/markdown-viewer/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/notifications/", - "destination": "/terminal/more-features/notifications/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/quit-warning/", - "destination": "/terminal/more-features/quit-warning/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/settings-sync/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/text-selection/", - "destination": "/terminal/more-features/text-selection/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/uri-scheme/", - "destination": "/terminal/more-features/uri-scheme/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/working-directory/", - "destination": "/terminal/more-features/working-directory/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/sessions/launch-configurations/", - "destination": "/terminal/sessions/launch-configurations/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/sessions/session-navigation/", - "destination": "/terminal/sessions/session-navigation/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/sessions/session-restoration/", - "destination": "/terminal/sessions/session-restoration/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/settings/all-settings/", - "destination": "/getting-started/quickstart/customizing-warp/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/warpify/ssh/", - "destination": "/terminal/warpify/ssh/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/warpify/ssh-legacy/", - "destination": "/terminal/warpify/ssh-legacy/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/warpify/subshells/", - "destination": "/terminal/warpify/subshells/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/windows/global-hotkey/", - "destination": "/terminal/windows/global-hotkey/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/windows/split-panes/", - "destination": "/terminal/windows/split-panes/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/windows/tab-configs/", - "destination": "/terminal/windows/tab-configs/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/windows/tabs/", - "destination": "/terminal/windows/tabs/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/windows/vertical-tabs/", - "destination": "/terminal/windows/vertical-tabs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/integrations/github-actions/quickstart-github-actions/", - "destination": "/platform/integrations/github-actions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/", - "destination": "/agent-platform/local-agents/agent-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/agent-notifications/", - "destination": "/agent-platform/capabilities/agent-notifications/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/agent-profiles-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/cloud-conversations/", - "destination": "/agent-platform/local-agents/cloud-conversations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/codebase-context/", - "destination": "/agent-platform/capabilities/codebase-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/computer-use/", - "destination": "/agent-platform/capabilities/computer-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/full-terminal-use/", - "destination": "/agent-platform/capabilities/full-terminal-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/planning/", - "destination": "/agent-platform/capabilities/planning/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/rules/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/session-sharing/", - "destination": "/agent-platform/local-agents/session-sharing/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/skills/", - "destination": "/agent-platform/capabilities/skills/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/slash-commands/", - "destination": "/agent-platform/capabilities/slash-commands/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/task-lists/", - "destination": "/agent-platform/capabilities/task-lists/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/web-search/", - "destination": "/agent-platform/capabilities/web-search/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/interacting-with-agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/interacting-with-agents/code-diffs/", - "destination": "/agent-platform/local-agents/code-diffs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/warp-agents/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart/", - "destination": "/quickstart/", - "statusCode": 308 - }, - { - "source": "/guides/agent-workflows/how-to-run-3-agents-in-parallel-summarize-logs-\\+-analyze-pr-\\+-modify-ui/", - "destination": "/guides/agent-workflows/how-to-run-3-agents-in-parallel-summarize-logs-analyze-pr-modify-ui/", - "statusCode": 308 - }, - { - "source": "/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-\\+-railway/", - "destination": "/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-railway/", - "statusCode": 308 - }, - { - "source": "/guides/build-an-app-in-warp/building-a-slackbot/", - "destination": "/platform/integrations/slack/", - "statusCode": 308 - }, - { - "source": "/guides/configuration/how-to-create-project-rules-for-an-existing-project-astro-\\+-typescript-\\+-tailwind/", - "destination": "/guides/configuration/how-to-create-project-rules-for-an-existing-project-astro-typescript-tailwind/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/how-to-analyze-cloud-run-logs-gcloud/", - "destination": "/guides/devops/how-to-analyze-cloud-run-logs-gcloud/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/how-to-create-a-production-ready-docker-setup/", - "destination": "/guides/devops/how-to-create-a-production-ready-docker-setup/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/how-to-create-priority-matrix-for-database-optimization/", - "destination": "/guides/devops/how-to-create-priority-matrix-for-database-optimization/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/how-to-generate-unit-and-security-tests-to-debug-faster/", - "destination": "/guides/devops/how-to-generate-unit-and-security-tests-to-debug-faster/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/how-to-prevent-secrets-from-leaking/", - "destination": "/guides/devops/how-to-prevent-secrets-from-leaking/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/how-to-write-sql-commands-inside-a-postgres-repl/", - "destination": "/guides/devops/how-to-write-sql-commands-inside-a-postgres-repl/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/improve-your-kubernetes-workflow-kubectl-\\+-helm/", - "destination": "/guides/devops/improve-your-kubernetes-workflow-kubectl-helm/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/context7-mcp-update-astro-project-with-best-practices/", - "destination": "/guides/external-tools/context7-mcp-update-astro-project-with-best-practices/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/figma-remote-mcp-create-a-website-from-a-figma-file-from-scratch/", - "destination": "/guides/external-tools/figma-remote-mcp-create-a-website-from-a-figma-file-from-scratch/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/github-mcp-summarizing-open-prs-and-creating-gh-issues/", - "destination": "/guides/external-tools/github-mcp-summarizing-open-prs-and-creating-gh-issues/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/how-to-set-up-claude-code/", - "destination": "/guides/external-tools/how-to-set-up-claude-code/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/how-to-set-up-codex-cli/", - "destination": "/guides/external-tools/how-to-set-up-codex-cli/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/how-to-set-up-gemini-cli/", - "destination": "/guides/external-tools/how-to-set-up-gemini-cli/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/how-to-set-up-ollama/", - "destination": "/guides/external-tools/how-to-set-up-ollama/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/how-to-set-up-opencode/", - "destination": "/guides/external-tools/how-to-set-up-opencode/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/linear-mcp-retrieve-issue-data/", - "destination": "/guides/external-tools/linear-mcp-retrieve-issue-data/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/linear-mcp-updating-tickets-with-a-lean-build-approach/", - "destination": "/guides/external-tools/linear-mcp-updating-tickets-with-a-lean-build-approach/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/puppeteer-mcp-scraping-amazon-web-reviews/", - "destination": "/guides/external-tools/puppeteer-mcp-scraping-amazon-web-reviews/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/sentry-mcp-fix-sentry-error-in-empower-website/", - "destination": "/guides/external-tools/sentry-mcp-fix-sentry-error-in-empower-website/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up/", - "destination": "/guides/external-tools/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/using-mcp-servers-with-warp/", - "destination": "/guides/external-tools/using-mcp-servers-with-warp/", - "statusCode": 308 - }, - { - "source": "/guides/frontend-and-ui/how-to-actually-code-ui-that-matches-your-mockup-react-\\+-tailwind/", - "destination": "/guides/frontend/how-to-actually-code-ui-that-matches-your-mockup-react-tailwind/", - "statusCode": 308 - }, - { - "source": "/guides/frontend-and-ui/how-to-replace-a-ui-element-in-warp-rust-codebase/", - "destination": "/guides/frontend/how-to-replace-a-ui-element-in-warp-rust-codebase/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/api-and-sdk/", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/models/", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/cli/cli/", - "destination": "/reference/cli/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy-security-and-licensing/network-log/", - "destination": "/support-and-community/privacy-and-security/network-log/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy-security-and-licensing/open-source-licenses/", - "destination": "/support-and-community/community/open-source-licenses/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy-security-and-licensing/privacy/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy-security-and-licensing/secret-redaction/", - "destination": "/support-and-community/privacy-and-security/secret-redaction/", - "statusCode": 308 - }, - { - "source": "/terminal/classic-input/", - "destination": "/terminal/input/classic-input/", - "statusCode": 308 - }, - { - "source": "/terminal/terminal-features/", - "destination": "/terminal/comparisons/terminal-features/", - "statusCode": 308 - }, - { - "source": "/terminal/windows/launch-configurations/", - "destination": "/terminal/sessions/launch-configurations/", - "statusCode": 308 - }, - { - "source": "/agents/agents-overview/", - "destination": "/agent-platform/", - "statusCode": 308 - }, - { - "source": "/agents/ai/", - "destination": "/agent-platform/", - "statusCode": 308 - }, - { - "source": "/agents/ai-faqs/", - "destination": "/agent-platform/getting-started/faqs/", - "statusCode": 308 - }, - { - "source": "/agents/autonomy/", - "destination": "/agent-platform/getting-started/agents-in-warp/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-context/blocks-as-context/", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-context/images-as-context/", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-context/urls-as-context/", - "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-context/using-to-add-context/", - "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-conversations/conversation-forking/", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/managing-agents/", - "destination": "/platform/managing-cloud-agents/", - "statusCode": 308 - }, - { - "source": "/agents/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/ambient-agents/ambient-agents-overview/", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/ambient-agents/managing-ambient-agents/", - "destination": "/platform/managing-cloud-agents/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme-1/coding-in-warp/", - "destination": "/getting-started/quickstart/coding-in-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme-1/customizing-warp/", - "destination": "/getting-started/quickstart/customizing-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme-1/installation-and-setup/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme/coding-in-warp/", - "destination": "/getting-started/quickstart/coding-in-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme/customizing-warp/", - "destination": "/getting-started/quickstart/customizing-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme/installation-and-setup/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/platform/warp-platform/", - "destination": "/reference/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/known-issues/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/plans-and-pricing/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/plans-and-pricing/add-on-credits/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/plans-and-pricing/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/plans-and-pricing/pricing-faqs/", - "destination": "/support-and-community/plans-and-billing/pricing-faqs/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/plans-and-pricing/reload-credits-add-on-credits/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/sending-us-feedback/", - "destination": "/support-and-community/troubleshooting-and-support/sending-us-feedback/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/troubleshooting-login-issues/", - "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/uninstalling-warp/", - "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/updating-warp/", - "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/managed-worker-reference/", - "destination": "/platform/self-hosting/reference/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/managed-worker-reference/direct-backend/", - "destination": "/platform/self-hosting/managed-direct/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/managed-worker-reference/docker-connectivity/", - "destination": "/platform/self-hosting/managed-docker/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/managed-worker-reference/helm-chart/", - "destination": "/platform/self-hosting/managed-kubernetes/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/managed-worker-reference/kubernetes-backend/", - "destination": "/platform/self-hosting/managed-kubernetes/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/managed-worker-reference/private-docker-registries/", - "destination": "/platform/self-hosting/managed-docker/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality/", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", - "statusCode": 308 - }, - { - "source": "/university/(.*)", - "destination": "/guides/$1", - "statusCode": 308 - }, - { - "source": "/platform/cli", - "destination": "/reference/cli/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-and-billing/plans-and-pricing", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/knowledge-and-collaboration/mcp", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme-1", - "destination": "/quickstart/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/plans-and-pricing/ai-credits", - "destination": "/support-and-community/plans-and-billing/", - "statusCode": 308 - }, - { - "source": "/getting-started/changelog", - "destination": "/changelog/", - "statusCode": 308 - }, - { - "source": "/university", - "destination": "/guides/", - "statusCode": 308 - }, - { - "source": "/code/codebase-context", - "destination": "/agent-platform/capabilities/codebase-context/", - "statusCode": 308 - }, - { - "source": "/platform/environments", - "destination": "/platform/environments/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/model-choice", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme/agents-in-warp", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/privacy/privacy", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/third-party-cli-agents", - "destination": "/agent-platform/cli-agents/overview/", - "statusCode": 308 - }, - { - "source": "/knowledge-and-collaboration/rules", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/skills", - "destination": "/agent-platform/capabilities/skills/", - "statusCode": 308 - }, - { - "source": "/community/refer-a-friend", - "destination": "/support-and-community/community/refer-a-friend/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/using-agents/model-choice", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/using-agents", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/planning", - "destination": "/agent-platform/capabilities/planning/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-and-billing/ai-credits", - "destination": "/support-and-community/plans-and-billing/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/using-agents/agent-conversations", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/community/warp-preview-and-alpha-program", - "destination": "/support-and-community/community/warp-preview-and-alpha-program/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/capabilities-overview/skills", - "destination": "/agent-platform/capabilities/skills/", - "statusCode": 308 - }, - { - "source": "/guides/integrations/how-to-set-up-claude-code", - "destination": "/guides/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-conversations", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-profiles-permissions", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/integrations/integrations-overview", - "destination": "/platform/integrations/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/capabilities-overview/model-choice", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/platform/agent-api-and-sdk", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/using-warp-offline", - "destination": "/support-and-community/troubleshooting-and-support/using-warp-offline/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/interacting-with-agents/terminal-and-agent-modes", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents", - "destination": "/agent-platform/cli-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agents/full-terminal-use", - "destination": "/agent-platform/capabilities/full-terminal-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/ai-faqs", - "destination": "/agent-platform/getting-started/faqs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/using-agents/managing-agents", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/agent-context/mcp", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agents/slash-commands", - "destination": "/agent-platform/capabilities/slash-commands/", - "statusCode": 308 - }, - { - "source": "/privacy/secret-redaction", - "destination": "/support-and-community/privacy-and-security/secret-redaction/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/licenses", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/slash-commands", - "destination": "/agent-platform/capabilities/slash-commands/", - "statusCode": 308 - }, - { - "source": "/ambient-agents/agent-secrets", - "destination": "/platform/secrets/", - "statusCode": 308 - }, - { - "source": "/integrations/slack", - "destination": "/platform/integrations/slack/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-tasklists", - "destination": "/agent-platform/capabilities/task-lists/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/using-agents/agent-context/images-as-context", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/getting-started", - "destination": "/agent-platform/", - "statusCode": 308 - }, - { - "source": "/integrations/github-actions", - "destination": "/platform/integrations/github-actions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/using-agents/agent-conversations/conversation-forking", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/using-agents/agent-profiles-permissions", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/capabilities-overview/rules", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/capabilities-overview/session-sharing", - "destination": "/agent-platform/local-agents/session-sharing/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/interacting-with-agents/voice", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/agents/active-ai", - "destination": "/agent-platform/local-agents/active-ai/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/interacting-with-agents/code-diffs", - "destination": "/agent-platform/local-agents/code-diffs/", - "statusCode": 308 - }, - { - "source": "/integrations/linear", - "destination": "/platform/integrations/linear/", - "statusCode": 308 - }, - { - "source": "/platform/cli/integrations-and-environments", - "destination": "/platform/integrations/", - "statusCode": 308 - }, - { - "source": "/privacy/network-log", - "destination": "/support-and-community/privacy-and-security/network-log/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/using-agents/agent-context", - "destination": "/agent-platform/local-agents/agent-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/interacting-with-agents/code-diffs-in-agent-conversations", - "destination": "/agent-platform/local-agents/code-diffs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/interacting-with-agents", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/ambient-agents/mcp-servers-for-agents", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/agents-overview", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/voice", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/capabilities-overview/full-terminal-use", - "destination": "/agent-platform/capabilities/full-terminal-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/interacting-with-agents/code-diffs", - "destination": "/agent-platform/local-agents/code-diffs/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-context", - "destination": "/agent-platform/local-agents/agent-context/", - "statusCode": 308 - }, - { - "source": "/knowledge-and-collaboration/session-sharing/agent-session-sharing", - "destination": "/knowledge-and-collaboration/session-sharing/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/warp-agents", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/web-search", - "destination": "/agent-platform/capabilities/web-search/", - "statusCode": 308 - }, - { - "source": "/platform/deployment-patterns", - "destination": "/platform/deployment-patterns/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/agent-context/images-as-context", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/capabilities-overview/agent-profiles-permissions", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warps-agent/capabilities-overview/slash-commands", - "destination": "/agent-platform/capabilities/slash-commands/", - "statusCode": 308 - }, - { - "source": "/agents", - "destination": "/agent-platform/", - "statusCode": 308 - }, - { - "source": "/agents/agent-modality-beta", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/guides/integrations/how-to-set-up-opencode", - "destination": "/guides/", - "statusCode": 308 - }, - { - "source": "/help/troubleshooting-login-issues", - "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", - "statusCode": 308 - }, - { - "source": "/platform/agent-api-and-sdk/agent-1", - "destination": "/reference/api-and-sdk/", + "source": "/platform/agent-api-and-sdk/agent-1", + "destination": "/reference/api-and-sdk/", "statusCode": 308 }, { @@ -9423,12 +5753,7 @@ "statusCode": 308 }, { - "source": "/agents/using-agents/agent-permissions", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-permissions/", + "source": "/agents/using-agents/agent-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, @@ -9953,7 +6278,7 @@ "statusCode": 308 }, { - "source": "/support-and-community/plans-and-billing/bring-your-own-api-key", + "source": "/support-and-community/plans-and-billing/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, @@ -10143,57 +6468,27 @@ "statusCode": 308 }, { - "source": "/support-and-community/plans-and-billing/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/help/updating-warp", + "source": "/help/updating-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", "statusCode": 308 }, { - "source": "/help/updating-warp/", - "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", - "statusCode": 308 - }, - { - "source": "/help/licenses", - "destination": "/support-and-community/community/open-source-licenses/", - "statusCode": 308 - }, - { - "source": "/help/licenses/", + "source": "/help/licenses(/?)", "destination": "/support-and-community/community/open-source-licenses/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/overview", + "source": "/agent-platform/cloud-agents/overview(/?)", "destination": "/platform/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/overview/", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/platform", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/platform/", + "source": "/agent-platform/cloud-agents/platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/", + "source": "/agent-platform/cloud-agents(/?)", "destination": "/platform/", "statusCode": 308 }, @@ -10213,14 +6508,9 @@ "statusCode": 308 }, { - "source": "/team", - "destination": "/knowledge-and-collaboration/teams/", - "statusCode": 308 - }, - { - "source": "/team/", + "source": "/team(/?)", "destination": "/knowledge-and-collaboration/teams/", "statusCode": 308 } ] -} \ No newline at end of file +} From 6f2c2ee9d2cf2d14d2fdda5e298fae9777027317 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 14:26:24 -0400 Subject: [PATCH 078/107] Add Mermaid diagram support to docs.warp.dev with custom Warp branding (#515) * Add Mermaid diagram support with Warp branding Add astro-mermaid + mermaid so fenced ```mermaid blocks render as client-side SVG diagrams instead of plain code blocks. The integration is registered before starlight() per its required ordering, and autoTheme keeps each diagram's base theme in sync with the site's data-theme attribute. Brand the diagram accent (border/line color) and font with Warp's Inter stack and accent blue as literal values, since Mermaid resolves theme colors through its own color-math library at init time and can't parse a CSS var() reference. Add a real example diagram to the software-factory page's "How it works" section, showing the inner-loop handoff between agents and the human review gate. Co-Authored-By: Warp Agent * Apply suggestion from @oz-for-oss[bot] Co-authored-by: oz-for-oss[bot] <277970191+oz-for-oss[bot]@users.noreply.github.com> * Rework: fix CI lockfile, relocate example diagram, trim comments - Regenerate package-lock.json with a Node version in the repo's supported engines range (Node 22, matching CI). The previous lockfile was generated with an unsupported Node version and was missing a package-lock entry for @emnapi/runtime@1.11.1, which made `npm ci` fail in CI. Restored the original lockfile as a base and added only the two new packages, instead of a full re-resolution, to keep the diff minimal (no unrelated dependency bumps). - Move the example diagram off the software-factory page (an internal process page) to the handoff overview page, where it visualizes the three real handoff directions between a local session and a cloud run. - Redesign the diagram as a compact top-down flowchart (3 nodes) instead of a wide left-right one (7 nodes), fixing legibility: the previous diagram's SVG had to scale down significantly to fit the content column width, shrinking all diagram text well below normal body size. - Trim the astro-mermaid integration comments to the essential rationale (required integration order, and why colors are literal hex instead of CSS variables). Co-Authored-By: Warp Agent * Follow-up: fix diagram spacing gap, add zoom/pan/fullscreen controls - The handoff diagram's self-loop edge ("Cloud to cloud") made Mermaid reserve extra vertical space in the SVG's viewBox that the visible content never filled, showing as a large blank gap below the diagram. Redesign the flow as two sequential "Cloud agent run" nodes instead of a self-loop, which represents the same three handoff directions without the layout artifact. - Add MermaidControls.astro, a small component (included once via the site-wide footer) that layers zoom/pan/reset/fullscreen controls onto rendered diagrams using svg-toolbelt (zero runtime dependencies, ~5KB). astro-mermaid/mermaid expose no such hooks themselves. Re-runs after every astro-mermaid re-render, since a theme switch replaces a diagram's entire DOM subtree and would otherwise drop the controls. - Brand the controls' background, border, and hover colors to match the site's existing code-block/copy-button chrome in both themes. Co-Authored-By: Warp Agent * Follow-up: restyle Mermaid diagram toolbar to match Warp's design system svg-toolbelt's own stylesheet hardcoded a light-only look (white background, gray border, a column of individually-bordered squares) that didn't re-theme with the site and read as a foreign floating widget. Restyle it as a single pill matching .copy-dropdown-panel, with borderless, transparent buttons matching .copy-dropdown-item, using Warp's existing color tokens so it re-themes correctly. `!important` is used because the library's own CSS uses the same selector specificity and can load after this stylesheet in the bundle. Verified with computer use: the toolbar's computed background/border/ icon colors now differ correctly between dark and light theme, buttons are flat/borderless by default with a themed hover highlight, and zoom/pan/reset interactions are smooth with no jank (the library already disables its CSS transition during active drag and only applies it to discrete actions like reset). Co-Authored-By: Warp Agent --------- Co-authored-by: Oz Co-authored-by: Warp Agent Co-authored-by: Hong Yi Chen Co-authored-by: oz-for-oss[bot] <277970191+oz-for-oss[bot]@users.noreply.github.com> --- astro.config.mjs | 14 + package-lock.json | 1330 +++++++++++++++++-- package.json | 3 + src/components/FeedbackFooter.astro | 2 + src/components/MermaidControls.astro | 54 + src/content/docs/platform/handoff/index.mdx | 12 + src/styles/custom.css | 66 + 7 files changed, 1367 insertions(+), 114 deletions(-) create mode 100644 src/components/MermaidControls.astro diff --git a/astro.config.mjs b/astro.config.mjs index cfad50019..ff2e45722 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,6 +1,7 @@ // @ts-check import { defineConfig, envField } from 'astro/config'; import remarkGfm from 'remark-gfm'; +import mermaid from 'astro-mermaid'; import react from '@astrojs/react'; import sitemap from '@astrojs/sitemap'; import starlight from '@astrojs/starlight'; @@ -61,6 +62,19 @@ export default defineConfig({ }, }, integrations: [ + mermaid({ + autoTheme: true, + enableLog: false, + mermaidConfig: { + fontFamily: "'Inter', 'Inter Fallback', sans-serif", + themeVariables: { + fontFamily: "'Inter', 'Inter Fallback', sans-serif", + primaryBorderColor: '#51a6ec', + nodeBorder: '#51a6ec', + lineColor: '#51a6ec', + }, + }, + }), react(), sitemap(), starlight({ diff --git a/package-lock.json b/package-lock.json index 91002c48f..9221b4fa3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,8 +20,10 @@ "@vercel/analytics": "^2.0.1", "@vercel/speed-insights": "^2.0.0", "astro": "^7.1.3", + "astro-mermaid": "^2.1.0", "keymatch": "^1.0.5", "linkedom": "^0.18.12", + "mermaid": "^11.16.1", "react": "^19.2.4", "react-dom": "^19.2.4", "react-icons": "^5.6.0", @@ -30,6 +32,7 @@ "sharp": "^0.35.3", "starlight-llms-txt": "^0.11.0", "starlight-sidebar-topics": "^0.7.1", + "svg-toolbelt": "^0.7.0", "turndown": "^7.2.2", "turndown-plugin-gfm": "^1.0.2", "yaml": "^2.8.3" @@ -43,6 +46,19 @@ "node": "^20.19.0 || ^22.12.0 || ^24" } }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@astrojs/check": { "version": "0.9.8", "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.8.tgz", @@ -1341,6 +1357,12 @@ "node": ">=6.9.0" } }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", + "license": "MIT" + }, "node_modules/@bruits/satteri-darwin-arm64": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.5.tgz", @@ -1486,6 +1508,12 @@ "node": ">=18" } }, + "node_modules/@chevrotain/types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", + "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", + "license": "Apache-2.0" + }, "node_modules/@clack/core": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.1.0.tgz", @@ -2165,6 +2193,23 @@ "react-dom": ">= 16.3.0" } }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.4.tgz", + "integrity": "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "import-meta-resolve": "^4.2.0" + } + }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", @@ -2787,6 +2832,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/@mermaid-js/parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.2.0.tgz", + "integrity": "sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA==", + "license": "MIT", + "dependencies": { + "@chevrotain/types": "~11.1.2" + } + }, "node_modules/@mixmark-io/domino": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", @@ -3835,6 +3889,259 @@ "integrity": "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w==", "license": "MIT" }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz", + "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -3865,6 +4172,12 @@ "integrity": "sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==", "license": "MIT" }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -3963,6 +4276,13 @@ "@types/node": "*" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -3975,6 +4295,16 @@ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, + "node_modules/@upsetjs/venn.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", + "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", + "license": "MIT", + "optionalDependencies": { + "d3-selection": "^3.0.0", + "d3-transition": "^3.0.1" + } + }, "node_modules/@vercel/analytics": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-2.0.1.tgz", @@ -4559,6 +4889,27 @@ "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" } }, + "node_modules/astro-mermaid": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/astro-mermaid/-/astro-mermaid-2.1.0.tgz", + "integrity": "sha512-fFRUN0BTZh+DZhDiLyblXoO26XqJ1Rr+qK3JGgSu7OBspKHDm59jkztg/aHsrdo1vO/tIq/+xhP/vgT8Mp92XA==", + "license": "MIT", + "dependencies": { + "import-meta-resolve": "^4.2.0", + "mdast-util-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "peerDependencies": { + "@mermaid-js/layout-elk": "^0.2.0", + "astro": ">=4", + "mermaid": "^10.0.0 || ^11.0.0" + }, + "peerDependenciesMeta": { + "@mermaid-js/layout-elk": { + "optional": true + } + } + }, "node_modules/astro/node_modules/@astrojs/internal-helpers": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.1.tgz", @@ -4978,6 +5329,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/common-ancestor-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", @@ -5021,6 +5381,15 @@ "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", "license": "MIT" }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -5028,161 +5397,666 @@ "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT", + "peer": true + }, + "node_modules/cytoscape": { + "version": "3.34.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.1.tgz", + "integrity": "sha512-Lr0RvH9H75y9ar8h9Toy6u4lxRSCcxUq+hHcQ26sVWo6BnaQp1gwEZOYqwuYTZhyW7npyKnNLP8oJ2p1/3OZ7g==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" } }, - "node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", "license": "ISC" }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "license": "ISC", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" }, "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/crossws": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", - "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", - "license": "MIT", + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", "dependencies": { - "uncrypto": "^0.1.3" + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "d3-path": "^3.1.0" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=12" } }, - "node_modules/css-selector-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", - "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "license": "MIT", + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" + "d3-array": "2 - 3" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">=12" } }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=12" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "license": "MIT", + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", "dependencies": { - "css-tree": "~2.2.0" + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" } }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "license": "MIT", + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=12" } }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "license": "CC0-1.0" + "node_modules/dagre-d3-es": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", + "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "node_modules/dayjs": { + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", "license": "MIT" }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT", - "peer": true - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -5237,6 +6111,15 @@ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -5361,6 +6244,15 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.13.tgz", + "integrity": "sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/domutils": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", @@ -5482,6 +6374,17 @@ "node": ">= 0.4" } }, + "node_modules/es-toolkit": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", + "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks", + "tests/types" + ] + }, "node_modules/esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", @@ -5996,6 +6899,12 @@ "uncrypto": "^0.1.3" } }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6550,6 +7459,18 @@ } } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/import-meta-resolve": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", @@ -6566,6 +7487,15 @@ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", "license": "MIT" }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/iron-webcrypto": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", @@ -6790,12 +7720,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/katex": { + "version": "0.16.47", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", + "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/keymatch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/keymatch/-/keymatch-1.0.5.tgz", "integrity": "sha512-QBoXs/fUlNgdHBEnIyWUTeI7p+ooY6Ul8JAJ8pGVfEYUvVZJO6yj67zOau2DYiQbPznskpymks2TLY6nOwHwzg==", "license": "MIT" }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, "node_modules/klaw-sync": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", @@ -6825,6 +7785,12 @@ "node": ">= 8" } }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, "node_modules/lightningcss": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", @@ -7098,6 +8064,12 @@ } } }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -7159,6 +8131,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -7498,6 +8482,35 @@ "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "license": "CC0-1.0" }, + "node_modules/mermaid": { + "version": "11.16.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.16.1.tgz", + "integrity": "sha512-TQsq6u22fAn3rek5VOubrhKPo1g5hwC3FXUN9hiyupTckcYiGuuKGkNQrKYwGJkXUxZdojwRG46gsSCFZMDp4g==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.2", + "@iconify/utils": "^3.0.2", + "@mermaid-js/parser": "^1.2.0", + "@types/d3": "^7.4.3", + "@upsetjs/venn.js": "^2.0.0", + "cytoscape": "^3.33.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.14", + "dayjs": "^1.11.20", + "dompurify": "^3.3.3", + "es-toolkit": "^1.45.1", + "katex": "^0.16.45", + "khroma": "^2.1.0", + "marked": "^16.3.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" + } + }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -8725,6 +9738,12 @@ "dev": true, "license": "MIT" }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, "node_modules/path-expression-matcher": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", @@ -8787,6 +9806,22 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, "node_modules/postcss": { "version": "8.5.23", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", @@ -9499,6 +10534,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, "node_modules/rolldown": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", @@ -9532,6 +10573,30 @@ "@rolldown/binding-win32-x64-msvc": "1.1.5" } }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/satteri": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.5.tgz", @@ -9845,6 +10910,21 @@ "inline-style-parser": "0.2.7" } }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, + "node_modules/svg-toolbelt": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/svg-toolbelt/-/svg-toolbelt-0.7.0.tgz", + "integrity": "sha512-EK5IYUc7Tk4H4d5QcJ7C6t9Qu1YAqpKECYABxUf2GAyGyNWKdy/+T5AJ0oKBmsbv3snCi/Zaev6tLQOqoxRJHw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/svgo": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.2.tgz", @@ -10011,6 +11091,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-dedent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz", + "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -10481,6 +11570,19 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/uuid": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", diff --git a/package.json b/package.json index 9d9c6ebbd..02bf766aa 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,10 @@ "@vercel/analytics": "^2.0.1", "@vercel/speed-insights": "^2.0.0", "astro": "^7.1.3", + "astro-mermaid": "^2.1.0", "keymatch": "^1.0.5", "linkedom": "^0.18.12", + "mermaid": "^11.16.1", "react": "^19.2.4", "react-dom": "^19.2.4", "react-icons": "^5.6.0", @@ -41,6 +43,7 @@ "sharp": "^0.35.3", "starlight-llms-txt": "^0.11.0", "starlight-sidebar-topics": "^0.7.1", + "svg-toolbelt": "^0.7.0", "turndown": "^7.2.2", "turndown-plugin-gfm": "^1.0.2", "yaml": "^2.8.3" diff --git a/src/components/FeedbackFooter.astro b/src/components/FeedbackFooter.astro index b1637d4d0..c0fb7305b 100644 --- a/src/components/FeedbackFooter.astro +++ b/src/components/FeedbackFooter.astro @@ -6,6 +6,7 @@ import Pagination from 'virtual:starlight/components/Pagination'; import config from 'virtual:starlight/user-config'; import DocsFeedbackLinks from './DocsFeedbackLinks.astro'; +import MermaidControls from './MermaidControls.astro'; // `starlightRoute.editUrl` is typed as `URL | undefined`; DocsFeedbackLinks // expects a plain string so it can pass the same value through untouched @@ -14,6 +15,7 @@ const { editUrl } = Astro.locals.starlightRoute; const pageUrl = Astro.url.href; --- +