From f7b687809e5c2065f4de2b86a71654baa6c74657 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 11:18:30 -0600 Subject: [PATCH 01/63] docs: restructure factories documentation Co-Authored-By: Warp --- .../docs/agents/agent-memory/index.mdx | 4 +- .../capabilities/computer-use/index.mdx | 6 +- .../cli/oz-cli}/agent-profiles.mdx | 0 .../cli => agents/cli/oz-cli}/api-keys.mdx | 8 +- .../cli => agents/cli/oz-cli}/artifacts.mdx | 4 +- .../cli => agents/cli/oz-cli}/federate.mdx | 2 +- .../cli => agents/cli/oz-cli}/index.mdx | 36 +-- .../cli/oz-cli}/integration-setup.mdx | 10 +- .../cli => agents/cli/oz-cli}/mcp-servers.mdx | 2 +- .../cli => agents/cli/oz-cli}/quickstart.mdx | 18 +- .../cli => agents/cli/oz-cli}/skills.mdx | 0 .../cli/oz-cli}/troubleshooting.mdx | 14 +- .../cli => agents/cli/oz-cli}/warp-drive.mdx | 0 src/content/docs/agents/cli/quickstart.mdx | 2 +- src/content/docs/agents/cli/reference.mdx | 2 +- .../docs/agents/inference/model-choice.mdx | 2 +- src/content/docs/changelog/2025.mdx | 2 +- src/content/docs/changelog/2026.mdx | 2 +- .../enterprise-features/analytics-api.mdx | 6 +- .../architecture-and-deployment.mdx | 2 +- .../getting-started-enterprise.mdx | 2 +- .../team-management/admin-panel.mdx | 2 +- .../demo-sentry-monitoring-with-sdk.mdx | 0 .../api-and-sdk/index.mdx | 6 +- .../api-and-sdk/quickstart.mdx | 10 +- .../errors/agent-process-failed.mdx | 8 +- .../errors/authentication-required.mdx | 4 +- .../errors/budget-exceeded.mdx | 2 +- .../troubleshooting/errors/conflict.mdx | 4 +- .../errors/content-policy-violation.mdx | 2 +- .../errors/environment-setup-failed.mdx | 6 +- .../external-authentication-required.mdx | 6 +- .../errors/feature-not-available.mdx | 2 +- .../troubleshooting/errors/index.mdx | 40 ++-- .../errors/infrastructure-timeout.mdx | 4 +- .../errors/insufficient-credits.mdx | 2 +- .../errors/integration-disabled.mdx | 2 +- .../errors/integration-not-configured.mdx | 2 +- .../troubleshooting/errors/internal-error.mdx | 2 +- .../errors/invalid-request.mdx | 6 +- .../troubleshooting/errors/not-authorized.mdx | 4 +- .../errors/operation-not-supported.mdx | 6 +- .../errors/resource-not-found.mdx | 2 +- .../errors/resource-unavailable.mdx | 6 +- .../api-and-sdk/troubleshooting/index.mdx | 2 +- .../deployment-patterns.mdx | 6 +- .../docs/factories/developer-tools.mdx | 32 +++ src/content/docs/factories/factory-api.mdx | 6 +- .../docs/factories/factory-as-code.mdx | 4 +- src/content/docs/factories/factory-mcp.mdx | 2 +- src/content/docs/factories/index.mdx | 2 +- .../factories/infrastructure-and-security.mdx | 22 +- .../docs/{platform => factories}/runners.mdx | 6 +- .../docs/factories/self-hosting/index.mdx | 55 +++++ .../self-hosting/managed-direct.mdx | 20 +- .../self-hosting/managed-docker.mdx | 20 +- .../self-hosting/managed-kubernetes.mdx | 24 +- .../self-hosting/monitoring.mdx | 12 +- .../self-hosting/quickstart.mdx | 18 +- .../self-hosting/reference.mdx | 22 +- .../self-hosting/troubleshooting.mdx | 16 +- .../{platform => factories}/warp-hosting.mdx | 2 +- .../agent-workflows/build-a-triage-agent.mdx | 4 +- .../how-to-run-unattended-agents.mdx | 8 +- .../run-a-software-factory-in-the-cloud.mdx | 8 +- ...ld-a-mattermost-bot-for-warp-factories.mdx | 6 +- .../using-mcp-servers-with-warp.mdx | 6 +- src/content/docs/index.mdx | 131 ++-------- src/content/docs/platform/agents.mdx | 16 +- src/content/docs/platform/environments.mdx | 8 +- .../environments/configuring-environments.mdx | 2 +- .../troubleshooting-environments.mdx | 6 +- ...-networking.mdx => execution-security.mdx} | 6 +- src/content/docs/platform/faqs.mdx | 12 +- .../docs/platform/handoff/snapshots.mdx | 10 +- .../docs/platform/harnesses/claude-code.mdx | 2 +- src/content/docs/platform/harnesses/codex.mdx | 2 +- src/content/docs/platform/harnesses/index.mdx | 2 +- .../docs/platform/harnesses/warp-agent.mdx | 2 +- src/content/docs/platform/index.mdx | 16 +- .../platform/integrations/azure-devops.mdx | 2 +- .../docs/platform/integrations/bitbucket.mdx | 2 +- .../platform/integrations/cloud-providers.mdx | 2 +- .../platform/integrations/github-actions.mdx | 4 +- .../docs/platform/integrations/github.mdx | 6 +- .../docs/platform/integrations/index.mdx | 2 +- .../docs/platform/integrations/jira.mdx | 2 +- .../docs/platform/integrations/linear.mdx | 10 +- .../quickstart-github-actions.mdx | 2 +- .../docs/platform/integrations/quickstart.mdx | 6 +- .../docs/platform/integrations/slack.mdx | 10 +- .../docs/platform/managing-cloud-agents.mdx | 6 +- src/content/docs/platform/mcp.mdx | 4 +- .../docs/platform/orchestration/index.mdx | 10 +- .../orchestration/multi-agent-runs.mdx | 10 +- src/content/docs/platform/overview.mdx | 14 +- src/content/docs/platform/oz-web-app.mdx | 8 +- src/content/docs/platform/quickstart.mdx | 10 +- src/content/docs/platform/secrets.mdx | 2 +- .../docs/platform/self-hosting/index.mdx | 226 ------------------ .../docs/platform/skills-as-agents.mdx | 10 +- .../team-access-billing-and-identity.mdx | 12 +- src/content/docs/platform/triggers/index.mdx | 4 +- .../platform/triggers/scheduled-agents.mdx | 6 +- .../unmanaged.mdx => unmanaged-execution.mdx} | 14 +- .../platform/viewing-cloud-agent-runs.mdx | 4 +- src/content/docs/reference/index.mdx | 26 -- .../plans-and-billing/pricing-faqs.mdx | 2 +- src/sidebar.ts | 148 +++--------- vercel.json | 85 +++++++ 110 files changed, 593 insertions(+), 826 deletions(-) rename src/content/docs/{reference/cli => agents/cli/oz-cli}/agent-profiles.mdx (100%) rename src/content/docs/{reference/cli => agents/cli/oz-cli}/api-keys.mdx (95%) rename src/content/docs/{reference/cli => agents/cli/oz-cli}/artifacts.mdx (95%) rename src/content/docs/{reference/cli => agents/cli/oz-cli}/federate.mdx (97%) rename src/content/docs/{reference/cli => agents/cli/oz-cli}/index.mdx (94%) rename src/content/docs/{reference/cli => agents/cli/oz-cli}/integration-setup.mdx (96%) rename src/content/docs/{reference/cli => agents/cli/oz-cli}/mcp-servers.mdx (99%) rename src/content/docs/{reference/cli => agents/cli/oz-cli}/quickstart.mdx (77%) rename src/content/docs/{reference/cli => agents/cli/oz-cli}/skills.mdx (100%) rename src/content/docs/{reference/cli => agents/cli/oz-cli}/troubleshooting.mdx (92%) rename src/content/docs/{reference/cli => agents/cli/oz-cli}/warp-drive.mdx (100%) rename src/content/docs/{reference => factories}/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx (100%) rename src/content/docs/{reference => factories}/api-and-sdk/index.mdx (93%) rename src/content/docs/{reference => factories}/api-and-sdk/quickstart.mdx (92%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/agent-process-failed.mdx (89%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/authentication-required.mdx (92%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/budget-exceeded.mdx (95%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/conflict.mdx (91%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/content-policy-violation.mdx (96%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/environment-setup-failed.mdx (92%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx (95%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/feature-not-available.mdx (96%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/index.mdx (77%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/infrastructure-timeout.mdx (94%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/insufficient-credits.mdx (98%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/integration-disabled.mdx (95%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx (96%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/internal-error.mdx (96%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/invalid-request.mdx (89%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/not-authorized.mdx (92%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx (88%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/resource-not-found.mdx (96%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/errors/resource-unavailable.mdx (90%) rename src/content/docs/{reference => factories}/api-and-sdk/troubleshooting/index.mdx (90%) rename src/content/docs/{platform => factories}/deployment-patterns.mdx (92%) create mode 100644 src/content/docs/factories/developer-tools.mdx rename src/content/docs/{platform => factories}/runners.mdx (94%) create mode 100644 src/content/docs/factories/self-hosting/index.mdx rename src/content/docs/{platform => factories}/self-hosting/managed-direct.mdx (77%) rename src/content/docs/{platform => factories}/self-hosting/managed-docker.mdx (84%) rename src/content/docs/{platform => factories}/self-hosting/managed-kubernetes.mdx (86%) rename src/content/docs/{platform => factories}/self-hosting/monitoring.mdx (92%) rename src/content/docs/{platform => factories}/self-hosting/quickstart.mdx (73%) rename src/content/docs/{platform => factories}/self-hosting/reference.mdx (83%) rename src/content/docs/{platform => factories}/self-hosting/troubleshooting.mdx (86%) rename src/content/docs/{platform => factories}/warp-hosting.mdx (94%) rename src/content/docs/platform/{self-hosting/security-and-networking.mdx => execution-security.mdx} (94%) delete mode 100644 src/content/docs/platform/self-hosting/index.mdx rename src/content/docs/platform/{self-hosting/unmanaged.mdx => unmanaged-execution.mdx} (89%) delete mode 100644 src/content/docs/reference/index.mdx diff --git a/src/content/docs/agents/agent-memory/index.mdx b/src/content/docs/agents/agent-memory/index.mdx index 76227aaf6..1f63001e3 100644 --- a/src/content/docs/agents/agent-memory/index.mdx +++ b/src/content/docs/agents/agent-memory/index.mdx @@ -85,8 +85,8 @@ Attach stores to agents with read-only or read-write access. Each attachment inc These capabilities aren't part of the research preview yet, but they're on the way: -* **Programmatic API access** - Read and manage memories and stores through the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/), in addition to managing them in the {VARS.WEB_APP}. -* **Self-hosting support** - Run Agent Memory on a [self-hosted {VARS.WARP_AUTOMATION_PLATFORM}](/platform/self-hosting/) instance to meet security, privacy, and compliance requirements. +* **Programmatic API access** - Read and manage memories and stores through the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/), in addition to managing them in the {VARS.WEB_APP}. +* **Self-hosting support** - Run Agent Memory on a [self-hosted {VARS.WARP_AUTOMATION_PLATFORM}](/factories/self-hosting/) instance to meet security, privacy, and compliance requirements. ## Join the waitlist diff --git a/src/content/docs/agents/capabilities/computer-use/index.mdx b/src/content/docs/agents/capabilities/computer-use/index.mdx index 3cbd73ae2..4f3a915be 100644 --- a/src/content/docs/agents/capabilities/computer-use/index.mdx +++ b/src/content/docs/agents/capabilities/computer-use/index.mdx @@ -44,7 +44,7 @@ Runs started from the Warp app don't use the server default: they always follow ### CLI -When running cloud agents with the [{VARS.WARP_AGENT_CLI}](/reference/cli/), use flags to control Computer Use per run: +When running cloud agents with the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/), use flags to control Computer Use per run: ```bash oz agent run-cloud --computer-use --prompt "" @@ -53,7 +53,7 @@ oz agent run-cloud --no-computer-use --prompt "" ### API -When creating a cloud agent run with the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/), the optional `config.computer_use_enabled` field controls Computer Use. When omitted, it defaults to `true` for runs on Warp's built-in harness and `false` for runs on third-party harnesses. Set it to `false` to disable Computer Use for the run: +When creating a cloud agent run with the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/), the optional `config.computer_use_enabled` field controls Computer Use. When omitted, it defaults to `true` for runs on Warp's built-in harness and `false` for runs on third-party harnesses. Set it to `false` to disable Computer Use for the run: ```json { @@ -65,7 +65,7 @@ When creating a cloud agent run with the [{VARS.API_SDK_NAME}](/reference/api-an } ``` -For full API documentation, see the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) reference. +For full API documentation, see the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) reference. ### Web app diff --git a/src/content/docs/reference/cli/agent-profiles.mdx b/src/content/docs/agents/cli/oz-cli/agent-profiles.mdx similarity index 100% rename from src/content/docs/reference/cli/agent-profiles.mdx rename to src/content/docs/agents/cli/oz-cli/agent-profiles.mdx diff --git a/src/content/docs/reference/cli/api-keys.mdx b/src/content/docs/agents/cli/oz-cli/api-keys.mdx similarity index 95% rename from src/content/docs/reference/cli/api-keys.mdx rename to src/content/docs/agents/cli/oz-cli/api-keys.mdx index 6e3862617..240b02a53 100644 --- a/src/content/docs/reference/cli/api-keys.mdx +++ b/src/content/docs/agents/cli/oz-cli/api-keys.mdx @@ -46,7 +46,7 @@ You can create an API key in either the -![API key management interface in Warp settings](../../../../assets/reference/api-key-management.png) +![API key management interface in Warp settings](../../../../../assets/reference/api-key-management.png)
API key management interface in Warp settings.
@@ -86,7 +86,7 @@ $ oz agent run --api-key "wk-xxx..." --prompt "analyze this codebase" ``` :::note -API keys start with the prefix `wk-`. If your key doesn't have this prefix, it may be [invalid or from an older format](/reference/api-and-sdk/troubleshooting/errors/authentication-required/). +API keys start with the prefix `wk-`. If your key doesn't have this prefix, it may be [invalid or from an older format](/factories/api-and-sdk/troubleshooting/errors/authentication-required/). ::: ## Managing API keys @@ -107,11 +107,11 @@ The Warp app also shows additional metadata that isn't surfaced in the {VARS.WEB To delete an API key, find it in either the {VARS.WEB_APP} or the Warp app's API Keys list and click the delete icon next to the key. -Deleted keys are immediately invalidated and cannot be recovered. Any services or scripts using the deleted key will lose access and may return an [`authentication_required` error](/reference/api-and-sdk/troubleshooting/errors/authentication-required/). +Deleted keys are immediately invalidated and cannot be recovered. Any services or scripts using the deleted key will lose access and may return an [`authentication_required` error](/factories/api-and-sdk/troubleshooting/errors/authentication-required/). ## Manage API keys from the CLI -In addition to the web and Warp app surfaces, you can manage API keys directly with the [{VARS.WARP_AGENT_CLI}](/reference/cli/). These commands are useful for scripting key rotation and for headless environments. +In addition to the web and Warp app surfaces, you can manage API keys directly with the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/). These commands are useful for scripting key rotation and for headless environments. ### List keys diff --git a/src/content/docs/reference/cli/artifacts.mdx b/src/content/docs/agents/cli/oz-cli/artifacts.mdx similarity index 95% rename from src/content/docs/reference/cli/artifacts.mdx rename to src/content/docs/agents/cli/oz-cli/artifacts.mdx index de7bb6f6d..7d36ce629 100644 --- a/src/content/docs/reference/cli/artifacts.mdx +++ b/src/content/docs/agents/cli/oz-cli/artifacts.mdx @@ -22,7 +22,7 @@ Use artifacts when you need to retrieve files an agent produced after a run comp * **Local inspection** - Pull a generated file (HTML, image, CSV) onto your laptop to review. * **CI integration** - Fetch an agent-produced build artifact from a pipeline step that runs after the agent finishes. -Artifacts are referenced by an artifact UID. You can find UIDs in the agent's run detail view, in the JSON returned by [`oz run get`](/reference/cli/), or in the response from the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/). +Artifacts are referenced by an artifact UID. You can find UIDs in the agent's run detail view, in the JSON returned by [`oz run get`](/agents/cli/oz-cli/), or in the response from the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/). ## `oz artifact get` @@ -78,5 +78,5 @@ oz artifact download "$ARTIFACT_UID" --out ./latest-report.html ## Related -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) - retrieve artifacts programmatically over HTTP. +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - retrieve artifacts programmatically over HTTP. * [Scheduled cloud agents](/platform/triggers/scheduled-agents/) - common producer of recurring artifacts that downstream tooling consumes. diff --git a/src/content/docs/reference/cli/federate.mdx b/src/content/docs/agents/cli/oz-cli/federate.mdx similarity index 97% rename from src/content/docs/reference/cli/federate.mdx rename to src/content/docs/agents/cli/oz-cli/federate.mdx index a2bda5c55..03da8aaa7 100644 --- a/src/content/docs/reference/cli/federate.mdx +++ b/src/content/docs/agents/cli/oz-cli/federate.mdx @@ -94,7 +94,7 @@ A typical AWS flow: A typical GCP flow: 1. Run `oz federate issue-token` to get the OIDC JWT. -2. Call the [Security Token Service `token` endpoint](https://cloud.google.com/iam/docs/reference/sts/rest/v1/TopLevel/token) to exchange the JWT for a federated access token. +2. Call the [Security Token Service `token` endpoint](https://cloud.google.com/iam/docs/factories/developer-tools/sts/rest/v1/TopLevel/token) to exchange the JWT for a federated access token. 3. Optionally impersonate a service account for the final credentials. ## Related diff --git a/src/content/docs/reference/cli/index.mdx b/src/content/docs/agents/cli/oz-cli/index.mdx similarity index 94% rename from src/content/docs/reference/cli/index.mdx rename to src/content/docs/agents/cli/oz-cli/index.mdx index e301e9259..f58f2c61b 100644 --- a/src/content/docs/reference/cli/index.mdx +++ b/src/content/docs/agents/cli/oz-cli/index.mdx @@ -18,7 +18,7 @@ The {VARS.WARP_AGENT_CLI} is the command-line tool for running and managing Warp The {VARS.WARP_AGENT_CLI} is the command-line tool that lets you run [Cloud Agents](/platform/) from anywhere, including terminals, scripts, automated systems, or services. -It's the standard runtime entry point that turns a **prompt** plus **configuration** into an **executable agent task** that runs on either a **Warp-hosted or [self-hosted](/platform/self-hosting/) runner**. +It's the standard runtime entry point that turns a **prompt** plus **configuration** into an **executable agent task** that runs on either a **Warp-hosted or [self-hosted](/factories/self-hosting/) runner**. With the {VARS.WARP_AGENT_CLI}, you can: @@ -189,7 +189,7 @@ If you weren't logged in, the command prints `You are not logged in.` and exits. Use an API key when the environment must authenticate on its own, such as CI pipelines, headless servers, VMs, Codespaces, or containers. API keys let the CLI authenticate non-interactively. -For detailed instructions on creating, managing, and using API keys, see [API Keys](/reference/cli/api-keys/). +For detailed instructions on creating, managing, and using API keys, see [API Keys](/agents/cli/oz-cli/api-keys/). **Quickstart:** @@ -230,10 +230,10 @@ oz agent run --prompt "set up a new Rust crate named warp-cli" * `--cwd ` (`-C`) — run from a different directory. * `--name ` (`-n`) — label the run for grouping and traceability. -* `--share` — share the session with teammates (see [Collaboration](/reference/cli/#collaboration)). -* `--profile ` — use a specific agent profile (see [Using Agent Profiles](/reference/cli/#using-agent-profiles)). +* `--share` — share the session with teammates (see [Collaboration](/agents/cli/oz-cli/#collaboration)). +* `--profile ` — use a specific agent profile (see [Using Agent Profiles](/agents/cli/oz-cli/#using-agent-profiles)). * `--model ` — override the default model (see [Model Choice](/agents/inference/model-choice/)). -* `--skill ` — use a skill as the base prompt (see [Using Skills](/reference/cli/#using-skills)). +* `--skill ` — use a skill as the base prompt (see [Using Skills](/agents/cli/oz-cli/#using-skills)). * `--mcp ` — start one or more MCP servers before execution (UUID, JSON file path, or inline JSON). Can be repeated. * `--environment ` (`-e`) — run in a specific cloud environment. * `--file ` (`-f`) — load run configuration from a YAML or JSON file. @@ -263,13 +263,13 @@ oz agent run-cloud \ * `--environment ` (`-e`) — select the environment to run in. * `--no-environment` — run without an environment (not recommended). * `--open` — view the agent's session in Warp once it's available. -* `--name ` (`-n`) — label the run for grouping and traceability (see [Naming runs](/reference/cli/#naming-runs) below). -* `--title ` — set the title shown for the run and its conversation (see [Titling runs](/reference/cli/#titling-runs) below). -* `--parent-run-id <RUN_ID>` — start the run as an orchestration child of an existing run (see [Starting a run as an orchestration child](/reference/cli/#starting-a-run-as-an-orchestration-child) below). -* `--agent <UID>` — run as a saved [named agent](/platform/agents/), applying its configuration (skills, secrets, base model, and default environment) and attributing credit usage to it (see [Managing named agents](/reference/cli/#managing-named-agents) below). +* `--name <NAME>` (`-n`) — label the run for grouping and traceability (see [Naming runs](/agents/cli/oz-cli/#naming-runs) below). +* `--title <TITLE>` — set the title shown for the run and its conversation (see [Titling runs](/agents/cli/oz-cli/#titling-runs) below). +* `--parent-run-id <RUN_ID>` — start the run as an orchestration child of an existing run (see [Starting a run as an orchestration child](/agents/cli/oz-cli/#starting-a-run-as-an-orchestration-child) below). +* `--agent <UID>` — run as a saved [named agent](/platform/agents/), applying its configuration (skills, secrets, base model, and default environment) and attributing credit usage to it (see [Managing named agents](/agents/cli/oz-cli/#managing-named-agents) below). * `--mcp <SPEC>` — start one or more MCP servers before execution (UUID, JSON file path, or inline JSON). Can be repeated. * `--model <MODEL_ID>` — override the default model. -* `--skill <SPEC>` — use a skill from the environment's repository as the base prompt (see [Using Skills](/reference/cli/#using-skills)). +* `--skill <SPEC>` — use a skill from the environment's repository as the base prompt (see [Using Skills](/agents/cli/oz-cli/#using-skills)). * `--host <WORKER_ID>` — run on a specific self-hosted worker instead of Warp-hosted infrastructure. * `--attach <PATH>` — attach an image file to the agent query. Can be repeated (maximum 5). * `--computer-use` / `--no-computer-use` — enable or disable [Computer Use](/agents/capabilities/computer-use/) for this run. @@ -306,7 +306,7 @@ The `--name` flag assigns a config name to the run. Use it to group related runs **Why naming matters:** -When your team runs many agents across schedules, integrations, and ad-hoc triggers, `name` lets you answer questions like "how many distinct workflows are we running?" and "how often does this particular workflow run?" You can filter runs by name using the `name` query parameter on `GET /agent/runs` in the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/). +When your team runs many agents across schedules, integrations, and ad-hoc triggers, `name` lets you answer questions like "how many distinct workflows are we running?" and "how often does this particular workflow run?" You can filter runs by name using the `name` query parameter on `GET /agent/runs` in the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/). **Examples:** @@ -359,7 +359,7 @@ Pass the run ID of the run doing the spawning. Omit the flag for ordinary standa #### Reusing saved prompts and Warp Drive objects -You can reuse saved prompts with `--saved-prompt`, and reference notebooks, workflows, and rules inline in any `--prompt` string. See [Referencing Warp Drive objects](/reference/cli/warp-drive/) for details. +You can reuse saved prompts with `--saved-prompt`, and reference notebooks, workflows, and rules inline in any `--prompt` string. See [Referencing Warp Drive objects](/agents/cli/oz-cli/warp-drive/) for details. #### Choosing an execution harness @@ -379,19 +379,19 @@ Create the auth secret first with `oz secret create claude api-key <SECRET_NAME> Agent profiles control what the agent can do, how it behaves, and where it can act. Use the `--profile` flag with `oz agent run` to apply a specific profile. -See [Agent profiles](/reference/cli/agent-profiles/) for how to find profile IDs and apply them. +See [Agent profiles](/agents/cli/oz-cli/agent-profiles/) for how to find profile IDs and apply them. ## Using MCP servers MCP servers connect agents to external systems like GitHub, Linear, or Sentry. Use the `--mcp` flag with any of three formats: a Warp MCP server UUID, inline JSON, or a path to a JSON config file. -See [MCP Servers](/reference/cli/mcp-servers/) for full details, including how to find UUIDs, combine multiple servers, and handle environment variables on remote machines. +See [MCP Servers](/agents/cli/oz-cli/mcp-servers/) for full details, including how to find UUIDs, combine multiple servers, and handle environment variables on remote machines. ## Using skills [Skills](/agents/capabilities/skills/) are reusable instruction sets that teach agents how to perform specific tasks. Use the `--skill` flag to run an agent from a skill stored in a repository. -See [Skills](/reference/cli/skills/) for supported spec formats and examples for both local and cloud agent runs. +See [Skills](/agents/cli/oz-cli/skills/) for supported spec formats and examples for both local and cloud agent runs. ## Collaboration @@ -557,14 +557,14 @@ oz environment image list ### `oz artifact get` / `oz artifact download` -Inspect and retrieve files an agent produced during a run. See [Artifacts](/reference/cli/artifacts/) for details. +Inspect and retrieve files an agent produced during a run. See [Artifacts](/agents/cli/oz-cli/artifacts/) for details. ### `oz federate issue-token` -Issue a short-lived OIDC identity token from inside a running agent to authenticate to cloud providers without long-lived credentials. See [Federated identity tokens](/reference/cli/federate/) for details. +Issue a short-lived OIDC identity token from inside a running agent to authenticate to cloud providers without long-lived credentials. See [Federated identity tokens](/agents/cli/oz-cli/federate/) for details. --- ## Troubleshooting -For built-in CLI help commands and solutions to common errors — including authentication issues, agent failures, environment problems, and Docker image issues — see [Troubleshooting](/reference/cli/troubleshooting/). +For built-in CLI help commands and solutions to common errors — including authentication issues, agent failures, environment problems, and Docker image issues — see [Troubleshooting](/agents/cli/oz-cli/troubleshooting/). diff --git a/src/content/docs/reference/cli/integration-setup.mdx b/src/content/docs/agents/cli/oz-cli/integration-setup.mdx similarity index 96% rename from src/content/docs/reference/cli/integration-setup.mdx rename to src/content/docs/agents/cli/oz-cli/integration-setup.mdx index e158952da..5cc68e8e6 100644 --- a/src/content/docs/reference/cli/integration-setup.mdx +++ b/src/content/docs/agents/cli/oz-cli/integration-setup.mdx @@ -60,9 +60,9 @@ Setting up an integration consists of three steps. :::tip If setup fails, use the returned error code to narrow the fix. Common errors include: -* [`environment_setup_failed`](/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/) (environment initialization issues) -* [`external_authentication_required`](/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/) (missing GitHub or external-service authorization) -* [`integration_not_configured`](/reference/api-and-sdk/troubleshooting/errors/integration-not-configured/) (incomplete integration setup) +* [`environment_setup_failed`](/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed/) (environment initialization issues) +* [`external_authentication_required`](/factories/api-and-sdk/troubleshooting/errors/external-authentication-required/) (missing GitHub or external-service authorization) +* [`integration_not_configured`](/factories/api-and-sdk/troubleshooting/errors/integration-not-configured/) (incomplete integration setup) ::: --- @@ -191,7 +191,7 @@ You typically only need to handle this once per team, unless your repo access ch #### Team-level GitHub authorization -For automated workflows that use an [agent API key](/reference/cli/api-keys/) (CI/CD pipelines, scheduled agents, SDK-triggered runs), you can configure team GitHub authorization so the agent authenticates with the Warp Factories GitHub App instead of an individual's personal token. +For automated workflows that use an [agent API key](/agents/cli/oz-cli/api-keys/) (CI/CD pipelines, scheduled agents, SDK-triggered runs), you can configure team GitHub authorization so the agent authenticates with the Warp Factories GitHub App instead of an individual's personal token. This requires a Warp team admin to enable the GitHub organization in the Admin Panel (**Settings** > **Admin Panel** > **Platform**). Once configured, tasks initiated with an agent API key can clone repos and open pull requests using the GitHub App installation token. @@ -309,4 +309,4 @@ You now have everything needed to trigger agents from your team's tools. From he * [Cloud Agents Overview](/platform/) * [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) * [Slack](/platform/integrations/slack/), [Linear](/platform/integrations/linear/), [GitHub](/platform/integrations/github/), and [GitHub Actions](/platform/integrations/github-actions/) integrations -* [Troubleshooting](/reference/cli/troubleshooting/) +* [Troubleshooting](/agents/cli/oz-cli/troubleshooting/) diff --git a/src/content/docs/reference/cli/mcp-servers.mdx b/src/content/docs/agents/cli/oz-cli/mcp-servers.mdx similarity index 99% rename from src/content/docs/reference/cli/mcp-servers.mdx rename to src/content/docs/agents/cli/oz-cli/mcp-servers.mdx index 4e32feca0..6b109e612 100644 --- a/src/content/docs/reference/cli/mcp-servers.mdx +++ b/src/content/docs/agents/cli/oz-cli/mcp-servers.mdx @@ -49,7 +49,7 @@ $ oz mcp list Alternatively, copy the UUID from Warp in **Settings** > **Agents** > **MCP servers**. <figure style={{ maxWidth: "375px" }}> -![MCP servers page, showing a server with its UUID](../../../../assets/reference/mcp-server-id.png) +![MCP servers page, showing a server with its UUID](../../../../../assets/reference/mcp-server-id.png) <figcaption>MCP servers page, showing a server with its UUID.</figcaption> </figure> diff --git a/src/content/docs/reference/cli/quickstart.mdx b/src/content/docs/agents/cli/oz-cli/quickstart.mdx similarity index 77% rename from src/content/docs/reference/cli/quickstart.mdx rename to src/content/docs/agents/cli/oz-cli/quickstart.mdx index 2303b2535..3198f28c1 100644 --- a/src/content/docs/reference/cli/quickstart.mdx +++ b/src/content/docs/agents/cli/oz-cli/quickstart.mdx @@ -21,7 +21,7 @@ Watch this short demo of the {VARS.WARP_AGENT_CLI} workflow: If you already have the [Warp desktop app installed](/getting-started/quickstart/installation-and-setup/), the **CLI is included** and available in Warp. -If not, see [Installing the CLI](/reference/cli/#installing-the-cli) for installation options for all platforms. +If not, see [Installing the CLI](/agents/cli/oz-cli/#installing-the-cli) for installation options for all platforms. ## 2. Authenticate @@ -44,7 +44,7 @@ Interactive login works on both **local** and **remote** machines, and does not export WARP_API_KEY="wk-..." ``` -Create an API key in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a>. See [API Keys](/reference/cli/api-keys/) for guidance on personal vs. [agent keys](/platform/agents/) and on security best practices. +Create an API key in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a>. See [API Keys](/agents/cli/oz-cli/api-keys/) for guidance on personal vs. [agent keys](/platform/agents/) and on security best practices. ::: ## 3. Run an agent @@ -83,17 +83,17 @@ You can connect MCP servers to give the agent access to external tools like GitH oz agent run --mcp '{"github": {"url": "https://api.githubcopilot.com/mcp/"}}' --prompt "Open a pull request that fixes TODOs in this repo" ``` -See [MCP Servers](/reference/cli/mcp-servers/) for all supported formats, including UUID references and multi-server configurations. +See [MCP Servers](/agents/cli/oz-cli/mcp-servers/) for all supported formats, including UUID references and multi-server configurations. ## Next steps Once you've successfully set up and run your agent, explore other configurations and workflows with the {VARS.WARP_AGENT_CLI}: -* Customize behavior with [agent profiles](/reference/cli/agent-profiles/). -* [Reuse prompts](/reference/cli/warp-drive/) with `--saved-prompt`. -* Connect agents to external systems using [MCP Servers](/reference/cli/mcp-servers/). -* Authenticate with [API keys](/reference/cli/api-keys/) for automated environments or workflows. -* Get up-to-date information about the {VARS.WARP_AGENT_CLI} using the [`oz help` command](/reference/cli/troubleshooting/#getting-help). +* Customize behavior with [agent profiles](/agents/cli/oz-cli/agent-profiles/). +* [Reuse prompts](/agents/cli/oz-cli/warp-drive/) with `--saved-prompt`. +* Connect agents to external systems using [MCP Servers](/agents/cli/oz-cli/mcp-servers/). +* Authenticate with [API keys](/agents/cli/oz-cli/api-keys/) for automated environments or workflows. +* Get up-to-date information about the {VARS.WARP_AGENT_CLI} using the [`oz help` command](/agents/cli/oz-cli/troubleshooting/#getting-help). * Run agents in CI with the [GitHub Actions quickstart](/platform/integrations/quickstart-github-actions/). -Continue reading the [{VARS.WARP_AGENT_CLI} reference](/reference/cli/) to learn how to install the CLI on different platforms, authenticate in different environments, and configure agents for real-world workflows. +Continue reading the [{VARS.WARP_AGENT_CLI} reference](/agents/cli/oz-cli/) to learn how to install the CLI on different platforms, authenticate in different environments, and configure agents for real-world workflows. diff --git a/src/content/docs/reference/cli/skills.mdx b/src/content/docs/agents/cli/oz-cli/skills.mdx similarity index 100% rename from src/content/docs/reference/cli/skills.mdx rename to src/content/docs/agents/cli/oz-cli/skills.mdx diff --git a/src/content/docs/reference/cli/troubleshooting.mdx b/src/content/docs/agents/cli/oz-cli/troubleshooting.mdx similarity index 92% rename from src/content/docs/reference/cli/troubleshooting.mdx rename to src/content/docs/agents/cli/oz-cli/troubleshooting.mdx index 3fa5130a0..1d0cbac60 100644 --- a/src/content/docs/reference/cli/troubleshooting.mdx +++ b/src/content/docs/agents/cli/oz-cli/troubleshooting.mdx @@ -39,10 +39,10 @@ oz --version **Authentication issues** * Interactive login: ensure you've completed the browser-based flow with `oz login`. -* API keys: confirm the key is valid, not expired, and exported correctly. Invalid, expired, or missing keys can return an [`authentication_required` error](/reference/api-and-sdk/troubleshooting/errors/authentication-required/). +* API keys: confirm the key is valid, not expired, and exported correctly. Invalid, expired, or missing keys can return an [`authentication_required` error](/factories/api-and-sdk/troubleshooting/errors/authentication-required/). **Agent or MCP errors**\ -Ensure your agent profile and [MCP servers](/agents/capabilities/mcp/) are configured properly, with correct permissions. See [MCP Servers](/reference/cli/mcp-servers/) and [Agent profiles](/reference/cli/agent-profiles/) for details. +Ensure your agent profile and [MCP servers](/agents/capabilities/mcp/) are configured properly, with correct permissions. See [MCP Servers](/agents/cli/oz-cli/mcp-servers/) and [Agent profiles](/agents/cli/oz-cli/agent-profiles/) for details. --- @@ -118,7 +118,7 @@ oz environment delete <ID> Add `--force` to skip confirmation checks for environments used by integrations. -Only do this once you've confirmed no active integrations are relying on that environment. If an integration points to a deleted environment, requests from Slack/Linear will fail with a [`resource_not_found` error](/reference/api-and-sdk/troubleshooting/errors/resource-not-found/) until you create a new integration with a valid environment. +Only do this once you've confirmed no active integrations are relying on that environment. If an integration points to a deleted environment, requests from Slack/Linear will fail with a [`resource_not_found` error](/factories/api-and-sdk/troubleshooting/errors/resource-not-found/) until you create a new integration with a valid environment. ### Integrations @@ -149,7 +149,7 @@ This happens when: * You add a repo that Warp doesn’t have access to yet, or * You personally haven’t granted the Warp GitHub app permissions for that repo. -Follow the GitHub popup flow to install/adjust the Warp GitHub app. Missing external authorization can return an [`external_authentication_required` error](/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/). +Follow the GitHub popup flow to install/adjust the Warp GitHub app. Missing external authorization can return an [`external_authentication_required` error](/factories/api-and-sdk/troubleshooting/errors/external-authentication-required/). #### **The agent can’t open PRs or push changes to my repo** @@ -160,7 +160,7 @@ Check the following: 2. **Warp GitHub app has access to that repo** 1. In GitHub’s settings, confirm the Warp app is installed and that the repo is selected. 3. **You have write access** - 1. The agent inherits your GitHub permissions. If you only have read access, Warp can’t open PRs or push branches on your behalf, and the run may return a [`not_authorized` error](/reference/api-and-sdk/troubleshooting/errors/not-authorized/). + 1. The agent inherits your GitHub permissions. If you only have read access, Warp can’t open PRs or push branches on your behalf, and the run may return a [`not_authorized` error](/factories/api-and-sdk/troubleshooting/errors/not-authorized/). ### Docker image & environment failures @@ -172,7 +172,7 @@ Check: 2. The image is public on Docker Hub. 3. You can pull it locally: `docker pull <image_name>` -If local docker pull fails, fix the image visibility/name first, then recreate or update the environment with a working image. Image pull and setup failures can surface as [`environment_setup_failed`](/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/). +If local docker pull fails, fix the image visibility/name first, then recreate or update the environment with a working image. Image pull and setup failures can surface as [`environment_setup_failed`](/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed/). #### **The agent can’t find tools or runtimes inside the environment** @@ -183,7 +183,7 @@ This usually means the Docker image is missing required dependencies. Fix by eit #### **I see "VM failed before the agent could run. This is likely an issue with your Docker image"** -This typically means your Docker image uses musl libc instead of glibc. Alpine Linux and other musl-based images are not compatible with the agent runtime, and this can surface as [`environment_setup_failed`](/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/). +This typically means your Docker image uses musl libc instead of glibc. Alpine Linux and other musl-based images are not compatible with the agent runtime, and this can surface as [`environment_setup_failed`](/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed/). Fix: diff --git a/src/content/docs/reference/cli/warp-drive.mdx b/src/content/docs/agents/cli/oz-cli/warp-drive.mdx similarity index 100% rename from src/content/docs/reference/cli/warp-drive.mdx rename to src/content/docs/agents/cli/oz-cli/warp-drive.mdx diff --git a/src/content/docs/agents/cli/quickstart.mdx b/src/content/docs/agents/cli/quickstart.mdx index 13b369e84..389a9e094 100644 --- a/src/content/docs/agents/cli/quickstart.mdx +++ b/src/content/docs/agents/cli/quickstart.mdx @@ -80,7 +80,7 @@ When login completes, the CLI shows its start screen with the version, a short " WARP_API_KEY=YOUR_API_KEY warp ``` -You can also pass the `--api-key` flag, but prefer the environment variable. Command-line arguments can be captured in shell history and process listings. See [API keys](/reference/cli/api-keys/) to learn how to create one. +You can also pass the `--api-key` flag, but prefer the environment variable. Command-line arguments can be captured in shell history and process listings. See [API keys](/agents/cli/oz-cli/api-keys/) to learn how to create one. ::: ## 3. Run your first prompt diff --git a/src/content/docs/agents/cli/reference.mdx b/src/content/docs/agents/cli/reference.mdx index 79f770b25..bbd1ccd5e 100644 --- a/src/content/docs/agents/cli/reference.mdx +++ b/src/content/docs/agents/cli/reference.mdx @@ -32,7 +32,7 @@ warp --api-key YOUR_API_KEY Command-line arguments can be captured in shell history and process listings. Prefer the `WARP_API_KEY` environment variable, ideally populated from a secret manager. ::: -Create a key in the Warp app under **Settings** > **Cloud platform** > **API keys**. See the [API keys reference](/reference/cli/api-keys/) for details. +Create a key in the Warp app under **Settings** > **Cloud platform** > **API keys**. See the [API keys reference](/agents/cli/oz-cli/api-keys/) for details. ### `--auto-approve` diff --git a/src/content/docs/agents/inference/model-choice.mdx b/src/content/docs/agents/inference/model-choice.mdx index 44addc041..3c3bca0b6 100644 --- a/src/content/docs/agents/inference/model-choice.mdx +++ b/src/content/docs/agents/inference/model-choice.mdx @@ -16,7 +16,7 @@ Warp lets you choose from a curated set of large language models (LLMs) to power **Warp supports the following models.** -The `model_id` values shown below can be used when configuring models via the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) or [CLI](/reference/cli/). +The `model_id` values shown below can be used when configuring models via the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) or [CLI](/agents/cli/oz-cli/). ### Auto models diff --git a/src/content/docs/changelog/2025.mdx b/src/content/docs/changelog/2025.mdx index a87fa2fa0..118869e0f 100644 --- a/src/content/docs/changelog/2025.mdx +++ b/src/content/docs/changelog/2025.mdx @@ -192,7 +192,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **New Features** -* Warp agents are now available via the command line. See the [CLI reference](https://docs.warp.dev/reference/cli). +* Warp agents are now available via the command line. See the [CLI reference](https://docs.warp.dev/agents/cli/oz-cli). * Added support for custom Regex names in Enterprise Secret Redaction. **Improvements** diff --git a/src/content/docs/changelog/2026.mdx b/src/content/docs/changelog/2026.mdx index 136430e66..b52f9e911 100644 --- a/src/content/docs/changelog/2026.mdx +++ b/src/content/docs/changelog/2026.mdx @@ -1673,7 +1673,7 @@ Oz is Warp's orchestration platform for cloud agents: launch parallel agents, au * **Cloud environments for consistent execution** — configure Docker-based environments (unlimited repos + setup commands) and run agents in isolated cloud sandboxes. [Environments docs →](https://docs.warp.dev/platform/environments) * **Track agents from the web** — manage runs, create schedules, configure environments, and set up integrations from any browser in the <a href="https://oz.warp.dev">Oz web app</a>. * **Schedule agents based on Skills** — run agents automatically on a cron schedule for code cleanup, dependency updates, and issue triage. See [Scheduled Agents](/platform/triggers/scheduled-agents/). -* **Programmable by default** — orchestrate agents via the CLI and integrate Oz into tools and services via the [API and CLI reference](/reference/). +* **Programmable by default** — orchestrate agents via the CLI and integrate Oz into tools and services via the [API and CLI reference](/factories/developer-tools/). #### Warp Upgrades diff --git a/src/content/docs/enterprise/enterprise-features/analytics-api.mdx b/src/content/docs/enterprise/enterprise-features/analytics-api.mdx index 3dae9cf28..11f3a801d 100644 --- a/src/content/docs/enterprise/enterprise-features/analytics-api.mdx +++ b/src/content/docs/enterprise/enterprise-features/analytics-api.mdx @@ -29,7 +29,7 @@ Before you can call the API, your team must satisfy all of the following: * **Enterprise plan** - The Analytics API is available to all enterprise teams during Early Access; no separate enrollment is required. * **Admin role on the team** - Calls are rejected unless the authenticated user has admin-level permissions on the enterprise team. See [Roles and permissions](/enterprise/team-management/roles-and-permissions/). -* **A personal Warp API key** - Authenticate requests with a key from **Settings** > **Cloud platform** > **API keys** in the Warp app. See [API Keys](/reference/cli/api-keys/) for step-by-step instructions. Agent API keys (including legacy team keys) are not accepted by these endpoints — only personal API keys belonging to a team admin work. +* **A personal Warp API key** - Authenticate requests with a key from **Settings** > **Cloud platform** > **API keys** in the Warp app. See [API Keys](/agents/cli/oz-cli/api-keys/) for step-by-step instructions. Agent API keys (including legacy team keys) are not accepted by these endpoints — only personal API keys belonging to a team admin work. * **Enterprise Usage Reporting toggle enabled** - In the Warp app, go to **Admin Panel** > **Privacy** and turn on **Enterprise Usage Reporting (Early Access)**. Until this toggle is on, no usage data is recorded for your team and the endpoints will return empty datasets even if every other prerequisite is met. :::caution @@ -297,7 +297,7 @@ Any authenticated user with admin-level permissions on an enterprise team. Calls ### What kind of API key works? -Only **personal** Warp API keys created by an admin from **Settings** > **Cloud platform** > **API keys**. Agent API keys (including legacy team keys) are explicitly rejected by these endpoints. See [API Keys](/reference/cli/api-keys/) for how to create one. +Only **personal** Warp API keys created by an admin from **Settings** > **Cloud platform** > **API keys**. Agent API keys (including legacy team keys) are explicitly rejected by these endpoints. See [API Keys](/agents/cli/oz-cli/api-keys/) for how to create one. ### Are these calls billed? @@ -309,7 +309,7 @@ The `events` endpoint enforces a hard 365-day window between `start_date` and `e ## Related resources -* [API Keys](/reference/cli/api-keys/) - Create and manage personal Warp API keys. +* [API Keys](/agents/cli/oz-cli/api-keys/) - Create and manage personal Warp API keys. * [Admin Panel](/enterprise/team-management/admin-panel/) - Manage team settings, including the **Privacy** section. * [Roles and permissions](/enterprise/team-management/roles-and-permissions/) - Required admin role for Analytics API access. * [Architecture and deployment](/enterprise/enterprise-features/architecture-and-deployment/) - Where enterprise data is stored and how it transits Warp's infrastructure. diff --git a/src/content/docs/enterprise/enterprise-features/architecture-and-deployment.mdx b/src/content/docs/enterprise/enterprise-features/architecture-and-deployment.mdx index b516e1313..2cbcf52d3 100644 --- a/src/content/docs/enterprise/enterprise-features/architecture-and-deployment.mdx +++ b/src/content/docs/enterprise/enterprise-features/architecture-and-deployment.mdx @@ -157,7 +157,7 @@ Consider the following when selecting a deployment model: ## Related resources * [Architecture reference](/platform/architecture/) - Diagrams of the stack, the run lifecycle, self-hosted execution, and data boundaries -* [Deployment Patterns](/platform/deployment-patterns/) - Detailed patterns for CLI-only, {VARS.WARP_AUTOMATION_PLATFORM}-hosted, and self-hosted setups +* [Deployment Patterns](/factories/deployment-patterns/) - Detailed patterns for CLI-only, {VARS.WARP_AUTOMATION_PLATFORM}-hosted, and self-hosted setups * [Security overview](/enterprise/security-and-compliance/security-overview/) - Data handling, encryption, and compliance details * [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) - Route inference through your own cloud infrastructure * [Admin Panel](/enterprise/team-management/admin-panel/) - Configure agent policies and security settings diff --git a/src/content/docs/enterprise/getting-started/getting-started-enterprise.mdx b/src/content/docs/enterprise/getting-started/getting-started-enterprise.mdx index c21fb46bc..25e380115 100644 --- a/src/content/docs/enterprise/getting-started/getting-started-enterprise.mdx +++ b/src/content/docs/enterprise/getting-started/getting-started-enterprise.mdx @@ -164,7 +164,7 @@ Once your team is set up: * **BYOLLM** - Set up [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) to route inference through your cloud infrastructure for data locality and cost control * **Team-managed API keys and endpoints** - Configure [shared provider API keys and custom endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) for your team in the Admin Panel, available in both interactive sessions and cloud agents * **Monitor usage** - Review usage analytics in the Admin Panel to track adoption and measure engineering productivity gains -* **Self-hosting** - Run agents on your own infrastructure to control where agents run and keep repository clones on your own machines. See [Self-hosting](/platform/self-hosting/) for setup instructions +* **Self-hosting** - Run agents on your own infrastructure to control where agents run and keep repository clones on your own machines. See [Self-hosting](/factories/self-hosting/) for setup instructions ## Troubleshooting diff --git a/src/content/docs/enterprise/team-management/admin-panel.mdx b/src/content/docs/enterprise/team-management/admin-panel.mdx index 896571486..c225b9f8c 100644 --- a/src/content/docs/enterprise/team-management/admin-panel.mdx +++ b/src/content/docs/enterprise/team-management/admin-panel.mdx @@ -269,7 +269,7 @@ Controls how screenshots and video recordings captured with [Computer Use](/agen **Enabled GitHub Orgs** -The **Enabled GitHub Orgs** setting associates your Warp team with one or more GitHub App installations. That association does two things: it lets cloud agents initiated with an [agent API key](/reference/cli/api-keys/) clone repositories and open pull requests using the Warp Factories GitHub App, and it tells Warp which team owns runs started from the [GitHub integration](/platform/integrations/github/) when someone mentions `@warp-agent` in those repositories. +The **Enabled GitHub Orgs** setting associates your Warp team with one or more GitHub App installations. That association does two things: it lets cloud agents initiated with an [agent API key](/agents/cli/oz-cli/api-keys/) clone repositories and open pull requests using the Warp Factories GitHub App, and it tells Warp which team owns runs started from the [GitHub integration](/platform/integrations/github/) when someone mentions `@warp-agent` in those repositories. To configure: diff --git a/src/content/docs/reference/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx b/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx similarity index 100% rename from src/content/docs/reference/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx rename to src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx diff --git a/src/content/docs/reference/api-and-sdk/index.mdx b/src/content/docs/factories/api-and-sdk/index.mdx similarity index 93% rename from src/content/docs/reference/api-and-sdk/index.mdx rename to src/content/docs/factories/api-and-sdk/index.mdx index 2815e592d..f60d954a6 100644 --- a/src/content/docs/reference/api-and-sdk/index.mdx +++ b/src/content/docs/factories/api-and-sdk/index.mdx @@ -12,7 +12,7 @@ import { VARS } from '@data/vars'; The {VARS.API_SDK_NAME} lets you create, monitor, and inspect cloud agent runs programmatically. Use the REST API from any HTTP client, or the official Python and TypeScript SDKs for typed requests, built-in retries, and structured error handling. The SDKs are ideal for CI pipelines, internal tools, and custom integrations. :::note -Some examples in this reference and the [CLI reference](/reference/cli/) use `oz` commands (for example, `oz environment list`) from the {VARS.WARP_AGENT_CLI}. Those commands remain supported through the end of September 2026. The [Warp Agent CLI reference](/agents/cli/reference/) does not yet document a `warp` equivalent. +Some examples in this reference and the [CLI reference](/agents/cli/oz-cli/) use `oz` commands (for example, `oz environment list`) from the {VARS.WARP_AGENT_CLI}. Those commands remain supported through the end of September 2026. The [Warp Agent CLI reference](/agents/cli/reference/) does not yet document a `warp` equivalent. ::: ### API overview @@ -39,7 +39,7 @@ Warp provides official [Python](https://github.com/warpdotdev/oz-sdk-python) and * **Typed requests and responses** (editor autocomplete, fewer schema mistakes) * **Built-in retries and timeouts** (with per-request overrides) -* [**Consistent error types**](/reference/api-and-sdk/troubleshooting/errors/) that map to API status codes +* [**Consistent error types**](/factories/api-and-sdk/troubleshooting/errors/) that map to API status codes * **Helpers for raw responses** when you need headers/status or custom parsing If you’re building an integration (CI, Slack bots, internal tooling, orchestrators), the SDKs are typically the quickest and safest starting point. @@ -118,7 +118,7 @@ See the [**Python SDK**](https://github.com/warpdotdev/oz-sdk-python) or [**Type Cancel a run that is currently queued or in progress. Returns the ID of the cancelled run. -All endpoint semantics, query parameters, and [error codes](/reference/api-and-sdk/troubleshooting/errors/) are documented on the [Agents API Reference](/api). +All endpoint semantics, query parameters, and [error codes](/factories/api-and-sdk/troubleshooting/errors/) are documented on the [Agents API Reference](/api). --- diff --git a/src/content/docs/reference/api-and-sdk/quickstart.mdx b/src/content/docs/factories/api-and-sdk/quickstart.mdx similarity index 92% rename from src/content/docs/reference/api-and-sdk/quickstart.mdx rename to src/content/docs/factories/api-and-sdk/quickstart.mdx index 00107985e..f500af542 100644 --- a/src/content/docs/reference/api-and-sdk/quickstart.mdx +++ b/src/content/docs/factories/api-and-sdk/quickstart.mdx @@ -18,7 +18,7 @@ Watch this short demo of how the REST API can power agent-backed apps like [Powe ## Prerequisites -* **A Warp API key** - Create one in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a> and copy the raw value. Use a personal key if you want runs attributed to you, or an agent key to attribute runs to a [cloud agent](/platform/agents/). See [API Keys](/reference/cli/api-keys/) for the full flow. +* **A Warp API key** - Create one in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a> and copy the raw value. Use a personal key if you want runs attributed to you, or an agent key to attribute runs to a [cloud agent](/platform/agents/). See [API Keys](/agents/cli/oz-cli/api-keys/) for the full flow. * **A cloud environment** - Agents run inside a configured environment that includes repos and other dependencies. If you don't have an environment yet, follow the [Cloud Agents Quickstart](/platform/quickstart/) first. --- @@ -71,9 +71,9 @@ The `state` has the following possible values: * `QUEUED` - The run is waiting to start. * `INPROGRESS` - The agent is actively running. * `SUCCEEDED` - The run completed successfully. -* `FAILED` - The run encountered an error. Check the `status_message` field in the response for details, then use the [API error reference](/reference/api-and-sdk/troubleshooting/errors/) to interpret the error code. +* `FAILED` - The run encountered an error. Check the `status_message` field in the response for details, then use the [API error reference](/factories/api-and-sdk/troubleshooting/errors/) to interpret the error code. -These are the most common states. See the [full API reference](/reference/api-and-sdk/) for all possible values. +These are the most common states. See the [full API reference](/factories/api-and-sdk/) for all possible values. To list all recent runs: @@ -92,7 +92,7 @@ You can also view and manage all runs in the <a href={`${VARS.WEB_APP_URL}/runs` ## Next steps -* **Read the full API reference** - [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) documents all endpoint parameters, query filters, and response schemas. +* **Read the full API reference** - [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) documents all endpoint parameters, query filters, and response schemas. * **Explore the SDKs** - [Python SDK](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript SDK](https://github.com/warpdotdev/oz-sdk-typescript) include typed request/response models, retries, and error handling. -* **See a real-world example** - [Demo: Sentry monitoring with SDK](/reference/api-and-sdk/demo-sentry-monitoring-with-sdk/) shows how to build a webhook handler that triggers agents from production errors. +* **See a real-world example** - [Demo: Sentry monitoring with SDK](/factories/api-and-sdk/demo-sentry-monitoring-with-sdk/) shows how to build a webhook handler that triggers agents from production errors. * **Schedule and automate** - See [Scheduled Agents Quickstart](/platform/triggers/scheduled-agents-quickstart/) to run agents on a cron, or [Integrations Quickstart](/platform/integrations/quickstart/) to trigger agents from Slack or Linear. diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/agent-process-failed.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/agent-process-failed.mdx similarity index 89% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/agent-process-failed.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/agent-process-failed.mdx index 41b8898b0..421899ce4 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/agent-process-failed.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/agent-process-failed.mdx @@ -8,7 +8,7 @@ description: >- The `agent_process_failed` error occurs when the agent process exits unexpectedly after environment setup has completed, before the task reaches a normal terminal state. :::note -This is classified as a **platform error** (task state → ERROR) rather than a user error. It differs from [`environment_setup_failed`](/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/), which covers failures that happen while initializing the environment (cloning the repo, running setup commands, starting MCP servers). `agent_process_failed` covers failures that happen during the agent's active execution phase. +This is classified as a **platform error** (task state → ERROR) rather than a user error. It differs from [`environment_setup_failed`](/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed/), which covers failures that happen while initializing the environment (cloning the repo, running setup commands, starting MCP servers). `agent_process_failed` covers failures that happen during the agent's active execution phase. ::: --- @@ -35,7 +35,7 @@ This error is returned when: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/agent-process-failed/", + "type": "/factories/api-and-sdk/troubleshooting/errors/agent-process-failed/", "title": "The agent process exited unexpectedly.", "status": 500, "instance": "/api/v1/agent/tasks", @@ -58,5 +58,5 @@ This error is returned when: ## Related * [Cloud Agents Overview](/platform/) — How cloud agent tasks work -* [environment_setup_failed](/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/) — Errors during environment setup -* [internal_error](/reference/api-and-sdk/troubleshooting/errors/internal-error/) — Catch-all for unexpected server-side errors +* [environment_setup_failed](/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed/) — Errors during environment setup +* [internal_error](/factories/api-and-sdk/troubleshooting/errors/internal-error/) — Catch-all for unexpected server-side errors diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/authentication-required.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/authentication-required.mdx similarity index 92% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/authentication-required.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/authentication-required.mdx index 37e3adcd9..c8c026b82 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/authentication-required.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/authentication-required.mdx @@ -36,7 +36,7 @@ This error is returned when: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/authentication-required/", + "type": "/factories/api-and-sdk/troubleshooting/errors/authentication-required/", "title": "Your API key is invalid or has expired. Please generate a new key and try again.", "status": 401, "instance": "/api/v1/agent/tasks", @@ -57,5 +57,5 @@ This error is returned when: ## Related -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) — API authentication +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — API authentication * [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) — API key management diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/budget-exceeded.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/budget-exceeded.mdx similarity index 95% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/budget-exceeded.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/budget-exceeded.mdx index f483a50b5..b9e7e7cb8 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/budget-exceeded.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/budget-exceeded.mdx @@ -32,7 +32,7 @@ The `title` field in the response will describe the specific budget constraint. ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/budget-exceeded/", + "type": "/factories/api-and-sdk/troubleshooting/errors/budget-exceeded/", "title": "Monthly spending budget of $50 has been reached.", "status": 403, "instance": "/api/v1/agent/tasks", diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/conflict.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/conflict.mdx similarity index 91% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/conflict.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/conflict.mdx index 489a0620a..c45972875 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/conflict.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/conflict.mdx @@ -34,7 +34,7 @@ The operation can typically succeed once the resource transitions to the expecte ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/conflict/", + "type": "/factories/api-and-sdk/troubleshooting/errors/conflict/", "title": "Pending agent runs cannot be cancelled, retry after a moment.", "status": 409, "instance": "/api/v1/agent/tasks/abc123/cancel", @@ -57,4 +57,4 @@ For task cancellation specifically, wait until the task moves from **pending** t ## Related * [Managing Cloud Agents](/platform/managing-cloud-agents/) — Viewing and managing agent tasks -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) — API reference for managing agent tasks +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — API reference for managing agent tasks diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/content-policy-violation.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/content-policy-violation.mdx similarity index 96% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/content-policy-violation.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/content-policy-violation.mdx index 3b6480de1..ebc168b31 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/content-policy-violation.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/content-policy-violation.mdx @@ -35,7 +35,7 @@ For security reasons, the error message is intentionally generic and does not de ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/content-policy-violation/", + "type": "/factories/api-and-sdk/troubleshooting/errors/content-policy-violation/", "title": "Unable to start cloud agent. Please try again or contact support if the issue persists.", "status": 403, "instance": "/api/v1/agent/tasks", diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed.mdx similarity index 92% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed.mdx index b356fc21e..eb36310d0 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed.mdx @@ -38,7 +38,7 @@ The `title` field in the response will describe the specific setup failure. ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/", + "type": "/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed/", "title": "Failed to clone repository: branch 'main' not found in acme/backend", "status": 500, "instance": "/api/v1/agent/tasks", @@ -54,7 +54,7 @@ The `title` field in the response will describe the specific setup failure. 1. **Check repository configuration** — Verify the repository URL and branch name in your [environment settings](/platform/environments/). Ensure the repository exists and is accessible. 2. **Check setup commands** — Run the setup commands locally to confirm they work. Look for missing dependencies, incorrect paths, or syntax errors. 3. **Check working directory** — Ensure the working directory path exists relative to the cloned repository root. -4. **Check MCP server configuration** — Verify MCP server startup commands and that any required dependencies or credentials are available. See [MCP Servers for Agents](/reference/cli/mcp-servers/). +4. **Check MCP server configuration** — Verify MCP server startup commands and that any required dependencies or credentials are available. See [MCP Servers for Agents](/agents/cli/oz-cli/mcp-servers/). 5. **Check secrets** — If setup commands reference environment variables from [secrets](/platform/secrets/), verify the secrets are configured and in scope. --- @@ -63,4 +63,4 @@ The `title` field in the response will describe the specific setup failure. * [Environments](/platform/environments/) — Configuring cloud agent environments * [Secrets](/platform/secrets/) — Managing credentials for agent environments -* [MCP Servers for Agents](/reference/cli/mcp-servers/) — Configuring MCP servers +* [MCP Servers for Agents](/agents/cli/oz-cli/mcp-servers/) — Configuring MCP servers diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx similarity index 95% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx index 82872f987..d1847c5bb 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx @@ -43,7 +43,7 @@ This error includes extra fields beyond the standard response format: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/", + "type": "/factories/api-and-sdk/troubleshooting/errors/external-authentication-required/", "title": "User is not connected to GitHub", "status": 401, "instance": "/api/v1/agent/tasks", @@ -58,7 +58,7 @@ This error includes extra fields beyond the standard response format: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/", + "type": "/factories/api-and-sdk/troubleshooting/errors/external-authentication-required/", "title": "User does not have access to the following repositories in the environment: acme/backend", "status": 401, "detail": "inaccessible repos: acme/backend", @@ -75,7 +75,7 @@ This error includes extra fields beyond the standard response format: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/", + "type": "/factories/api-and-sdk/troubleshooting/errors/external-authentication-required/", "title": "Unable to locate your Warp account", "status": 401, "instance": "/api/v1/agent/tasks", diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/feature-not-available.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/feature-not-available.mdx similarity index 96% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/feature-not-available.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/feature-not-available.mdx index 1d255c180..e911b9e14 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/feature-not-available.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/feature-not-available.mdx @@ -32,7 +32,7 @@ The `title` field in the response will describe the specific feature that is una ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/feature-not-available/", + "type": "/factories/api-and-sdk/troubleshooting/errors/feature-not-available/", "title": "Slack integration requires a Build plan or higher.", "status": 403, "instance": "/api/v1/agent/tasks", diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/index.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx similarity index 77% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/index.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx index af4046131..16dc9b825 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/index.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx @@ -17,7 +17,7 @@ All error responses share this structure: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/invalid-request/", + "type": "/factories/api-and-sdk/troubleshooting/errors/invalid-request/", "title": "The request contains invalid or missing parameters.", "status": 400, "detail": "schedule_id is required", @@ -53,29 +53,29 @@ Errors are split into two categories based on what caused the failure: These indicate something the caller needs to fix. When a cloud agent task encounters a user error, the task transitions to the **FAILED** state. -* [`insufficient_credits`](/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/) — Team has no remaining add-on credits -* [`feature_not_available`](/reference/api-and-sdk/troubleshooting/errors/feature-not-available/) — Feature not included in your current plan -* [`external_authentication_required`](/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/) — External service authorization needed -* [`not_authorized`](/reference/api-and-sdk/troubleshooting/errors/not-authorized/) — Insufficient permissions for the operation -* [`invalid_request`](/reference/api-and-sdk/troubleshooting/errors/invalid-request/) — Malformed request or invalid parameters -* [`resource_not_found`](/reference/api-and-sdk/troubleshooting/errors/resource-not-found/) — Referenced resource does not exist -* [`budget_exceeded`](/reference/api-and-sdk/troubleshooting/errors/budget-exceeded/) — Spending budget limit reached -* [`integration_disabled`](/reference/api-and-sdk/troubleshooting/errors/integration-disabled/) — Integration is disabled -* [`integration_not_configured`](/reference/api-and-sdk/troubleshooting/errors/integration-not-configured/) — Integration setup is incomplete -* [`operation_not_supported`](/reference/api-and-sdk/troubleshooting/errors/operation-not-supported/) — Operation not supported for this resource or state -* [`environment_setup_failed`](/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/) — Cloud agent environment failed to initialize -* [`content_policy_violation`](/reference/api-and-sdk/troubleshooting/errors/content-policy-violation/) — Task flagged by content policy checks -* [`conflict`](/reference/api-and-sdk/troubleshooting/errors/conflict/) — Request conflicts with the current resource state (retryable) +* [`insufficient_credits`](/factories/api-and-sdk/troubleshooting/errors/insufficient-credits/) — Team has no remaining add-on credits +* [`feature_not_available`](/factories/api-and-sdk/troubleshooting/errors/feature-not-available/) — Feature not included in your current plan +* [`external_authentication_required`](/factories/api-and-sdk/troubleshooting/errors/external-authentication-required/) — External service authorization needed +* [`not_authorized`](/factories/api-and-sdk/troubleshooting/errors/not-authorized/) — Insufficient permissions for the operation +* [`invalid_request`](/factories/api-and-sdk/troubleshooting/errors/invalid-request/) — Malformed request or invalid parameters +* [`resource_not_found`](/factories/api-and-sdk/troubleshooting/errors/resource-not-found/) — Referenced resource does not exist +* [`budget_exceeded`](/factories/api-and-sdk/troubleshooting/errors/budget-exceeded/) — Spending budget limit reached +* [`integration_disabled`](/factories/api-and-sdk/troubleshooting/errors/integration-disabled/) — Integration is disabled +* [`integration_not_configured`](/factories/api-and-sdk/troubleshooting/errors/integration-not-configured/) — Integration setup is incomplete +* [`operation_not_supported`](/factories/api-and-sdk/troubleshooting/errors/operation-not-supported/) — Operation not supported for this resource or state +* [`environment_setup_failed`](/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed/) — Cloud agent environment failed to initialize +* [`content_policy_violation`](/factories/api-and-sdk/troubleshooting/errors/content-policy-violation/) — Task flagged by content policy checks +* [`conflict`](/factories/api-and-sdk/troubleshooting/errors/conflict/) — Request conflicts with the current resource state (retryable) ### Platform errors These indicate a Warp-side issue. When a cloud agent task encounters a platform error, the task transitions to the **ERROR** state. Retryable errors are automatically retried before the task is marked as failed. -* [`authentication_required`](/reference/api-and-sdk/troubleshooting/errors/authentication-required/) — Invalid or expired API key -* [`resource_unavailable`](/reference/api-and-sdk/troubleshooting/errors/resource-unavailable/) — Transient infrastructure issue (retryable) -* [`internal_error`](/reference/api-and-sdk/troubleshooting/errors/internal-error/) — Unexpected server-side error (retryable) -* [`infrastructure_timeout`](/reference/api-and-sdk/troubleshooting/errors/infrastructure-timeout/) — Task terminated after exceeding the maximum allowed runtime -* [`agent_process_failed`](/reference/api-and-sdk/troubleshooting/errors/agent-process-failed/) — Agent process exited unexpectedly during task execution +* [`authentication_required`](/factories/api-and-sdk/troubleshooting/errors/authentication-required/) — Invalid or expired API key +* [`resource_unavailable`](/factories/api-and-sdk/troubleshooting/errors/resource-unavailable/) — Transient infrastructure issue (retryable) +* [`internal_error`](/factories/api-and-sdk/troubleshooting/errors/internal-error/) — Unexpected server-side error (retryable) +* [`infrastructure_timeout`](/factories/api-and-sdk/troubleshooting/errors/infrastructure-timeout/) — Task terminated after exceeding the maximum allowed runtime +* [`agent_process_failed`](/factories/api-and-sdk/troubleshooting/errors/agent-process-failed/) — Agent process exited unexpectedly during task execution --- @@ -87,6 +87,6 @@ When an error response includes a `trace_id`, you can include it when [contactin ## Related -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) — API reference for creating and managing agent tasks +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — API reference for creating and managing agent tasks * [Cloud Agents Overview](/platform/) — How cloud agents work * [Access, Billing, and Identity](/platform/team-access-billing-and-identity/) — Plan requirements and billing details diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/infrastructure-timeout.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/infrastructure-timeout.mdx similarity index 94% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/infrastructure-timeout.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/infrastructure-timeout.mdx index fff2a0222..e96660122 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/infrastructure-timeout.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/infrastructure-timeout.mdx @@ -35,7 +35,7 @@ This error is returned when: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/infrastructure-timeout/", + "type": "/factories/api-and-sdk/troubleshooting/errors/infrastructure-timeout/", "title": "The task exceeded the maximum allowed runtime and was terminated.", "status": 500, "instance": "/api/v1/agent/tasks", @@ -58,5 +58,5 @@ This error is returned when: ## Related * [Cloud Agents Overview](/platform/) — How cloud agent tasks work -* [internal_error](/reference/api-and-sdk/troubleshooting/errors/internal-error/) — Other platform-level errors +* [internal_error](/factories/api-and-sdk/troubleshooting/errors/internal-error/) — Other platform-level errors * [Cloud Agents FAQs](/platform/faqs/) — Common questions about cloud agents diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/insufficient-credits.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/insufficient-credits.mdx similarity index 98% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/insufficient-credits.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/insufficient-credits.mdx index 1a0f262fd..3eef34f85 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/insufficient-credits.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/insufficient-credits.mdx @@ -40,7 +40,7 @@ For the full waterfall, see [How are cloud agent runs on team plans billed when ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/", + "type": "/factories/api-and-sdk/troubleshooting/errors/insufficient-credits/", "title": "The principal billed for this run has no remaining credits. Purchase add-on credits or raise the team-wide spend cap to continue.", "status": 403, "instance": "/api/v1/agent/tasks", diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-disabled.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-disabled.mdx similarity index 95% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-disabled.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-disabled.mdx index 91cdccec5..aeff2a424 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-disabled.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-disabled.mdx @@ -31,7 +31,7 @@ This error is returned when: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/integration-disabled/", + "type": "/factories/api-and-sdk/troubleshooting/errors/integration-disabled/", "title": "This integration is disabled. Please enable it in Oz.", "status": 403, "instance": "/api/v1/agent/tasks", diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx similarity index 96% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx index 24b249f9f..775be7f26 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx @@ -41,7 +41,7 @@ This error includes extra fields beyond the standard response format: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/integration-not-configured/", + "type": "/factories/api-and-sdk/troubleshooting/errors/integration-not-configured/", "title": "Slack integration is not configured", "status": 400, "instance": "/api/v1/agent/tasks", diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/internal-error.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/internal-error.mdx similarity index 96% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/internal-error.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/internal-error.mdx index 2dd683a7d..1afacfd24 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/internal-error.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/internal-error.mdx @@ -31,7 +31,7 @@ This error is returned when: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/internal-error/", + "type": "/factories/api-and-sdk/troubleshooting/errors/internal-error/", "title": "An unexpected error occurred. Please try again later. If the issue persists, contact support.", "status": 500, "instance": "/api/v1/agent/tasks", diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/invalid-request.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/invalid-request.mdx similarity index 89% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/invalid-request.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/invalid-request.mdx index dc807a2fd..ce6c6ec9f 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/invalid-request.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/invalid-request.mdx @@ -36,7 +36,7 @@ The `detail` field in the response will describe the specific validation issue. ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/invalid-request/", + "type": "/factories/api-and-sdk/troubleshooting/errors/invalid-request/", "title": "The request contains invalid or missing parameters.", "status": 400, "detail": "schedule_id is required", @@ -51,11 +51,11 @@ The `detail` field in the response will describe the specific validation issue. ## How to resolve 1. Check the `detail` field for the specific validation issue. -2. Correct the request parameters according to the [API documentation](/reference/api-and-sdk/). +2. Correct the request parameters according to the [API documentation](/factories/api-and-sdk/). 3. Retry the request. --- ## Related -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) — API request format and parameters +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — API request format and parameters diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/not-authorized.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/not-authorized.mdx similarity index 92% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/not-authorized.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/not-authorized.mdx index 964bbfc17..a1870fea8 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/not-authorized.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/not-authorized.mdx @@ -33,7 +33,7 @@ This error is returned when: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/not-authorized/", + "type": "/factories/api-and-sdk/troubleshooting/errors/not-authorized/", "title": "You do not have permission for this operation.", "status": 403, "detail": "user is not a member of the team", @@ -56,4 +56,4 @@ This error is returned when: ## Related * [Access, Billing, and Identity](/platform/team-access-billing-and-identity/) — Permission model and identity -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) — API authentication and authorization +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — API authentication and authorization diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx similarity index 88% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx index eaabaa540..f57a68f50 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx @@ -32,7 +32,7 @@ This error is returned when: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/operation-not-supported/", + "type": "/factories/api-and-sdk/troubleshooting/errors/operation-not-supported/", "title": "Self-hosted agent runs cannot be cancelled with the API.", "status": 422, "instance": "/api/v1/agent/tasks/abc123/cancel", @@ -56,5 +56,5 @@ This error is returned when: ## Related * [Cloud Agents Overview](/platform/) — How cloud agent tasks work -* [Self-hosting](/platform/self-hosting/) — Self-hosted agent configuration -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) — API reference for managing agent tasks +* [Self-hosting](/factories/self-hosting/) — Self-hosted agent configuration +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — API reference for managing agent tasks diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/resource-not-found.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-not-found.mdx similarity index 96% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/resource-not-found.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-not-found.mdx index e3f7f36f3..30feb59af 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/resource-not-found.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-not-found.mdx @@ -34,7 +34,7 @@ The `detail` field in the response will describe which resource was not found. ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/resource-not-found/", + "type": "/factories/api-and-sdk/troubleshooting/errors/resource-not-found/", "title": "The requested resource was not found.", "status": 404, "detail": "environment abc123 not found", diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/resource-unavailable.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-unavailable.mdx similarity index 90% rename from src/content/docs/reference/api-and-sdk/troubleshooting/errors/resource-unavailable.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-unavailable.mdx index 69f5b63c3..0e721a0c1 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/resource-unavailable.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-unavailable.mdx @@ -32,7 +32,7 @@ This error is returned when: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/resource-unavailable/", + "type": "/factories/api-and-sdk/troubleshooting/errors/resource-unavailable/", "title": "Agent capacity is temporarily full. Your task will be retried automatically, or you can try again later.", "status": 429, "instance": "/api/v1/agent/tasks", @@ -46,7 +46,7 @@ This error is returned when: ```json { - "type": "/reference/api-and-sdk/troubleshooting/errors/resource-unavailable/", + "type": "/factories/api-and-sdk/troubleshooting/errors/resource-unavailable/", "title": "Failed to create a sandbox instance for your agent. This is typically a transient issue — your task will be retried automatically.", "status": 500, "instance": "/api/v1/agent/tasks", @@ -72,4 +72,4 @@ If the error persists after retries: ## Related * [Cloud Agents Overview](/platform/) — How cloud agent execution works -* [Deployment Patterns](/platform/deployment-patterns/) — Execution models and infrastructure +* [Deployment Patterns](/factories/deployment-patterns/) — Execution models and infrastructure diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/index.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx similarity index 90% rename from src/content/docs/reference/api-and-sdk/troubleshooting/index.mdx rename to src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx index 097333f4f..ee151f68c 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/index.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx @@ -10,4 +10,4 @@ When the {VARS.API_SDK_NAME} encounters an error, it returns a structured respon ## Resources -* [**Errors**](/reference/api-and-sdk/troubleshooting/errors/) — Full reference for all API error codes, including causes, example responses, and resolution steps +* [**Errors**](/factories/api-and-sdk/troubleshooting/errors/) — Full reference for all API error codes, including causes, example responses, and resolution steps diff --git a/src/content/docs/platform/deployment-patterns.mdx b/src/content/docs/factories/deployment-patterns.mdx similarity index 92% rename from src/content/docs/platform/deployment-patterns.mdx rename to src/content/docs/factories/deployment-patterns.mdx index 5f35d060a..e8adae12e 100644 --- a/src/content/docs/platform/deployment-patterns.mdx +++ b/src/content/docs/factories/deployment-patterns.mdx @@ -127,8 +127,8 @@ Think of self-hosted execution as **customer-hosted execution with Warp-hosted o Self-hosting has two architectures that differ on **who orchestrates agent runs** (both keep code and execution on your infrastructure): -* **[Managed](/platform/self-hosting/#managed-architecture)** — The {VARS.WARP_AUTOMATION_PLATFORM} orchestrates. You run the `oz-agent-worker` daemon; the {VARS.WARP_AUTOMATION_PLATFORM} routes runs to it from Slack, Linear, schedules, the API, or `oz agent run-cloud`. Tasks execute in Docker containers, Kubernetes Jobs, or directly on the host. -* **[Unmanaged](/platform/self-hosting/unmanaged/)** — You orchestrate. Invoke `oz agent run` directly from your CI, Kubernetes, or dev environment. Warp provides session tracking and observability; it does not start or stop agents. +* **[Managed](/factories/self-hosting/#managed-architecture)** — The {VARS.WARP_AUTOMATION_PLATFORM} orchestrates. You run the `oz-agent-worker` daemon; the {VARS.WARP_AUTOMATION_PLATFORM} routes runs to it from Slack, Linear, schedules, the API, or `oz agent run-cloud`. Tasks execute in Docker containers, Kubernetes Jobs, or directly on the host. +* **[Unmanaged](/platform/unmanaged-execution/)** — You orchestrate. Invoke `oz agent run` directly from your CI, Kubernetes, or dev environment. Warp provides session tracking and observability; it does not start or stop agents. Why teams choose self-hosted execution: @@ -136,4 +136,4 @@ Why teams choose self-hosted execution: * Agents need to access services behind a VPN or self-hosted SCMs like GitLab or Bitbucket. Warp-hosted agents can also access GitLab and Bitbucket over the public internet — see the [GitLab](/platform/integrations/gitlab/) and [Bitbucket](/platform/integrations/bitbucket/) setup guides. * Your environments (multi-service stacks, heavy resource requirements) don't fit in a single Docker container. -For setup, decision guides, and a quickstart, start with [Self-hosting](/platform/self-hosting/). +For setup, decision guides, and a quickstart, start with [Self-hosting](/factories/self-hosting/). diff --git a/src/content/docs/factories/developer-tools.mdx b/src/content/docs/factories/developer-tools.mdx new file mode 100644 index 000000000..85518d073 --- /dev/null +++ b/src/content/docs/factories/developer-tools.mdx @@ -0,0 +1,32 @@ +--- +title: Developer tools for Warp Factories +description: >- + Use APIs, SDKs, webhooks, and MCP to integrate Warp Factories with your + services, tools, and development workflows. +sidebar: + label: "Developer tools" +--- +import { VARS } from '@data/vars'; + +Warp Factories provides programmatic interfaces for sending work to a factory, integrating external systems, and inspecting the runs a factory produces. + +## Choose an interface + +* **[Factory API](/factories/factory-api/)** - Find a factory and send work to it by UID from your own application or service. +* **[{VARS.API_SDK_NAME}](/factories/api-and-sdk/)** - Create, monitor, and manage cloud agent runs from scripts, CI, and backend services. +* **[API reference](/api)** - Look up the full HTTP API schema, parameters, and responses. +* **[Factory MCP](/factories/factory-mcp/)** - Exchange work between a factory and a connected coding agent or MCP client. +* **[Webhooks](/factories/webhooks/)** - Receive events from systems that can send JSON and route matching deliveries into factory automations. + +## Use the API and SDK + + +# Use the API and SDK +es/webhooks/)** - Receive events from syfor typed requests, retries, and error handling. Start with the [Aes/webhooks/)** - Recei/factories/api-and-sdk/quickstart/) to create and inspect a run, or use the [Sentry monitoring example](/factories/api-and-sdk/demo-sentry-monitoring-with-sdk/) to connect an external event source. +es/webhooks/)** - Recrequests, see [API troubleshooting](/factories/api-and-sdk/troubleshooting/) and the [API error reference](/factories/api-and-sdk/troubleshooting/errors/). + +## Related pages + +* [Connect your factory](/factories/connect-your-factory/) - Choose an integration or direct intake path. +* [Factory automations](/factories/automations/) - Route events and schedules to factory agents. +* [Factory dashboard](/factories/factory-dashboard/) - Inspect work items, runs, and factory settings. diff --git a/src/content/docs/factories/factory-api.mdx b/src/content/docs/factories/factory-api.mdx index 141f3b200..40a03c247 100644 --- a/src/content/docs/factories/factory-api.mdx +++ b/src/content/docs/factories/factory-api.mdx @@ -20,7 +20,7 @@ Warp Factories is in **Early Access** and available to a limited set of teams. [ * `GET /factory/{uid}` - get one factory by UID. * `POST /factory/{uid}/runs` - dispatch a run to the factory's foreman agent. Pass a `prompt`; the server resolves the foreman for you. -A dispatched run is an ordinary [cloud agent run](/platform/): retrieve it, send it follow-ups, or cancel it through the same [Agent API](/reference/api-and-sdk/) you'd use for any run. +A dispatched run is an ordinary [cloud agent run](/platform/): retrieve it, send it follow-ups, or cancel it through the same [Agent API](/factories/api-and-sdk/) you'd use for any run. ## When to use the factory API vs the Agent API @@ -119,12 +119,12 @@ Content-Type: application/json } ``` -See [key endpoints](/reference/api-and-sdk/#key-endpoints) for the full set of run-management operations, including cancellation. +See [key endpoints](/factories/api-and-sdk/#key-endpoints) for the full set of run-management operations, including cancellation. ## Related pages * [Connect your factory](/factories/connect-your-factory/) - Every way work can enter a factory, including the factory API alongside Slack, GitHub, and Factory MCP. * [Build a Mattermost bot for Warp Factories](/guides/external-tools/build-a-mattermost-bot-for-warp-factories/) - A worked example that discovers a factory and dispatches and continues a task from a custom chat integration. * [Factory MCP](/factories/factory-mcp/) - Connect a local coding agent to a factory instead of calling the REST API directly. -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) - Full endpoint reference, SDKs, and error codes for the underlying Agent API. +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - Full endpoint reference, SDKs, and error codes for the underlying Agent API. * [How Warp Factories work](/factories/how-factories-work/) - The stages a dispatched task moves through after the foreman picks it up. diff --git a/src/content/docs/factories/factory-as-code.mdx b/src/content/docs/factories/factory-as-code.mdx index b0eb0f94e..a7296832f 100644 --- a/src/content/docs/factories/factory-as-code.mdx +++ b/src/content/docs/factories/factory-as-code.mdx @@ -291,7 +291,7 @@ MCP servers for agents that don't declare their own, in the same form as [`mcpSe ### `agentDefaults.workerHost` -Where runs execute: `warp` for Warp-hosted compute, or the ID of a connected worker in the [managed self-hosting architecture](/platform/self-hosting/#managed-architecture). Configure the worker's Docker, Kubernetes, or Direct backend on the worker itself; the factory definition selects the worker and a compatible runner. +Where runs execute: `warp` for Warp-hosted compute, or the ID of a connected [self-hosted worker](/factories/self-hosting/). Configure the worker's Docker, Kubernetes, or Direct backend on the worker itself; the factory definition selects the worker and a compatible runner. ### `agentDefaults.computerUseModel` @@ -443,7 +443,7 @@ An automation may also declare `model` or `harness`, `runner`, `environmentId`, ## `runners/<name>.yaml` -Optional. Each file defines a runner: the compute a run executes on. The runner's name comes from the file name, and agents and automations select it by that name. See [cloud agent runners](/platform/runners/) for how runners behave. For three runners selected per agent, including a macOS runner, see [`02-sdlc-issue-to-pr`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/02-sdlc-issue-to-pr). +Optional. Each file defines a runner: the compute a run executes on. The runner's name comes from the file name, and agents and automations select it by that name. See [cloud agent runners](/factories/runners/) for how runners behave. For three runners selected per agent, including a macOS runner, see [`02-sdlc-issue-to-pr`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/02-sdlc-issue-to-pr). ```yaml title="runners/linux-build.yaml" description: Linux runner for payments builds and tests diff --git a/src/content/docs/factories/factory-mcp.mdx b/src/content/docs/factories/factory-mcp.mdx index 73d922586..96338c571 100644 --- a/src/content/docs/factories/factory-mcp.mdx +++ b/src/content/docs/factories/factory-mcp.mdx @@ -74,7 +74,7 @@ In clients that use the `mcpServers` JSON format, such as Cursor: For Codex and other clients, follow the [client's own remote-server instructions](https://developers.openai.com/codex/mcp/#connect-codex-to-an-mcp-server) with the same URL. -Automation that runs without a person present, such as a CI pipeline or a headless server, can't complete the browser sign-in. For those cases, authenticate with an [agent API key](/reference/cli/api-keys/) instead, passed as a bearer token: +Automation that runs without a person present, such as a CI pipeline or a headless server, can't complete the browser sign-in. For those cases, authenticate with an [agent API key](/agents/cli/oz-cli/api-keys/) instead, passed as a bearer token: ```json { diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index cc937bf53..f8a750d47 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -69,7 +69,7 @@ Warp Factories is designed for engineering teams with repeatable work that exten Warp Factories is built on the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/), Warp's programmable system for running and coordinating agents at scale. A factory doesn't replace the platform; it assembles the platform's primitives into one standing workflow, so what you already know about cloud agents carries over: * **Runs** - Every factory agent executes as a [cloud agent run](/platform/), with the same run records and [session sharing](/platform/viewing-cloud-agent-runs/) as any other cloud agent. -* **Execution** - [Runners](/platform/runners/) provide the compute each agent works on, and eligible Enterprise teams can route execution to [managed self-hosted workers](/platform/self-hosting/). +* **Execution** - [Runners](/factories/runners/) provide the compute each agent works on, and eligible Enterprise teams can route execution to [managed self-hosted workers](/factories/self-hosting/). * **Agent configuration** - Each agent runs on a supported [harness](/platform/harnesses/) and model, with [secrets](/platform/secrets/) and [MCP servers](/platform/mcp/) scoping what it can reach. * **Billing** - A factory's runs consume [platform credits](/support-and-community/plans-and-billing/platform-credits/) the same way as any other cloud agent run. diff --git a/src/content/docs/factories/infrastructure-and-security.mdx b/src/content/docs/factories/infrastructure-and-security.mdx index 049ce2780..d373db11e 100644 --- a/src/content/docs/factories/infrastructure-and-security.mdx +++ b/src/content/docs/factories/infrastructure-and-security.mdx @@ -27,7 +27,7 @@ flowchart LR C --> D["Warp-managed storage"] ``` -Self-hosting moves only the execution plane: with a managed self-hosted worker, repository checkouts, command execution, and the sandbox filesystem stay on machines you control, but content that enters prompts, results, transcripts, attachments, artifacts, or telemetry still flows through Warp and the providers you configure. See [deployment patterns](/platform/deployment-patterns/) and [self-hosting security and networking](/platform/self-hosting/security-and-networking/) for the broader data model. +Self-hosting moves only the execution plane: with a managed self-hosted worker, repository checkouts, command execution, and the sandbox filesystem stay on machines you control, but content that enters prompts, results, transcripts, attachments, artifacts, or telemetry still flows through Warp and the providers you configure. See [deployment patterns](/factories/deployment-patterns/) and [self-hosting security and networking](/platform/execution-security/) for the broader data model. The diagram below maps those boundaries for self-hosted execution; factory runs follow the same data model. See the [data security and boundaries](/platform/architecture/#data-security-and-boundaries) reference for a description of each data class. @@ -35,15 +35,15 @@ The diagram below maps those boundaries for self-hosted execution; factory runs ## Runners -A runner defines the operating system, architecture, sandbox image, and instance shape (vCPUs and memory) for a factory agent. The factory's [definition](/factories/factory-as-code/) supplies its repositories, setup commands, and secrets; the execution host determines whether that runner uses Warp-hosted or self-hosted compute. +A runner defines the compute a factory's agents work on: the operating system and architecture, the sandbox image, and the instance shape (vCPUs and memory). It's the infrastructure choice you make for a factory. The workspace itself — repositories, setup commands, and secrets — comes from the factory's [definition](/factories/factory-as-code/), and Warp keeps it in step for you. See the [runner reference](/factories/runners/) for the available compute options. Declare runners as `runners/*.yaml` files. Every agent inherits `agentDefaults.runner`, and an agent or automation can override it. A self-hosted runner must match the worker's operating system and architecture. Warp provisions hosted runners within your plan limits; your team provisions and operates self-hosted compute. -See [cloud agent runner compute options](/platform/runners/) and [factory runner syntax](/factories/factory-as-code/#runnersnameyaml). +See [cloud agent runner compute options](/factories/runners/) and [factory runner syntax](/factories/factory-as-code/#runnersnameyaml). ## Choose an execution host -A factory runs its work on one of two execution hosts: Warp-hosted compute or a worker in the [managed self-hosting architecture](/platform/self-hosting/#managed-architecture). +A factory runs its work on one of two execution hosts: Warp-hosted compute or a worker in the [managed self-hosting architecture](/factories/self-hosting/#managed-architecture). | Decision area | Warp-hosted | Managed self-hosted | | --- | --- | --- | @@ -56,7 +56,7 @@ A factory runs its work on one of two execution hosts: Warp-hosted compute or a To route factory work to a managed self-hosted worker (an Enterprise feature): -1. **Deploy a worker** - Use the [self-hosting overview](/platform/self-hosting/) to choose a managed backend and review its requirements, then connect a worker that authenticates to Warp with an agent API key. Workers run on `linux/amd64` and `linux/arm64`, and the worker's platform determines which workloads it can run. +1. **Deploy a worker** - Review the [self-hosting requirements](/factories/self-hosting/), then connect a worker that authenticates to Warp with an agent API key. Workers run on `linux/amd64` and `linux/arm64`, and the worker's platform determines which workloads it can run. 2. **Pair it with a compatible runner** - Choose a runner that matches the worker's platform. 3. **Select the worker in the factory definition** - Set [`workerHost`](/factories/factory-as-code/) so the factory routes work to it. @@ -70,9 +70,9 @@ Factories use managed self-hosting, so Warp still orchestrates their runs. The w | Structure | How factory runs execute | What your team operates | Use it when | | --- | --- | --- | --- | -| **[Docker](/platform/self-hosting/managed-docker/)** (default) | In a separate Docker container on the worker host | The worker daemon, host, Docker daemon, images, capacity, and container policy | Docker is available and you want per-run container isolation without Kubernetes | -| **[Kubernetes](/platform/self-hosting/managed-kubernetes/)** | As a Kubernetes Job in the worker's namespace | The worker deployment, cluster, namespace RBAC, scheduling, admission policy, and capacity | Your team already operates Kubernetes or needs cluster-native policy and scheduling | -| **[Direct](/platform/self-hosting/managed-direct/)** | In a separate workspace directly on the worker host, sharing its OS and kernel | The worker daemon, host security, dependencies, capacity, and cleanup | A container runtime isn't available or runs need direct access to host resources | +| **[Docker](/factories/self-hosting/managed-docker/)** (default) | In a separate Docker container on the worker host | The worker daemon, host, Docker daemon, images, capacity, and container policy | Docker is available and you want per-run container isolation without Kubernetes | +| **[Kubernetes](/factories/self-hosting/managed-kubernetes/)** | As a Kubernetes Job in the worker's namespace | The worker deployment, cluster, namespace RBAC, scheduling, admission policy, and capacity | Your team already operates Kubernetes or needs cluster-native policy and scheduling | +| **[Direct](/factories/self-hosting/managed-direct/)** | In a separate workspace directly on the worker host, sharing its OS and kernel | The worker daemon, host security, dependencies, capacity, and cleanup | A container runtime isn't available or runs need direct access to host resources | All three structures keep execution on your infrastructure while Warp operates the control plane. @@ -124,8 +124,8 @@ Warp meters hosted compute, Warp-provided inference, and platform services. Mana ## Related pages -* [**Deployment patterns**](/platform/deployment-patterns/) - Compare Warp-hosted, managed self-hosted, and CLI-only execution. -* [**Self-hosting overview**](/platform/self-hosting/) - Choose a managed worker backend and follow its setup guide. -* [**Self-hosting security and networking**](/platform/self-hosting/security-and-networking/) - Review data boundaries, network egress, and backend-specific controls. +* [**Deployment patterns**](/factories/deployment-patterns/) - Compare Warp-hosted, managed self-hosted, and CLI-only execution. +* [**Managed self-hosting**](/factories/self-hosting/) - Choose a worker backend and follow its setup guide. +* [**Execution security**](/platform/execution-security/) - Review data boundaries, network egress, and backend-specific controls. * [**Bring Your Own LLM**](/enterprise/enterprise-features/bring-your-own-llm/) - Compare customer-owned inference options and provider support. * [**Enterprise security overview**](/enterprise/security-and-compliance/security-overview/) - Review data handling, ZDR, compliance, and access controls across Warp. diff --git a/src/content/docs/platform/runners.mdx b/src/content/docs/factories/runners.mdx similarity index 94% rename from src/content/docs/platform/runners.mdx rename to src/content/docs/factories/runners.mdx index 6692e4a06..c51a1c92f 100644 --- a/src/content/docs/platform/runners.mdx +++ b/src/content/docs/factories/runners.mdx @@ -32,7 +32,7 @@ A runner is the compute layer for a cloud agent run. When a run starts, Warp pro * **Environment** – Defines the workspace: Docker image, repositories, and setup commands. See [Environments](/platform/environments/). * **Runner** – Defines the compute: OS, architecture, instance shape (vCPUs and memory), and sandbox image. -* **Host** – Determines where execution happens (Warp-hosted or [self-hosted](/platform/self-hosting/) infrastructure). +* **Host** – Determines where execution happens (Warp-hosted or [self-hosted](/factories/self-hosting/) infrastructure). Each environment has a default runner. Specifying a runner for a run overrides that default for that run only. @@ -64,7 +64,7 @@ Each environment has a default runner. Specifying a runner for a run overrides t ## Managing runners with the CLI -Use the [{VARS.WARP_AGENT_CLI}](/reference/cli/) to create, list, update, and delete runners. Runner commands require an authenticated CLI—see the [CLI quickstart](/reference/cli/quickstart/) to get set up. +Use the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) to create, list, update, and delete runners. Runner commands require an authenticated CLI—see the [CLI quickstart](/agents/cli/oz-cli/quickstart/) to get set up. ### Create a runner @@ -145,4 +145,4 @@ You can also select a runner when [running orchestrated agents](/platform/orches * [Environments](/platform/environments/) – Define the repos, image, and setup commands an agent works with. * [Managing cloud agents](/platform/managing-cloud-agents/) – Start, monitor, and manage cloud agent runs. -* [{VARS.WARP_AGENT_CLI} reference](/reference/cli/) – Full command-line reference for runners and every other cloud agent command. +* [{VARS.WARP_AGENT_CLI} reference](/agents/cli/oz-cli/) – Full command-line reference for runners and every other cloud agent command. diff --git a/src/content/docs/factories/self-hosting/index.mdx b/src/content/docs/factories/self-hosting/index.mdx new file mode 100644 index 000000000..1883bffd8 --- /dev/null +++ b/src/content/docs/factories/self-hosting/index.mdx @@ -0,0 +1,55 @@ +--- +title: Managed self-hosting for Warp Factories +description: >- + Run Warp Factories on your own infrastructure with a managed worker for + Docker, Kubernetes, or direct-host execution. +sidebar: + label: "Managed self-hosting" +--- +import { VARS } from '@data/vars'; + +Managed self-hosting runs factory work on infrastructure you control. A worker connects to Warp, receives work from your factory, and executes it in Docker containers, Kubernetes Jobs, or directly on the worker host. Repository clones, build artifacts, and execution workspaces stay on your infrastructure. + +:::note +Managed self-hosting is available to Enterprise teams. [Contact sales](https://www.warp.dev/contact-sales) to enable it for your team. +::: + +<a id="managed-architecture"></a> + +## How managed self-hosting works + +Run the `oz-agent-worker` daemon on infrastructure that can reach your repositories and internal services. The worker connects outbound to the {VARS.WARP_AUTOMATION_PLATFORM}, waits for factory work, and runs each task using the backend you configure. + +A managed worker is the self-hosted execution option for a factory. [Unmanaged execution](/platform/unmanaged-execution/) runs `oz agent run` directly from your own CI or infrastructure, but it cannot run factory work. + +<a id="choosing-a-managed-backend"></a> + +## Choose a backend + +* **Docker** - Run each factory task in an isolated container. Start with the [Docker quickstart](/factories/self-hosting/quickstart/) or see the [Docker backend](/factories/self-hosting/managed-docker/) for registries, volumes, and runtime configuration. +* **Kubernetes** - Run each task as a Kubernetes Job in your cluster. See the [Kubernetes backend](/factories/self-hosting/managed-kubernetes/) for Helm installation, RBAC, and pod configuration. +* **Direct** - Run tasks directly on the worker host when a container runtime is not available. See the [Direct backend](/factories/self-hosting/managed-direct/) for isolation and workspace requirements. + +## Data and network boundaries + +Managed self-hosting moves execution to your infrastructure. Warp still provides the service that coordinates runs, stores session data, and routes inference requests. Review [execution security](/platform/execution-security/) before connecting a worker to internal repositories or services. + +The worker requires outbound HTTPS access to Warp and any repositories, registries, and services that its tasks use. It does not require inbound firewall access. + +<a id="routing-runs-to-self-hosted-workers"></a> + +## Configure a factory to use a worker + +Define the worker host and a compatible runner in your [factory definition](/factories/factory-as-code/). The factory dashboard shows each configured runner and the worker that executes its work. Use the [worker reference](/factories/self-hosting/reference/) to configure the worker process and the [Factory dashboard](/factories/factory-dashboard/) to inspect its runs. + +## Monitor and troubleshoot workers + +[Worker monitoring](/factories/self-hosting/monitoring/) exports OpenTelemetry metrics for worker health, capacity, and task throughput. If a worker cannot connect or tasks remain queued, use [self-hosting troubleshooting](/factories/self-hosting/troubleshooting/). + +## Related pages + +* [Docker quickstart](/factories/self-hosting/quickstart/) - Start a managed worker with Docker. +* [Factory runners](/factories/runners/) - Choose the compute configuration for factory work. +* [Infrastructure and security](/factories/infrastructure-and-security/) - Configure execution, inference, storage, and credentials. +* [Worker reference](/factories/self-hosting/reference/) - Look up worker flags and configuration fields. +* [Execution security](/platform/execution-security/) - Review data boundaries and network requirements. diff --git a/src/content/docs/platform/self-hosting/managed-direct.mdx b/src/content/docs/factories/self-hosting/managed-direct.mdx similarity index 77% rename from src/content/docs/platform/self-hosting/managed-direct.mdx rename to src/content/docs/factories/self-hosting/managed-direct.mdx index 555c668c0..47e9917d9 100644 --- a/src/content/docs/platform/self-hosting/managed-direct.mdx +++ b/src/content/docs/factories/self-hosting/managed-direct.mdx @@ -11,7 +11,7 @@ import { VARS } from '@data/vars'; Run the `oz-agent-worker` daemon with the **Direct backend** — tasks execute directly on the worker host without Docker or Kubernetes. The {VARS.WARP_AUTOMATION_PLATFORM} still orchestrates runs end to end (Slack, Linear, schedules, API, `oz agent run-cloud`); the worker just runs the agent in a per-task workspace on its own filesystem. :::note -This page covers the [managed architecture](/platform/self-hosting/#managed-architecture) with the Direct backend. For container-based task isolation, see [Managed: Docker](/platform/self-hosting/managed-docker/) or [Managed: Kubernetes](/platform/self-hosting/managed-kubernetes/). For invocation-driven use cases, see [Unmanaged](/platform/self-hosting/unmanaged/). +This page covers the [managed architecture](/factories/self-hosting/#managed-architecture) with the Direct backend. For container-based task isolation, see [Managed: Docker](/factories/self-hosting/managed-docker/) or [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/). For invocation-driven use cases, see [Unmanaged](/platform/unmanaged-execution/). ::: ## When to use the Direct backend @@ -39,9 +39,9 @@ The Direct backend does not provide per-task container isolation. Each task runs * **Enterprise plan with self-hosting enabled** — [Contact sales](https://www.warp.dev/contact-sales) if self-hosting is not yet enabled for your team. * **A worker host** with write access to `workspace_root` (defaults to `/var/lib/oz/workspaces`). -* **The `oz-agent-worker` binary** installed on the worker host. The Direct backend runs the worker itself on the host rather than in a container, so install it via [Homebrew or a prebuilt binary](/platform/self-hosting/managed-docker/#install-and-run-the-worker). -* **The {VARS.WARP_AGENT_CLI}** installed and available in `PATH` on the worker host (or specify `oz_path` in the config file). See [Installing the CLI](/reference/cli/#installing-the-cli). -* **An agent API key** — Create one in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a> so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}. You can bind the key to any cloud agent — that choice doesn't restrict which agents can run on the worker. See [API Keys](/reference/cli/api-keys/) for the full creation flow. +* **The `oz-agent-worker` binary** installed on the worker host. The Direct backend runs the worker itself on the host rather than in a container, so install it via [Homebrew or a prebuilt binary](/factories/self-hosting/managed-docker/#install-and-run-the-worker). +* **The {VARS.WARP_AGENT_CLI}** installed and available in `PATH` on the worker host (or specify `oz_path` in the config file). See [Installing the CLI](/agents/cli/oz-cli/#installing-the-cli). +* **An agent API key** — Create one in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a> so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}. You can bind the key to any cloud agent — that choice doesn't restrict which agents can run on the worker. See [API Keys](/agents/cli/oz-cli/api-keys/) for the full creation flow. --- @@ -63,7 +63,7 @@ Pass `--backend direct`: oz-agent-worker --api-key "$WARP_API_KEY" --worker-id "my-worker" --backend direct ``` -Or with a [config file](/platform/self-hosting/reference/#config-file): +Or with a [config file](/factories/self-hosting/reference/#config-file): ```yaml worker_id: "my-worker" @@ -125,8 +125,8 @@ backend: ## Related pages -* [Self-hosted worker reference](/platform/self-hosting/reference/#direct-backend-config) — Full config schema for the Direct backend. -* [Self-hosting overview](/platform/self-hosting/) — Managed vs unmanaged and the backend decision guide. -* [Routing runs to self-hosted workers](/platform/self-hosting/#routing-runs-to-self-hosted-workers) — How to send tasks to your connected worker from the CLI, schedules, integrations, the API, and the web UI. -* [Security and networking](/platform/self-hosting/security-and-networking/) — Data boundaries and security considerations for the Direct backend. -* [Troubleshooting](/platform/self-hosting/troubleshooting/#direct-backend) — Common Direct-backend issues. +* [Self-hosted worker reference](/factories/self-hosting/reference/#direct-backend-config) — Full config schema for the Direct backend. +* [Self-hosting overview](/factories/self-hosting/) — Managed vs unmanaged and the backend decision guide. +* [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) — How to send tasks to your connected worker from the CLI, schedules, integrations, the API, and the web UI. +* [Security and networking](/platform/execution-security/) — Data boundaries and security considerations for the Direct backend. +* [Troubleshooting](/factories/self-hosting/troubleshooting/#direct-backend) — Common Direct-backend issues. diff --git a/src/content/docs/platform/self-hosting/managed-docker.mdx b/src/content/docs/factories/self-hosting/managed-docker.mdx similarity index 84% rename from src/content/docs/platform/self-hosting/managed-docker.mdx rename to src/content/docs/factories/self-hosting/managed-docker.mdx index 2ee278a35..436be6b59 100644 --- a/src/content/docs/platform/self-hosting/managed-docker.mdx +++ b/src/content/docs/factories/self-hosting/managed-docker.mdx @@ -11,7 +11,7 @@ import { VARS } from '@data/vars'; Run the `oz-agent-worker` daemon with the **Docker backend** — the default managed path. Each agent task runs in an isolated Docker container spawned from the worker, with full orchestration by the {VARS.WARP_AUTOMATION_PLATFORM} (Slack, Linear, schedules, API, `oz agent run-cloud`). :::note -This page covers the [managed architecture](/platform/self-hosting/#managed-architecture) with the Docker backend. For the Kubernetes backend, see [Managed: Kubernetes](/platform/self-hosting/managed-kubernetes/). For host execution without a container runtime, see [Managed: Direct](/platform/self-hosting/managed-direct/). If you'd rather invoke agents yourself, see [Unmanaged](/platform/self-hosting/unmanaged/). +This page covers the [managed architecture](/factories/self-hosting/#managed-architecture) with the Docker backend. For the Kubernetes backend, see [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/). For host execution without a container runtime, see [Managed: Direct](/factories/self-hosting/managed-direct/). If you'd rather invoke agents yourself, see [Unmanaged](/platform/unmanaged-execution/). ::: ## When to use the Docker backend @@ -27,7 +27,7 @@ This page covers the [managed architecture](/platform/self-hosting/#managed-arch * **Enterprise plan with self-hosting enabled** — [Contact sales](https://www.warp.dev/contact-sales) if self-hosting is not yet enabled for your team. * **A machine to run the worker** — A VM, server, or local machine running Linux (recommended for production). For testing, macOS and Windows hosts running Docker Desktop work. * **Docker installed** — The worker uses Docker to spawn task containers. The Docker daemon must run Linux containers (Windows containers are not supported). Verify with `docker info`. -* **An agent API key** — Create one in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a> so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}. You can bind the key to any cloud agent — that choice doesn't restrict which agents can run on the worker. See [API Keys](/reference/cli/api-keys/) for the full creation flow. +* **An agent API key** — Create one in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a> so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}. You can bind the key to any cloud agent — that choice doesn't restrict which agents can run on the worker. See [API Keys](/agents/cli/oz-cli/api-keys/) for the full creation flow. :::caution Task containers require a **linux/amd64** or **linux/arm64** Docker daemon. The worker host itself can be any OS — Docker Desktop on macOS and Windows runs a Linux VM that satisfies this requirement. @@ -59,7 +59,7 @@ The `oz-agent-worker` is open source. See the [oz-agent-worker repository](https There are three ways to install and run the worker: as a Docker container, via Homebrew, or as a prebuilt binary from GitHub Releases. Docker is the recommended default. -The worker can be configured entirely via CLI flags, or via a YAML [config file](/platform/self-hosting/reference/#config-file) for more complex setups. +The worker can be configured entirely via CLI flags, or via a YAML [config file](/factories/self-hosting/reference/#config-file) for more complex setups. ### Option 1: Docker (recommended) @@ -104,7 +104,7 @@ You can run multiple workers with the same `--worker-id` for redundancy — the ## Docker backend configuration -The worker can take configuration either via CLI flags or via a YAML [config file](/platform/self-hosting/reference/#config-file). CLI flags take precedence over config file values. +The worker can take configuration either via CLI flags or via a YAML [config file](/factories/self-hosting/reference/#config-file). CLI flags take precedence over config file values. **Common CLI flags:** @@ -152,7 +152,7 @@ backend: - name: GITHUB_TOKEN # inherits from host environment ``` -Pass it with `--config-file config.yaml`. See the [self-hosted worker reference](/platform/self-hosting/reference/) for the full flag and config schema. +Pass it with `--config-file config.yaml`. See the [self-hosted worker reference](/factories/self-hosting/reference/) for the full flag and config schema. --- @@ -212,14 +212,14 @@ Sidecar images (the `oz` binary and dependencies) are pulled from public registr ## Routing runs to this worker -Once your Docker worker is connected, route tasks to it with `--host "<your-worker-id>"`. Routing is the same across all managed backends — see [Routing runs to self-hosted workers](/platform/self-hosting/#routing-runs-to-self-hosted-workers) for CLI, scheduled, integration, API, and web UI examples. +Once your Docker worker is connected, route tasks to it with `--host "<your-worker-id>"`. Routing is the same across all managed backends — see [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) for CLI, scheduled, integration, API, and web UI examples. --- ## Related pages -* [Self-hosting quickstart](/platform/self-hosting/quickstart/) — ~10-minute path to a running Docker worker. -* [Self-hosted worker reference](/platform/self-hosting/reference/) — Full CLI flag and config file schema. +* [Self-hosting quickstart](/factories/self-hosting/quickstart/) — ~10-minute path to a running Docker worker. +* [Self-hosted worker reference](/factories/self-hosting/reference/) — Full CLI flag and config file schema. * [Environments](/platform/environments/) — Define the Docker image, repos, and setup commands for tasks. -* [Security and networking](/platform/self-hosting/security-and-networking/) — Data boundaries, egress, and Docker socket considerations. -* [Troubleshooting](/platform/self-hosting/troubleshooting/) — Common issues with the Docker backend. +* [Security and networking](/platform/execution-security/) — Data boundaries, egress, and Docker socket considerations. +* [Troubleshooting](/factories/self-hosting/troubleshooting/) — Common issues with the Docker backend. diff --git a/src/content/docs/platform/self-hosting/managed-kubernetes.mdx b/src/content/docs/factories/self-hosting/managed-kubernetes.mdx similarity index 86% rename from src/content/docs/platform/self-hosting/managed-kubernetes.mdx rename to src/content/docs/factories/self-hosting/managed-kubernetes.mdx index f13bb13b3..f1659e7ee 100644 --- a/src/content/docs/platform/self-hosting/managed-kubernetes.mdx +++ b/src/content/docs/factories/self-hosting/managed-kubernetes.mdx @@ -11,7 +11,7 @@ import { VARS } from '@data/vars'; Deploy the `oz-agent-worker` daemon into a Kubernetes cluster using the included Helm chart. Each agent task runs as a **Kubernetes Job** in your cluster. The {VARS.WARP_AUTOMATION_PLATFORM} orchestrates runs end to end (Slack, Linear, schedules, API, `oz agent run-cloud`); your cluster provides the compute, scheduling, and policy enforcement. :::note -This page covers the [managed architecture](/platform/self-hosting/#managed-architecture) with the Kubernetes backend. For the default Docker backend, see [Managed: Docker](/platform/self-hosting/managed-docker/). For host execution without a container runtime, see [Managed: Direct](/platform/self-hosting/managed-direct/). To route runs to a connected worker, see [Routing runs to this worker](/platform/self-hosting/managed-docker/#routing-runs-to-this-worker). +This page covers the [managed architecture](/factories/self-hosting/#managed-architecture) with the Kubernetes backend. For the default Docker backend, see [Managed: Docker](/factories/self-hosting/managed-docker/). For host execution without a container runtime, see [Managed: Direct](/factories/self-hosting/managed-direct/). To route runs to a connected worker, see [Routing runs to this worker](/factories/self-hosting/managed-docker/#routing-runs-to-this-worker). ::: ## When to use the Kubernetes backend @@ -39,7 +39,7 @@ This page covers the [managed architecture](/platform/self-hosting/#managed-arch * Allow the worker's namespace to create Jobs with a **root init container** (sidecar materialization depends on this pattern). * Grant the worker these namespace-scoped permissions: `create`, `get`, `list`, `watch`, `delete` on `jobs`; `get`, `list`, `watch` on `pods`; `get` on `pods/log`; `list` on `events`. * **[Helm](https://helm.sh/docs/intro/install/)** installed locally, plus `kubectl` authenticated against the target cluster. -* **An agent API key** — Create one in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a> so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}. You can bind the key to any cloud agent — that choice doesn't restrict which agents can run on the worker. See [API Keys](/reference/cli/api-keys/) for the full creation flow. +* **An agent API key** — Create one in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a> so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}. You can bind the key to any cloud agent — that choice doesn't restrict which agents can run on the worker. See [API Keys](/agents/cli/oz-cli/api-keys/) for the full creation flow. --- @@ -134,7 +134,7 @@ To scale horizontally, deploy multiple Helm releases with distinct worker IDs ra * `kubernetesBackend.extraAnnotations` — Additional annotations for task Jobs and Pods. * `kubernetesBackend.activeDeadlineSeconds` — Maximum task Job lifetime. * `kubernetesBackend.workspaceSizeLimit` — Size limit for workspace `emptyDir` volume. -* `kubernetesBackend.podTemplate` — Raw PodSpec YAML for task Jobs (same as `backend.kubernetes.pod_template` in the [config file](/platform/self-hosting/reference/#config-file)). +* `kubernetesBackend.podTemplate` — Raw PodSpec YAML for task Jobs (same as `backend.kubernetes.pod_template` in the [config file](/factories/self-hosting/reference/#config-file)). **API key Secret:** @@ -143,7 +143,7 @@ To scale horizontally, deploy multiple Helm releases with distinct worker IDs ra * `warp.apiKeySecret.name` — Name of the Secret containing `WARP_API_KEY`. Defaults to `oz-agent-worker`. * `warp.apiKeySecret.key` — Key within the Secret. Defaults to `WARP_API_KEY`. -See the [self-hosted worker reference](/platform/self-hosting/reference/#kubernetes-backend-config) for the full config file schema. +See the [self-hosted worker reference](/factories/self-hosting/reference/#kubernetes-backend-config) for the full config file schema. --- @@ -230,7 +230,7 @@ If your organization uses an external secrets manager (HashiCorp Vault, AWS Secr ## Setup and teardown commands -Use `kubernetesBackend.setupCommand` (Helm value) or `backend.kubernetes.setup_command` ([config file](/platform/self-hosting/reference/#kubernetes-backend-config)) to run a shell command before each task. Use `teardownCommand` / `teardown_command` for cleanup after the task finishes. These run inside the task Pod and are useful for workspace bootstrapping or post-run reporting. +Use `kubernetesBackend.setupCommand` (Helm value) or `backend.kubernetes.setup_command` ([config file](/factories/self-hosting/reference/#kubernetes-backend-config)) to run a shell command before each task. Use `teardownCommand` / `teardown_command` for cleanup after the task finishes. These run inside the task Pod and are useful for workspace bootstrapping or post-run reporting. --- @@ -250,7 +250,7 @@ With the default `metrics.exporter=prometheus`, the chart creates a `Service` wi To push metrics to an OTLP collector instead, set `metrics.exporter=otlp` and configure the endpoint via `metrics.extraEnv`. -See [Monitoring](/platform/self-hosting/monitoring/) for the full list of Helm values, the metric catalog, and sample PromQL queries. +See [Monitoring](/factories/self-hosting/monitoring/) for the full list of Helm values, the metric catalog, and sample PromQL queries. --- @@ -266,10 +266,10 @@ See [Monitoring](/platform/self-hosting/monitoring/) for the full list of Helm v ## Related pages -* [Self-hosted worker reference](/platform/self-hosting/reference/) — Full CLI flag and config file schema, including every Kubernetes backend field. -* [Self-hosting overview](/platform/self-hosting/) — Managed vs unmanaged and the backend decision guide. -* [Routing runs to this worker](/platform/self-hosting/#routing-runs-to-self-hosted-workers) — How to send tasks to your connected worker from the CLI, schedules, integrations, the API, and the web UI. +* [Self-hosted worker reference](/factories/self-hosting/reference/) — Full CLI flag and config file schema, including every Kubernetes backend field. +* [Self-hosting overview](/factories/self-hosting/) — Managed vs unmanaged and the backend decision guide. +* [Routing runs to this worker](/factories/self-hosting/#routing-runs-to-self-hosted-workers) — How to send tasks to your connected worker from the CLI, schedules, integrations, the API, and the web UI. * [Environments](/platform/environments/) — Define the task image, repos, and setup commands. -* [Monitoring](/platform/self-hosting/monitoring/) — OpenTelemetry metrics, including Helm chart metrics values. -* [Security and networking](/platform/self-hosting/security-and-networking/) — RBAC, admission policies, and data boundaries. -* [Troubleshooting](/platform/self-hosting/troubleshooting/#kubernetes-backend) — Common Kubernetes-backend issues. +* [Monitoring](/factories/self-hosting/monitoring/) — OpenTelemetry metrics, including Helm chart metrics values. +* [Security and networking](/platform/execution-security/) — RBAC, admission policies, and data boundaries. +* [Troubleshooting](/factories/self-hosting/troubleshooting/#kubernetes-backend) — Common Kubernetes-backend issues. diff --git a/src/content/docs/platform/self-hosting/monitoring.mdx b/src/content/docs/factories/self-hosting/monitoring.mdx similarity index 92% rename from src/content/docs/platform/self-hosting/monitoring.mdx rename to src/content/docs/factories/self-hosting/monitoring.mdx index d9263e2bf..b479e1e28 100644 --- a/src/content/docs/platform/self-hosting/monitoring.mdx +++ b/src/content/docs/factories/self-hosting/monitoring.mdx @@ -78,7 +78,7 @@ The worker pushes metrics at the SDK's default interval. Configure the collector ## Helm chart configuration -The [Helm chart](/platform/self-hosting/managed-kubernetes/) includes built-in support for metrics. Enable metrics with `metrics.enabled=true`: +The [Helm chart](/factories/self-hosting/managed-kubernetes/) includes built-in support for metrics. Enable metrics with `metrics.enabled=true`: ```bash helm install oz-agent-worker ./charts/oz-agent-worker \ @@ -219,8 +219,8 @@ metrics: ## Related pages -* [Self-hosting overview](/platform/self-hosting/) — Architecture, decision guide, and Enterprise requirements. -* [Self-hosted worker reference](/platform/self-hosting/reference/) — CLI flags, config file schema, and metrics environment variables. -* [Managed: Kubernetes](/platform/self-hosting/managed-kubernetes/) — Helm chart deployment, including metrics values. -* [Troubleshooting](/platform/self-hosting/troubleshooting/) — Diagnostics for metrics issues and other common problems. -* [Security and networking](/platform/self-hosting/security-and-networking/) — Network egress and data boundaries. +* [Self-hosting overview](/factories/self-hosting/) — Architecture, decision guide, and Enterprise requirements. +* [Self-hosted worker reference](/factories/self-hosting/reference/) — CLI flags, config file schema, and metrics environment variables. +* [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/) — Helm chart deployment, including metrics values. +* [Troubleshooting](/factories/self-hosting/troubleshooting/) — Diagnostics for metrics issues and other common problems. +* [Security and networking](/platform/execution-security/) — Network egress and data boundaries. diff --git a/src/content/docs/platform/self-hosting/quickstart.mdx b/src/content/docs/factories/self-hosting/quickstart.mdx similarity index 73% rename from src/content/docs/platform/self-hosting/quickstart.mdx rename to src/content/docs/factories/self-hosting/quickstart.mdx index 67deebce4..f30a91205 100644 --- a/src/content/docs/platform/self-hosting/quickstart.mdx +++ b/src/content/docs/factories/self-hosting/quickstart.mdx @@ -11,7 +11,7 @@ import { VARS } from '@data/vars'; Run your first cloud agent on your own infrastructure in ~10 minutes using the managed architecture with the Docker backend — the default and fastest path to self-hosting. :::note -This quickstart sets up the [managed architecture](/platform/self-hosting/#managed-architecture), where the {VARS.WARP_AUTOMATION_PLATFORM} orchestrates the agent and your worker provides the compute. **Prefer a CLI-only path with no Docker requirement?** Jump to the [Unmanaged quickstart](/platform/self-hosting/unmanaged/#unmanaged-quickstart) to run `oz agent run` directly on any host. +This quickstart sets up the [managed architecture](/factories/self-hosting/#managed-architecture), where the {VARS.WARP_AUTOMATION_PLATFORM} orchestrates the agent and your worker provides the compute. **Prefer a CLI-only path with no Docker requirement?** Jump to the [Unmanaged quickstart](/platform/unmanaged-execution/#unmanaged-quickstart) to run `oz agent run` directly on any host. ::: --- @@ -20,8 +20,8 @@ This quickstart sets up the [managed architecture](/platform/self-hosting/#manag * **Enterprise plan with self-hosting enabled** — [Contact sales](https://www.warp.dev/contact-sales) if self-hosting is not yet enabled for your team. * **A Linux machine with Docker** — A VM, server, or local machine with the Docker daemon running Linux containers. Verify with `docker info`. Docker Desktop on macOS or Windows works for testing. -* **An agent API key** — Create one in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a> so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}. You can bind the key to any cloud agent — that choice doesn't restrict which agents can run on the worker. See [API Keys](/reference/cli/api-keys/) for the full creation flow. -* **The {VARS.WARP_AGENT_CLI}** (for routing a test run) — See [Installing the CLI](/reference/cli/#installing-the-cli). +* **An agent API key** — Create one in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a> so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}. You can bind the key to any cloud agent — that choice doesn't restrict which agents can run on the worker. See [API Keys](/agents/cli/oz-cli/api-keys/) for the full creation flow. +* **The {VARS.WARP_AGENT_CLI}** (for routing a test run) — See [Installing the CLI](/agents/cli/oz-cli/#installing-the-cli). --- @@ -71,12 +71,12 @@ Open the <a href={VARS.WEB_APP_URL}>{VARS.DASHBOARD}</a>, find the new task, and ## Next steps -* [Unmanaged quickstart](/platform/self-hosting/unmanaged/#unmanaged-quickstart) — ~5-minute CLI-only path: run `oz agent run` in your CI, Kubernetes pod, or dev box with no worker daemon and no Docker requirement. -* [Managed: Docker](/platform/self-hosting/managed-docker/) — Full Docker backend setup, including private registries, volume mounts, and runtime configuration. +* [Unmanaged quickstart](/platform/unmanaged-execution/#unmanaged-quickstart) — ~5-minute CLI-only path: run `oz agent run` in your CI, Kubernetes pod, or dev box with no worker daemon and no Docker requirement. +* [Managed: Docker](/factories/self-hosting/managed-docker/) — Full Docker backend setup, including private registries, volume mounts, and runtime configuration. * [Environments](/platform/environments/) — Define a repository, Docker image, and setup commands so agents have a reproducible workspace for every run. -* [Routing runs to self-hosted workers](/platform/self-hosting/#routing-runs-to-self-hosted-workers) — How to route tasks from schedules, integrations (Slack, Linear), the API, and the {VARS.WEB_APP}. -* [Managed: Kubernetes](/platform/self-hosting/managed-kubernetes/) — Deploy workers into a Kubernetes cluster with Helm. -* [Self-hosted worker reference](/platform/self-hosting/reference/) — All CLI flags and config file options. +* [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) — How to route tasks from schedules, integrations (Slack, Linear), the API, and the {VARS.WEB_APP}. +* [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/) — Deploy workers into a Kubernetes cluster with Helm. +* [Self-hosted worker reference](/factories/self-hosting/reference/) — All CLI flags and config file options. ## Troubleshooting @@ -89,4 +89,4 @@ Verify your API key has team scope. Ensure the machine has outbound internet acc **Task stays queued and never runs**\ Confirm the `--host` value you passed to `oz agent run-cloud` matches your `--worker-id` exactly (case-sensitive). Check that the worker's team matches the team creating the task. -For more, see [Troubleshooting](/platform/self-hosting/troubleshooting/). +For more, see [Troubleshooting](/factories/self-hosting/troubleshooting/). diff --git a/src/content/docs/platform/self-hosting/reference.mdx b/src/content/docs/factories/self-hosting/reference.mdx similarity index 83% rename from src/content/docs/platform/self-hosting/reference.mdx rename to src/content/docs/factories/self-hosting/reference.mdx index c5ced7a2d..ae0e017a2 100644 --- a/src/content/docs/platform/self-hosting/reference.mdx +++ b/src/content/docs/factories/self-hosting/reference.mdx @@ -5,10 +5,10 @@ description: >- file schema for the Docker, Kubernetes, and Direct backends. --- -Reference for the `oz-agent-worker` daemon: CLI flags and the full YAML config-file schema for all three [managed backends](/platform/self-hosting/#managed-architecture) — Docker, Kubernetes, and Direct. For installation instructions, see [Install and run the worker](/platform/self-hosting/managed-docker/#install-and-run-the-worker). +Reference for the `oz-agent-worker` daemon: CLI flags and the full YAML config-file schema for all three [managed backends](/factories/self-hosting/#managed-architecture) — Docker, Kubernetes, and Direct. For installation instructions, see [Install and run the worker](/factories/self-hosting/managed-docker/#install-and-run-the-worker). :::note -This page documents every flag and config option. For installation and backend-specific setup walkthroughs, see [Managed: Docker](/platform/self-hosting/managed-docker/), [Managed: Kubernetes](/platform/self-hosting/managed-kubernetes/), or [Managed: Direct](/platform/self-hosting/managed-direct/). This reference applies to the managed architecture only; the [unmanaged architecture](/platform/self-hosting/unmanaged/) uses `oz agent run` instead. +This page documents every flag and config option. For installation and backend-specific setup walkthroughs, see [Managed: Docker](/factories/self-hosting/managed-docker/), [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/), or [Managed: Direct](/factories/self-hosting/managed-direct/). This reference applies to the managed architecture only; the [unmanaged architecture](/platform/unmanaged-execution/) uses `oz agent run` instead. ::: --- @@ -25,7 +25,7 @@ The following flags are available when starting the worker. ### Optional * `--config-file` — Path to a YAML [config file](#config-file). CLI flags take precedence over config file values. -* `--backend` — Backend type: `docker` (default), `kubernetes`, or `direct`. See [Managed: Kubernetes](/platform/self-hosting/managed-kubernetes/) and [Managed: Direct](/platform/self-hosting/managed-direct/) for backend-specific setup. +* `--backend` — Backend type: `docker` (default), `kubernetes`, or `direct`. See [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/) and [Managed: Direct](/factories/self-hosting/managed-direct/) for backend-specific setup. * `--log-level` — Log verbosity. One of `debug`, `info`, `warn`, `error`. Defaults to `info`. * `--no-cleanup` — Keep task containers, Kubernetes Jobs, or workspace directories after execution instead of removing them. Useful for debugging failed tasks. * `-v` / `--volumes` — Mount host directories into task containers (Docker backend only). Format: `HOST_PATH:CONTAINER_PATH` or `HOST_PATH:CONTAINER_PATH:MODE` (where MODE is `ro` or `rw`). Can be specified multiple times. @@ -185,22 +185,22 @@ The worker exports metrics over OpenTelemetry when configured. Exporter selectio * `OTEL_EXPORTER_OTLP_ENDPOINT` — OTLP collector endpoint (e.g., `http://otel-collector.observability.svc:4318`). * `OTEL_EXPORTER_OTLP_PROTOCOL` — OTLP protocol: `http/protobuf` (default) or `grpc`. -When deploying with the Helm chart, use the `metrics.*` values instead of setting these variables manually. See [Monitoring](/platform/self-hosting/monitoring/) for the full setup guide, metric catalog, Helm values, and sample PromQL queries. +When deploying with the Helm chart, use the `metrics.*` values instead of setting these variables manually. See [Monitoring](/factories/self-hosting/monitoring/) for the full setup guide, metric catalog, Helm values, and sample PromQL queries. --- ## Routing runs to self-hosted workers -Once a worker is running, route cloud agent runs to it with the `--host` flag or its equivalents. See [Routing runs to self-hosted workers](/platform/self-hosting/#routing-runs-to-self-hosted-workers) for examples across the CLI, schedules, integrations, the API, and the web UI. +Once a worker is running, route cloud agent runs to it with the `--host` flag or its equivalents. See [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) for examples across the CLI, schedules, integrations, the API, and the web UI. --- ## Related pages -* [Managed: Docker](/platform/self-hosting/managed-docker/) — Docker backend setup, connectivity, and private registries. -* [Managed: Kubernetes](/platform/self-hosting/managed-kubernetes/) — Kubernetes backend setup, Helm chart, pod template, and operational notes. -* [Managed: Direct](/platform/self-hosting/managed-direct/) — Direct backend setup and workspace model. -* [Self-hosting overview](/platform/self-hosting/) — Architecture, decision guide, and Enterprise requirements. +* [Managed: Docker](/factories/self-hosting/managed-docker/) — Docker backend setup, connectivity, and private registries. +* [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/) — Kubernetes backend setup, Helm chart, pod template, and operational notes. +* [Managed: Direct](/factories/self-hosting/managed-direct/) — Direct backend setup and workspace model. +* [Self-hosting overview](/factories/self-hosting/) — Architecture, decision guide, and Enterprise requirements. * [Environments](/platform/environments/) — Define the Docker image, repos, and setup commands used by task containers. -* [Monitoring](/platform/self-hosting/monitoring/) — OpenTelemetry metrics for worker health, task throughput, and capacity. -* [Troubleshooting](/platform/self-hosting/troubleshooting/) — Worker and task failure diagnostics. +* [Monitoring](/factories/self-hosting/monitoring/) — OpenTelemetry metrics for worker health, task throughput, and capacity. +* [Troubleshooting](/factories/self-hosting/troubleshooting/) — Worker and task failure diagnostics. diff --git a/src/content/docs/platform/self-hosting/troubleshooting.mdx b/src/content/docs/factories/self-hosting/troubleshooting.mdx similarity index 86% rename from src/content/docs/platform/self-hosting/troubleshooting.mdx rename to src/content/docs/factories/self-hosting/troubleshooting.mdx index 2a53f2b64..e19638b85 100644 --- a/src/content/docs/platform/self-hosting/troubleshooting.mdx +++ b/src/content/docs/factories/self-hosting/troubleshooting.mdx @@ -11,7 +11,7 @@ import { VARS } from '@data/vars'; Diagnostic guides for the `oz-agent-worker` daemon and its task execution. Use this page when a worker won't start, won't connect, tasks stay queued, or tasks fail. :::note -The steps below apply to the [managed architecture](/platform/self-hosting/#managed-architecture) (`oz-agent-worker` daemon). For [unmanaged](/platform/self-hosting/unmanaged/) deployments, refer to the documentation for the environment running `oz agent run` (e.g., GitHub Actions, Kubernetes). +The steps below apply to the [managed architecture](/factories/self-hosting/#managed-architecture) (`oz-agent-worker` daemon). For [unmanaged](/platform/unmanaged-execution/) deployments, refer to the documentation for the environment running `oz agent run` (e.g., GitHub Actions, Kubernetes). ::: --- @@ -46,7 +46,7 @@ The steps below apply to the [managed architecture](/platform/self-hosting/#mana **Fix:** -1. Install the {VARS.WARP_AGENT_CLI} on the worker host. See [Installing the CLI](/reference/cli/#installing-the-cli). +1. Install the {VARS.WARP_AGENT_CLI} on the worker host. See [Installing the CLI](/agents/cli/oz-cli/#installing-the-cli). 2. If the CLI isn't on `PATH`, set `oz_path` in the config file to the absolute path of the `oz` binary. --- @@ -63,7 +63,7 @@ The steps below apply to the [managed architecture](/platform/self-hosting/#mana 4. Check that no firewall rules are blocking WebSocket connections to `wss://oz.warp.dev`. 5. Increase log verbosity with `--log-level debug` to see connection details. -See [Security and networking](/platform/self-hosting/security-and-networking/#network-requirements) for the full list of outbound endpoints the worker needs. +See [Security and networking](/platform/execution-security/#network-requirements) for the full list of outbound endpoints the worker needs. --- @@ -93,7 +93,7 @@ See [Security and networking](/platform/self-hosting/security-and-networking/#ne 6. If using `metrics.podMonitor.create=true`, verify the `monitoring.coreos.com` CRDs are installed in the cluster. The `PodMonitor` resource requires the Prometheus Operator. 7. Restart the worker with `--log-level debug` and look for metrics-related error messages at startup. -See [Monitoring](/platform/self-hosting/monitoring/) for the full setup guide. +See [Monitoring](/factories/self-hosting/monitoring/) for the full setup guide. --- @@ -133,7 +133,7 @@ See [Monitoring](/platform/self-hosting/monitoring/) for the full setup guide. ### Docker backend (image pull) -1. If using a private registry, ensure Docker credentials are available to the worker. See [Private Docker registries](/platform/self-hosting/managed-docker/#private-docker-registries). +1. If using a private registry, ensure Docker credentials are available to the worker. See [Private Docker registries](/factories/self-hosting/managed-docker/#private-docker-registries). 2. Try pulling the image manually on the worker host: `docker pull <image>`. ### Kubernetes backend (image pull) @@ -150,7 +150,7 @@ See [Monitoring](/platform/self-hosting/monitoring/) for the full setup guide. ## Related pages -* [Self-hosting overview](/platform/self-hosting/) — Architecture and decision guide. -* [Self-hosted worker reference](/platform/self-hosting/reference/) — CLI flags and config schema, including every flag mentioned here. -* [Security and networking](/platform/self-hosting/security-and-networking/) — Outbound endpoints the worker needs. +* [Self-hosting overview](/factories/self-hosting/) — Architecture and decision guide. +* [Self-hosted worker reference](/factories/self-hosting/reference/) — CLI flags and config schema, including every flag mentioned here. +* [Security and networking](/platform/execution-security/) — Outbound endpoints the worker needs. * [Agent Session Sharing](/agents/local-agents/session-sharing/) — Attach to running tasks to debug interactively. diff --git a/src/content/docs/platform/warp-hosting.mdx b/src/content/docs/factories/warp-hosting.mdx similarity index 94% rename from src/content/docs/platform/warp-hosting.mdx rename to src/content/docs/factories/warp-hosting.mdx index 3b7ee8010..11bc60b6c 100644 --- a/src/content/docs/platform/warp-hosting.mdx +++ b/src/content/docs/factories/warp-hosting.mdx @@ -52,4 +52,4 @@ Warp's hosted agents have network egress enabled by default. Outgoing requests m ## Related pages * [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) - Learn how Warp-hosted agents fit into the {VARS.WARP_AUTOMATION_PLATFORM}. -* [Self-hosting](/platform/self-hosting/) - Run agents on infrastructure you manage when execution must stay inside your network. +* [Self-hosting](/factories/self-hosting/) - Run agents on infrastructure you manage when execution must stay inside your network. diff --git a/src/content/docs/guides/agent-workflows/build-a-triage-agent.mdx b/src/content/docs/guides/agent-workflows/build-a-triage-agent.mdx index 6287a6f7d..af83db49c 100644 --- a/src/content/docs/guides/agent-workflows/build-a-triage-agent.mdx +++ b/src/content/docs/guides/agent-workflows/build-a-triage-agent.mdx @@ -18,7 +18,7 @@ Learn how to use the {VARS.WARP_AUTOMATION_PLATFORM} to build a triage agent tha * A Warp account ([sign up at warp.dev](https://www.warp.dev)) * A GitHub repository with Issues enabled * A cloud environment with access to your repository ([create one](/platform/environments/configuring-environments/#create-an-environment-with-guided-setup)) -* A Warp API key added to your CI secrets as `WARP_API_KEY` ([create one](/reference/cli/api-keys/#from-the-web-app-recommended)) +* A Warp API key added to your CI secrets as `WARP_API_KEY` ([create one](/agents/cli/oz-cli/api-keys/#from-the-web-app-recommended)) ## 1. Define your triage criteria @@ -71,7 +71,7 @@ oz agent run \ The `--share` flag generates a session link your team can use to inspect what the agent did. Review the session output to confirm that the labels and comments are what you expect. If something is wrong, refine the skill file and run again. -For the full reference of `oz agent run` flags, see the [{VARS.WARP_AGENT_CLI} reference](/reference/cli/). +For the full reference of `oz agent run` flags, see the [{VARS.WARP_AGENT_CLI} reference](/agents/cli/oz-cli/). ## 4. Deploy with GitHub Actions diff --git a/src/content/docs/guides/agent-workflows/how-to-run-unattended-agents.mdx b/src/content/docs/guides/agent-workflows/how-to-run-unattended-agents.mdx index 55234b5f7..b41efbb88 100644 --- a/src/content/docs/guides/agent-workflows/how-to-run-unattended-agents.mdx +++ b/src/content/docs/guides/agent-workflows/how-to-run-unattended-agents.mdx @@ -28,8 +28,8 @@ Use this table to decide where an unattended agent should start. | Linear | An issue, comment, or assignment should start the agent. | [Linear integration](/platform/integrations/linear/) | Linear issue updates, {VARS.WEB_APP} Runs page, Agent Management Panel in the Warp app, and the shared run session | | GitHub | Someone should delegate work by mentioning `@warp-agent` on an issue, pull request, or review comment. | [GitHub integration](/platform/integrations/github/) | GitHub thread comments, {VARS.WEB_APP} Runs page, Agent Management Panel in the Warp app, and the shared run session | | GitHub Actions | A repository event, PR workflow, issue workflow, or CI failure should start the agent. | [GitHub Actions](/platform/integrations/github-actions/) | GitHub Actions logs, PR or issue comments, {VARS.WEB_APP}, and cloud agent runs | -| {VARS.WARP_AGENT_CLI} | You want to start a named cloud run from a terminal, script, or local automation. | [{VARS.WARP_AGENT_CLI}](/reference/cli/#running-agents-remotely-oz-agent-run-cloud) | CLI output, {VARS.WEB_APP} Runs page, Agent Management Panel in the Warp app, and cloud agent session links | -| {VARS.API_SDK_NAME} | Your internal system should create, query, or monitor runs programmatically. | [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) | Your system, API results, {VARS.WEB_APP}, and run sessions | +| {VARS.WARP_AGENT_CLI} | You want to start a named cloud run from a terminal, script, or local automation. | [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/#running-agents-remotely-oz-agent-run-cloud) | CLI output, {VARS.WEB_APP} Runs page, Agent Management Panel in the Warp app, and cloud agent session links | +| {VARS.API_SDK_NAME} | Your internal system should create, query, or monitor runs programmatically. | [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) | Your system, API results, {VARS.WEB_APP}, and run sessions | ## Choose a workflow pattern @@ -82,7 +82,7 @@ The GitHub Action can pass event data, prior step output, and repository context ### Start runs from scripts or internal systems -Use the [{VARS.WARP_AGENT_CLI}](/reference/cli/#running-agents-remotely-oz-agent-run-cloud) for scripts and terminal workflows. Use the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) when another service should create or monitor runs. This is useful for: +Use the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/#running-agents-remotely-oz-agent-run-cloud) for scripts and terminal workflows. Use the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) when another service should create or monitor runs. This is useful for: * internal dashboards * custom webhooks @@ -112,7 +112,7 @@ Unattended does not mean invisible. Use these surfaces to review what happened: * [{VARS.WEB_APP}](/platform/oz-web-app/) - View runs, schedules, run metadata, and session transcripts from a browser or mobile device. * [Managing cloud agents](/platform/managing-cloud-agents/) - Filter runs by source, status, day, creator, or trigger. * [Cloud agent session sharing](/platform/viewing-cloud-agent-runs/) - Inspect the prompt, plan, commands, logs, output, and follow-up messages where available. -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) - Query runs and build internal monitoring around status, runtime, or outcomes. +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - Query runs and build internal monitoring around status, runtime, or outcomes. When a run creates a PR, include the cloud run link in the PR description or a comment. See [Attach agent session context to GitHub PRs](/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs/) for a template. diff --git a/src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx b/src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx index 6167264f4..55588cff3 100644 --- a/src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx +++ b/src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx @@ -31,7 +31,7 @@ The practical difference: * **Team visibility** — Any teammate can open a run in the {VARS.WEB_APP} to inspect the session transcript, steer a stuck agent, or pick up where the agent left off. * **Scale without contention** — Multiple triage runs can execute in parallel without fighting over a shared dev box, local git checkouts, or CPU. -See [Deployment patterns](/platform/deployment-patterns) for a full comparison of {VARS.WARP_AUTOMATION_PLATFORM}-hosted, CLI-based, and self-hosted execution patterns. +See [Deployment patterns](/factories/deployment-patterns) for a full comparison of {VARS.WARP_AUTOMATION_PLATFORM}-hosted, CLI-based, and self-hosted execution patterns. ## 1. Set up a cloud environment @@ -67,7 +67,7 @@ With GitHub Actions, your factory already has event-based triggers. The {VARS.WA * **Slack** — Teammates can kick off a run by mentioning `@warp` in a Slack thread. Useful for one-off requests that don't need the full label workflow. See [Slack integration](/platform/integrations/slack). * **Linear** — When an issue in Linear reaches a specific status, a cloud agent run starts automatically. Useful for teams that track work in Linear rather than GitHub Issues. See [Linear integration](/platform/integrations/linear). * **Scheduled agents** — For the outer improvement loop (which runs on a cadence rather than an event), use a scheduled cloud agent. See [Scheduled agents](/platform/triggers/scheduled-agents). -* **{VARS.API_SDK_NAME}** — For custom triggers — webhooks, internal dashboards, other events — use the [{VARS.API_SDK_NAME}](/reference/api-and-sdk) to start runs programmatically. +* **{VARS.API_SDK_NAME}** — For custom triggers — webhooks, internal dashboards, other events — use the [{VARS.API_SDK_NAME}](/factories/api-and-sdk) to start runs programmatically. ## 4. Monitor factory runs @@ -100,5 +100,5 @@ See [Multi-agent orchestration](/platform/orchestration) for fan-out, sharding, * [Infrastructure and security](/factories/infrastructure-and-security/) — The environment, runner, and credential model behind the concerns you configured by hand here. * [Build a self-improving agent](/guides/agent-workflows/build-a-self-improving-agent) — Add the outer improvement loop on a schedule. * [Environments](/platform/environments) — Full reference for cloud agent environments. -* [Deployment patterns](/platform/deployment-patterns) — Choose the right architecture for your team. -* [Self-hosting](/platform/self-hosting) — Run cloud agent workers on your own infrastructure when code must stay on-premises. +* [Deployment patterns](/factories/deployment-patterns) — Choose the right architecture for your team. +* [Self-hosting](/factories/self-hosting) — Run cloud agent workers on your own infrastructure when code must stay on-premises. diff --git a/src/content/docs/guides/external-tools/build-a-mattermost-bot-for-warp-factories.mdx b/src/content/docs/guides/external-tools/build-a-mattermost-bot-for-warp-factories.mdx index b2eaa33d0..c15261df9 100644 --- a/src/content/docs/guides/external-tools/build-a-mattermost-bot-for-warp-factories.mdx +++ b/src/content/docs/guides/external-tools/build-a-mattermost-bot-for-warp-factories.mdx @@ -13,8 +13,8 @@ Build a Mattermost bot that sends work to a [Warp factory](/factories/) and post ## Prerequisites * **A Warp Factories factory** - [Set up a factory](/factories/quickstart/) before starting; this guide dispatches work to an existing factory rather than creating one. -* **A Warp API key** - Create an [agent API key](/reference/cli/api-keys/#personal-vs-agent-keys) rather than a personal key, so the bot's requests aren't tied to your individual account. -* **A Mattermost bot account and access token** - Create one from your Mattermost System Console under **Integrations** > **Bot Accounts**, and generate a personal access token for it. Mattermost's own [bot accounts documentation](https://developers.mattermost.com/integrate/reference/bot-accounts/) covers the exact steps, since they vary by Mattermost version and hosting setup. +* **A Warp API key** - Create an [agent API key](/agents/cli/oz-cli/api-keys/#personal-vs-agent-keys) rather than a personal key, so the bot's requests aren't tied to your individual account. +* **A Mattermost bot account and access token** - Create one from your Mattermost System Console under **Integrations** > **Bot Accounts**, and generate a personal access token for it. Mattermost's own [bot accounts documentation](https://developers.mattermost.com/integrate/factories/developer-tools/bot-accounts/) covers the exact steps, since they vary by Mattermost version and hosting setup. * **The {VARS.API_SDK_NAME} Python SDK** - Install it with `pip install oz-agent-sdk`. If you're working in another language, the [factory API page](/factories/factory-api/) shows the equivalent REST calls. ## 1. Store your credentials @@ -169,4 +169,4 @@ You've built a Mattermost bot that discovers a factory by name, dispatches tasks * [Use the factory API](/factories/factory-api/) - The full discover-and-dispatch reference this guide builds on. * [Connect your factory](/factories/connect-your-factory/) - Compare this custom integration against Warp's built-in intake sources. -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) - Full endpoint reference for run status, follow-ups, and cancellation. +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - Full endpoint reference for run status, follow-ups, and cancellation. diff --git a/src/content/docs/guides/external-tools/using-mcp-servers-with-warp.mdx b/src/content/docs/guides/external-tools/using-mcp-servers-with-warp.mdx index 44546dac6..818a9132a 100644 --- a/src/content/docs/guides/external-tools/using-mcp-servers-with-warp.mdx +++ b/src/content/docs/guides/external-tools/using-mcp-servers-with-warp.mdx @@ -30,7 +30,7 @@ Use this guide to choose the right setup path, then jump to the source docs for | Local Warp agent | You are working interactively in Warp and want the agent to use tools from your machine or desktop-authenticated services. | Warp MCP settings, Warp Drive MCP servers, `.warp/.mcp.json`, or provider config files. | [Model Context Protocol (MCP)](/agents/capabilities/mcp/) | | Third-party CLI agent in Warp | You run Claude Code, Codex, OpenCode, or another CLI agent in Warp and want shared MCP config across tools. | File-based MCP config that Warp can detect and approve. | [File-based MCP servers](/agents/capabilities/mcp/#file-based-mcp-servers) | | Cloud agent run | The agent runs in a cloud environment from Slack, Linear, schedules, GitHub Actions, the CLI, or the API. | `--mcp`, an agent config file, or a Warp-shared MCP UUID. | [MCP Servers for cloud agents](/platform/mcp/) | -| Repeatable automation | You need the same MCP tools every time a scheduled agent, integration, or CI workflow runs. | Agent config files plus [Agent Secrets](/platform/secrets/) for credentials. | [MCP servers (CLI reference)](/reference/cli/mcp-servers/) | +| Repeatable automation | You need the same MCP tools every time a scheduled agent, integration, or CI workflow runs. | Agent config files plus [Agent Secrets](/platform/secrets/) for credentials. | [MCP servers (CLI reference)](/agents/cli/oz-cli/mcp-servers/) | ## Common MCP workflows @@ -80,7 +80,7 @@ Then pass the UUID to an agent run: oz agent run-cloud --mcp "<MCP_SERVER_UUID>" --prompt "Summarize the latest production incidents" ``` -See [MCP servers (CLI reference)](/reference/cli/mcp-servers/) for all `--mcp` formats. +See [MCP servers (CLI reference)](/agents/cli/oz-cli/mcp-servers/) for all `--mcp` formats. ## Local MCP setup paths @@ -136,5 +136,5 @@ Before giving an agent tool access through MCP: * [Model Context Protocol (MCP)](/agents/capabilities/mcp/) - Configure MCP servers for local agents in the Warp app. * [MCP Servers for cloud agents](/platform/mcp/) - Configure MCP servers for cloud runs and automation. -* [MCP servers (CLI reference)](/reference/cli/mcp-servers/) - Use `--mcp` with UUIDs, inline JSON, or files. +* [MCP servers (CLI reference)](/agents/cli/oz-cli/mcp-servers/) - Use `--mcp` with UUIDs, inline JSON, or files. * [Agent Secrets](/platform/secrets/) - Store credentials for cloud agent runs. \ No newline at end of file diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index 8565714d8..d7ae36460 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -1,129 +1,48 @@ --- -title: Getting started with Warp +title: Warp products description: >- - Get started with Warp, the Agentic Development Environment, and the - {{WARP_AUTOMATION_PLATFORM}}, which orchestrates cloud agents at scale. + Warp combines a modern terminal, coding agents, cloud automation, and + software factories for teams that build and ship software. sidebar: - label: Getting started with Warp + label: Warp products --- import { VARS } from '@data/vars'; -import VideoEmbed from '@components/VideoEmbed.astro'; -Warp is an [open source](https://github.com/warpdotdev/warp) **Agentic Development Environment** that combines a modern, high-performance terminal with powerful agents to help you build, test, deploy, and debug code. Agents in Warp are powered by the **{VARS.WARP_AUTOMATION_PLATFORM}**, which orchestrates agents locally or in the cloud at scale. - -<figure> -![Two panels side by side: Warp, a modern terminal built for coding with agents, and Warp Factories, open infrastructure for building cloud software factories](../../assets/terminal/warp-factories-welcome.png) -<figcaption>Warp and Warp Factories in the Agentic Development Environment.</figcaption> -</figure> - ---- +Warp is an [open source](https://github.com/warpdotdev/warp) development environment for working in the terminal and with coding agents. Use Warp for interactive coding, run the Warp Agent from any terminal, automate recurring work in the cloud, or connect a team workflow to Warp Factories. ## Warp -Warp is where you work — a fast, modern terminal built for coding with agents. - -**Key capabilities:** - -* [**Terminal and Agent modes**](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/): Switch between a clean terminal for commands and a dedicated conversation view for multi-turn agent workflows. -* [**Modern terminal UX**](/terminal/editor/): Cursor movement, block-based navigation, multi-line editing, syntax highlighting, and rich completions. Built with Rust for high performance. -* [**Code editor**](/code/overview/): File tree, code editor with LSP support, and interactive code review experience. -* [**Third-party CLI agents**](/agents/cli-agents/overview/): Run third-party CLI agents like Claude Code, Codex, and OpenCode with the agent toolbelt — rich input, code review, notifications, and more. - -<VideoEmbed url="https://www.youtube.com/watch?v=xhkoXsE9Wqc" title="Deep dive into Warp's core features" /> - ---- - -## Three ways to use the Warp Agent - -The **Warp Agent** writes and edits code, debugs issues, runs commands, and works through multi-step tasks. You reach the same agent three ways, and your account, rules, skills, and model access carry across all of them. - -### In the Warp app - -Real-time, interactive coding assistance alongside your terminal. - -* Write and refactor code across your codebase -* Debug issues and fix errors -* Run commands and interpret results -* Plan and execute multi-step tasks - -You stay in control. Review changes, steer the agent mid-task, and approve actions before they execute. - -→ [Get started with agents in Warp](/agents/) - -### In any terminal, with the Warp Agent CLI - -The Warp Agent CLI is a standalone terminal program that runs the same agent without the Warp app. Run the `warp` command to start a conversation in whichever terminal you already use, over SSH, or on a machine where Warp isn't installed. - -→ [Get started with the Warp Agent CLI](/agents/cli/quickstart/) - -### In the cloud, as a cloud agent - -Cloud agents run in the background on Warp's infrastructure (or your own) for automation at scale. - -* **Triggers**: React to events from Slack, Linear, GitHub, or custom webhooks -* **Schedules**: Run recurring tasks like dependency updates or dead code removal -* **Parallelism**: Run many agents concurrently across repos or tasks -* **Observability**: Every run is tracked, auditable, and shareable with your team +Warp is the desktop terminal for running commands, editing code, and working with agents in a local checkout. -Cloud agents are ideal for work that doesn't need your immediate attention, like PR reviews, issue triage, routine maintenance, and integration-driven workflows. +* [Modern terminal editing](/terminal/editor/) - Edit commands, navigate blocks, manage tabs, and customize your terminal. +* [Code](/code/overview/) - Review agent changes and edit files alongside your terminal. +* [Agents](/agents/) - Start and steer coding agents in the Warp app. -→ [Learn about cloud agents](/platform/) +## Warp Agent -### The platform behind them +The Warp Agent helps you investigate issues, edit code, run commands, and complete multi-step work. Use it in the Warp app or from the [Warp Agent CLI](/agents/cli/), which runs the same agent in any terminal. -The **{VARS.WARP_AUTOMATION_PLATFORM}** is Warp's programmable system for running and coordinating agents at scale. It provides the environments, triggers, integrations, orchestration, and observability that cloud agents run on, plus a CLI, API, and SDK. +## Automation Platform -→ [Learn about the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) +The {VARS.WARP_AUTOMATION_PLATFORM} runs cloud agents from triggers, schedules, integrations, and APIs. Use it for background work such as issue triage, pull request review, and recurring maintenance. ---- - -## Repeatable development workflows with Warp Factories - -A single cloud agent handles one task. **Warp Factories**, now in Early Access, lets your team run a software factory: a repeatable process where cloud agents triage, spec, implement, review, and verify work, and humans approve key decisions. - -→ [Learn about Warp Factories](/factories/) or [request access](https://www.warp.dev/factories/request-access) - ---- +* [Cloud agents](/platform/) - Run background agent work in the cloud. +* [Automation Platform](/platform/overview/) - Configure environments, integrations, orchestration, and shared agent settings. -## How they work together +## Warp Factories -Warp and the {VARS.WARP_AUTOMATION_PLATFORM} provide a unified experience across local and cloud development: +Warp Factories is available in Early Access. A factory turns incoming engineering work into a repeatable, multi-stage workflow with specialized agents, review points, and measurable outcomes. -* **Same agent, anywhere**: Whether you're working in the Warp app, in another terminal through the Warp Agent CLI, or running agents in the cloud, you're using the same underlying agent capabilities. -* **Seamless handoff**: Start a task in the cloud and take over locally in Warp when you want hands-on control, without losing progress or context. -* **Shared context**: [Warp Drive](/knowledge-and-collaboration/warp-drive/), [Rules](/agents/capabilities/rules/), and [MCP servers](/agents/capabilities/mcp/) work across both local and cloud agents, so your team's knowledge and tools are always available. -* **Team collaboration**: Share agent sessions, review agents' actions, and steer running tasks, regardless of who started them. +* [Warp Factories overview](/factories/) - Learn how a factory receives, routes, and tracks work. +* [Factory quickstart](/factories/quickstart/) - Create a factory and send it its first work item. ---- - -## Multi-model support - -The {VARS.WARP_AUTOMATION_PLATFORM} is multi-model by design. You can [choose your preferred LLM](/agents/inference/model-choice/) from a curated set of top models. - ---- +## How the products work together -## Open source - -Warp's client is open source under [AGPL v3](https://github.com/warpdotdev/warp/blob/master/LICENSE-AGPL). The source lives at [`warpdotdev/warp`](https://github.com/warpdotdev/warp), where you can read the code, file issues, and contribute alongside the Warp team. Development happens in the open with an agent-first workflow managed by the {VARS.WARP_AUTOMATION_PLATFORM}. - -→ [Contributing to Warp](/support-and-community/community/contributing/) explains how to file issues, claim work, and ship code or themes. - ---- - -## Privacy and security - -Warp is **SOC 2 compliant** and has **Zero Data Retention** policies with all contracted LLM providers. No customer AI data is retained, stored, or used for training. - -Warp's AI features can be globally disabled in **Settings** > **Agents** > **Warp Agent**. - -→ [Read more about data privacy](https://www.warp.dev/privacy) - ---- +Use Warp and the Warp Agent for interactive development. Use the Automation Platform for background agents and shared cloud configuration. Use Warp Factories when your team needs a standing workflow to route, review, and improve work across repositories. ## Next steps -* [**Quickstart**](/quickstart/): Get Warp installed and start coding -* [**Agents overview**](/agents/): What the Warp Agent does, how to control it, and where to run it -* [**Warp Agent CLI**](/agents/cli/): Run the Warp Agent in any terminal -* [**Cloud Agents overview**](/platform/): Set up background automation -* [**{VARS.WARP_AUTOMATION_PLATFORM}**](/platform/overview/): Learn about the CLI, API, SDK, and infrastructure +* [Install Warp](/quickstart/) - Set up Warp and start coding. +* [Start an agent conversation](/agents/) - Work with the Warp Agent in a local checkout. +* [Run cloud agents](/platform/quickstart/) - Set up background automation. +* [Set up a factory](/factories/quickstart/) - Route engineering work through Warp Factories. diff --git a/src/content/docs/platform/agents.mdx b/src/content/docs/platform/agents.mdx index f0bd0cf38..7ac6aa772 100644 --- a/src/content/docs/platform/agents.mdx +++ b/src/content/docs/platform/agents.mdx @@ -14,22 +14,22 @@ Every team starts with a default cloud agent, which is what runs when an automat ## How cloud agents get triggered -A run executes as a cloud agent when it's authenticated with an [agent API key](/reference/cli/api-keys/) or when an agent is explicitly selected; otherwise it runs as the calling user. The triggers that can run as a cloud agent are: +A run executes as a cloud agent when it's authenticated with an [agent API key](/agents/cli/oz-cli/api-keys/) or when an agent is explicitly selected; otherwise it runs as the calling user. The triggers that can run as a cloud agent are: * **Schedules** — Cron-style recurring runs. See [Scheduled agents](/platform/triggers/scheduled-agents/). * **Integrations** — Slack mentions, Linear issue updates, GitHub Actions workflow steps. See [Integrations](/platform/integrations/). -* **API and SDK** — Programmatic runs from your own backend, scripts, or webhooks via the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/). -* **CLI** — `oz agent run-cloud` from a developer machine, CI pipeline, or self-hosted worker. See the [{VARS.WARP_AGENT_CLI}](/reference/cli/). +* **API and SDK** — Programmatic runs from your own backend, scripts, or webhooks via the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/). +* **CLI** — `oz agent run-cloud` from a developer machine, CI pipeline, or self-hosted worker. See the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/). Each run is tracked in the <a href={`${VARS.WEB_APP_URL}/runs`}>{VARS.DASHBOARD}</a> with its trigger source, the environment it ran in, and the full transcript. ## Agent API keys -Most automation triggers authenticate using an **agent API key** — a credential that runs as a cloud agent on your team rather than as an individual user. See [API keys](/reference/cli/api-keys/) for how personal and agent keys differ, and how to create one. +Most automation triggers authenticate using an **agent API key** — a credential that runs as a cloud agent on your team rather than as an individual user. See [API keys](/agents/cli/oz-cli/api-keys/) for how personal and agent keys differ, and how to create one. ## Service accounts -In the CLI and REST API, a cloud agent is represented as a **service account**. `oz whoami` reports `service_account:<uid>` when the CLI is authenticated as a service account, and [`oz federate issue-token`](/reference/cli/federate/) emits the same form in OIDC token subjects. +In the CLI and REST API, a cloud agent is represented as a **service account**. `oz whoami` reports `service_account:<uid>` when the CLI is authenticated as a service account, and [`oz federate issue-token`](/agents/cli/oz-cli/federate/) emits the same form in OIDC token subjects. ## Managing cloud agents @@ -75,8 +75,8 @@ Cloud agents — and individual runs — can also be granted specific capabiliti * [Triggers](/platform/triggers/) - How schedules, integrations, and API calls invoke cloud agents. * [Environments](/platform/environments/) - The runtime context (Docker image, repos, setup commands) a cloud agent uses. * [Multi-agent orchestration](/platform/orchestration/) - Coordinate a parent cloud agent and its children across local and cloud runs. -* [API keys](/reference/cli/api-keys/) - Create personal and agent API keys. -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) - Programmatic access to the cloud agent endpoints. -* [Federated identity tokens](/reference/cli/federate/) - Issue OIDC tokens from inside a run. +* [API keys](/agents/cli/oz-cli/api-keys/) - Create personal and agent API keys. +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - Programmatic access to the cloud agent endpoints. +* [Federated identity tokens](/agents/cli/oz-cli/federate/) - Issue OIDC tokens from inside a run. * [{VARS.WEB_APP}](/platform/oz-web-app/) - Manage cloud agents and inspect their runs in the web UI. * [Admin Panel](/knowledge-and-collaboration/admin-panel/) - Team-level billing and access controls. diff --git a/src/content/docs/platform/environments.mdx b/src/content/docs/platform/environments.mdx index cf5f158c2..81f12d6d7 100644 --- a/src/content/docs/platform/environments.mdx +++ b/src/content/docs/platform/environments.mdx @@ -13,7 +13,7 @@ Environments describe _how_ an agent executes a task, not _what_ it does. They g An environment groups the runtime configuration for a cloud agent run: -* **Docker image** - The image that provides the toolchain and dependencies for your code. A self-hosted Kubernetes worker with a [`default_image`](/platform/self-hosting/managed-kubernetes/) can run without a separate environment. +* **Docker image** - The image that provides the toolchain and dependencies for your code. A self-hosted Kubernetes worker with a [`default_image`](/factories/self-hosting/managed-kubernetes/) can run without a separate environment. * **Repositories** - One or more repos that the agent clones into its workspace. * **Setup commands** - Commands that prepare the workspace, such as dependency installation, builds, or code generation. * **Environment variables** - Runtime values that you set in the Docker image or container configuration. @@ -25,7 +25,7 @@ Together, these settings create a fresh workspace for each run. Warp provides [p When the {VARS.WARP_AUTOMATION_PLATFORM} starts a cloud agent run, it combines the environment with a host, an agent profile, and task-specific context. Each part serves a distinct purpose: -* **Host** - Determines where the run executes. Choose [Warp-hosted](warp-hosting/) infrastructure or [self-hosted](/platform/self-hosting/) runners. +* **Host** - Determines where the run executes. Choose [Warp-hosted](/factories/warp-hosting/) infrastructure or [self-hosted](/factories/self-hosting/) runners. * **Agent Profiles** - Set the agent's permissions, model choice, and defaults. See [Agent Profiles](/agents/capabilities/agent-profiles-permissions/). * **Rules** - Provide instructions that guide agent responses and decisions. See [Rules](/agents/capabilities/rules/). * **MCP servers** - Connect agents to external tools and data. See [MCP servers](/platform/mcp/). @@ -52,5 +52,5 @@ Cloud agents run as a non-root user inside the container. See [configuring conta * [Configuring cloud agent environments](environments/configuring-environments/) to create, configure, and manage environments. * [Troubleshooting cloud agent environments](environments/troubleshooting-environments/) to fix setup, authorization, permissions, and image failures. -* [Runners](/platform/runners/) to configure the compute that hosts environments. -* [Deployment patterns](/platform/deployment-patterns/) to choose between Warp-hosted and self-hosted execution. +* [Runners](/factories/runners/) to configure the compute that hosts environments. +* [Deployment patterns](/factories/deployment-patterns/) to choose between Warp-hosted and self-hosted execution. diff --git a/src/content/docs/platform/environments/configuring-environments.mdx b/src/content/docs/platform/environments/configuring-environments.mdx index 1f20570ab..691e3686c 100644 --- a/src/content/docs/platform/environments/configuring-environments.mdx +++ b/src/content/docs/platform/environments/configuring-environments.mdx @@ -162,4 +162,4 @@ Add `--force` to skip confirmation checks for environments used by integrations. * [Cloud agent environments](/platform/environments/) for the conceptual overview. * [Troubleshooting cloud agent environments](troubleshooting-environments/) to resolve setup and runtime problems. -* [Integration setup](/reference/cli/integration-setup/) to configure end-to-end integration workflows. +* [Integration setup](/agents/cli/oz-cli/integration-setup/) to configure end-to-end integration workflows. diff --git a/src/content/docs/platform/environments/troubleshooting-environments.mdx b/src/content/docs/platform/environments/troubleshooting-environments.mdx index 2eab2ceea..fcf6e5f27 100644 --- a/src/content/docs/platform/environments/troubleshooting-environments.mdx +++ b/src/content/docs/platform/environments/troubleshooting-environments.mdx @@ -7,7 +7,7 @@ import { VARS } from '@data/vars'; ## Setup commands fail on a fresh container -Setup commands run in a new container on every cloud agent run. Commands that depend on existing directories, caches, or cloned repositories can fail with [`environment_setup_failed`](/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/). +Setup commands run in a new container on every cloud agent run. Commands that depend on existing directories, caches, or cloned repositories can fail with [`environment_setup_failed`](/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed/). 1. Update the setup commands so they work in a fresh container. For example, use `mkdir -p .cache` instead of `mkdir .cache`. 2. Use lockfile-based dependency commands such as `npm ci` when your project supports them. @@ -27,7 +27,7 @@ Cloud agents need GitHub authorization to clone private repositories. This error 1. Authorize GitHub for the user who starts the run. 2. For an automated workflow with an agent API key, configure [team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization). -3. Follow [GitHub authorization setup](/reference/cli/integration-setup/#how-github-authorization-works) for the full flow. +3. Follow [GitHub authorization setup](/agents/cli/oz-cli/integration-setup/#how-github-authorization-works) for the full flow. ## "VM failed before the agent could run" @@ -41,4 +41,4 @@ This error often means the Docker image is incompatible with the agent runtime. * [Cloud agent environments](/platform/environments/) for the environment model and when to use one. * [Configuring cloud agent environments](configuring-environments/) to create, update, and manage environments. -* [`environment_setup_failed`](/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/) for the API error reference. +* [`environment_setup_failed`](/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed/) for the API error reference. diff --git a/src/content/docs/platform/self-hosting/security-and-networking.mdx b/src/content/docs/platform/execution-security.mdx similarity index 94% rename from src/content/docs/platform/self-hosting/security-and-networking.mdx rename to src/content/docs/platform/execution-security.mdx index 8935cab8d..ae07b84dd 100644 --- a/src/content/docs/platform/self-hosting/security-and-networking.mdx +++ b/src/content/docs/platform/execution-security.mdx @@ -8,7 +8,7 @@ description: >- Self-hosting uses a split-plane architecture. Understanding which data stays on your infrastructure and which data routes through Warp is critical for security evaluation. This page summarizes the data model, network egress requirements, and backend-specific security considerations for self-hosted workers. :::note -This page applies to both the [managed](/platform/self-hosting/#managed-architecture) and [unmanaged](/platform/self-hosting/unmanaged/) architectures. Backend-specific notes call out Docker-, Kubernetes-, and Direct-only considerations. +This page applies to both the [managed](/factories/self-hosting/#managed-architecture) and [unmanaged](/platform/unmanaged-execution/) architectures. Backend-specific notes call out Docker-, Kubernetes-, and Direct-only considerations. ::: ## Data boundaries @@ -114,8 +114,8 @@ LLM inference routes through Warp's backend. With Warp-managed inference, reques ## Related pages -* [Self-hosting overview](/platform/self-hosting/) — Managed vs unmanaged and architecture decision guide. +* [Managed self-hosting](/factories/self-hosting/) — Install and operate a managed worker for a factory. * [Data security and boundaries](/platform/architecture/#data-security-and-boundaries) — Diagrams of where each class of data lives and travels. * [Security overview](/enterprise/security-and-compliance/security-overview/) — Warp's broader security model, including ZDR. * [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/) — Route inference through your own cloud provider accounts. -* [Self-hosted worker reference](/platform/self-hosting/reference/) — CLI flags and config schema, including every security-relevant option. +* [Self-hosted worker reference](/factories/self-hosting/reference/) — CLI flags and config schema, including every security-relevant option. diff --git a/src/content/docs/platform/faqs.mdx b/src/content/docs/platform/faqs.mdx index ed1fe3d3e..1f3337094 100644 --- a/src/content/docs/platform/faqs.mdx +++ b/src/content/docs/platform/faqs.mdx @@ -61,7 +61,7 @@ No. By default, cloud agents run as a dedicated non-root `agent` user (UID/GID 1 The cloud agents platform supports self-hosting the **agent sandbox** (the execution environment) on your own infrastructure. The **control plane**—which handles orchestration, tracking, and auditability—remains Warp-managed and is not self-hosted. -Self-hosted execution is available on **Enterprise** plans. See [Self-hosting](/platform/self-hosting/) and [Deployment patterns](/platform/deployment-patterns/) for details. +Self-hosted execution is available on **Enterprise** plans. See [Self-hosting](/factories/self-hosting/) and [Deployment patterns](/factories/deployment-patterns/) for details. :::note Self-serve [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/) does not apply to cloud agents. Keys you add yourself are stored locally on your device and can't be passed to cloud-hosted or self-hosted agent runs, so those runs consume [Warp credits](/support-and-community/plans-and-billing/credits/). @@ -209,11 +209,11 @@ With self-hosting, repositories are cloned and stored only on your infrastructur * **Execution plane (your infrastructure)** — Repository clones, build artifacts, runtime secrets, and container filesystem state stay on the machines you control. * **Control plane (Warp-hosted)** — Session transcripts (which include code context from agent interactions), orchestration metadata, and LLM inference route through Warp's backend under [Zero Data Retention (ZDR)](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr) agreements. Warp does not persistently store your source code or use it for model training. -See [Self-hosting](/platform/self-hosting/) for deployment options and [Security Overview](/enterprise/security-and-compliance/security-overview/) for full details. +See [Self-hosting](/factories/self-hosting/) for deployment options and [Security Overview](/enterprise/security-and-compliance/security-overview/) for full details. ### Can I use `oz agent run` in CI or existing runners? -Yes. The [unmanaged architecture](/platform/self-hosting/unmanaged/) is designed exactly for this. Run `oz agent run` in any environment where you can execute a CLI command — GitHub Actions, Jenkins, Buildkite, Kubernetes pods, or custom orchestrators. This is how the [`warpdotdev/oz-agent-action`](https://github.com/warpdotdev/oz-agent-action) GitHub Action works. The agent runs locally on the runner and its session is tracked on Warp's backend for observability. +Yes. The [unmanaged architecture](/platform/unmanaged-execution/) is designed exactly for this. Run `oz agent run` in any environment where you can execute a CLI command — GitHub Actions, Jenkins, Buildkite, Kubernetes pods, or custom orchestrators. This is how the [`warpdotdev/oz-agent-action`](https://github.com/warpdotdev/oz-agent-action) GitHub Action works. The agent runs locally on the runner and its session is tracked on Warp's backend for observability. ### Can self-hosted agents access services behind a VPN? @@ -221,7 +221,7 @@ Yes. Since self-hosted agents run on your infrastructure, they inherit your netw ### Does self-hosting work with GitLab or other non-GitHub SCMs? -Self-hosted agents can use any SCM accessible from your infrastructure. With the [unmanaged architecture](/platform/self-hosting/unmanaged/), agents run directly on your host and use whatever Git configuration and SCM access is already available. With the [managed architecture](/platform/self-hosting/#managed-architecture), automatic environment setup currently focuses on GitHub, but you can configure access to other SCMs via volume mounts, environment variables, setup commands, or Kubernetes Secrets (when using the [Kubernetes backend](/platform/self-hosting/managed-kubernetes/)). See the [GitLab](/platform/integrations/gitlab/) and [Bitbucket](/platform/integrations/bitbucket/) setup guides for step-by-step instructions. +Self-hosted agents can use any SCM accessible from your infrastructure. With the [unmanaged architecture](/platform/unmanaged-execution/), agents run directly on your host and use whatever Git configuration and SCM access is already available. With the [managed architecture](/factories/self-hosting/#managed-architecture), automatic environment setup currently focuses on GitHub, but you can configure access to other SCMs via volume mounts, environment variables, setup commands, or Kubernetes Secrets (when using the [Kubernetes backend](/factories/self-hosting/managed-kubernetes/)). See the [GitLab](/platform/integrations/gitlab/) and [Bitbucket](/platform/integrations/bitbucket/) setup guides for step-by-step instructions. ### Do LLM requests still go through Warp with self-hosting? @@ -229,10 +229,10 @@ Yes. LLM inference routes through Warp's backend, which has [Zero Data Retention ### What about large monorepos with long environment setup times? -The [unmanaged architecture](/platform/self-hosting/unmanaged/) is well-suited for large monorepos because agents run directly in your pre-provisioned environment — there is no Docker image build or repo cloning step. For the [managed architecture](/platform/self-hosting/#managed-architecture), the Docker backend supports volume mounts (`-v` flag) to mount a pre-existing repo checkout from the host into task containers. With the Kubernetes backend, use `pod_template` to configure persistent volume claims or pre-populated storage for the same purpose. +The [unmanaged architecture](/platform/unmanaged-execution/) is well-suited for large monorepos because agents run directly in your pre-provisioned environment — there is no Docker image build or repo cloning step. For the [managed architecture](/factories/self-hosting/#managed-architecture), the Docker backend supports volume mounts (`-v` flag) to mount a pre-existing repo checkout from the host into task containers. With the Kubernetes backend, use `pod_template` to configure persistent volume claims or pre-populated storage for the same purpose. :::note -The managed architecture supports three execution backends: **Docker** (default), **Kubernetes**, and **Direct** (no container runtime). The Kubernetes backend runs each task as a Kubernetes Job and includes a Helm chart for deployment. See [Self-hosting](/platform/self-hosting/#choosing-a-managed-backend) for details on choosing a backend. +The managed architecture supports three execution backends: **Docker** (default), **Kubernetes**, and **Direct** (no container runtime). The Kubernetes backend runs each task as a Kubernetes Job and includes a Helm chart for deployment. See [Self-hosting](/factories/self-hosting/#choose-a-backend) for details on choosing a backend. ::: ### Do Kubernetes pods provide enough sandboxing for self-hosted agents? diff --git a/src/content/docs/platform/handoff/snapshots.mdx b/src/content/docs/platform/handoff/snapshots.mdx index 5f6600006..a49bd96ab 100644 --- a/src/content/docs/platform/handoff/snapshots.mdx +++ b/src/content/docs/platform/handoff/snapshots.mdx @@ -11,7 +11,7 @@ import { VARS } from '@data/vars'; Workspace snapshots are how [handoff](/platform/handoff/) carries repository changes and other workspace state across cloud agent runs. At the end of every cloud agent run, Warp asks a small declarations script which repositories and files to snapshot, then uploads the resulting git diffs and file contents so the next cloud agent run can apply them. -Warp's bundled cloud agent image ships with a declarations script that snapshots every Git repository under the agent's workspace, so most cloud agent runs need no configuration. This page is for the cases where you need to customize what gets snapshotted — for example, when running cloud agents in a custom Docker image, on a self-hosted [Direct backend](/platform/self-hosting/managed-direct/), or as an [unmanaged](/platform/self-hosting/unmanaged/) `oz agent run` in CI. +Warp's bundled cloud agent image ships with a declarations script that snapshots every Git repository under the agent's workspace, so most cloud agent runs need no configuration. This page is for the cases where you need to customize what gets snapshotted — for example, when running cloud agents in a custom Docker image, on a self-hosted [Direct backend](/factories/self-hosting/managed-direct/), or as an [unmanaged](/platform/unmanaged-execution/) `oz agent run` in CI. ## When to customize snapshots @@ -113,7 +113,7 @@ Then point Warp at it by exporting `OZ_SNAPSHOT_DECLARATIONS_SCRIPT` in the envi export OZ_SNAPSHOT_DECLARATIONS_SCRIPT=/path/to/snapshot-declarations.sh ``` -For a managed [Direct backend](/platform/self-hosting/managed-direct/) worker, set it via the worker's `environment` config so it's present when the agent process starts. +For a managed [Direct backend](/factories/self-hosting/managed-direct/) worker, set it via the worker's `environment` config so it's present when the agent process starts. ### The full bundled script @@ -229,6 +229,6 @@ Snapshotting is also skipped automatically when cloud conversations are disabled * [Handoff from local to cloud](/platform/handoff/local-to-cloud/) - Promote a local conversation to a cloud run; the workspace snapshot is what carries your uncommitted changes across. * [Handoff from cloud to cloud](/platform/handoff/cloud-to-cloud/) - Continue a finished cloud run; the prior session's workspace snapshot is what gets restored. -* [Self-hosting overview](/platform/self-hosting/) - Architecture decision guide for self-hosted workers, where customizing snapshots is most often needed. -* [Unmanaged architecture](/platform/self-hosting/unmanaged/) - Run `oz agent run` in CI, Kubernetes, or your dev environment outside the bundled image. -* [{VARS.WARP_AGENT_CLI}](/reference/cli/) - Full reference for `oz agent run` and `oz agent run-cloud`. +* [Self-hosting overview](/factories/self-hosting/) - Architecture decision guide for self-hosted workers, where customizing snapshots is most often needed. +* [Unmanaged architecture](/platform/unmanaged-execution/) - Run `oz agent run` in CI, Kubernetes, or your dev environment outside the bundled image. +* [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) - Full reference for `oz agent run` and `oz agent run-cloud`. diff --git a/src/content/docs/platform/harnesses/claude-code.mdx b/src/content/docs/platform/harnesses/claude-code.mdx index eb8c70c8e..d929ad89f 100644 --- a/src/content/docs/platform/harnesses/claude-code.mdx +++ b/src/content/docs/platform/harnesses/claude-code.mdx @@ -45,7 +45,7 @@ For setup steps, see [Connecting Claude Code credentials](/platform/harnesses/au * **Warp app** - In Cloud Mode, click the **Agent harness** dropdown above the input and choose **Claude Code**. * **{VARS.WEB_APP}** - On the new run or new schedule pane, choose **Claude Code** in the **Harness** field. A **Claude Code auth secret** field appears below it; pick one of your stored Anthropic secrets. -* **API and SDK** - Set the agent config `harness` to `claude` — the [harness identifier](/platform/harnesses/#harness-identifiers) is `claude`, not `claude-code` — and the Anthropic secret name on the matching auth-secret field. See the [API reference](/reference/api-and-sdk/). +* **API and SDK** - Set the agent config `harness` to `claude` — the [harness identifier](/platform/harnesses/#harness-identifiers) is `claude`, not `claude-code` — and the Anthropic secret name on the matching auth-secret field. See the [API reference](/factories/api-and-sdk/). ## Related pages diff --git a/src/content/docs/platform/harnesses/codex.mdx b/src/content/docs/platform/harnesses/codex.mdx index dadc3df16..569c729e4 100644 --- a/src/content/docs/platform/harnesses/codex.mdx +++ b/src/content/docs/platform/harnesses/codex.mdx @@ -45,7 +45,7 @@ For setup steps, see [Connecting Codex credentials](/platform/harnesses/authenti * **Warp app** - In Cloud Mode, click the **Agent harness** dropdown above the input and choose **Codex**. * **{VARS.WEB_APP}** - On the new run or new schedule pane, choose **Codex** in the **Harness** field. A **Codex auth secret** field appears below it; pick the OpenAI secret your team has stored. -* **API and SDK** - Set the agent config `harness` to `codex` and the OpenAI secret name on the matching auth-secret field. See the [API reference](/reference/api-and-sdk/). +* **API and SDK** - Set the agent config `harness` to `codex` and the OpenAI secret name on the matching auth-secret field. See the [API reference](/factories/api-and-sdk/). ## Related pages diff --git a/src/content/docs/platform/harnesses/index.mdx b/src/content/docs/platform/harnesses/index.mdx index 98a629bbd..8578dc4f8 100644 --- a/src/content/docs/platform/harnesses/index.mdx +++ b/src/content/docs/platform/harnesses/index.mdx @@ -54,7 +54,7 @@ On the new run or new schedule pane, choose the harness in the **Harness** field ### API and SDK -Set the `harness` field on the agent config to one of the [harness identifiers](#harness-identifiers) below. See the [API reference](/reference/api-and-sdk/) for the exact field names. +Set the `harness` field on the agent config to one of the [harness identifiers](#harness-identifiers) below. See the [API reference](/factories/api-and-sdk/) for the exact field names. ## Harness identifiers diff --git a/src/content/docs/platform/harnesses/warp-agent.mdx b/src/content/docs/platform/harnesses/warp-agent.mdx index 79165c57c..d1071c9c2 100644 --- a/src/content/docs/platform/harnesses/warp-agent.mdx +++ b/src/content/docs/platform/harnesses/warp-agent.mdx @@ -56,7 +56,7 @@ Warp Agent is the default, so there's nothing extra to configure. * **Warp app** - Start a cloud agent run from the input. The **Agent harness** dropdown defaults to **Warp Agent**. * **{VARS.WEB_APP}** - On a new run or new schedule pane, leave the **Harness** field set to **Warp Agent**. * **{VARS.WARP_AGENT_CLI}** - Run `oz agent run-cloud --prompt "..."` with no `--harness` flag, or pass `--harness oz` explicitly. -* **API and SDK** - Omit the `harness` field on the agent config, or set it to `oz`. See the [API reference](/reference/api-and-sdk/). +* **API and SDK** - Omit the `harness` field on the agent config, or set it to `oz`. See the [API reference](/factories/api-and-sdk/). For a complete walkthrough, see the [Cloud agents quickstart](/platform/quickstart/). diff --git a/src/content/docs/platform/index.mdx b/src/content/docs/platform/index.mdx index 27e991797..9bb57f234 100644 --- a/src/content/docs/platform/index.mdx +++ b/src/content/docs/platform/index.mdx @@ -68,9 +68,9 @@ Cloud agents run on the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/), * The **orchestrator creates** and tracks the task. * The agent **executes** on a host, optionally inside an [environment](/platform/environments/), with whatever [secrets](/platform/secrets/) and credentials it needs. -The exact way tasks are triggered and executed depends on your deployment model (for example CLI-only, Warp-hosted orchestration, or self-hosted execution). Those options are covered in the [Deployment Patterns](/platform/deployment-patterns/) pages. +The exact way tasks are triggered and executed depends on your deployment model (for example CLI-only, Warp-hosted orchestration, or self-hosted execution). Those options are covered in the [Deployment Patterns](/factories/deployment-patterns/) pages. -For teams that need execution to stay within their network boundary, self-hosting supports two architectures: a **managed** worker daemon that lets the {VARS.WARP_AUTOMATION_PLATFORM} orchestrate agents in Docker containers on your machines, and an **unmanaged** mode where you run `oz agent run` directly in your CI, Kubernetes, or dev environment. See [Self-hosting](/platform/self-hosting/) for details. +For teams that need execution to stay within their network boundary, self-hosting supports two architectures: a **managed** worker daemon that lets the {VARS.WARP_AUTOMATION_PLATFORM} orchestrate agents in Docker containers on your machines, and an **unmanaged** mode where you run `oz agent run` directly in your CI, Kubernetes, or dev environment. See [Self-hosting](/factories/self-hosting/) for details. ### What you get by default @@ -98,7 +98,7 @@ For details on configuring MCP servers for cloud agents, see [MCP Servers](/plat #### API access to tasks -The {VARS.WARP_AUTOMATION_PLATFORM} exposes task visibility via the [**{VARS.API_SDK_NAME}**](/reference/api-and-sdk/), so teams can: +The {VARS.WARP_AUTOMATION_PLATFORM} exposes task visibility via the [**{VARS.API_SDK_NAME}**](/factories/api-and-sdk/), so teams can: * Query which tasks are running or have run. * Fetch task metadata and outcomes. @@ -108,11 +108,11 @@ The {VARS.WARP_AUTOMATION_PLATFORM} exposes task visibility via the [**{VARS.API Cloud agents do not require the Warp app. Teams can deploy and operate them through the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) using: -* [{VARS.WARP_AGENT_CLI}](/reference/cli/) — run agents from scripts, CI, or the terminal +* [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) — run agents from scripts, CI, or the terminal * [{VARS.WEB_APP}](/platform/oz-web-app/) — visual interface for managing runs, schedules, environments, and integrations (works on mobile) * [Agent Session Sharing](/agents/local-agents/session-sharing/) — attach to running tasks to monitor or steer * [Agent Management Panel](/platform/managing-cloud-agents/) — view agent activity and run history in the Warp app -* [APIs and SDKs](/reference/api-and-sdk/) — programmatic access for custom integrations +* [APIs and SDKs](/factories/api-and-sdk/) — programmatic access for custom integrations If your team also uses Warp's terminal, you get an additional workflow: tasks launched via the CLI can be handed off into an interactive session for review, edits, or continuation. @@ -161,10 +161,10 @@ If your credit balance reaches zero, cloud agent runs will not be able to execut * [Agents](/platform/agents/) — cloud agents that own and execute runs on your team. * [Multi-agent orchestration](/platform/orchestration/) — coordinate a parent agent and its child agents across local and cloud runs to build supervisor/worker, fan-out, critic, DAG, and swarm workflows. * [Skills as Agents](/platform/skills-as-agents/) — run agents based on reusable skill definitions from the CLI, web app, API, or on a schedule. -* [{VARS.WARP_AGENT_CLI}](/reference/cli/) — shows how to run agents in non-interactive mode from CI, scripts, or remote machines, including auth and common commands. +* [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) — shows how to run agents in non-interactive mode from CI, scripts, or remote machines, including auth and common commands. * [Environments](/platform/environments/) — explains how environments provide the runtime context (repo, image, startup commands) for agent tasks. -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) — documents the REST API for creating, querying, and monitoring agent tasks programmatically. +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — documents the REST API for creating, querying, and monitoring agent tasks programmatically. * [Agent Secrets](/platform/secrets/) — covers how to store, scope, and inject credentials into agent runs safely. * [MCP Servers](/platform/mcp/) — how to configure MCP servers for agent tool access and how MCP configuration is applied across runs. -* [Deployment Patterns](/platform/deployment-patterns/) (beta) — compares common ways to deploy cloud agents and when to use each. +* [Deployment Patterns](/factories/deployment-patterns/) (beta) — compares common ways to deploy cloud agents and when to use each. * [Access, Billing, and Identity Permissions](/platform/team-access-billing-and-identity/) — explains individual and team-level requirements, credit billing behavior, and the permission model for who can run, view, and steer cloud agent tasks. diff --git a/src/content/docs/platform/integrations/azure-devops.mdx b/src/content/docs/platform/integrations/azure-devops.mdx index 777101633..99c2d0f9b 100644 --- a/src/content/docs/platform/integrations/azure-devops.mdx +++ b/src/content/docs/platform/integrations/azure-devops.mdx @@ -22,7 +22,7 @@ This approach works for both Azure DevOps Services (dev.azure.com) and Azure Dev * A Warp account (<a href={VARS.WEB_APP_URL}>create an account at {VARS.WEB_APP_URL}</a>) * A repository hosted on Azure DevOps (cloud or self-hosted) -* The [{VARS.WARP_AGENT_CLI}](/reference/cli/) installed and authenticated +* The [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) installed and authenticated --- diff --git a/src/content/docs/platform/integrations/bitbucket.mdx b/src/content/docs/platform/integrations/bitbucket.mdx index b2b8baad5..fb67db47b 100644 --- a/src/content/docs/platform/integrations/bitbucket.mdx +++ b/src/content/docs/platform/integrations/bitbucket.mdx @@ -25,7 +25,7 @@ Follow the section that matches your setup. * A Warp account (<a href={VARS.WEB_APP_URL}>create an account at {VARS.WEB_APP_URL}</a>) * A repository hosted on Bitbucket (Cloud or Data Center/Server) -* The [{VARS.WARP_AGENT_CLI}](/reference/cli/) installed and authenticated +* The [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) installed and authenticated --- diff --git a/src/content/docs/platform/integrations/cloud-providers.mdx b/src/content/docs/platform/integrations/cloud-providers.mdx index 5a7ae511a..19fb399b0 100644 --- a/src/content/docs/platform/integrations/cloud-providers.mdx +++ b/src/content/docs/platform/integrations/cloud-providers.mdx @@ -334,7 +334,7 @@ The following claims are derived from an agent run: * `environment`: the unique identifier for the agent's [Environment](/platform/environments/). * `agent_name`: the name of the [Skill](/platform/skills-as-agents/) that the agent was invoked with. * `skill_spec`: the canonical identifier for the skill, such as `github-org/github-repo:.warp/skills/skill-name/SKILL.md`. -* `host`: the execution host. This will either be `warp`, for Warp-hosted agents, or the worker ID if [self-hosting](/platform/self-hosting/). +* `host`: the execution host. This will either be `warp`, for Warp-hosted agents, or the worker ID if [self-hosting](/factories/self-hosting/). ### Example token diff --git a/src/content/docs/platform/integrations/github-actions.mdx b/src/content/docs/platform/integrations/github-actions.mdx index f519e47ad..fd17644cd 100644 --- a/src/content/docs/platform/integrations/github-actions.mdx +++ b/src/content/docs/platform/integrations/github-actions.mdx @@ -48,7 +48,7 @@ The `oz-agent-action` is a GitHub Action that wraps the {VARS.WARP_AGENT_CLI} an To use agents in GitHub Actions, you need: -* A [**Warp API Key**](/reference/cli/api-keys/) stored as a [GitHub secret](https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions) — this authenticates the agent with Warp. Pick a personal key if you want commits attributed to you, or an agent key to run as a [cloud agent](/platform/agents/) on your team. See [API keys](/reference/cli/api-keys/) for when to pick each. +* A [**Warp API Key**](/agents/cli/oz-cli/api-keys/) stored as a [GitHub secret](https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions) — this authenticates the agent with Warp. Pick a personal key if you want commits attributed to you, or an agent key to run as a [cloud agent](/platform/agents/) on your team. See [API keys](/agents/cli/oz-cli/api-keys/) for when to pick each. * Workflow permissions that match your intended actions (for example, `pull-requests: write` if the agent should commit or comment on PRs) — the agent performs actions on your behalf using the GitHub token available to the workflow * The `oz-agent-action` step added to your workflow * **For private repositories using `@oz-agent` mention workflows**: The [`oz-agent`](https://github.com/oz-agent) GitHub user must be [invited as a member](https://docs.github.com/en/organizations/managing-membership-in-your-organization/inviting-users-to-join-your-organization) of your GitHub organization (see [Responding to comments with @ mentions](#1-responding-to-comments-with--mentions) for details) @@ -73,7 +73,7 @@ You can specify a skill using the `skill` input parameter, either instead of or :::tip If the action fails, use the returned error code to narrow the fix. Common errors include: -* [`authentication_required`](/reference/api-and-sdk/troubleshooting/errors/authentication-required/) (missing, invalid, or expired `warp_api_key` secret) +* [`authentication_required`](/factories/api-and-sdk/troubleshooting/errors/authentication-required/) (missing, invalid, or expired `warp_api_key` secret) ::: #### Skill format options diff --git a/src/content/docs/platform/integrations/github.mdx b/src/content/docs/platform/integrations/github.mdx index 6c0231acf..88ff904e0 100644 --- a/src/content/docs/platform/integrations/github.mdx +++ b/src/content/docs/platform/integrations/github.mdx @@ -192,9 +192,9 @@ Your GitHub account is connected, but your Warp account isn't in a team with acc Use the error code in the thread's status comment to narrow the fix. Common errors include: -* [`feature_not_available`](/reference/api-and-sdk/troubleshooting/errors/feature-not-available/) - The team's plan doesn't support integrations. -* [`external_authentication_required`](/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/) - GitHub authorization is missing or expired. -* [`insufficient_credits`](/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/) - The billed account has no credits available. +* [`feature_not_available`](/factories/api-and-sdk/troubleshooting/errors/feature-not-available/) - The team's plan doesn't support integrations. +* [`external_authentication_required`](/factories/api-and-sdk/troubleshooting/errors/external-authentication-required/) - GitHub authorization is missing or expired. +* [`insufficient_credits`](/factories/api-and-sdk/troubleshooting/errors/insufficient-credits/) - The billed account has no credits available. ### The agent finished but opened no pull request diff --git a/src/content/docs/platform/integrations/index.mdx b/src/content/docs/platform/integrations/index.mdx index bd981d9e3..bf2245a4c 100644 --- a/src/content/docs/platform/integrations/index.mdx +++ b/src/content/docs/platform/integrations/index.mdx @@ -31,7 +31,7 @@ Use the setup walkthrough below for a quick look at how environments connect to <VideoEmbed url="https://www.youtube.com/watch?v=ahFfInVD0HQ" title="Cloud agents integrations overview video" /> * [Integrations quickstart](/platform/integrations/quickstart/) - Trigger your first agent from Slack and watch the run from start to finish. -* [Integration setup](/reference/cli/integration-setup/) - Configure environments, GitHub authorization, CLI flags, and integrations in more detail. +* [Integration setup](/agents/cli/oz-cli/integration-setup/) - Configure environments, GitHub authorization, CLI flags, and integrations in more detail. * [Slack](/platform/integrations/slack/), [Linear](/platform/integrations/linear/), and [Jira](/platform/integrations/jira/) - Trigger agents from team conversations, issues, and comments. * [GitHub](/platform/integrations/github/) - Mention `@warp-agent` on issues, pull requests, and review comments to start agents that reply in the thread. * [GitHub Actions](/platform/integrations/github-actions/) - Run agents from CI workflows and repository events. diff --git a/src/content/docs/platform/integrations/jira.mdx b/src/content/docs/platform/integrations/jira.mdx index 6363debb7..ab45559cd 100644 --- a/src/content/docs/platform/integrations/jira.mdx +++ b/src/content/docs/platform/integrations/jira.mdx @@ -16,7 +16,7 @@ The Jira integration lets your team kick off cloud agent runs directly from Jira * **Jira Cloud** - Jira Server and Data Center are not supported. * **Team membership** - The Jira 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. +* **Infrastructure** - By default, agents run on Warp-hosted infrastructure. Enterprise teams can [self-host agents](/factories/self-hosting/) on their own infrastructure. * **Jira site admin** - Installing the Warp app on your Jira site requires site admin permissions. --- diff --git a/src/content/docs/platform/integrations/linear.mdx b/src/content/docs/platform/integrations/linear.mdx index 5e631c8dc..8240072aa 100644 --- a/src/content/docs/platform/integrations/linear.mdx +++ b/src/content/docs/platform/integrations/linear.mdx @@ -70,7 +70,7 @@ Because PRs are created as _you_, this makes code review, auditing, and team col * **Team membership** - The Linear 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 have cloud agents enabled and 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. +* **Infrastructure** - By default, agents run on Warp-hosted infrastructure. Enterprise teams can [self-host agents](/factories/self-hosting/) on their own infrastructure. * **Identity** - The first time you trigger an agent, Warp prompts you to connect your Linear identity to your Warp account. * **GitHub authorization** - You must authorize the Warp GitHub app the first time you trigger an agent. * The repositories involved must be included in your environment and accessible to the Warp GitHub app. @@ -80,7 +80,7 @@ Because PRs are created as _you_, this makes code review, auditing, and team col ### How to configure the integration -Setup involves two steps powered by the [{VARS.WARP_AGENT_CLI}](/reference/cli/). For more instructions, see [Integrations Overview](/platform/integrations/). +Setup involves two steps powered by the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/). For more instructions, see [Integrations Overview](/platform/integrations/). #### 1. Create an environment @@ -116,8 +116,8 @@ The CLI will open a browser window prompting you to install the Warp app into yo :::tip If the integration cannot be created or a Linear-triggered run cannot start, use the returned error code to narrow the fix. Common errors include: -* [`feature_not_available`](/reference/api-and-sdk/troubleshooting/errors/feature-not-available/) (plan does not support integrations) -* [`external_authentication_required`](/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/) (missing GitHub or Linear authorization) +* [`feature_not_available`](/factories/api-and-sdk/troubleshooting/errors/feature-not-available/) (plan does not support integrations) +* [`external_authentication_required`](/factories/api-and-sdk/troubleshooting/errors/external-authentication-required/) (missing GitHub or Linear authorization) ::: --- @@ -134,7 +134,7 @@ To remove the Warp app from Linear: <VideoEmbed url="https://www.loom.com/share/2f1648586d8148dc80561c00a09ca334" title="Uninstalling the Warp Linear integration video" /> -After revoking access, Warp will no longer be able to read issues, receive triggers, or create updates in Linear. If you reinstall later, you’ll need to authorize Warp again during setup. Events for a disabled integration can return [`integration_disabled`](/reference/api-and-sdk/troubleshooting/errors/integration-disabled/). +After revoking access, Warp will no longer be able to read issues, receive triggers, or create updates in Linear. If you reinstall later, you’ll need to authorize Warp again during setup. Events for a disabled integration can return [`integration_disabled`](/factories/api-and-sdk/troubleshooting/errors/integration-disabled/). ### Troubleshooting diff --git a/src/content/docs/platform/integrations/quickstart-github-actions.mdx b/src/content/docs/platform/integrations/quickstart-github-actions.mdx index 54830ef12..dee39ef26 100644 --- a/src/content/docs/platform/integrations/quickstart-github-actions.mdx +++ b/src/content/docs/platform/integrations/quickstart-github-actions.mdx @@ -14,7 +14,7 @@ Add agents to your GitHub Actions workflows with [`oz-agent-action`](https://git ## Prerequisites -* **Warp API key** - Create one in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a>. Use a personal key if the agent should commit as you, or an agent key (which runs as a [cloud agent](/platform/agents/) on your team) with [team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization). See [API Keys](/reference/cli/api-keys/) for the full creation flow. +* **Warp API key** - Create one in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a>. Use a personal key if the agent should commit as you, or an agent key (which runs as a [cloud agent](/platform/agents/) on your team) with [team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization). See [API Keys](/agents/cli/oz-cli/api-keys/) for the full creation flow. * **A GitHub repository with Actions enabled** - The workflow file will live in `.github/workflows/` in your repo. --- diff --git a/src/content/docs/platform/integrations/quickstart.mdx b/src/content/docs/platform/integrations/quickstart.mdx index 1db093854..7b1c1dc33 100644 --- a/src/content/docs/platform/integrations/quickstart.mdx +++ b/src/content/docs/platform/integrations/quickstart.mdx @@ -47,8 +47,8 @@ Replace `<ENV_ID>` with your environment ID (see [Environments](/platform/enviro :::tip If the integration cannot be created or your first run cannot start, use the returned error code to narrow the fix. Common errors include: -* [`feature_not_available`](/reference/api-and-sdk/troubleshooting/errors/feature-not-available/) (plan does not support integrations) -* [`external_authentication_required`](/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/) (missing GitHub or Slack authorization) +* [`feature_not_available`](/factories/api-and-sdk/troubleshooting/errors/feature-not-available/) (plan does not support integrations) +* [`external_authentication_required`](/factories/api-and-sdk/troubleshooting/errors/external-authentication-required/) (missing GitHub or Slack authorization) ::: To attach a default prompt that applies to every agent run triggered from this integration, add the `--prompt` flag: @@ -85,5 +85,5 @@ When the task is complete, Warp posts a summary back to the original Slack threa ## Next steps * **Customize agent behavior** - Use a [skill](/platform/skills-as-agents/) as the base prompt for your integration to give agents consistent, reusable instructions across every run. -* **Trigger agents programmatically** - Use the [API & SDK](/reference/api-and-sdk/) to build custom automations and integrations on top of agents. +* **Trigger agents programmatically** - Use the [API & SDK](/factories/api-and-sdk/) to build custom automations and integrations on top of agents. * **Read the full Slack reference** - [Slack](/platform/integrations/slack/) covers identity mapping, team access, monitoring runs, troubleshooting, and uninstall instructions. diff --git a/src/content/docs/platform/integrations/slack.mdx b/src/content/docs/platform/integrations/slack.mdx index a89b0ea6f..275641de6 100644 --- a/src/content/docs/platform/integrations/slack.mdx +++ b/src/content/docs/platform/integrations/slack.mdx @@ -19,7 +19,7 @@ The Slack integration lets your team trigger cloud agents directly from Slack co 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 [{VARS.WARP_AGENT_CLI}](/reference/cli/): +Alternatively, install via the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/): ``` oz integration create slack --environment <ENV_ID> @@ -31,7 +31,7 @@ The CLI opens a browser window to install the Warp app into your Slack workspace * **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 have cloud agents enabled and 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. +* **Infrastructure** - By default, agents run on Warp-hosted infrastructure. Enterprise teams can [self-host agents](/factories/self-hosting/) on their own infrastructure. --- @@ -137,8 +137,8 @@ oz integration create slack \ :::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: -* [`feature_not_available`](/reference/api-and-sdk/troubleshooting/errors/feature-not-available/) (plan does not support integrations) -* [`external_authentication_required`](/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/) (missing GitHub or Slack authorization) +* [`feature_not_available`](/factories/api-and-sdk/troubleshooting/errors/feature-not-available/) (plan does not support integrations) +* [`external_authentication_required`](/factories/api-and-sdk/troubleshooting/errors/external-authentication-required/) (missing GitHub or Slack authorization) ::: ### Identity mapping and team access @@ -172,7 +172,7 @@ To remove the Warp app from your Slack workspace: ![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/). +Once removed, Slack will immediately disable the integration for all teammates. Events for a disabled integration can return [`integration_disabled`](/factories/api-and-sdk/troubleshooting/errors/integration-disabled/). ### Troubleshooting diff --git a/src/content/docs/platform/managing-cloud-agents.mdx b/src/content/docs/platform/managing-cloud-agents.mdx index 46b1cdbc2..5bb605a3e 100644 --- a/src/content/docs/platform/managing-cloud-agents.mdx +++ b/src/content/docs/platform/managing-cloud-agents.mdx @@ -82,8 +82,8 @@ Each row represents a single item in the agents list (either an interactive conv Where the agent was launched from. Common sources include: * **Interactive:** an [agent conversation](/agents/) started in the Warp app -* **CLI**: a local run triggered by the [{VARS.WARP_AGENT_CLI}](/reference/cli/) -* **API**: a run triggered by [Warp's API](/reference/api-and-sdk/) +* **CLI**: a local run triggered by the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) +* **API**: a run triggered by [Warp's API](/factories/api-and-sdk/) * **Slack / Linear**: runs triggered by [integrations](/platform/integrations/) * **Scheduled**: runs triggered on a [cron schedule](/platform/triggers/scheduled-agents/) @@ -91,7 +91,7 @@ Where the agent was launched from. Common sources include: Warp uses a small set of statuses to help you quickly identify what needs attention: -<table><thead><tr><th width="173.375">Status</th><th width="78.41973876953125">Icon</th><th>Description</th></tr></thead><tbody><tr><td><code>Working</code></td><td>N/A</td><td>in progress (may include queued / running states)</td></tr><tr><td><code>Blocked</code></td><td>🟨</td><td><p><em>(interactive only)</em></p><p><br />the conversation is waiting on user input or a required step</p></td></tr><tr><td><code>Canceled</code></td><td>⬜️</td><td>(interactive only)<br /><br />the interactive conversation was canceled before completion</td></tr><tr><td><a href="/reference/api-and-sdk/troubleshooting/errors/"><code>Failed / Errored</code></a></td><td>🔺</td><td>something went wrong (applies to both interactive and cloud agent runs)</td></tr><tr><td><code>Success</code></td><td>✅</td><td>completed successfully (applies to both interactive and cloud agent runs)</td></tr></tbody></table> +<table><thead><tr><th width="173.375">Status</th><th width="78.41973876953125">Icon</th><th>Description</th></tr></thead><tbody><tr><td><code>Working</code></td><td>N/A</td><td>in progress (may include queued / running states)</td></tr><tr><td><code>Blocked</code></td><td>🟨</td><td><p><em>(interactive only)</em></p><p><br />the conversation is waiting on user input or a required step</p></td></tr><tr><td><code>Canceled</code></td><td>⬜️</td><td>(interactive only)<br /><br />the interactive conversation was canceled before completion</td></tr><tr><td><a href="/factories/api-and-sdk/troubleshooting/errors/"><code>Failed / Errored</code></a></td><td>🔺</td><td>something went wrong (applies to both interactive and cloud agent runs)</td></tr><tr><td><code>Success</code></td><td>✅</td><td>completed successfully (applies to both interactive and cloud agent runs)</td></tr></tbody></table> **Duration (for cloud agent tasks)** diff --git a/src/content/docs/platform/mcp.mdx b/src/content/docs/platform/mcp.mdx index 1105a7ce2..ad13551b4 100644 --- a/src/content/docs/platform/mcp.mdx +++ b/src/content/docs/platform/mcp.mdx @@ -24,7 +24,7 @@ The agent calls MCP tools automatically based on what the task requires, without You can supply MCP configuration in two ways: -* **At run time** — pass `--mcp` when calling `oz agent run` or `oz agent run-cloud`. See [MCP Servers](/reference/cli/mcp-servers/) in the CLI reference for the full syntax. +* **At run time** — pass `--mcp` when calling `oz agent run` or `oz agent run-cloud`. See [MCP Servers](/agents/cli/oz-cli/mcp-servers/) in the CLI reference for the full syntax. * **In an agent config file** — define `mcp_servers` directly in a YAML or JSON agent config file (passed with `-f / --file`). This is the recommended approach for repeatable workflows. ## Configuration schema @@ -133,7 +133,7 @@ Token- or header-based authentication on a `url` server, `env`-based secrets on ## Learn more * [Connect developer tools to agents with MCP workflows](/guides/external-tools/using-mcp-servers-with-warp/) — choose between local, cloud, and shared MCP setup paths -* [MCP Servers (CLI reference)](/reference/cli/mcp-servers/) — how to pass MCP configuration using the `--mcp` flag +* [MCP Servers (CLI reference)](/agents/cli/oz-cli/mcp-servers/) — how to pass MCP configuration using the `--mcp` flag * [Model Context Protocol (MCP)](/agents/capabilities/mcp/) — configuring MCP servers in Warp for local agents * [Environments](/platform/environments/) — set up the runtime context (repo, image, startup commands) for cloud agent tasks * [Secrets](/platform/secrets/) — store and inject credentials into agent runs safely diff --git a/src/content/docs/platform/orchestration/index.mdx b/src/content/docs/platform/orchestration/index.mdx index 753c2afd5..a0c97d2cd 100644 --- a/src/content/docs/platform/orchestration/index.mdx +++ b/src/content/docs/platform/orchestration/index.mdx @@ -7,7 +7,7 @@ sidebar: import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; -Multi-agent orchestration lets one agent spawn and coordinate other agents to parallelize work, delegate specialized tasks, or verify another agent's output. The parent/child model works from the Warp app, the [{VARS.WARP_AGENT_CLI}](/reference/cli/), and the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/), and supports local, cloud, and mixed execution. +Multi-agent orchestration lets one agent spawn and coordinate other agents to parallelize work, delegate specialized tasks, or verify another agent's output. The parent/child model works from the Warp app, the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/), and the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/), and supports local, cloud, and mixed execution. Watch this walkthrough to see how a cloud agent can coordinate a team of agents in the cloud. @@ -24,7 +24,7 @@ An orchestrated workflow always has one **parent agent** and one or more **child * **Parent agent** - the agent that decides what work needs to be done, spawns child agents, and (optionally) merges their results. Any agent can become a parent the first time it spawns a child. * **Child agent** - an agent spawned by a parent with its own prompt, environment, and (optionally) a different model or agent runtime. A child runs its own work and reports back; it does not spawn its own children. -Orchestrations today are exactly one level deep: a parent and its direct children. The Warp app, the [{VARS.WEB_APP}](/platform/oz-web-app/), and the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) render that single level. The parent and each child each have an independent **run** with its own lifecycle, transcript, conversation, and credit usage. +Orchestrations today are exactly one level deep: a parent and its direct children. The Warp app, the [{VARS.WEB_APP}](/platform/oz-web-app/), and the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) render that single level. The parent and each child each have an independent **run** with its own lifecycle, transcript, conversation, and credit usage. ### Where parent and child agents can run @@ -124,13 +124,13 @@ Because every parent and child is tracked as its own conversation or run, the ex * **[Managing cloud agents](/platform/managing-cloud-agents/)** - in the Warp app, the orchestration pill bar above the agent view header lets you switch between the parent and each child while you're viewing the parent. Cloud children also appear as their own rows in the Agent Management Panel list. * **[{VARS.WEB_APP}](/platform/oz-web-app/)** - the Runs page groups cloud children under the parent's row, and the parent's detail pane adds a **Sub-agents** tab. -* **[{VARS.API_SDK_NAME}](/reference/api-and-sdk/)** - list every descendant of a parent in one call and fetch any run with its conversation, transcript, and artifacts. See [Running orchestrated agents](/platform/orchestration/multi-agent-runs/#retrieving-conversations-and-artifacts). +* **[{VARS.API_SDK_NAME}](/factories/api-and-sdk/)** - list every descendant of a parent in one call and fetch any run with its conversation, transcript, and artifacts. See [Running orchestrated agents](/platform/orchestration/multi-agent-runs/#retrieving-conversations-and-artifacts). * **[Agent notifications](/agents/capabilities/agent-notifications/)** - in-app notifications fire on the parent agent's conversation only. Use the pill bar or the **Sub-agents** tab to drill into a specific child. ## Related pages * [Running orchestrated agents](/platform/orchestration/multi-agent-runs/) - how to start an orchestrated run from the CLI, slash command, web app, or API. * [How to run multiple AI coding agents](/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/) - practical guidance for splitting tasks, assigning worktrees, validating child output, and handing work off for review. -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) - REST endpoints for runs, conversations, and artifacts. +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - REST endpoints for runs, conversations, and artifacts. * [Cloud agents overview](/platform/) - what a cloud agent run is and how it fits into the {VARS.WARP_AUTOMATION_PLATFORM}. -* [Deployment patterns](/platform/deployment-patterns/) - higher-level deployment models that orchestration composes with. +* [Deployment patterns](/factories/deployment-patterns/) - higher-level deployment models that orchestration composes with. diff --git a/src/content/docs/platform/orchestration/multi-agent-runs.mdx b/src/content/docs/platform/orchestration/multi-agent-runs.mdx index 1b231cda8..efbf2e416 100644 --- a/src/content/docs/platform/orchestration/multi-agent-runs.mdx +++ b/src/content/docs/platform/orchestration/multi-agent-runs.mdx @@ -18,9 +18,9 @@ Watch this walkthrough to see how to start and inspect an orchestrated agent run Pick where the parent will run. Every orchestration starts with a single parent that spawns children: * **Parent in the Warp app** - use the `/orchestrate` or `/plan` slash command. This is the fastest way to try orchestration. -* **Parent in the cloud** - trigger the parent through the {VARS.WARP_AGENT_CLI} (`oz agent run-cloud`), the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/), any [integration](/platform/integrations/) such as [Slack](/platform/integrations/slack/) or [Linear](/platform/integrations/linear/), or a [schedule](/platform/triggers/scheduled-agents/). The parent runs in an environment and spawns children from there. +* **Parent in the cloud** - trigger the parent through the {VARS.WARP_AGENT_CLI} (`oz agent run-cloud`), the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/), any [integration](/platform/integrations/) such as [Slack](/platform/integrations/slack/) or [Linear](/platform/integrations/linear/), or a [schedule](/platform/triggers/scheduled-agents/). The parent runs in an environment and spawns children from there. -Cloud parents that spawn cloud children need access to one or more [environments](/platform/environments/) the children can run in. To keep child execution on your own infrastructure, route those children to a [self-hosted worker](/platform/self-hosting/). +Cloud parents that spawn cloud children need access to one or more [environments](/platform/environments/) the children can run in. To keep child execution on your own infrastructure, route those children to a [self-hosted worker](/factories/self-hosting/). ## Starting an orchestrated run from Warp @@ -193,10 +193,10 @@ Self-hosted, local, and GitHub Action runs cannot be cancelled through this endp * [Multi-agent orchestration](/platform/orchestration/) - parent/child model, run state transitions, and common patterns. * [How to run multiple AI coding agents](/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/) - practical task decomposition, worktree ownership, validation, and review handoff guidance. -* [{VARS.WARP_AGENT_CLI}](/reference/cli/) - command reference for `oz agent run-cloud` and `oz run`. -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) - full HTTP reference and typed SDKs. +* [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) - command reference for `oz agent run-cloud` and `oz run`. +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - full HTTP reference and typed SDKs. * [Managing cloud agents](/platform/managing-cloud-agents/) - how parent and child runs appear in the Agent Management Panel in the Warp app and the Runs page in the {VARS.WEB_APP}. * [Scheduled agents](/platform/triggers/scheduled-agents/) - start a recurring cloud parent that fans out children on a cron cadence. -* [Self-hosting](/platform/self-hosting/) - keep parent or child execution on your infrastructure while Warp tracks the runs. +* [Self-hosting](/factories/self-hosting/) - keep parent or child execution on your infrastructure while Warp tracks the runs. * [Handoff between local and cloud agents](/platform/handoff/) - promote a local parent to the cloud, or continue a finished cloud parent with a follow-up. * [Environments](/platform/environments/) - configure the runtime context cloud children execute in. diff --git a/src/content/docs/platform/overview.mdx b/src/content/docs/platform/overview.mdx index eee34d36b..5d87dc41b 100644 --- a/src/content/docs/platform/overview.mdx +++ b/src/content/docs/platform/overview.mdx @@ -36,13 +36,13 @@ Every run follows the same path, whatever starts it: ## Integrations and triggers -Every run starts with a trigger. [Integrations](/platform/integrations/) turn events in other tools into runs: mention @warp in [Slack](/platform/integrations/slack/) and the agent gets the message and its thread, or run agents inside your [GitHub Actions](/platform/integrations/github-actions/) workflows with your CI context. [Scheduled agents](/platform/triggers/scheduled-agents/) start runs on a cron schedule. For event sources Warp doesn't cover, receive the event in your own system and start the run through the [API](/reference/api-and-sdk/); it becomes a normal, fully tracked task. +Every run starts with a trigger. [Integrations](/platform/integrations/) turn events in other tools into runs: mention @warp in [Slack](/platform/integrations/slack/) and the agent gets the message and its thread, or run agents inside your [GitHub Actions](/platform/integrations/github-actions/) workflows with your CI context. [Scheduled agents](/platform/triggers/scheduled-agents/) start runs on a cron schedule. For event sources Warp doesn't cover, receive the event in your own system and start the run through the [API](/factories/api-and-sdk/); it becomes a normal, fully tracked task. -Set up a first-party integration with `oz integration create` on the {VARS.WARP_AGENT_CLI}; the [integration setup guide](/reference/cli/integration-setup/) covers it end to end. +Set up a first-party integration with `oz integration create` on the {VARS.WARP_AGENT_CLI}; the [integration setup guide](/agents/cli/oz-cli/integration-setup/) covers it end to end. ## Tasks and tracking -Warp tracks every run as a task: its status, transcript, and outputs stay available after the run finishes. Watch or steer a live run with [session sharing](/agents/local-agents/session-sharing/), browse history in the [management UI](/platform/managing-cloud-agents/), or query it from the [{VARS.WARP_AGENT_CLI}](/reference/cli/) and the [API](/reference/api-and-sdk/). Access control decides who can run, view, or intervene in tasks. +Warp tracks every run as a task: its status, transcript, and outputs stay available after the run finishes. Watch or steer a live run with [session sharing](/agents/local-agents/session-sharing/), browse history in the [management UI](/platform/managing-cloud-agents/), or query it from the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) and the [API](/factories/api-and-sdk/). Access control decides who can run, view, or intervene in tasks. To fan work out across parent and child agents, see [multi-agent orchestration](/platform/orchestration/). @@ -52,17 +52,17 @@ An [environment](/platform/environments/) defines what a run needs: a Docker ima ## Hosts -A host is where the agent executes. By default runs execute on [Warp-hosted infrastructure](/platform/warp-hosting/), with nothing to set up. On Enterprise plans, [self-hosted runners](/platform/self-hosting/) keep code and execution inside your own network while Warp still tracks the runs. +A host is where the agent executes. By default runs execute on [Warp-hosted infrastructure](/factories/warp-hosting/), with nothing to set up. On Enterprise plans, [self-hosted runners](/factories/self-hosting/) keep code and execution inside your own network while Warp still tracks the runs. ![Architecture diagram: Warp-designed and customer-defined triggers create an agent task, which is routed to agent runners on Warp or customer infrastructure](../../../assets/agent-platform/platform-architecture.png) ## The CLI -The [{VARS.WARP_AGENT_CLI}](/reference/cli/) starts and manages runs where there's no UI: CI jobs, scripts, and remote servers. Start a run with `oz agent run`, and it reports progress to Warp like any other task, so work that starts on a CI runner shows up alongside everything else your team runs. For interactive sessions, use [agents in the Warp app](/agents/). +The [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) starts and manages runs where there's no UI: CI jobs, scripts, and remote servers. Start a run with `oz agent run`, and it reports progress to Warp like any other task, so work that starts on a CI runner shows up alongside everything else your team runs. For interactive sessions, use [agents in the Warp app](/agents/). ## API and SDKs -The [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) creates and inspects tasks over HTTP: submit a prompt with optional configuration, poll status, and fetch results with full provenance. Teams use it to start agents from incident tooling and internal systems, build dashboards over run history, and coordinate large batches of runs. Official [Python](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript](https://github.com/warpdotdev/oz-sdk-typescript) SDKs add typed requests and responses, built-in retries, and consistent errors. Start with an SDK unless you need full control over your HTTP client. +The [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) creates and inspects tasks over HTTP: submit a prompt with optional configuration, poll status, and fetch results with full provenance. Teams use it to start agents from incident tooling and internal systems, build dashboards over run history, and coordinate large batches of runs. Official [Python](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript](https://github.com/warpdotdev/oz-sdk-typescript) SDKs add typed requests and responses, built-in retries, and consistent errors. Start with an SDK unless you need full control over your HTTP client. ## Secrets @@ -82,4 +82,4 @@ Runs pick up your team's shared setup no matter what triggered them: [MCP server * [Cloud agents](/platform/) - what cloud agents are, how they get triggered, and how to run them with or without the Warp app. * [Cloud agents quickstart](/platform/quickstart/) - run your first cloud agent in about ten minutes. * [Environments](/platform/environments/) - define the toolchain and repos a run executes against. -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) - drive the platform programmatically. +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - drive the platform programmatically. diff --git a/src/content/docs/platform/oz-web-app.mdx b/src/content/docs/platform/oz-web-app.mdx index b40860d23..131cfca2e 100644 --- a/src/content/docs/platform/oz-web-app.mdx +++ b/src/content/docs/platform/oz-web-app.mdx @@ -38,7 +38,7 @@ The {VARS.WEB_APP} is ideal when you want to: * **Configure environments** — Set up repos, Docker images, and setup commands through a form-based flow * **Set up integrations** — Connect Slack and Linear with a guided setup flow, and configure how [GitHub](/platform/integrations/github/) mention-triggered runs execute -For scripting, automation, and CI/CD workflows, use the [{VARS.WARP_AGENT_CLI}](/reference/cli/) or [API](/reference/api-and-sdk/). +For scripting, automation, and CI/CD workflows, use the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) or [API](/factories/api-and-sdk/). ## Getting started @@ -217,7 +217,7 @@ To create a new environment: 6. Click **Create environment**. The environment appears on the Environments page. :::note -For advanced environment configuration, see [Environments](/platform/environments/) and the [CLI reference](/reference/cli/integration-setup/). +For advanced environment configuration, see [Environments](/platform/environments/) and the [CLI reference](/agents/cli/oz-cli/integration-setup/). ::: ## Integrations @@ -251,5 +251,5 @@ For detailed integration setup instructions, see [Slack](/platform/integrations/ * [Scheduled Agents](/platform/triggers/scheduled-agents/) — Run agents automatically on a cron schedule * [Environments](/platform/environments/) — Configure runtime context for cloud agents * [Managing Cloud Agents](/platform/managing-cloud-agents/) — Monitor agent activity and inspect runs -* [{VARS.WARP_AGENT_CLI}](/reference/cli/) — Command-line interface for running agents -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) — Programmatic access to cloud agents +* [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) — Command-line interface for running agents +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — Programmatic access to cloud agents diff --git a/src/content/docs/platform/quickstart.mdx b/src/content/docs/platform/quickstart.mdx index b597b592c..45bbc2d73 100644 --- a/src/content/docs/platform/quickstart.mdx +++ b/src/content/docs/platform/quickstart.mdx @@ -102,7 +102,7 @@ Follow the prompts to save your task definition. Once created, you can run it ag **How this works:** Skills capture successful agent workflows as reusable building blocks. Instead of typing the same prompt repeatedly, you define it once. You can use it yourself, share it with teammates, schedule it to run automatically, or trigger it from integrations. Learn more about [Skills as Agents](/platform/skills-as-agents/). -**Prefer using the CLI?** See the [{VARS.WARP_AGENT_CLI} quickstart](/reference/cli/quickstart/) for CLI-based workflows. +**Prefer using the CLI?** See the [{VARS.WARP_AGENT_CLI} quickstart](/agents/cli/oz-cli/quickstart/) for CLI-based workflows. --- @@ -114,7 +114,7 @@ Now that you've run your first cloud agent, try these next steps: * [**Trigger agents from Slack or Linear**](/platform/integrations/quickstart/) - Connect Warp to team tools so mentions and issue updates can launch cloud agent runs. * [**Orchestrate multiple agents**](/platform/orchestration/multi-agent-runs/) - Fan work out across parent and child agents for large refactors, PR review swarms, and parallel package migrations. * [**Turn successful prompts into reusable skills**](/platform/skills-as-agents/) - Save repeatable agent workflows and run them again from the CLI, web app, API, or a schedule. -* [**Build programmatic automations**](/reference/api-and-sdk/quickstart/) - Start cloud agent runs from your own systems with the {VARS.API_SDK_NAME}. +* [**Build programmatic automations**](/factories/api-and-sdk/quickstart/) - Start cloud agent runs from your own systems with the {VARS.API_SDK_NAME}. For example, schedule a recurring agent from the CLI: @@ -135,13 +135,13 @@ Integrations require a team on Build, Max, or Business plan. ## Troubleshooting **Environment creation fails**\ -Use official Docker Hub images like `node`, `python`, or `rust` for best compatibility. Ensure your GitHub repos are accessible. If using a custom image, avoid Alpine/musl-based images—the agent runtime requires glibc. See [Environments](/platform/environments/) for more guidance on choosing Docker images and [`environment_setup_failed`](/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/) for the related API error. +Use official Docker Hub images like `node`, `python`, or `rust` for best compatibility. Ensure your GitHub repos are accessible. If using a custom image, avoid Alpine/musl-based images—the agent runtime requires glibc. See [Environments](/platform/environments/) for more guidance on choosing Docker images and [`environment_setup_failed`](/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed/) for the related API error. **Agent can't access repos**\ -Warp prompts you to authorize GitHub when you create an environment or trigger your first agent. If authorization fails or needs updating, see [How GitHub Authorization works](/reference/cli/integration-setup/#how-github-authorization-works) and [`external_authentication_required`](/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/). For automated workflows using an agent API key, make sure [team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization) is configured in the Admin Panel. Also verify that repos are correctly configured in your environment with `oz environment get <ENV_ID>`; permission mismatches can surface as [`not_authorized`](/reference/api-and-sdk/troubleshooting/errors/not-authorized/). +Warp prompts you to authorize GitHub when you create an environment or trigger your first agent. If authorization fails or needs updating, see [How GitHub Authorization works](/agents/cli/oz-cli/integration-setup/#how-github-authorization-works) and [`external_authentication_required`](/factories/api-and-sdk/troubleshooting/errors/external-authentication-required/). For automated workflows using an agent API key, make sure [team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization) is configured in the Admin Panel. Also verify that repos are correctly configured in your environment with `oz environment get <ENV_ID>`; permission mismatches can surface as [`not_authorized`](/factories/api-and-sdk/troubleshooting/errors/not-authorized/). **Not enough credits to run cloud agents**\ -Your team needs at least 20 credits available. Check your credit balance in Settings or see [Access, Billing, and Identity](/platform/team-access-billing-and-identity/) for details on credit requirements and which plans support cloud agents. If a run is blocked because the billed principal has no remaining credits, see [`insufficient_credits`](/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/). +Your team needs at least 20 credits available. Check your credit balance in Settings or see [Access, Billing, and Identity](/platform/team-access-billing-and-identity/) for details on credit requirements and which plans support cloud agents. If a run is blocked because the billed principal has no remaining credits, see [`insufficient_credits`](/factories/api-and-sdk/troubleshooting/errors/insufficient-credits/). **More resources** diff --git a/src/content/docs/platform/secrets.mdx b/src/content/docs/platform/secrets.mdx index e336eb55c..2290c7fae 100644 --- a/src/content/docs/platform/secrets.mdx +++ b/src/content/docs/platform/secrets.mdx @@ -290,7 +290,7 @@ Individual runs can override which secrets the run receives by listing them on t * **Explicit list of secret names** - Only the listed secrets are injected. Any other secrets the caller can access are skipped for this run. * **Empty list** - The run opts out of all secret injection. No managed secrets are injected, even for triggers that would otherwise receive them. -Run-level scoping is exposed through the public REST API on the run config. See the [{VARS.API_SDK_NAME} reference](/reference/api-and-sdk/) for the exact field and shape. +Run-level scoping is exposed through the public REST API on the run config. See the [{VARS.API_SDK_NAME} reference](/factories/api-and-sdk/) for the exact field and shape. :::note Secret names that don't exist in the caller's scope are silently skipped at injection time rather than failing the run. The run detail view surfaces any references that were requested but not resolved so you can spot typos or stale names. diff --git a/src/content/docs/platform/self-hosting/index.mdx b/src/content/docs/platform/self-hosting/index.mdx deleted file mode 100644 index baaa956c6..000000000 --- a/src/content/docs/platform/self-hosting/index.mdx +++ /dev/null @@ -1,226 +0,0 @@ ---- -title: Self-hosting overview -description: >- - Run cloud agents on your own infrastructure with a managed worker daemon or - unmanaged CLI-based execution you control. ---- -import { VARS } from '@data/vars'; - -Self-hosting lets your team run cloud agent workloads on your own infrastructure instead of Warp-managed servers. You control the execution environment, compute resources, and network access. Repository clones, source files, build artifacts, runtime secrets, and agent execution workspaces stay on your infrastructure, and agents can reach services behind your VPN or firewall. - -**New to self-hosting?** Start with the [Self-hosting quickstart](/platform/self-hosting/quickstart/) to get a managed worker running on Docker in under 10 minutes. - -**Want a CLI-only path with no Docker requirement?** Jump straight to the [Unmanaged quickstart](/platform/self-hosting/unmanaged/#unmanaged-quickstart) to run `oz agent run` directly on any host. - -:::note -**Enterprise feature**: Self-hosted agents are available exclusively to teams on an Enterprise plan. To enable self-hosting for your team, [contact sales](https://www.warp.dev/contact-sales). -::: - -## Managed vs unmanaged - -Self-hosting has two architectures. The core distinction is **who orchestrates agent runs** — not who owns the compute. Both models keep code and execution on your infrastructure. - -* **Managed** — The {VARS.WARP_AUTOMATION_PLATFORM} orchestrates agent runs. You run the `oz-agent-worker` daemon on your infrastructure; it connects to the {VARS.WARP_AUTOMATION_PLATFORM} and waits for work. [Slack](/platform/integrations/slack/) mentions, Linear comments, [schedules](/platform/triggers/scheduled-agents/), API calls, and `oz agent run-cloud` commands all route tasks to your worker, which executes them in isolated Docker containers, Kubernetes Jobs, or directly on the host. Similar to a [GitHub self-hosted runner](https://docs.github.com/en/actions/hosting-your-own-runners). -* **Unmanaged** — You orchestrate agent runs. You invoke `oz agent run` directly from your existing CI pipeline, Kubernetes pod, VM, or dev box. The {VARS.WARP_AUTOMATION_PLATFORM} provides session tracking and observability for each run, but does not start or stop agents for you. - -### At a glance - -| Aspect | **Managed** | **Unmanaged** | -| --- | --- | --- | -| **Who triggers runs** | The {VARS.WARP_AUTOMATION_PLATFORM} (Slack, Linear, schedules, API, `run-cloud`) | Your system (CI, cron, scripts) | -| **What runs on your infra** | Long-lived `oz-agent-worker` daemon | One-shot `oz agent run` invocations | -| **OS support** | Linux (macOS/Windows coming) | Linux, macOS, Windows | -| **Execution isolation** | Docker container, Kubernetes Job, or direct host | Whatever your host provides | -| **Automatic environment setup** | Yes (via Warp [environments](/platform/environments/)) | No (you manage it) | -| **Session tracking and steering** | Yes | Yes | - -The two architectures are not mutually exclusive. Some teams run managed workers for integration-triggered work and unmanaged agents in CI pipelines. The deployment models diagram on [Deployment patterns](/platform/deployment-patterns/) compares what runs where in each model. - -## How self-hosting works - -Warp uses a split-plane architecture: **execution happens on your infrastructure**, while **orchestration, session management, and LLM inference route through Warp's backend**. Agent interactions — including code context in session transcripts and LLM prompts — transit Warp's control plane under [Zero Data Retention (ZDR)](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr) agreements. Warp does not persistently store your source code or train on it. - -If your security requirement is "repository clones and execution must stay on our infrastructure," self-hosting is designed for that. If your requirement is "no code context can ever route through Warp or an external LLM provider," review [Security and networking](/platform/self-hosting/security-and-networking/) with your Warp account team before deploying. - -![Self-hosted execution architecture showing the managed worker on customer infrastructure connecting outbound to the Warp control plane](../../../../assets/agent-platform/customer-dedicated-saas.png) - -The [self-hosted execution flow](/platform/architecture/#self-hosted-execution-flow) reference explains each numbered step in the diagram. - -With any self-hosted architecture: - -* **Agent runs are tracked and steerable** — View status, metadata, and session transcripts in the <a href={VARS.WEB_APP_URL}>{VARS.DASHBOARD}</a>, the Warp app, or via the [API/SDK](/reference/api-and-sdk/). Authorized teammates can attach to running sessions to monitor or steer agents. -* **Connectivity to Warp's backend is required** — Agents need outbound access to Warp for orchestration, session storage, and LLM inference. No inbound ports need to be opened. -* **Resource limits are controlled by your infrastructure** — Concurrency and compute are only limited by the machines you provision, not by Warp. - -:::note -Enterprise teams that need full control over LLM inference routing can use [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/) to route inference through their own cloud provider accounts. Cloud agent support varies by provider; see each provider's setup guide for details. -::: - ---- - -## Choosing an architecture - -:::caution -**OS support:** The managed architecture is **Linux-only** today (macOS and Windows support is coming). If you need agents to run on macOS or Windows, use the [unmanaged](/platform/self-hosting/unmanaged/) architecture, which works on any platform Warp supports. -::: - -Use these questions to decide between managed and unmanaged: - -1. **Do you need agents to run on Windows or macOS?** - * Yes → Use the [unmanaged](/platform/self-hosting/unmanaged/) architecture. Managed is Linux-only today. - * No, Linux works → Continue to the next question. -2. **Do you want the {VARS.WARP_AUTOMATION_PLATFORM} to handle starting and stopping agents** (from Slack, the web interface, the Warp app, schedules, or the API)? - * Yes → Use the [managed](#managed-architecture) architecture. - * No, you have your own triggering mechanism → Use the [unmanaged](/platform/self-hosting/unmanaged/) architecture. -3. **Can your development environment run in a Docker container or Kubernetes pod?** - * Yes, Docker → [Managed: Docker](/platform/self-hosting/managed-docker/) backend. - * Yes, Kubernetes → [Managed: Kubernetes](/platform/self-hosting/managed-kubernetes/) backend. - * No (multi-service stacks that don't fit a single container, or environments where container runtimes aren't available) → [Unmanaged](/platform/self-hosting/unmanaged/) or [Managed: Direct](/platform/self-hosting/managed-direct/). -4. **Do you have your own orchestrator** (CI/CD, Kubernetes, internal job scheduler) **that starts agents on demand?** - * Yes → [Unmanaged](/platform/self-hosting/unmanaged/), using `oz agent run` as a drop-in. - * No → [Managed](#managed-architecture). - -### Choosing a managed backend - -The managed architecture supports three backends for task execution: - -1. **Are you deploying the worker into a Kubernetes cluster?** - * Yes → Use the [Kubernetes backend](/platform/self-hosting/managed-kubernetes/). Each task runs as a Kubernetes Job in your cluster; install with the included Helm chart. - * No → Continue. -2. **Is Docker available on your worker host?** - * Yes → Use the [Docker backend](/platform/self-hosting/managed-docker/) (default). Tasks run in isolated containers. - * No → Use the [Direct backend](/platform/self-hosting/managed-direct/). Tasks run directly on the host. -3. **Do you need container-level isolation between tasks?** - * Yes → [Docker](/platform/self-hosting/managed-docker/) or [Kubernetes](/platform/self-hosting/managed-kubernetes/) backend. - * No → Any backend works. -4. **Do you need Kubernetes-native scheduling, resource management, or policy enforcement?** - * Yes → [Kubernetes backend](/platform/self-hosting/managed-kubernetes/). - * No → [Docker](/platform/self-hosting/managed-docker/) or [Direct](/platform/self-hosting/managed-direct/) is simpler to set up. - ---- - -## Managed architecture - -With the managed architecture, you run the `oz-agent-worker` daemon on your infrastructure. The daemon connects to the {VARS.WARP_AUTOMATION_PLATFORM}'s backend, waits for tasks to be assigned to it, and executes those tasks on its host using one of three backends: - -* **[Docker backend](/platform/self-hosting/managed-docker/)** (default) — Runs each task in an isolated Docker container. -* **[Kubernetes backend](/platform/self-hosting/managed-kubernetes/)** — Runs each task as a Kubernetes Job in your cluster. -* **[Direct backend](/platform/self-hosting/managed-direct/)** — Runs each task directly on the host without a container runtime. - -The managed architecture enables full orchestration by the {VARS.WARP_AUTOMATION_PLATFORM} — it can remotely start agents via Slack, Linear, the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a>, the API/SDK, and the `oz agent run-cloud` command. Agents can access host resources through volume mounts (Docker), Kubernetes-native configuration (Kubernetes), and injected environment variables. - -## Unmanaged architecture - -With the [unmanaged architecture](/platform/self-hosting/unmanaged/), you run `oz agent run` inside your own orchestrator or dev environment. This works on any platform Warp supports (Linux, macOS, Windows), with no dependency on Docker or any other sandboxing platform. - -You're responsible for executing `oz agent run` on your infrastructure — similar to how you'd integrate Claude Code or Codex CLI. The agent runs directly on the host, which could itself be a Kubernetes pod, VM, container, or CI runner. - ---- - -## Routing runs to self-hosted workers - -This section applies to **all managed backends** (Docker, Kubernetes, and Direct). Once a worker is connected, route cloud agent runs to it by specifying the `--host` flag (or equivalent) with your worker ID. The `--host` value must match the `--worker-id` of a connected worker exactly. - -:::note -Unmanaged runs don't need routing — you invoke `oz agent run` directly on the host where you want the agent to execute. Routing is only relevant for managed workers. -::: - -### From the CLI - -```bash -oz agent run-cloud --prompt "Refactor the authentication module" --host "my-worker" -``` - -You can combine `--host` with any other `run-cloud` flags, such as `--environment`, `--model`, `--mcp`, `--skill`, `--computer-use`, and `--attach`. - -### From scheduled agents - -When creating or updating a schedule, specify the host: - -```bash -oz schedule create --name "daily-cleanup" \ - --cron "0 9 * * *" \ - --prompt "Run dead code cleanup" \ - --environment ENV_ID \ - --host "my-worker" - -oz schedule update SCHEDULE_ID --host "my-worker" -``` - -### From integrations - -When creating or updating an integration, specify the host: - -```bash -oz integration create slack --host "my-worker" ... -oz integration update linear --host "my-worker" ... -``` - -All tasks created through that integration route to your self-hosted worker. - -### From the API and SDKs - -When creating a run via the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/), include `worker_host` in the config: - -```bash -curl -X POST https://app.warp.dev/api/v1/agent/run \ - --header 'Authorization: Bearer YOUR_API_KEY' \ - --header 'Content-Type: application/json' \ - --data '{ - "prompt": "Refactor the authentication module", - "config": { - "environment_id": "ENV_ID", - "worker_host": "my-worker" - } - }' -``` - -### From the web UI - -When creating a run, schedule, or integration in the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a>, select your self-hosted worker from the host dropdown. - ---- - -## Environments with self-hosted workers - -Self-hosted workers fully support [environments](/platform/environments/). When a task specifies an environment, the worker resolves the Docker image, clones the repositories, runs setup commands, and executes the agent inside the prepared container or Kubernetes Job. - -The same environment can be used for both Warp-hosted and self-hosted runs without modification. If your agents need custom tools, binaries, scripts, or system packages, add them to the environment's Docker image. See [Environments](/platform/environments/) for details on creating and configuring custom images. - -:::note -With the Kubernetes backend, setting a [`default_image`](/platform/self-hosting/reference/#kubernetes-backend-config) on the worker lets you skip creating a Warp environment when all your tasks use the same base image. -::: - -:::caution -Musl-based Docker images (such as Alpine Linux) are not supported as task images. The agent runtime requires glibc. Use glibc-based images like Debian, Ubuntu, or the default (non-Alpine) variants of official Docker Hub images. -::: - -## Monitoring runs - -Self-hosted runs have the same observability as Warp-hosted runs: - -* **Run history** — View task status, history, and metadata in the {VARS.DASHBOARD}, hosted in the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a>, or filter by source and status in the [Agent Management Panel](/platform/managing-cloud-agents/). -* **Session sharing** — Authorized teammates can attach to running tasks to [monitor progress](/platform/viewing-cloud-agent-runs/). -* **APIs and SDKs** — Query task history and build monitoring using the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/). - -For infrastructure-level observability, the `oz-agent-worker` daemon can export OpenTelemetry metrics (worker health, task throughput, capacity saturation) to Prometheus, an OTLP collector, or the console. See [Monitoring](/platform/self-hosting/monitoring/) for setup, the full metric catalog, and sample PromQL queries. - ---- - -## Related pages - -* [Self-hosting quickstart](/platform/self-hosting/quickstart/) — Get a managed worker running in ~10 minutes. -* [Unmanaged](/platform/self-hosting/unmanaged/) — Run `oz agent run` in your CI, K8s, or dev environment. -* [Managed: Docker](/platform/self-hosting/managed-docker/) — Default managed setup with the Docker backend. -* [Managed: Kubernetes](/platform/self-hosting/managed-kubernetes/) — Managed setup with the Kubernetes backend and Helm chart. -* [Managed: Direct](/platform/self-hosting/managed-direct/) — Managed setup with no container runtime. -* [Self-hosted worker reference](/platform/self-hosting/reference/) — CLI flags and config file schema. -* [Monitoring](/platform/self-hosting/monitoring/) — OpenTelemetry metrics for worker health, task throughput, and capacity. -* [Security and networking](/platform/self-hosting/security-and-networking/) — Data boundaries, network egress, and security considerations. -* [Troubleshooting](/platform/self-hosting/troubleshooting/) — Worker won't start, tasks not picked up, and other common issues. -* [Deployment patterns](/platform/deployment-patterns/) — How self-hosting compares to CLI-only and Warp-hosted deployment. -* [Scheduled agents](/platform/triggers/scheduled-agents/) — Route recurring cloud agent work to a self-hosted worker with `--host`. -* [Integrations](/platform/integrations/) — Point Slack, Linear, and other triggers at a self-hosted worker. -* [Managing cloud agents](/platform/managing-cloud-agents/) — Inspect self-hosted runs alongside Warp-hosted ones. -* [Environments](/platform/environments/) — Define the runtime context for agent tasks. -* [Customizing workspace snapshots](/platform/handoff/snapshots/) — Configure end-of-run snapshots so handoff works when running outside the bundled cloud agent image. diff --git a/src/content/docs/platform/skills-as-agents.mdx b/src/content/docs/platform/skills-as-agents.mdx index e2e7d5ed7..56f3c284b 100644 --- a/src/content/docs/platform/skills-as-agents.mdx +++ b/src/content/docs/platform/skills-as-agents.mdx @@ -52,7 +52,7 @@ For cloud agent runs (`oz agent run-cloud`), skills are discovered from reposito 3. **The skill appears** in the Agents list in the {VARS.WEB_APP} :::note -You can also list available skills programmatically using the `GET /agent` endpoint. See the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) reference for details. +You can also list available skills programmatically using the `GET /agent` endpoint. See the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) reference for details. ::: ### Extra skill directories in cloud runs @@ -105,7 +105,7 @@ oz agent run-cloud \ --prompt "additional context" ``` -For full CLI documentation, see [Using skills](/reference/cli/#using-skills) in the CLI reference. +For full CLI documentation, see [Using skills](/agents/cli/oz-cli/#using-skills) in the CLI reference. ### API & SDK @@ -121,7 +121,7 @@ Use the `skill_spec` parameter when creating a run: } ``` -For full API documentation, see [Agent configuration](/reference/api-and-sdk/#agent-configuration) in the API reference. +For full API documentation, see [Agent configuration](/factories/api-and-sdk/#agent-configuration) in the API reference. --- @@ -164,5 +164,5 @@ Suggested skills appear on the Agents page under the **Suggested** filter. * [Environments](/platform/environments/) — Configure repositories and runtime context for cloud agents * [Scheduled Agents](/platform/triggers/scheduled-agents/) — Run agents automatically on a cron schedule * [{VARS.WEB_APP}](/platform/oz-web-app/) — Visual interface for managing cloud agents -* [{VARS.WARP_AGENT_CLI}](/reference/cli/) — Command-line interface for running agents -* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) — Programmatic access to cloud agents +* [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) — Command-line interface for running agents +* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — Programmatic access to cloud agents diff --git a/src/content/docs/platform/team-access-billing-and-identity.mdx b/src/content/docs/platform/team-access-billing-and-identity.mdx index 094b0b384..413c04936 100644 --- a/src/content/docs/platform/team-access-billing-and-identity.mdx +++ b/src/content/docs/platform/team-access-billing-and-identity.mdx @@ -110,7 +110,7 @@ This ensures runs are scoped to what the user is allowed to see and modify, and By default, cloud agents authenticate with GitHub using the personal token of the user who triggered the run. Team GitHub authorization gives you an alternative: authenticate with the **Warp Factories** GitHub App instead, so agents can clone repositories and open pull requests without relying on any individual's token. -This is useful for fully automated workflows that use an [agent API key](/reference/cli/api-keys/), like CI/CD pipelines, scheduled agents, and SDK-triggered runs, where you want code changes attributed to the GitHub App rather than a specific person. +This is useful for fully automated workflows that use an [agent API key](/agents/cli/oz-cli/api-keys/), like CI/CD pipelines, scheduled agents, and SDK-triggered runs, where you want code changes attributed to the GitHub App rather than a specific person. ### How it works @@ -233,9 +233,9 @@ How credits are consumed depends on how the agent run is triggered and authentic * On Build, Max, and Business plans, Warp bills the team owner: the owner's plan-included credits, then the team's shared add-on credit pool. With auto-reload off, the request is blocked when both are depleted. With auto-reload on, usage can trigger a reload into the team's shared pool subject to the team-wide monthly spend cap. * On Enterprise plans, these runs draw from the team-scoped credit pool, per your Enterprise contract terms. * Ideal for CI/CD pipelines, scheduled tasks, and other automated workflows. -* For workflows that require code changes (opening pull requests, pushing branches, or writing to a repository), configure [team GitHub authorization](#team-github-authorization) so the agent can authenticate with the Warp Factories GitHub App. Alternatively, use a [personal API key](/reference/cli/api-keys/) to authenticate as an individual user. +* For workflows that require code changes (opening pull requests, pushing branches, or writing to a repository), configure [team GitHub authorization](#team-github-authorization) so the agent can authenticate with the Warp Factories GitHub App. Alternatively, use a [personal API key](/agents/cli/oz-cli/api-keys/) to authenticate as an individual user. -For more details on creating and using API keys, see [API Keys](/reference/cli/api-keys/). +For more details on creating and using API keys, see [API Keys](/agents/cli/oz-cli/api-keys/). :::note When a user triggers an agent via Slack or Linear, the run still follows that same order — plan-included credits first, then shared team grants, then any applicable user-scoped grants — as long as the triggering user's identity can be mapped to their Warp account. @@ -263,9 +263,9 @@ It's the team's responsibility to manage triggers, confirm they behave as intend If a cloud agent or integration run fails with an error code, use the error reference to narrow the fix: -* **Missing GitHub or external authorization** - See [`external_authentication_required`](/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/) when a user needs to authorize GitHub, Slack, or Linear before a run can continue. -* **Insufficient repo permissions** - See [`not_authorized`](/reference/api-and-sdk/troubleshooting/errors/not-authorized/) when the triggering user or GitHub App lacks access to the repo the agent needs. -* **Credits or spend caps block a run** - See [`insufficient_credits`](/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/) or [`budget_exceeded`](/reference/api-and-sdk/troubleshooting/errors/budget-exceeded/) when the billed account has depleted credits or reached a configured spend cap. +* **Missing GitHub or external authorization** - See [`external_authentication_required`](/factories/api-and-sdk/troubleshooting/errors/external-authentication-required/) when a user needs to authorize GitHub, Slack, or Linear before a run can continue. +* **Insufficient repo permissions** - See [`not_authorized`](/factories/api-and-sdk/troubleshooting/errors/not-authorized/) when the triggering user or GitHub App lacks access to the repo the agent needs. +* **Credits or spend caps block a run** - See [`insufficient_credits`](/factories/api-and-sdk/troubleshooting/errors/insufficient-credits/) or [`budget_exceeded`](/factories/api-and-sdk/troubleshooting/errors/budget-exceeded/) when the billed account has depleted credits or reached a configured spend cap. --- diff --git a/src/content/docs/platform/triggers/index.mdx b/src/content/docs/platform/triggers/index.mdx index c30ca6039..f204f1303 100644 --- a/src/content/docs/platform/triggers/index.mdx +++ b/src/content/docs/platform/triggers/index.mdx @@ -15,8 +15,8 @@ If you're choosing between schedules, Slack, Linear, GitHub, GitHub Actions, the ## Available trigger types * **[Scheduled Agents](/platform/triggers/scheduled-agents/)** - Run agents on a recurring schedule using cron expressions. -* **[CLI](/reference/cli/)** - Trigger cloud agents directly from your terminal using the {VARS.WARP_AGENT_CLI}. -* **[API & SDK](/reference/api-and-sdk/)** - Programmatically trigger agents via the Warp API or SDK. +* **[CLI](/agents/cli/oz-cli/)** - Trigger cloud agents directly from your terminal using the {VARS.WARP_AGENT_CLI}. +* **[API & SDK](/factories/api-and-sdk/)** - Programmatically trigger agents via the Warp API or SDK. * **[Integrations](/platform/integrations/)** - Trigger agents from external services like Slack, Linear, or Jira. * **[GitHub](/platform/integrations/github/)** - Mention `@warp-agent` on an issue, pull request, or review comment to start an agent that replies in the thread. * **[GitHub Actions](/platform/integrations/github-actions/)** - Run agents from your own CI workflows and repository events. diff --git a/src/content/docs/platform/triggers/scheduled-agents.mdx b/src/content/docs/platform/triggers/scheduled-agents.mdx index f9e8b71f6..55e633cf1 100644 --- a/src/content/docs/platform/triggers/scheduled-agents.mdx +++ b/src/content/docs/platform/triggers/scheduled-agents.mdx @@ -69,7 +69,7 @@ Use `oz schedule create` (with required flags) to define a new Scheduled Agent. * A cron schedule. * A prompt or skill that the agent will execute. * An optional environment in which the agent will run. -* An optional [model selection](/reference/cli/#using-agent-profiles). +* An optional [model selection](/agents/cli/oz-cli/#using-agent-profiles). * [Optional MCP server configuration](/platform/mcp/). ```bash @@ -115,7 +115,7 @@ oz schedule create \ Once created, the agent will automatically run at the specified times without further action. -Scheduled Agents support the same [model selection](/reference/cli/) and [MCP server configuration](/platform/mcp/) as other cloud agent triggers. +Scheduled Agents support the same [model selection](/agents/cli/oz-cli/) and [MCP server configuration](/platform/mcp/) as other cloud agent triggers. #### Cron schedule format @@ -290,7 +290,7 @@ Each scheduled run behaves like a standard cloud agent run, with a few important * Runs execute automatically without human intervention. * All usage is billed to the team’s shared credit balance. -If a scheduled run fails, it does not block future runs. Each execution is independent. Use the [API error reference](/reference/api-and-sdk/troubleshooting/errors/) to interpret any returned error code. +If a scheduled run fails, it does not block future runs. Each execution is independent. Use the [API error reference](/factories/api-and-sdk/troubleshooting/errors/) to interpret any returned error code. ### Permissions and responsibility diff --git a/src/content/docs/platform/self-hosting/unmanaged.mdx b/src/content/docs/platform/unmanaged-execution.mdx similarity index 89% rename from src/content/docs/platform/self-hosting/unmanaged.mdx rename to src/content/docs/platform/unmanaged-execution.mdx index 49cf1d397..68df30864 100644 --- a/src/content/docs/platform/self-hosting/unmanaged.mdx +++ b/src/content/docs/platform/unmanaged-execution.mdx @@ -11,7 +11,7 @@ import { VARS } from '@data/vars'; With the unmanaged architecture, **you orchestrate agent runs** by invoking `oz agent run` directly from your existing CI pipelines, Kubernetes pods, VMs, or dev boxes. The agent runs on whatever host the command is executed from; Warp tracks the session for you but does not start or stop agents. :::note -Unmanaged is the right choice if you already have a system that schedules work (CI, internal orchestrators, cron, dev environments). If you'd rather have the {VARS.WARP_AUTOMATION_PLATFORM} trigger and route runs from Slack, Linear, schedules, or the API, use the [managed architecture](/platform/self-hosting/#managed-architecture) instead. +Unmanaged is the right choice if you already have a system that schedules work (CI, internal orchestrators, cron, dev environments). If you'd rather have the {VARS.WARP_AUTOMATION_PLATFORM} trigger and route runs from Slack, Linear, schedules, or the API, use the [managed architecture](/factories/self-hosting/#managed-architecture) instead. ::: ## When to use unmanaged @@ -33,8 +33,8 @@ No Docker, no worker daemon, no environment required — just the {VARS.WARP_AGE ### Prerequisites -* **The {VARS.WARP_AGENT_CLI}** installed on the machine where agents will run. See [Installing the CLI](/reference/cli/#installing-the-cli) for platform-specific instructions. -* **A Warp API key** — For automation, create an agent API key in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a>. See [API Keys](/reference/cli/api-keys/) for personal vs. agent guidance. +* **The {VARS.WARP_AGENT_CLI}** installed on the machine where agents will run. See [Installing the CLI](/agents/cli/oz-cli/#installing-the-cli) for platform-specific instructions. +* **A Warp API key** — For automation, create an agent API key in the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a>. See [API Keys](/agents/cli/oz-cli/api-keys/) for personal vs. agent guidance. ### 1. Authenticate @@ -123,7 +123,7 @@ Unmanaged agents are tracked on Warp's backend. Each run creates a persistent se * **View** in the <a href={VARS.WEB_APP_URL}>{VARS.DASHBOARD}</a>. * **Attach to** via [Agent Session Sharing](/agents/local-agents/session-sharing/) to monitor or steer. -* **Query** through the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) for custom dashboards or monitoring. +* **Query** through the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) for custom dashboards or monitoring. Unmanaged sessions benefit from the same shared configuration as other cloud agent runs — [MCP servers](/platform/mcp/), [secrets](/platform/secrets/), Warp Drive context, and saved prompts all apply. @@ -133,8 +133,8 @@ Unmanaged runs don't ship with the bundled declarations script, so end-of-run wo ## Related pages -* [Self-hosting overview](/platform/self-hosting/) — Compare managed and unmanaged, plus the architecture decision guide. +* [Self-hosting overview](/factories/self-hosting/) — Compare managed and unmanaged, plus the architecture decision guide. * [GitHub Actions integration](/platform/integrations/github-actions/) — Run agents in CI with the official action. -* [Deployment patterns](/platform/deployment-patterns/) — Pattern 1 (CLI-only) explains the unmanaged model conceptually. -* [{VARS.WARP_AGENT_CLI}](/reference/cli/) — Full CLI reference for `oz agent run` and related commands. +* [Deployment patterns](/factories/deployment-patterns/) — Pattern 1 (CLI-only) explains the unmanaged model conceptually. +* [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) — Full CLI reference for `oz agent run` and related commands. * [Agent Session Sharing](/agents/local-agents/session-sharing/) — Attach to running sessions to monitor or steer them. diff --git a/src/content/docs/platform/viewing-cloud-agent-runs.mdx b/src/content/docs/platform/viewing-cloud-agent-runs.mdx index 12cb6f3b1..54d9b0128 100644 --- a/src/content/docs/platform/viewing-cloud-agent-runs.mdx +++ b/src/content/docs/platform/viewing-cloud-agent-runs.mdx @@ -9,7 +9,7 @@ sidebar: import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; -Cloud agent session sharing lets you open, inspect, and continue interacting with agent tasks that are running on remote virtual machines. Whether a cloud agent was triggered from [integrations](/platform/integrations/) like Slack, Linear, GitHub Actions, or the [{VARS.WARP_AGENT_CLI}](/reference/cli/), you can view its full session, follow along in real time, ask follow-up questions, and even "fork" the work into your local Warp environment. +Cloud agent session sharing lets you open, inspect, and continue interacting with agent tasks that are running on remote virtual machines. Whether a cloud agent was triggered from [integrations](/platform/integrations/) like Slack, Linear, GitHub Actions, or the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/), you can view its full session, follow along in real time, ask follow-up questions, and even "fork" the work into your local Warp environment. Use cloud agent session sharing when you need to inspect a cloud agent run, debug a failed automation, or give teammates a shared record of what the agent did. The shared session is the review surface for the run: it shows the prompt, plan, commands, logs, outputs, and follow-up messages where available. @@ -37,7 +37,7 @@ Everything is accessible whether or not Warp is installed on the viewer’s mach #### 1. Open a remote cloud agent run -When a cloud agent starts working — for example, from a Slack mention, a Linear issue, or a [CLI](/reference/cli/) trigger — Warp attaches a shareable link to the run. +When a cloud agent starts working — for example, from a Slack mention, a Linear issue, or a [CLI](/agents/cli/oz-cli/) trigger — Warp attaches a shareable link to the run. * From [Slack](/platform/integrations/slack/), click **View Agent** in the agent response to open the session. * From [Linear](/platform/integrations/linear/), click the ↗ **Warp** button ("Open in Warp") on the ticket to open the session. diff --git a/src/content/docs/reference/index.mdx b/src/content/docs/reference/index.mdx deleted file mode 100644 index 59996046e..000000000 --- a/src/content/docs/reference/index.mdx +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Technical reference -description: >- - Technical reference documentation for the {{WARP_AGENT_CLI}}, API, and SDK. ---- -import { VARS } from '@data/vars'; - -Technical reference documentation for the {VARS.WARP_AGENT_CLI}, API, and SDKs. Use these programmatic interfaces to run and manage agents from CI pipelines, scripts, backend services, and custom tooling without requiring the Warp desktop app. - -## CLI - -The [{VARS.WARP_AGENT_CLI}](/reference/cli/) lets you run and configure agents from any environment — locally, in CI pipelines, or on remote machines. - -- [API Keys](/reference/cli/api-keys/) - Create and manage API keys to authenticate the {VARS.WARP_AGENT_CLI} without human interaction, ideal for CI pipelines, headless servers, and containers. -- [Agent Profiles](/reference/cli/agent-profiles/) - Use agent profiles to control what the agent can access, how it behaves, and where it can act, including file access, command execution, and MCP server usage. -- [MCP Servers](/reference/cli/mcp-servers/) - Pass MCP server configuration to agent runs using the `--mcp` flag, by UUID, inline JSON, or file path. -- [Skills](/reference/cli/skills/) - Run agents from reusable instruction sets stored in your repositories using the `--skill` flag. -- [Warp Drive Context](/reference/cli/warp-drive/) - Reference saved prompts, notebooks, workflows, and rules from Warp Drive directly in CLI agent commands. -- [Integration Setup](/reference/cli/integration-setup/) - Configure environments and connect external tools like Slack and Linear so you can trigger agents from outside the terminal. -- [Troubleshooting](/reference/cli/troubleshooting/) - Find solutions to common CLI errors, including authentication issues, agent failures, environment problems, and Docker image issues. - -## API & SDK - -The [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) lets you create and monitor cloud agent runs over HTTP. Official SDKs for [Python](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript](https://github.com/warpdotdev/oz-sdk-typescript) provide typed clients with built-in retries and error handling. - -- [Demo: Sentry monitoring with SDK](/reference/api-and-sdk/demo-sentry-monitoring-with-sdk/) - example integration diff --git a/src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx b/src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx index ceaf3c34a..f02dcf605 100644 --- a/src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx +++ b/src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx @@ -256,7 +256,7 @@ The waterfall is: When auto-reload is **off**, the request is blocked once both buckets are depleted. When auto-reload is **on**, cloud agent usage can trigger auto-reload into the team's shared pool subject to the team-wide spend cap; further cloud agent runs then draw from that reloaded balance until the cap is reached. -"Blocked" means the run fails immediately with an insufficient-credits error rather than queuing or retrying. For unattended runs (scheduled jobs, team-API-key triggers), this manifests as a failed run in the {VARS.DASHBOARD} with an [insufficient credits](/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/) error code; the run won't be retried automatically. Owners should monitor the dashboard and configure spend caps with headroom for critical scheduled workloads. +"Blocked" means the run fails immediately with an insufficient-credits error rather than queuing or retrying. For unattended runs (scheduled jobs, team-API-key triggers), this manifests as a failed run in the {VARS.DASHBOARD} with an [insufficient credits](/factories/api-and-sdk/troubleshooting/errors/insufficient-credits/) error code; the run won't be retried automatically. Owners should monitor the dashboard and configure spend caps with headroom for critical scheduled workloads. :::note Enterprise plans support team-scoped credit pools, so this traffic draws from the team pool rather than an individual admin. See [enterprise billing](/enterprise/support-and-resources/billing/) for overage and contract terms. diff --git a/src/sidebar.ts b/src/sidebar.ts index 27a299094..2068522c8 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -389,19 +389,16 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // next door, since the underlying concepts are the same. items: [ { - // 'Getting started', not 'Get started': matches the Terminal, - // Enterprise, and Guides tabs. - label: 'Getting started', + label: 'Overview', items: [ { slug: 'factories', label: 'Overview' }, - { slug: 'factories/quickstart', label: 'Quickstart' }, - // 'Warp' is redundant inside the Factories tab, and the sibling - // labels ('Factory agents', 'Factory MCP') drop it too. This also - // resolves a desync: the page's own frontmatter label already said - // 'How Factories work', which this override was silently shadowing. { slug: 'factories/how-factories-work', label: 'How Factories work' }, ], }, + { + label: 'Get started', + items: [{ slug: 'factories/quickstart', label: 'Quickstart' }], + }, { // Parallel to 'Agent configuration' in the Automation Platform tab. // Scoped to the factory itself: who runs the work, how it is defined, @@ -414,8 +411,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // now the Automations primitive's conceptual home, parallel to Factory // agents and Factory skills, not just a filters reference. { slug: 'factories/automations', label: 'Factory automations' }, - { slug: 'factories/factory-as-code', label: 'Factory definition' }, - { slug: 'factories/infrastructure-and-security', label: 'Infrastructure & security' }, + { slug: 'factories/factory-as-code', label: 'Definitions as code' }, ], }, { @@ -468,6 +464,36 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'factories/factory-mcp', label: 'Factory MCP' }, ], }, + { + label: 'Developer tools', + items: [ + { slug: 'factories/developer-tools', label: 'Overview' }, + { slug: 'factories/factory-api', label: 'Factory API' }, + { slug: 'factories/api-and-sdk', label: VARS.API_SDK_NAME }, + { label: 'API reference', link: '/api' }, + { slug: 'factories/api-and-sdk/troubleshooting', label: 'API troubleshooting' }, + { slug: 'factories/api-and-sdk/troubleshooting/errors', label: 'API errors' }, + { slug: 'factories/factory-mcp', label: 'Factory MCP' }, + { slug: 'factories/webhooks', label: 'Webhooks' }, + ], + }, + { + label: 'Infrastructure & security', + items: [ + { slug: 'factories/infrastructure-and-security', label: 'Overview' }, + { slug: 'factories/deployment-patterns', label: 'Deployment patterns' }, + { slug: 'factories/warp-hosting', label: 'Warp-hosted execution' }, + { slug: 'factories/runners', label: 'Runners' }, + { slug: 'factories/self-hosting', label: 'Managed self-hosting' }, + { slug: 'factories/self-hosting/quickstart', label: 'Self-hosting quickstart' }, + { slug: 'factories/self-hosting/managed-docker', label: 'Docker backend' }, + { slug: 'factories/self-hosting/managed-kubernetes', label: 'Kubernetes backend' }, + { slug: 'factories/self-hosting/managed-direct', label: 'Direct backend' }, + 'factories/self-hosting/monitoring', + { slug: 'factories/self-hosting/reference', label: 'Worker reference' }, + 'factories/self-hosting/troubleshooting', + ], + }, { // Same label as the Automation Platform tab's group for watching and // steering runs, because it covers the same ground one level up: the @@ -582,6 +608,8 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ }, { slug: 'platform/team-access-billing-and-identity', label: 'Access, billing, and identity' }, { slug: 'platform/faqs', label: 'Cloud agent FAQs' }, + { slug: 'platform/unmanaged-execution', label: 'Unmanaged execution' }, + { slug: 'platform/execution-security', label: 'Execution security' }, ], }, { @@ -590,7 +618,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'platform/environments', label: 'Overview' }, { slug: 'platform/environments/configuring-environments', label: 'Configuring environments' }, { slug: 'platform/environments/troubleshooting-environments', label: 'Troubleshooting' }, - { slug: 'platform/runners', label: 'Runners' }, ], }, { @@ -652,105 +679,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'platform/orchestration/multi-agent-runs', label: 'Running orchestrated agents' }, ], }, - { - // Named for what the group contains, not just its largest member: it - // holds a comparison page (deployment-patterns), a Warp-HOSTED page, - // and the self-hosting set. Labeling it 'Self-hosting' put - // 'Warp-hosted agents' under its own opposite. - label: 'Deployment & hosting', - items: [ - { slug: 'platform/architecture', label: 'Architecture' }, - { slug: 'platform/deployment-patterns', label: 'Deployment patterns' }, - { slug: 'platform/warp-hosting', label: 'Warp-hosted agents' }, - // Qualified: a bare 'Overview'/'Quickstart' would now read as the - // whole group's, not self-hosting's. Both match their page titles. - { slug: 'platform/self-hosting', label: 'Self-hosting overview' }, - { slug: 'platform/self-hosting/quickstart', label: 'Self-hosting quickstart' }, - { slug: 'platform/self-hosting/managed-docker', label: 'Managed: Docker' }, - { slug: 'platform/self-hosting/managed-kubernetes', label: 'Managed: Kubernetes' }, - { slug: 'platform/self-hosting/managed-direct', label: 'Managed: Direct' }, - { slug: 'platform/self-hosting/unmanaged', label: 'Unmanaged' }, - 'platform/self-hosting/monitoring', - { slug: 'platform/self-hosting/reference', label: 'Self-hosted worker reference' }, - 'platform/self-hosting/security-and-networking', - { slug: 'platform/self-hosting/troubleshooting', label: 'Troubleshooting' }, - ], - }, - ], - }, - { - label: 'API & Reference', - link: '/reference/', - icon: 'open-book', - items: [ - { - // API Reference promoted to the top of the sidebar (was buried 3 - // levels deep under API & SDK) per HYC/Rachael's Slack discussion on - // discoverability after the top-level API tab was removed. - label: 'Technical Reference', - items: [ - { slug: 'reference', label: 'Overview' }, - { label: 'API Reference', link: '/api' }, - ], - }, - { - label: 'CLI', - items: [ - { slug: 'reference/cli', label: `${VARS.WARP_AGENT_CLI} (legacy)` }, - { slug: 'reference/cli/quickstart', label: 'Quickstart' }, - { slug: 'reference/cli/api-keys', label: 'API Keys' }, - { slug: 'reference/cli/agent-profiles', label: 'Agent Profiles' }, - { slug: 'reference/cli/mcp-servers', label: 'MCP Servers' }, - { slug: 'reference/cli/skills', label: 'Skills' }, - { slug: 'reference/cli/warp-drive', label: 'Warp Drive Context' }, - { slug: 'reference/cli/integration-setup', label: 'Integration Setup' }, - { slug: 'reference/cli/artifacts', label: 'Artifacts' }, - { slug: 'reference/cli/federate', label: 'Federated identity' }, - 'reference/cli/troubleshooting', - ], - }, - { - label: 'API & SDK', - items: [ - { slug: 'reference/api-and-sdk', label: VARS.API_SDK_NAME }, - { slug: 'reference/api-and-sdk/quickstart', label: 'Quickstart' }, - // API Reference link moved to the top-level 'Technical Reference' - // group above for discoverability -- not duplicated here. - 'reference/api-and-sdk/demo-sentry-monitoring-with-sdk', - { - label: 'API Troubleshooting', - collapsed: true, - items: [ - { slug: 'reference/api-and-sdk/troubleshooting', label: 'API Troubleshooting' }, - { - label: 'Errors', - collapsed: true, - items: [ - { slug: 'reference/api-and-sdk/troubleshooting/errors', label: 'Errors' }, - 'reference/api-and-sdk/troubleshooting/errors/insufficient-credits', - 'reference/api-and-sdk/troubleshooting/errors/feature-not-available', - 'reference/api-and-sdk/troubleshooting/errors/external-authentication-required', - 'reference/api-and-sdk/troubleshooting/errors/not-authorized', - 'reference/api-and-sdk/troubleshooting/errors/invalid-request', - 'reference/api-and-sdk/troubleshooting/errors/resource-not-found', - 'reference/api-and-sdk/troubleshooting/errors/budget-exceeded', - 'reference/api-and-sdk/troubleshooting/errors/integration-disabled', - 'reference/api-and-sdk/troubleshooting/errors/integration-not-configured', - 'reference/api-and-sdk/troubleshooting/errors/operation-not-supported', - 'reference/api-and-sdk/troubleshooting/errors/environment-setup-failed', - 'reference/api-and-sdk/troubleshooting/errors/content-policy-violation', - 'reference/api-and-sdk/troubleshooting/errors/conflict', - 'reference/api-and-sdk/troubleshooting/errors/authentication-required', - 'reference/api-and-sdk/troubleshooting/errors/resource-unavailable', - 'reference/api-and-sdk/troubleshooting/errors/internal-error', - 'reference/api-and-sdk/troubleshooting/errors/infrastructure-timeout', - 'reference/api-and-sdk/troubleshooting/errors/agent-process-failed', - ], - }, - ], - }, - ], - }, ], }, { diff --git a/vercel.json b/vercel.json index 55a2455af..2ced957f4 100644 --- a/vercel.json +++ b/vercel.json @@ -6557,6 +6557,91 @@ "destination": "/agents/", "statusCode": 308 }, + { + "source": "/platform/warp-hosting", + "destination": "/factories/warp-hosting/", + "statusCode": 308 + }, + { + "source": "/platform/runners", + "destination": "/factories/runners/", + "statusCode": 308 + }, + { + "source": "/platform/self-hosting", + "destination": "/factories/self-hosting/", + "statusCode": 308 + }, + { + "source": "/platform/self-hosting/quickstart", + "destination": "/factories/self-hosting/quickstart/", + "statusCode": 308 + }, + { + "source": "/platform/self-hosting/managed-docker", + "destination": "/factories/self-hosting/managed-docker/", + "statusCode": 308 + }, + { + "source": "/platform/self-hosting/managed-kubernetes", + "destination": "/factories/self-hosting/managed-kubernetes/", + "statusCode": 308 + }, + { + "source": "/platform/self-hosting/managed-direct", + "destination": "/factories/self-hosting/managed-direct/", + "statusCode": 308 + }, + { + "source": "/platform/self-hosting/monitoring", + "destination": "/factories/self-hosting/monitoring/", + "statusCode": 308 + }, + { + "source": "/platform/self-hosting/reference", + "destination": "/factories/self-hosting/reference/", + "statusCode": 308 + }, + { + "source": "/platform/self-hosting/troubleshooting", + "destination": "/factories/self-hosting/troubleshooting/", + "statusCode": 308 + }, + { + "source": "/platform/self-hosting/unmanaged", + "destination": "/platform/unmanaged-execution/", + "statusCode": 308 + }, + { + "source": "/platform/self-hosting/security-and-networking", + "destination": "/platform/execution-security/", + "statusCode": 308 + }, + { + "source": "/reference", + "destination": "/factories/developer-tools/", + "statusCode": 308 + }, + { + "source": "/reference/api-and-sdk", + "destination": "/factories/api-and-sdk/", + "statusCode": 308 + }, + { + "source": "/reference/api-and-sdk/:path*", + "destination": "/factories/api-and-sdk/:path*", + "statusCode": 308 + }, + { + "source": "/reference/cli", + "destination": "/agents/cli/oz-cli/", + "statusCode": 308 + }, + { + "source": "/reference/cli/:path*", + "destination": "/agents/cli/oz-cli/:path*", + "statusCode": 308 + }, { "source": "/agents/cli-agents(/?)", "destination": "/agents/cli-agents/overview/", From ec1997c2864ed7c71783b3657e58d57678062832 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 11:36:58 -0600 Subject: [PATCH 02/63] docs: fix factories restructure review findings Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/agents/cli/oz-cli/federate.mdx | 2 +- src/content/docs/factories/developer-tools.mdx | 6 ++---- .../build-a-mattermost-bot-for-warp-factories.mdx | 2 +- vercel.json | 5 +++++ 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/content/docs/agents/cli/oz-cli/federate.mdx b/src/content/docs/agents/cli/oz-cli/federate.mdx index 03da8aaa7..a2bda5c55 100644 --- a/src/content/docs/agents/cli/oz-cli/federate.mdx +++ b/src/content/docs/agents/cli/oz-cli/federate.mdx @@ -94,7 +94,7 @@ A typical AWS flow: A typical GCP flow: 1. Run `oz federate issue-token` to get the OIDC JWT. -2. Call the [Security Token Service `token` endpoint](https://cloud.google.com/iam/docs/factories/developer-tools/sts/rest/v1/TopLevel/token) to exchange the JWT for a federated access token. +2. Call the [Security Token Service `token` endpoint](https://cloud.google.com/iam/docs/reference/sts/rest/v1/TopLevel/token) to exchange the JWT for a federated access token. 3. Optionally impersonate a service account for the final credentials. ## Related diff --git a/src/content/docs/factories/developer-tools.mdx b/src/content/docs/factories/developer-tools.mdx index 85518d073..22c014a37 100644 --- a/src/content/docs/factories/developer-tools.mdx +++ b/src/content/docs/factories/developer-tools.mdx @@ -19,11 +19,9 @@ Warp Factories provides programmatic interfaces for sending work to a factory, i * **[Webhooks](/factories/webhooks/)** - Receive events from systems that can send JSON and route matching deliveries into factory automations. ## Use the API and SDK +Use the API and SDK for typed requests, retries, and error handling. Start with the [API and SDK quickstart](/factories/api-and-sdk/quickstart/) to create and inspect a run, or use the [Sentry monitoring example](/factories/api-and-sdk/demo-sentry-monitoring-with-sdk/) to connect an external event source. - -# Use the API and SDK -es/webhooks/)** - Receive events from syfor typed requests, retries, and error handling. Start with the [Aes/webhooks/)** - Recei/factories/api-and-sdk/quickstart/) to create and inspect a run, or use the [Sentry monitoring example](/factories/api-and-sdk/demo-sentry-monitoring-with-sdk/) to connect an external event source. -es/webhooks/)** - Recrequests, see [API troubleshooting](/factories/api-and-sdk/troubleshooting/) and the [API error reference](/factories/api-and-sdk/troubleshooting/errors/). +For request errors, see [API troubleshooting](/factories/api-and-sdk/troubleshooting/) and the [API error reference](/factories/api-and-sdk/troubleshooting/errors/). ## Related pages diff --git a/src/content/docs/guides/external-tools/build-a-mattermost-bot-for-warp-factories.mdx b/src/content/docs/guides/external-tools/build-a-mattermost-bot-for-warp-factories.mdx index c15261df9..d5641e581 100644 --- a/src/content/docs/guides/external-tools/build-a-mattermost-bot-for-warp-factories.mdx +++ b/src/content/docs/guides/external-tools/build-a-mattermost-bot-for-warp-factories.mdx @@ -14,7 +14,7 @@ Build a Mattermost bot that sends work to a [Warp factory](/factories/) and post * **A Warp Factories factory** - [Set up a factory](/factories/quickstart/) before starting; this guide dispatches work to an existing factory rather than creating one. * **A Warp API key** - Create an [agent API key](/agents/cli/oz-cli/api-keys/#personal-vs-agent-keys) rather than a personal key, so the bot's requests aren't tied to your individual account. -* **A Mattermost bot account and access token** - Create one from your Mattermost System Console under **Integrations** > **Bot Accounts**, and generate a personal access token for it. Mattermost's own [bot accounts documentation](https://developers.mattermost.com/integrate/factories/developer-tools/bot-accounts/) covers the exact steps, since they vary by Mattermost version and hosting setup. +* **A Mattermost bot account and access token** - Create one from your Mattermost System Console under **Integrations** > **Bot Accounts**, and generate a personal access token for it. Mattermost's own [bot accounts documentation](https://developers.mattermost.com/integrate/reference/bot-accounts/) covers the exact steps, since they vary by Mattermost version and hosting setup. * **The {VARS.API_SDK_NAME} Python SDK** - Install it with `pip install oz-agent-sdk`. If you're working in another language, the [factory API page](/factories/factory-api/) shows the equivalent REST calls. ## 1. Store your credentials diff --git a/vercel.json b/vercel.json index 2ced957f4..835e2d784 100644 --- a/vercel.json +++ b/vercel.json @@ -6557,6 +6557,11 @@ "destination": "/agents/", "statusCode": 308 }, + { + "source": "/platform/deployment-patterns", + "destination": "/factories/deployment-patterns/", + "statusCode": 308 + }, { "source": "/platform/warp-hosting", "destination": "/factories/warp-hosting/", From b6453a3dcd180b790c29580da51757fe37c02cab Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 13:12:28 -0600 Subject: [PATCH 03/63] docs: restore legacy CLI sidebar group Co-Authored-By: Warp <agent@warp.dev> --- src/sidebar.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/sidebar.ts b/src/sidebar.ts index 2068522c8..6fc968790 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -354,6 +354,23 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'agents/cli/reference', label: 'CLI reference' }, ], }, + { + label: `${VARS.WARP_AGENT_CLI} (legacy)`, + collapsed: true, + items: [ + { slug: 'agents/cli/oz-cli', label: 'Overview' }, + { slug: 'agents/cli/oz-cli/quickstart', label: 'Quickstart' }, + { slug: 'agents/cli/oz-cli/api-keys', label: 'API keys' }, + { slug: 'agents/cli/oz-cli/agent-profiles', label: 'Agent profiles' }, + { slug: 'agents/cli/oz-cli/mcp-servers', label: 'MCP servers' }, + { slug: 'agents/cli/oz-cli/skills', label: 'Skills' }, + { slug: 'agents/cli/oz-cli/warp-drive', label: 'Warp Drive context' }, + { slug: 'agents/cli/oz-cli/integration-setup', label: 'Integration setup' }, + { slug: 'agents/cli/oz-cli/artifacts', label: 'Artifacts' }, + { slug: 'agents/cli/oz-cli/federate', label: 'Federated identity' }, + 'agents/cli/oz-cli/troubleshooting', + ], + }, { label: 'Third-Party CLI Agents', items: [ From 2901556580e226c5e8233e6d8b32575847be253a Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 13:56:41 -0600 Subject: [PATCH 04/63] docs: fix factory navigation checks Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/factories/self-hosting/index.mdx | 2 +- src/content/docs/index.mdx | 6 +++--- src/sidebar.ts | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/content/docs/factories/self-hosting/index.mdx b/src/content/docs/factories/self-hosting/index.mdx index 1883bffd8..d58babe69 100644 --- a/src/content/docs/factories/self-hosting/index.mdx +++ b/src/content/docs/factories/self-hosting/index.mdx @@ -40,7 +40,7 @@ The worker requires outbound HTTPS access to Warp and any repositories, registri ## Configure a factory to use a worker -Define the worker host and a compatible runner in your [factory definition](/factories/factory-as-code/). The factory dashboard shows each configured runner and the worker that executes its work. Use the [worker reference](/factories/self-hosting/reference/) to configure the worker process and the [Factory dashboard](/factories/factory-dashboard/) to inspect its runs. +Define the worker host and a compatible runner in your [factory definition](/factories/factory-as-code/). The factory dashboard shows each configured runner and the worker that executes its work. Use the [worker reference](/factories/self-hosting/reference/) to configure the worker process and the [factory dashboard](/factories/factory-dashboard/) to inspect its runs. ## Monitor and troubleshoot workers diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index d7ae36460..30b6904d2 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -22,12 +22,12 @@ Warp is the desktop terminal for running commands, editing code, and working wit The Warp Agent helps you investigate issues, edit code, run commands, and complete multi-step work. Use it in the Warp app or from the [Warp Agent CLI](/agents/cli/), which runs the same agent in any terminal. -## Automation Platform +## {VARS.WARP_AUTOMATION_PLATFORM} The {VARS.WARP_AUTOMATION_PLATFORM} runs cloud agents from triggers, schedules, integrations, and APIs. Use it for background work such as issue triage, pull request review, and recurring maintenance. * [Cloud agents](/platform/) - Run background agent work in the cloud. -* [Automation Platform](/platform/overview/) - Configure environments, integrations, orchestration, and shared agent settings. +* [The {VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) - Configure environments, integrations, orchestration, and shared agent settings. ## Warp Factories @@ -38,7 +38,7 @@ Warp Factories is available in Early Access. A factory turns incoming engineerin ## How the products work together -Use Warp and the Warp Agent for interactive development. Use the Automation Platform for background agents and shared cloud configuration. Use Warp Factories when your team needs a standing workflow to route, review, and improve work across repositories. +Use Warp and the Warp Agent for interactive development. Use the {VARS.WARP_AUTOMATION_PLATFORM} for background agents and shared cloud configuration. Use Warp Factories when your team needs a standing workflow to route, review, and improve work across repositories. ## Next steps diff --git a/src/sidebar.ts b/src/sidebar.ts index 6fc968790..d235a6675 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -488,6 +488,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'factories/factory-api', label: 'Factory API' }, { slug: 'factories/api-and-sdk', label: VARS.API_SDK_NAME }, { label: 'API reference', link: '/api' }, + { slug: 'factories/api-and-sdk/demo-sentry-monitoring-with-sdk', label: 'Sentry monitoring with the SDK' }, { slug: 'factories/api-and-sdk/troubleshooting', label: 'API troubleshooting' }, { slug: 'factories/api-and-sdk/troubleshooting/errors', label: 'API errors' }, { slug: 'factories/factory-mcp', label: 'Factory MCP' }, From ce60a8953e15efd8ba3e63e8606446e294e00d68 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 14:28:05 -0600 Subject: [PATCH 05/63] docs: fix factories review checks Co-Authored-By: Warp <agent@warp.dev> --- .github/workflows/agent-docs-review.yml | 2 ++ .../factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx | 1 + src/content/docs/factories/api-and-sdk/index.mdx | 1 + src/content/docs/factories/api-and-sdk/quickstart.mdx | 1 + .../api-and-sdk/troubleshooting/errors/agent-process-failed.mdx | 1 + .../troubleshooting/errors/authentication-required.mdx | 1 + .../api-and-sdk/troubleshooting/errors/budget-exceeded.mdx | 1 + .../factories/api-and-sdk/troubleshooting/errors/conflict.mdx | 1 + .../troubleshooting/errors/content-policy-violation.mdx | 1 + .../troubleshooting/errors/environment-setup-failed.mdx | 1 + .../troubleshooting/errors/external-authentication-required.mdx | 1 + .../troubleshooting/errors/feature-not-available.mdx | 1 + .../docs/factories/api-and-sdk/troubleshooting/errors/index.mdx | 1 + .../troubleshooting/errors/infrastructure-timeout.mdx | 1 + .../api-and-sdk/troubleshooting/errors/insufficient-credits.mdx | 1 + .../api-and-sdk/troubleshooting/errors/integration-disabled.mdx | 1 + .../troubleshooting/errors/integration-not-configured.mdx | 1 + .../api-and-sdk/troubleshooting/errors/internal-error.mdx | 1 + .../api-and-sdk/troubleshooting/errors/invalid-request.mdx | 1 + .../api-and-sdk/troubleshooting/errors/not-authorized.mdx | 1 + .../troubleshooting/errors/operation-not-supported.mdx | 1 + .../api-and-sdk/troubleshooting/errors/resource-not-found.mdx | 1 + .../api-and-sdk/troubleshooting/errors/resource-unavailable.mdx | 1 + .../docs/factories/api-and-sdk/troubleshooting/index.mdx | 1 + src/content/docs/factories/self-hosting/managed-direct.mdx | 2 +- src/content/docs/factories/self-hosting/managed-docker.mdx | 2 +- src/content/docs/factories/self-hosting/managed-kubernetes.mdx | 2 +- 27 files changed, 28 insertions(+), 3 deletions(-) diff --git a/.github/workflows/agent-docs-review.yml b/.github/workflows/agent-docs-review.yml index 6b7b267c7..1918fc98c 100644 --- a/.github/workflows/agent-docs-review.yml +++ b/.github/workflows/agent-docs-review.yml @@ -60,6 +60,8 @@ jobs: changed file and line or quoted text, explain the problem, and state the requested resolution. Set reviewer_login to `github-actions[bot]`, the runner account that will publish the review. + 5. Your final response must contain only the single [SIGNAL:pr-review] JSON record. + Do not repeat the diff, review rationale, or findings outside that record. - name: Dismiss stale automated change requests env: GH_TOKEN: ${{ github.token }} diff --git a/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx b/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx index 3bdfd4c2f..d64295181 100644 --- a/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx +++ b/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: "Demo: Sentry monitoring with SDK" description: >- Build a Sentry webhook handler that triggers agents to investigate errors diff --git a/src/content/docs/factories/api-and-sdk/index.mdx b/src/content/docs/factories/api-and-sdk/index.mdx index f60d954a6..3f2555796 100644 --- a/src/content/docs/factories/api-and-sdk/index.mdx +++ b/src/content/docs/factories/api-and-sdk/index.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: "{{API_SDK_NAME}} reference" sidebar: label: "{{API_SDK_NAME}}" diff --git a/src/content/docs/factories/api-and-sdk/quickstart.mdx b/src/content/docs/factories/api-and-sdk/quickstart.mdx index f500af542..6eeac8068 100644 --- a/src/content/docs/factories/api-and-sdk/quickstart.mdx +++ b/src/content/docs/factories/api-and-sdk/quickstart.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: "API & SDK quickstart" description: >- Create and monitor your first cloud agent run via the {{API_SDK_NAME}} in ~5 diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/agent-process-failed.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/agent-process-failed.mdx index 421899ce4..52a7740fa 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/agent-process-failed.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/agent-process-failed.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: agent_process_failed description: >- The agent process exited unexpectedly during task execution. Retry the task diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/authentication-required.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/authentication-required.mdx index c8c026b82..332140f14 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/authentication-required.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/authentication-required.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: authentication_required description: >- The API key in the request is invalid, expired, or missing. Generate a new diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/budget-exceeded.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/budget-exceeded.mdx index b9e7e7cb8..cecf4fc26 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/budget-exceeded.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/budget-exceeded.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: budget_exceeded description: >- Your team's configured spending budget limit has been reached. Increase the diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/conflict.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/conflict.mdx index c45972875..3cf340fdb 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/conflict.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/conflict.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: "Error: conflict (409)" sidebar: label: "conflict" diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/content-policy-violation.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/content-policy-violation.mdx index ebc168b31..c27645de9 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/content-policy-violation.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/content-policy-violation.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: content_policy_violation description: >- The task prompt or environment setup commands were flagged by the platform's diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed.mdx index eb36310d0..598c0ea38 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/environment-setup-failed.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: environment_setup_failed description: >- The cloud agent's environment failed to initialize. Check repo URLs, setup diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx index d1847c5bb..ec71c7fca 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: external_authentication_required description: >- The task requires access to an external service (GitHub, Slack, Linear, diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/feature-not-available.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/feature-not-available.mdx index e911b9e14..fb9013b2d 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/feature-not-available.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/feature-not-available.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: feature_not_available description: >- The requested feature is not included in your current plan. Upgrade your diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx index 16dc9b825..1ca4dac8b 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: Errors Overview description: >- Reference for all error codes returned by the {{API_SDK_NAME}}. Each error diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/infrastructure-timeout.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/infrastructure-timeout.mdx index e96660122..7e213ad0c 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/infrastructure-timeout.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/infrastructure-timeout.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: infrastructure_timeout description: >- The task was forcibly terminated because it remained active past the maximum diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/insufficient-credits.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/insufficient-credits.mdx index 3eef34f85..c8000af6d 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/insufficient-credits.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/insufficient-credits.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: insufficient_credits description: >- The principal billed for the run has no remaining credits. Top up the diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-disabled.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-disabled.mdx index aeff2a424..9f1a8a3a4 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-disabled.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-disabled.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: integration_disabled description: >- The integration (Slack, Linear, etc.) is currently disabled in the diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx index 775be7f26..e5da179e4 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: integration_not_configured description: >- The integration's setup is incomplete. Visit the setup URL to finish diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/internal-error.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/internal-error.mdx index 1afacfd24..02a121076 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/internal-error.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/internal-error.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: internal_error description: >- An unexpected server-side error occurred. The platform will automatically diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/invalid-request.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/invalid-request.mdx index ce6c6ec9f..3bce443c3 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/invalid-request.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/invalid-request.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: invalid_request description: >- The request body is malformed, missing required fields, or contains invalid diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/not-authorized.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/not-authorized.mdx index a1870fea8..df721242f 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/not-authorized.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/not-authorized.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: not_authorized description: >- The authenticated user or API key does not have permission to perform the diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx index f57a68f50..b88945263 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: operation_not_supported description: >- The requested operation is not supported for this resource or its current diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-not-found.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-not-found.mdx index 30feb59af..a75992bd0 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-not-found.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-not-found.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: resource_not_found description: >- The requested resource (task, environment, schedule, agent, etc.) does not diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-unavailable.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-unavailable.mdx index 0e721a0c1..d0feae9af 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-unavailable.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/resource-unavailable.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: resource_unavailable description: >- A transient infrastructure issue prevented the task from running. The diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx index ee151f68c..29101c02a 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx @@ -1,4 +1,5 @@ --- +topic: factories title: API Troubleshooting description: >- Troubleshooting resources for the {{API_SDK_NAME}}, including a full reference diff --git a/src/content/docs/factories/self-hosting/managed-direct.mdx b/src/content/docs/factories/self-hosting/managed-direct.mdx index 47e9917d9..d8c6035dd 100644 --- a/src/content/docs/factories/self-hosting/managed-direct.mdx +++ b/src/content/docs/factories/self-hosting/managed-direct.mdx @@ -11,7 +11,7 @@ import { VARS } from '@data/vars'; Run the `oz-agent-worker` daemon with the **Direct backend** — tasks execute directly on the worker host without Docker or Kubernetes. The {VARS.WARP_AUTOMATION_PLATFORM} still orchestrates runs end to end (Slack, Linear, schedules, API, `oz agent run-cloud`); the worker just runs the agent in a per-task workspace on its own filesystem. :::note -This page covers the [managed architecture](/factories/self-hosting/#managed-architecture) with the Direct backend. For container-based task isolation, see [Managed: Docker](/factories/self-hosting/managed-docker/) or [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/). For invocation-driven use cases, see [Unmanaged](/platform/unmanaged-execution/). +The Direct backend uses the [managed architecture](/factories/self-hosting/#managed-architecture). For container-based task isolation, see [Managed: Docker](/factories/self-hosting/managed-docker/) or [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/). For invocation-driven use cases, see [Unmanaged](/platform/unmanaged-execution/). ::: ## When to use the Direct backend diff --git a/src/content/docs/factories/self-hosting/managed-docker.mdx b/src/content/docs/factories/self-hosting/managed-docker.mdx index 436be6b59..8206877c5 100644 --- a/src/content/docs/factories/self-hosting/managed-docker.mdx +++ b/src/content/docs/factories/self-hosting/managed-docker.mdx @@ -11,7 +11,7 @@ import { VARS } from '@data/vars'; Run the `oz-agent-worker` daemon with the **Docker backend** — the default managed path. Each agent task runs in an isolated Docker container spawned from the worker, with full orchestration by the {VARS.WARP_AUTOMATION_PLATFORM} (Slack, Linear, schedules, API, `oz agent run-cloud`). :::note -This page covers the [managed architecture](/factories/self-hosting/#managed-architecture) with the Docker backend. For the Kubernetes backend, see [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/). For host execution without a container runtime, see [Managed: Direct](/factories/self-hosting/managed-direct/). If you'd rather invoke agents yourself, see [Unmanaged](/platform/unmanaged-execution/). +The Docker backend uses the [managed architecture](/factories/self-hosting/#managed-architecture). For the Kubernetes backend, see [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/). For host execution without a container runtime, see [Managed: Direct](/factories/self-hosting/managed-direct/). If you'd rather invoke agents yourself, see [Unmanaged](/platform/unmanaged-execution/). ::: ## When to use the Docker backend diff --git a/src/content/docs/factories/self-hosting/managed-kubernetes.mdx b/src/content/docs/factories/self-hosting/managed-kubernetes.mdx index f1659e7ee..50a53700a 100644 --- a/src/content/docs/factories/self-hosting/managed-kubernetes.mdx +++ b/src/content/docs/factories/self-hosting/managed-kubernetes.mdx @@ -11,7 +11,7 @@ import { VARS } from '@data/vars'; Deploy the `oz-agent-worker` daemon into a Kubernetes cluster using the included Helm chart. Each agent task runs as a **Kubernetes Job** in your cluster. The {VARS.WARP_AUTOMATION_PLATFORM} orchestrates runs end to end (Slack, Linear, schedules, API, `oz agent run-cloud`); your cluster provides the compute, scheduling, and policy enforcement. :::note -This page covers the [managed architecture](/factories/self-hosting/#managed-architecture) with the Kubernetes backend. For the default Docker backend, see [Managed: Docker](/factories/self-hosting/managed-docker/). For host execution without a container runtime, see [Managed: Direct](/factories/self-hosting/managed-direct/). To route runs to a connected worker, see [Routing runs to this worker](/factories/self-hosting/managed-docker/#routing-runs-to-this-worker). +The Kubernetes backend uses the [managed architecture](/factories/self-hosting/#managed-architecture). For the default Docker backend, see [Managed: Docker](/factories/self-hosting/managed-docker/). For host execution without a container runtime, see [Managed: Direct](/factories/self-hosting/managed-direct/). To route runs to a connected worker, see [Routing runs to this worker](/factories/self-hosting/managed-docker/#routing-runs-to-this-worker). ::: ## When to use the Kubernetes backend From ef1070072817b197200c73f983c26a221fa890f0 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 15:28:36 -0600 Subject: [PATCH 06/63] docs: complete factories GA phase 1 Co-Authored-By: Warp <agent@warp.dev> --- .../demo-sentry-monitoring-with-sdk.mdx | 2 + .../docs/factories/api-and-sdk/index.mdx | 10 ++- .../docs/factories/api-and-sdk/quickstart.mdx | 2 + .../docs/factories/deployment-patterns.mdx | 79 +++++++------------ .../docs/factories/factory-dashboard.mdx | 4 +- src/content/docs/factories/index.mdx | 2 +- .../factories/infrastructure-and-security.mdx | 1 + src/content/docs/factories/runners.mdx | 14 ++-- .../factories/self-hosting/quickstart.mdx | 4 +- src/content/docs/factories/warp-hosting.mdx | 18 +++-- src/content/docs/index.mdx | 2 +- src/content/docs/platform/environments.mdx | 2 + src/content/docs/platform/harnesses/index.mdx | 2 + src/content/docs/platform/index.mdx | 6 +- .../docs/platform/integrations/index.mdx | 2 + .../docs/platform/managing-cloud-agents.mdx | 2 + src/content/docs/platform/mcp.mdx | 2 + src/content/docs/platform/overview.mdx | 7 +- src/content/docs/platform/secrets.mdx | 2 + .../docs/platform/skills-as-agents.mdx | 2 + .../docs/platform/transitioning-from-oz.mdx | 37 +++++++++ src/content/docs/platform/triggers/index.mdx | 2 + src/sidebar.ts | 26 +----- 23 files changed, 124 insertions(+), 106 deletions(-) create mode 100644 src/content/docs/platform/transitioning-from-oz.mdx diff --git a/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx b/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx index d64295181..51250f461 100644 --- a/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx +++ b/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx @@ -18,6 +18,8 @@ Example repository: [**Sentry monitor example repository**](https://github.com/w In this demo, Ben builds a small TypeScript “Sentry monitor” service that listens for specific Sentry alerts (like a Go nil pointer dereference) and triggers a Warp cloud agent to investigate. The server validates the webhook, extracts the stack trace, and injects it into an agent run inside a Warp Environment so the agent can inspect the repo and propose a fix. +To route the alert through a factory's named agents and workflow instead, use the [factory API](/factories/factory-api/) to dispatch the request. This example remains useful for custom standalone cloud-agent intake. + He also covers the task lifecycle basics in the TypeScript SDK (running an agent, polling task state to fetch a session link for debugging), and shows the end result: a draft GitHub pull request created from the Sentry event for a maintainer to review. **What Ben covers** diff --git a/src/content/docs/factories/api-and-sdk/index.mdx b/src/content/docs/factories/api-and-sdk/index.mdx index 3f2555796..943f9c759 100644 --- a/src/content/docs/factories/api-and-sdk/index.mdx +++ b/src/content/docs/factories/api-and-sdk/index.mdx @@ -4,16 +4,18 @@ title: "{{API_SDK_NAME}} reference" sidebar: label: "{{API_SDK_NAME}}" description: >- - Create and inspect cloud agent runs over HTTP, or use the Python and - TypeScript SDKs for typed requests, retries, and error handling. + Create and operate factory and cloud agent runs over HTTP, or use the Python + and TypeScript SDKs for typed requests, retries, and error handling. --- import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; -The {VARS.API_SDK_NAME} lets you create, monitor, and inspect cloud agent runs programmatically. Use the REST API from any HTTP client, or the official Python and TypeScript SDKs for typed requests, built-in retries, and structured error handling. The SDKs are ideal for CI pipelines, internal tools, and custom integrations. +The {VARS.API_SDK_NAME} lets you integrate with Warp Factories and operate the cloud agent runs behind them. Use the REST API from any HTTP client, or the official Python and TypeScript SDKs for typed requests, built-in retries, and structured error handling. + +Use the [factory API](/factories/factory-api/) to discover a factory and send it work. Use this API and SDK reference to monitor factory runs, submit follow-ups, inspect results, or start standalone cloud-agent runs from CI, internal tools, and custom integrations. :::note -Some examples in this reference and the [CLI reference](/agents/cli/oz-cli/) use `oz` commands (for example, `oz environment list`) from the {VARS.WARP_AGENT_CLI}. Those commands remain supported through the end of September 2026. The [Warp Agent CLI reference](/agents/cli/reference/) does not yet document a `warp` equivalent. +Some examples in this reference and the [CLI reference](/agents/cli/oz-cli/) use `oz` commands (for example, `oz environment list`) from the {VARS.WARP_AGENT_CLI}. Those commands remain available during the transition. The [Warp Agent CLI reference](/agents/cli/reference/) does not yet document a `warp` equivalent. ::: ### API overview diff --git a/src/content/docs/factories/api-and-sdk/quickstart.mdx b/src/content/docs/factories/api-and-sdk/quickstart.mdx index 6eeac8068..725c5f9bd 100644 --- a/src/content/docs/factories/api-and-sdk/quickstart.mdx +++ b/src/content/docs/factories/api-and-sdk/quickstart.mdx @@ -12,6 +12,8 @@ import { VARS } from '@data/vars'; The {VARS.API_SDK_NAME} lets you run and manage cloud agents from anywhere — CI/CD pipelines, backend services, scripts, or custom tooling — without the Warp desktop app. This quickstart walks you through creating your first run and checking its status. +To dispatch work through a factory's named agents and workflow, use the [factory API](/factories/factory-api/) after this quickstart. The run-management steps below also apply to the factory run that API creates. + Watch this short demo of how the REST API can power agent-backed apps like [PowerFixer](https://github.com/warpdotdev/power-fixer-setup), an issue triage bot built by the Warp team: <VideoEmbed url="https://youtu.be/N6qMe641K34" title={`${VARS.API_SDK_NAME} quickstart video`} /> diff --git a/src/content/docs/factories/deployment-patterns.mdx b/src/content/docs/factories/deployment-patterns.mdx index e8adae12e..e6d23f9ef 100644 --- a/src/content/docs/factories/deployment-patterns.mdx +++ b/src/content/docs/factories/deployment-patterns.mdx @@ -1,70 +1,38 @@ --- -title: Deployment patterns +title: Deployment patterns for Warp Factories description: >- - Common architectures for deploying cloud agents, including CLI-only, - {{WARP_AUTOMATION_PLATFORM}}-hosted, and self-hosted execution patterns. + Choose Warp-hosted or managed self-hosted execution for Warp Factories based + on your network, compliance, and operational requirements. sidebar: label: "Deployment patterns" --- import { VARS } from '@data/vars'; -Teams adopt cloud agents in a few repeatable ways. This page outlines the most common architectures, what they're good for, and how they fit together. +Choose an execution model for your factory based on where its code must run and who operates the compute. Warp-hosted execution is the default. Managed self-hosting keeps checkout and command execution in your network while Warp coordinates the work. ![Deployment models diagram comparing Warp-hosted, managed self-hosted, and unmanaged self-hosted patterns by what runs on Warp versus customer infrastructure](../../../assets/agent-platform/deployment-models.png) -## Quick mental model +## Choose an execution model -Cloud agent setups usually have four moving parts: +| If your factory needs to... | Choose | +| --- | --- | +| Run public repositories and services without operating workers | [Warp-hosted execution](#warp-hosted-execution) | +| Reach private repositories or services behind your network boundary | [Managed self-hosting](#managed-self-hosting) | +| Run standalone agents from CI or developer infrastructure, without a factory | [Unmanaged execution](/platform/unmanaged-execution/) | -1. **Trigger**: something happens (CI step, webhook, cron, Slack mention). -2. **Orchestration**: something decides what to run and tracks it ({VARS.WARP_AUTOMATION_PLATFORM} orchestrator, GitHub Actions, your internal system). -3. **Execution**: where the agent actually runs (your runner, {VARS.WARP_AUTOMATION_PLATFORM}-hosted environment, or self-hosted workers). -4. **Visibility**: how the team monitors and intervenes ({VARS.DASHBOARD}, session sharing, APIs). +Both factory options use the same [factory definition](/factories/factory-as-code/), [runners](/factories/runners/), and [factory dashboard](/factories/factory-dashboard/). The execution host changes the location of checkout, command execution, and the sandbox filesystem. --- -## Pattern 1: CLI-only agents (bring your own orchestrator) +## Standalone CLI-only agents -Use this when you already have a system that schedules work (CI, dev boxes, internal orchestrators), and you need a reliable, cloud-connected agent runner. - -### What it looks like - -* **Trigger**: GitHub Actions / CI, a script, a dev box action, or an internal orchestrator -* **Orchestration**: your existing system -* **Execution**: wherever that system runs -* **Warp adds**: cloud connectivity, shared context, visibility, session sharing, and tracking - -### Why teams choose it - -* You want a **drop-in replacement** for other CLI/SDK-based agents (Claude Code, Codex CLI, Gemini CLI/SDK-style flows). -* You want to run agents anywhere without requiring Warp desktop. -* You still want **team-level observability** even when execution is “outside Warp.” - -### Common examples - -* **CI PR helper**: run formatting checks, generate review comments, suggest fixes, open PRs. -* **Remote dev box agent**: run refactors or debugging tasks inside a pre-provisioned box. -* **Internal orchestrator integration**: treat Warp as one agent option alongside other model providers. - -### What you still get even without Warp orchestration - -* Access to your shared Warp context (for example MCP config, Warp Drive context, rules/prompts). -* [Agent Session Sharing](/agents/local-agents/session-sharing/) to monitor/steer runs. -* Read-only APIs for tracking and reporting. -* A path to [Handoff](/platform/handoff/) workflows (where a run can be continued or inspected in richer surfaces). - -### Minimal setup checklist - -* A Warp team -* A [cloud agent](/platform/agents/) (recommended for automation) -* The {VARS.WARP_AGENT_CLI} installed on the runner / box -* Any needed credentials (often via secrets + environment variables) +This is not a factory deployment model. Use it when you already have a system that schedules work and need to run standalone agents from CI, developer infrastructure, or an internal orchestrator. See [Unmanaged execution](/platform/unmanaged-execution/) for the Platform reference. --- -## Pattern 2: Warp-hosted agents and orchestration (managed cloud execution) +## Warp-hosted execution -Use this when you want the {VARS.WARP_AUTOMATION_PLATFORM} to run agent workloads on Warp-managed infrastructure, typically inside reproducible Docker environments, with built-in lifecycle management. +Use this when your factory can reach its repositories and services over the public internet. The {VARS.WARP_AUTOMATION_PLATFORM} runs the work on Warp-managed infrastructure while your factory definition selects the agents, runner, workspace, and credentials. ![Warp-hosted execution architecture showing customer infrastructure, triggers and integrations, isolated tenant sandboxes, the Warp control plane, and LLM providers](../../../assets/agent-platform/cloud-agents-infra.png) @@ -115,11 +83,11 @@ When a task is naturally divisible, use [multi-agent orchestration](/platform/or --- -## Pattern 3: Self-hosted execution +## Managed self-hosting -Use this when you need to control where agent execution happens while still using {VARS.WARP_AUTOMATION_PLATFORM} orchestration and visibility. Repositories are cloned and stored only on your infrastructure. Orchestration metadata and session transcripts route through Warp's backend; cloud conversations require Warp to store conversation data according to Warp's retention terms. LLM inference requests and responses route through Warp to contracted model providers under [ZDR](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr), except for provider-specific models that are not covered by ZDR and follow the provider's retention requirements. +Use this when a factory must run checkout and execution on your infrastructure while the {VARS.WARP_AUTOMATION_PLATFORM} coordinates the work and records its results. Repositories are cloned and stored only on your infrastructure. Orchestration metadata and session transcripts route through Warp's backend; cloud conversations require Warp to store conversation data according to Warp's retention terms. LLM inference requests and responses route through Warp to contracted model providers under [ZDR](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr), except for provider-specific models that are not covered by ZDR and follow the provider's retention requirements. -Think of self-hosted execution as **customer-hosted execution with Warp-hosted orchestration**, not as a fully offline agent stack. Code repositories, build artifacts, runtime secrets, and execution workspaces stay on your infrastructure. Code context can still appear in session transcripts and LLM prompts as the agent works. +Think of managed self-hosting as **customer-hosted execution with Warp-hosted orchestration**, not as a fully offline agent stack. Code repositories, build artifacts, runtime secrets, and execution workspaces stay on your infrastructure. Code context can still appear in session transcripts and LLM prompts as the agent works. :::note **Enterprise feature**: Self-hosted execution is available exclusively to teams on an Enterprise plan. @@ -128,7 +96,7 @@ Think of self-hosted execution as **customer-hosted execution with Warp-hosted o Self-hosting has two architectures that differ on **who orchestrates agent runs** (both keep code and execution on your infrastructure): * **[Managed](/factories/self-hosting/#managed-architecture)** — The {VARS.WARP_AUTOMATION_PLATFORM} orchestrates. You run the `oz-agent-worker` daemon; the {VARS.WARP_AUTOMATION_PLATFORM} routes runs to it from Slack, Linear, schedules, the API, or `oz agent run-cloud`. Tasks execute in Docker containers, Kubernetes Jobs, or directly on the host. -* **[Unmanaged](/platform/unmanaged-execution/)** — You orchestrate. Invoke `oz agent run` directly from your CI, Kubernetes, or dev environment. Warp provides session tracking and observability; it does not start or stop agents. +* **[Unmanaged](/platform/unmanaged-execution/)** — You orchestrate. Invoke `oz agent run` directly from your CI, Kubernetes, or dev environment. This is a standalone-agent model, not a factory host. Why teams choose self-hosted execution: @@ -136,4 +104,11 @@ Why teams choose self-hosted execution: * Agents need to access services behind a VPN or self-hosted SCMs like GitLab or Bitbucket. Warp-hosted agents can also access GitLab and Bitbucket over the public internet — see the [GitLab](/platform/integrations/gitlab/) and [Bitbucket](/platform/integrations/bitbucket/) setup guides. * Your environments (multi-service stacks, heavy resource requirements) don't fit in a single Docker container. -For setup, decision guides, and a quickstart, start with [Self-hosting](/factories/self-hosting/). +For factory worker setup and a quickstart, start with [Managed self-hosting](/factories/self-hosting/). For security and network boundaries that apply to both managed and unmanaged execution, see [Execution security](/platform/execution-security/). + +## Related pages + +* [Infrastructure and security](/factories/infrastructure-and-security/) - Choose execution, inference, storage, and credential boundaries for a factory. +* [Warp-hosted execution](/factories/warp-hosting/) - Review hosted execution capacity, networking, and supported environments. +* [Managed self-hosting](/factories/self-hosting/) - Install and operate a factory worker on your infrastructure. +* [Unmanaged execution](/platform/unmanaged-execution/) - Run standalone agents outside a factory. diff --git a/src/content/docs/factories/factory-dashboard.mdx b/src/content/docs/factories/factory-dashboard.mdx index 4c1310399..9d6ea3d48 100644 --- a/src/content/docs/factories/factory-dashboard.mdx +++ b/src/content/docs/factories/factory-dashboard.mdx @@ -81,13 +81,13 @@ When an agent proposes a change to a Warp-managed definition, a spec review for * **Repositories** - The repos the factory works in. * **Pull request authorship** - Whether pull requests are authored by the agent or the run creator (the definition's [`credentialStrategy`](/factories/factory-as-code/#credentialstrategy)). * **Analysis model** - The model [Self-improvement](/factories/measure-and-improve/self-improvement/) uses to analyze failed runs. -* **Runners** - The compute the factory's runs execute on. +* **Runners** - The compute the factory's runs execute on. See [factory runners](/factories/runners/) to choose runner configuration or [managed self-hosting](/factories/self-hosting/) to run factory work on your infrastructure. * **Integrations** - The integrations this factory can access. * **Deletion** - Deletes the factory. This cannot be undone. For a file-managed factory, `runners/*.yaml` in the repository is the source of truth. Anything managed in an external repository is read-only in Settings. -## Next steps +## Related pages * [Factory inbox](/factories/factory-inbox/) - See and resolve the questions, spec approvals, and PR reviews waiting on you. * [How Warp Factories work](/factories/how-factories-work/) - The stages work moves through and where humans stay in the loop. diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index f8a750d47..189827f03 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -93,7 +93,7 @@ flowchart LR Slack["Slack or Linear"] -->|"@handle"| Foreman ``` -## Next steps +## Related pages * [**Set up a factory**](/factories/quickstart/) - Create a factory and send its first work item. * [**Understand the execution model**](/factories/how-factories-work/) - See how the foreman coordinates stages, runs, and human decisions. diff --git a/src/content/docs/factories/infrastructure-and-security.mdx b/src/content/docs/factories/infrastructure-and-security.mdx index d373db11e..bd058ab91 100644 --- a/src/content/docs/factories/infrastructure-and-security.mdx +++ b/src/content/docs/factories/infrastructure-and-security.mdx @@ -129,3 +129,4 @@ Warp meters hosted compute, Warp-provided inference, and platform services. Mana * [**Execution security**](/platform/execution-security/) - Review data boundaries, network egress, and backend-specific controls. * [**Bring Your Own LLM**](/enterprise/enterprise-features/bring-your-own-llm/) - Compare customer-owned inference options and provider support. * [**Enterprise security overview**](/enterprise/security-and-compliance/security-overview/) - Review data handling, ZDR, compliance, and access controls across Warp. +* [Team-managed model keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) - Configure customer-supplied inference credentials. diff --git a/src/content/docs/factories/runners.mdx b/src/content/docs/factories/runners.mdx index c51a1c92f..987835724 100644 --- a/src/content/docs/factories/runners.mdx +++ b/src/content/docs/factories/runners.mdx @@ -1,17 +1,17 @@ --- -title: Cloud agent runners +title: Runners for Warp Factories sidebar: label: "Runners" description: >- - Runners define the OS, architecture, instance size, and sandbox image cloud - agents run on, managed with the {{WARP_AGENT_CLI}}. + Runners define the OS, architecture, instance size, and sandbox image for + Warp Factories work. --- import { VARS } from '@data/vars'; import { Tabs, TabItem } from '@astrojs/starlight/components'; -Runners define the compute a [cloud agent](/platform/) runs on: the operating system, CPU architecture, instance size, and sandbox image used to execute a run. +Runners define the compute a factory agent runs on: the operating system, CPU architecture, instance size, and sandbox image used to execute a run. Select runners in the [factory definition](/factories/factory-as-code/) or the [factory dashboard](/factories/factory-dashboard/). -A runner is a reusable compute configuration. Where an [environment](/platform/environments/) defines _what_ an agent works on (the repos, setup commands, and toolchain), a runner defines _where and on what hardware_ that work executes. Separating the two lets you reuse the same environment across different machine shapes—for example, a small Linux box for routine tasks and a larger instance for heavier builds. +A runner is a reusable compute configuration. Where an [environment](/platform/environments/) defines _what_ an agent works on (the repos, setup commands, and toolchain), a runner defines _where and on what hardware_ that work executes. Separating the two lets a factory use a small Linux runner for triage and a larger runner for builds. :::note Most runs don't need a custom runner. Every environment has a default runner, and Warp picks a sensible default shape when you don't specify one. Create a runner when you need a specific OS, architecture, instance size, or sandbox image. @@ -62,9 +62,9 @@ Each environment has a default runner. Specifying a runner for a run overrides t </TabItem> </Tabs> -## Managing runners with the CLI +## Managing runners with the legacy CLI -Use the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) to create, list, update, and delete runners. Runner commands require an authenticated CLI—see the [CLI quickstart](/agents/cli/oz-cli/quickstart/) to get set up. +For a file-managed factory, edit `runners/*.yaml` in the factory definition. For a Warp-managed factory, edit runner files in the factory dashboard. The legacy [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) also supports creating, listing, updating, and deleting reusable runners. ### Create a runner diff --git a/src/content/docs/factories/self-hosting/quickstart.mdx b/src/content/docs/factories/self-hosting/quickstart.mdx index f30a91205..4841addaf 100644 --- a/src/content/docs/factories/self-hosting/quickstart.mdx +++ b/src/content/docs/factories/self-hosting/quickstart.mdx @@ -8,7 +8,7 @@ sidebar: --- import { VARS } from '@data/vars'; -Run your first cloud agent on your own infrastructure in ~10 minutes using the managed architecture with the Docker backend — the default and fastest path to self-hosting. +Run your first managed worker on your own infrastructure in ~10 minutes using the Docker backend. After you verify the worker, configure a factory to route its work to that worker. :::note This quickstart sets up the [managed architecture](/factories/self-hosting/#managed-architecture), where the {VARS.WARP_AUTOMATION_PLATFORM} orchestrates the agent and your worker provides the compute. **Prefer a CLI-only path with no Docker requirement?** Jump to the [Unmanaged quickstart](/platform/unmanaged-execution/#unmanaged-quickstart) to run `oz agent run` directly on any host. @@ -63,6 +63,8 @@ oz agent run-cloud --prompt "List the files in the current directory" --host "my **Expected outcome:** The {VARS.WARP_AUTOMATION_PLATFORM} accepts the task, routes it to your worker, and the worker spawns a Docker container to execute the agent. You'll see the run appear in the <a href={VARS.WEB_APP_URL}>{VARS.DASHBOARD}</a> with status moving from `QUEUED` → `INPROGRESS` → `SUCCEEDED`. +This test verifies that the worker is connected. To route factory work to it, set `workerHost` and a platform-matched runner in the [factory definition](/factories/factory-as-code/#routing-to-a-self-hosted-worker). + ### 4. Verify the run Open the <a href={VARS.WEB_APP_URL}>{VARS.DASHBOARD}</a>, find the new task, and confirm the session transcript shows the agent running against your worker. You can attach to the session at any time via [Agent Session Sharing](/agents/local-agents/session-sharing/) to monitor or steer it. diff --git a/src/content/docs/factories/warp-hosting.mdx b/src/content/docs/factories/warp-hosting.mdx index 11bc60b6c..29d3b3dfe 100644 --- a/src/content/docs/factories/warp-hosting.mdx +++ b/src/content/docs/factories/warp-hosting.mdx @@ -1,15 +1,16 @@ --- -title: Warp-hosted agents +title: Warp-hosted execution for Warp Factories description: >- - Run cloud agents on Warp's infrastructure. Warp handles scaling, isolation, and performance for agent execution. + Run factory work on Warp-hosted infrastructure, with managed compute, + isolation, networking, and capacity. sidebar: - label: "Warp-hosted agents" + label: "Warp-hosted execution" --- import { VARS } from '@data/vars'; -Warp's managed infrastructure lets your team run cloud agent workloads in fast, secure sandboxes. +Warp-hosted execution runs factory work in managed sandboxes. Warp provisions the compute while your factory definition selects each agent's runner, repositories, setup, and credentials. -Use Warp-hosted agents to quickly get started with the {VARS.WARP_AUTOMATION_PLATFORM}, without needing to configure compute resources or maintain services. +Use it when your factory's repositories and services are reachable from the public internet and your team does not need to manage worker capacity or host maintenance. For private services or a network boundary that must contain checkout and execution, use [managed self-hosting](/factories/self-hosting/). ## Sandbox environment @@ -17,7 +18,7 @@ All Warp-hosted agents run in fully-isolated sandboxes. Warp uses a mix of infra ### OS and architecture -Warp-hosted agents use the container image specified in your [environment](/platform/environments/). +Warp-hosted factory agents use the runner and workspace configuration in your [factory definition](/factories/factory-as-code/). A factory can also use an existing [environment](/platform/environments/) when its definition specifies one. They are compatible with any Linux x86-64 image that includes a `bash` shell and core utilities like `ls` and `mkdir`. ### Resources @@ -51,5 +52,6 @@ Warp's hosted agents have network egress enabled by default. Outgoing requests m ## Related pages -* [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) - Learn how Warp-hosted agents fit into the {VARS.WARP_AUTOMATION_PLATFORM}. -* [Self-hosting](/factories/self-hosting/) - Run agents on infrastructure you manage when execution must stay inside your network. +* [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) - Configure the shared cloud-agent primitives behind a factory. +* [Factory runners](/factories/runners/) - Choose the operating system, architecture, and instance shape for factory work. +* [Managed self-hosting](/factories/self-hosting/) - Run factory work on infrastructure you manage when execution must stay inside your network. diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index 30b6904d2..cad74d8fe 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -40,7 +40,7 @@ Warp Factories is available in Early Access. A factory turns incoming engineerin Use Warp and the Warp Agent for interactive development. Use the {VARS.WARP_AUTOMATION_PLATFORM} for background agents and shared cloud configuration. Use Warp Factories when your team needs a standing workflow to route, review, and improve work across repositories. -## Next steps +## Related pages * [Install Warp](/quickstart/) - Set up Warp and start coding. * [Start an agent conversation](/agents/) - Work with the Warp Agent in a local checkout. diff --git a/src/content/docs/platform/environments.mdx b/src/content/docs/platform/environments.mdx index 81f12d6d7..9a19483fc 100644 --- a/src/content/docs/platform/environments.mdx +++ b/src/content/docs/platform/environments.mdx @@ -9,6 +9,8 @@ import { VARS } from '@data/vars'; Environments describe _how_ an agent executes a task, not _what_ it does. They give cloud agents the same container, repositories, and setup every time they run. Use an environment for a cloud agent run that needs a repeatable toolchain. Interactive local runs use your current checkout and machine setup, so they don't need one. +Factories manage their own repositories and workspace by default. Set `agentDefaults.environmentId` in a [factory definition](/factories/factory-as-code/#agentdefaultsenvironmentid) when a factory agent must use an existing environment. + ## What an environment includes An environment groups the runtime configuration for a cloud agent run: diff --git a/src/content/docs/platform/harnesses/index.mdx b/src/content/docs/platform/harnesses/index.mdx index 8578dc4f8..60b7d6d56 100644 --- a/src/content/docs/platform/harnesses/index.mdx +++ b/src/content/docs/platform/harnesses/index.mdx @@ -12,6 +12,8 @@ import { VARS } from '@data/vars'; The {VARS.WARP_AUTOMATION_PLATFORM} can run third-party agent harnesses as cloud agents alongside Warp Agent, including [Claude Code](/platform/harnesses/claude-code/) and [Codex](/platform/harnesses/codex/). You choose the harness (agent runtime) that fits the task; the platform around the run stays the same. +For a factory, set the default or per-agent harness in its [factory definition](/factories/factory-as-code/#agentdefaultsharness) or configure it for a [factory agent](/factories/factory-agents/). + Watch this walkthrough to see how to run Warp Agent, Claude Code, or Codex as a cloud agent. <VideoEmbed url="https://www.youtube.com/watch?v=ZUYyuA5i1VU" title={`Run any agent in the cloud with the ${VARS.WARP_AUTOMATION_PLATFORM} - Claude Code, Codex, or Warp Agent`} /> diff --git a/src/content/docs/platform/index.mdx b/src/content/docs/platform/index.mdx index 9bb57f234..a50628c65 100644 --- a/src/content/docs/platform/index.mdx +++ b/src/content/docs/platform/index.mdx @@ -9,16 +9,16 @@ sidebar: import { VARS } from '@data/vars'; import VideoEmbed from '@components/VideoEmbed.astro'; -{/* Transition notice for the 2026-08-18 rename. Remove after 2026-10-06, when - the CLI and web app take their new names and the old one stops appearing. */} :::note -**Oz is now the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/).** Only the name changed. Your existing cloud agents, integrations, API keys, and schedules keep working exactly as before. The `oz` CLI and the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> keep the Oz name until October 6, 2026. +**The [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) is the current name.** Existing cloud agents, integrations, API keys, and schedules continue to work. The `oz` CLI and the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> retain their legacy names during the transition. See [Transitioning](/platform/transitioning-from-oz/) for the current guidance. ::: Cloud agents are autonomous, background agents that run on Warp's cloud infrastructure or your own, triggered by system events, schedules, or integrations like Slack and GitHub. They execute tasks with full observability — every run is tracked, inspectable, and shareable across your team. **New to cloud agents?** Start with the [Cloud agents quickstart](/platform/quickstart/) to run your first cloud agent in ~10 minutes. +For a standing, multi-stage workflow with named agents, automations, and measurement, use [Warp Factories](/factories/). The factory-specific setup and operations guidance complements this shared cloud-agent reference. + ### Monitor, inspect, and share cloud agent runs To understand what a cloud agent did, start from the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app or the [Runs page in the {VARS.WEB_APP}](/platform/oz-web-app/#runs). From there, you can find a run by source, status, trigger, or owner; open the run transcript; inspect the prompt, plan, commands, logs, and output; and share the session link with teammates for review. diff --git a/src/content/docs/platform/integrations/index.mdx b/src/content/docs/platform/integrations/index.mdx index bf2245a4c..3bf7901c4 100644 --- a/src/content/docs/platform/integrations/index.mdx +++ b/src/content/docs/platform/integrations/index.mdx @@ -14,6 +14,8 @@ Warp integrations let your team trigger agents directly from the terminal, or fr * Run code inside your codebase in a remote environment * Open pull requests and perform other multi-step agent workflows on your behalf +For intake that routes work through a factory's named agents and automations, use the [Factory integrations](/factories/connect-your-factory/) documentation. + Integrations are one way to start a cloud agent. For the full set, including schedules, the {VARS.WARP_AGENT_CLI}, and the API, see [Triggers](/platform/triggers/). If you're deciding which one to use, see [Run agents unattended with schedules and triggers](/guides/agent-workflows/how-to-run-unattended-agents/). :::note diff --git a/src/content/docs/platform/managing-cloud-agents.mdx b/src/content/docs/platform/managing-cloud-agents.mdx index 5bb605a3e..f4c606492 100644 --- a/src/content/docs/platform/managing-cloud-agents.mdx +++ b/src/content/docs/platform/managing-cloud-agents.mdx @@ -13,6 +13,8 @@ Warp provides two management surfaces for tracking and observing agent activity Use these surfaces as the starting point for real-time agent observability in Warp. They help you see which agents are active, which runs are blocked or failed, where each run started, and which session link opens the prompt, plan, commands, logs, outputs, and follow-up messages behind the work. +To inspect work from one factory, use that factory's [Runs page](/factories/factory-dashboard/#inspect-runs). This page remains the reference for interactive and standalone cloud-agent management. + The Agent Management Panel and {VARS.WEB_APP} Runs page are designed to answer, at a glance: * Which agents are active or have been running recently. diff --git a/src/content/docs/platform/mcp.mdx b/src/content/docs/platform/mcp.mdx index ad13551b4..6dbb95772 100644 --- a/src/content/docs/platform/mcp.mdx +++ b/src/content/docs/platform/mcp.mdx @@ -27,6 +27,8 @@ You can supply MCP configuration in two ways: * **At run time** — pass `--mcp` when calling `oz agent run` or `oz agent run-cloud`. See [MCP Servers](/agents/cli/oz-cli/mcp-servers/) in the CLI reference for the full syntax. * **In an agent config file** — define `mcp_servers` directly in a YAML or JSON agent config file (passed with `-f / --file`). This is the recommended approach for repeatable workflows. +For factory work, declare factory-wide or per-agent MCP servers in the [factory definition](/factories/factory-as-code/#mcpservers). Use [Factory MCP](/factories/factory-mcp/) to connect an external coding agent to a factory. + ## Configuration schema Each MCP server entry is keyed by a name you choose. A server config must have **exactly one** transport type: diff --git a/src/content/docs/platform/overview.mdx b/src/content/docs/platform/overview.mdx index 5d87dc41b..06257e7d2 100644 --- a/src/content/docs/platform/overview.mdx +++ b/src/content/docs/platform/overview.mdx @@ -13,12 +13,9 @@ import { VARS } from '@data/vars'; If you're new to cloud agents, the [Cloud agents quickstart](/platform/quickstart/) gets you to your first run in about ten minutes. -{/* Transition notice for the 2026-08-18 rename. Remove after 2026-10-06, when - the CLI and web app take their new names and the old one stops appearing. */} :::note -**Oz is now the {VARS.WARP_AUTOMATION_PLATFORM}.** Only the name changed. Your existing integrations, API keys, scheduled agents, and scripts keep working exactly as before — nothing to migrate. - -The `oz` CLI and the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> keep the Oz name until October 6, 2026, which is why you'll still see it in commands and URLs. +**The {VARS.WARP_AUTOMATION_PLATFORM} is the current name.** Your existing integrations, API keys, scheduled agents, and scripts keep working exactly as before — nothing to migrate. +The `oz` CLI and the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> retain their legacy names during the transition. See [Transitioning](/platform/transitioning-from-oz/) for the current guidance. ::: <VideoEmbed url="https://youtu.be/poLkJhO7fdo" title={`${VARS.WARP_AUTOMATION_PLATFORM} cloud agents overview video`} /> diff --git a/src/content/docs/platform/secrets.mdx b/src/content/docs/platform/secrets.mdx index 2290c7fae..528e53d30 100644 --- a/src/content/docs/platform/secrets.mdx +++ b/src/content/docs/platform/secrets.mdx @@ -12,6 +12,8 @@ Cloud agents often need to interact with external systems such as APIs, database Warp-managed secrets are designed to work across [cloud agent](/platform/) and [integration](/platform/integrations/) triggers (CLI, Slack, Linear, and schedules), support both team-wide and personal credentials, and give engineering and security teams visibility into what agents can access. +For factory work, declare the managed secrets a factory or individual factory agent receives in its [factory definition](/factories/factory-as-code/#secrets). This page remains the reference for creating, scoping, and rotating the shared secrets. + **Warp-managed secrets are useful when:** * A cloud agent needs to call an API or CLI that does not support OAuth diff --git a/src/content/docs/platform/skills-as-agents.mdx b/src/content/docs/platform/skills-as-agents.mdx index 56f3c284b..ff784aba6 100644 --- a/src/content/docs/platform/skills-as-agents.mdx +++ b/src/content/docs/platform/skills-as-agents.mdx @@ -12,6 +12,8 @@ You can start an agent from a [skill](/agents/capabilities/skills/)—a reusable Skills work with both **local agents** (running on your machine) and **cloud agents** (running in Warp's infrastructure). +For reusable instructions scoped to a factory or one of its agents, use [factory skills](/factories/factory-skills/). This page describes skills that run independently of a factory. + This is useful when you want: * **Consistent behavior** — The same skill produces the same workflow every time, regardless of who triggers it or where it runs. diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx new file mode 100644 index 000000000..6c31600dd --- /dev/null +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -0,0 +1,37 @@ +--- +title: Transitioning to the {{WARP_AUTOMATION_PLATFORM}} and Warp Factories +description: >- + Warp's documentation is moving to a factory-first structure while existing + workflows, configuration, and tools remain available. +sidebar: + label: "Transitioning" +--- +import { VARS } from '@data/vars'; + +Warp's documentation is moving to a factory-first structure. Existing workflows, cloud agents, integrations, schedules, API keys, and the `oz` CLI remain available, so you don't need to migrate immediately. + +The {VARS.WARP_AUTOMATION_PLATFORM} remains the shared foundation for cloud agents. Warp Factories builds on those primitives for teams that need standing workflows with named agents, work intake, review stages, and measurement. + +## Choose the right entry point + +* **Use the {VARS.WARP_AUTOMATION_PLATFORM}** - Configure standalone cloud agents, environments, schedules, integrations, and orchestration. Start with the [{VARS.WARP_AUTOMATION_PLATFORM} overview](/platform/overview/) or [Cloud agents overview](/platform/). +* **Warp Factories** - Use a repeatable workflow that routes work through named agents and tracks it in one place. Start with the [Warp Factories overview](/factories/) or the [factory quickstart](/factories/quickstart/). + +## What stays available + +Current workflows and configuration continue to work during this documentation transition. Links from legacy API, SDK, and CLI reference paths point to their current documentation locations: + +* **API and SDK documentation** - Available under [Developer tools for Warp Factories](/factories/developer-tools/). +* **Legacy {VARS.WARP_AGENT_CLI} documentation** - Available in the [legacy CLI reference](/agents/cli/oz-cli/). +* **Managed self-hosting documentation** - Available in [Managed self-hosting for Warp Factories](/factories/self-hosting/). +* **Standalone cloud-agent execution** - Available in [Unmanaged execution](/platform/unmanaged-execution/). + +## What comes next + +This page will add verified migration actions, compatibility dates, and replacement destinations as the product transition is finalized. Until then, follow the documentation for the workflow you use today. + +## Related pages + +* [{VARS.WARP_AUTOMATION_PLATFORM} overview](/platform/overview/) - Configure the reusable primitives behind cloud-agent workflows. +* [Warp Factories overview](/factories/) - Build and operate a standing software factory. +* [Factory dashboard](/factories/factory-dashboard/) - Inspect work items, runs, and factory settings. diff --git a/src/content/docs/platform/triggers/index.mdx b/src/content/docs/platform/triggers/index.mdx index f204f1303..490144081 100644 --- a/src/content/docs/platform/triggers/index.mdx +++ b/src/content/docs/platform/triggers/index.mdx @@ -8,6 +8,8 @@ import { VARS } from '@data/vars'; A trigger is anything that starts a cloud agent run without you typing a prompt: a recurring schedule, an integration like Slack or Linear, a CI event, or a call to the API. This page covers the full set, including the [integrations](/platform/integrations/) that connect agents to the tools your team already uses. +For triggers that route work through one factory's named agents and workflow, use [factory automations](/factories/automations/) and [factory integrations](/factories/connect-your-factory/). + To set up your first recurring agent, follow the [Scheduled Agents Quickstart](/platform/triggers/scheduled-agents-quickstart/). If you're choosing between schedules, Slack, Linear, GitHub, GitHub Actions, the {VARS.WARP_AGENT_CLI}, or the API, start with [Run agents unattended with schedules and triggers](/guides/agent-workflows/how-to-run-unattended-agents/). diff --git a/src/sidebar.ts b/src/sidebar.ts index d235a6675..0ba757e98 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -451,34 +451,15 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // Integrations subgroup, which would have rendered as // Integrations > Integrations > Slack. // - // 'Connect your factory' leads because it is the overview for this - // group; Factory MCP trails because it is a connection mechanism - // rather than a third-party service. + // 'Connect your factory' leads because it is the overview for this + // group. The direct developer interfaces live in the Developer tools + // group rather than alongside third-party service integrations. label: 'Integrations', items: [ { slug: 'factories/connect-your-factory', label: 'Connect your factory' }, { slug: 'factories/integrations/slack', label: 'Slack' }, { slug: 'factories/integrations/linear', label: 'Linear' }, { slug: 'factories/integrations/jira', label: 'Jira' }, - // Custom webhooks connect any JSON-posting system, so they sit - // between the named third-party services and the API-style - // mechanisms below. Label matches the factory dashboard's nav. - // The overview holds the concept and the happy path; each - // provider whose setup differs from it gets its own page nested - // here (HYC, 9/15), same shape as 'Measure and improve' below. - { - label: 'Webhooks', - collapsed: false, - items: [ - { slug: 'factories/webhooks', label: 'Overview' }, - { slug: 'factories/webhooks/vercel', label: 'Vercel' }, - ], - }, - // Alongside Factory MCP: both are direct API-style connection - // mechanisms rather than third-party services, so they trail the - // per-service integrations above. - { slug: 'factories/factory-api', label: 'Factory API' }, - { slug: 'factories/factory-mcp', label: 'Factory MCP' }, ], }, { @@ -566,6 +547,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ items: [ { slug: 'platform', label: 'Overview' }, { slug: 'platform/quickstart', label: 'Quickstart' }, + { slug: 'platform/transitioning-from-oz', label: 'Transitioning' }, { // Runtime (which agent executes the run) is kept separate from // configuration (how any run is set up) -- HYC review, 8/14. From 5988485f43ba6e93a645288c71af2ef3580b1f9f Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 15:52:45 -0600 Subject: [PATCH 07/63] docs: refine factories transition copy Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/factories/index.mdx | 3 +++ src/content/docs/index.mdx | 2 +- .../docs/platform/transitioning-from-oz.mdx | 23 +++++++++---------- src/sidebar.ts | 9 +++----- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index 189827f03..65a417718 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -15,6 +15,9 @@ Warp Factories is in **Early Access** and available to a limited set of teams. [ A software factory takes in requests (bug reports, feature specs, support escalations), and a coordinated fleet of agents works them into a stream of mergeable pull requests instead of a growing backlog. Warp Factories gives you the building blocks, so your team stays in the loop where it matters, approving specs when needed and merging every pull request. +:::note +The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing workflows remain available today. See [Transitioning from the {VARS.WEB_APP}](/platform/transitioning-from-oz/) for the current transition guidance. +::: <VideoEmbed url="https://www.youtube.com/watch?v=0WBk4ai8y1A" title="Introducing Warp Factories" /> ## What is a software factory? diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index cad74d8fe..b1d0e4c4b 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -8,7 +8,7 @@ sidebar: --- import { VARS } from '@data/vars'; -Warp is an [open source](https://github.com/warpdotdev/warp) development environment for working in the terminal and with coding agents. Use Warp for interactive coding, run the Warp Agent from any terminal, automate recurring work in the cloud, or connect a team workflow to Warp Factories. +Warp is an [open source](https://github.com/warpdotdev/warp) **Agentic Development Environment** for working in the terminal and with coding agents. Use Warp for interactive coding, run the Warp Agent from any terminal, automate recurring work in the cloud, or connect a team workflow to Warp Factories. ## Warp diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx index 6c31600dd..a981cdb32 100644 --- a/src/content/docs/platform/transitioning-from-oz.mdx +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -1,16 +1,16 @@ --- -title: Transitioning to the {{WARP_AUTOMATION_PLATFORM}} and Warp Factories +title: Transitioning from the {{WEB_APP}} description: >- - Warp's documentation is moving to a factory-first structure while existing - workflows, configuration, and tools remain available. + The {{WEB_APP}} will retire after Warp Factories reaches general availability. + Existing workflows, configuration, and tools remain available today. sidebar: - label: "Transitioning" + label: "Transitioning from the {{WEB_APP}}" --- import { VARS } from '@data/vars'; -Warp's documentation is moving to a factory-first structure. Existing workflows, cloud agents, integrations, schedules, API keys, and the `oz` CLI remain available, so you don't need to migrate immediately. +The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing cloud agents, integrations, schedules, API keys, and the `oz` CLI remain available today, so you don't need to migrate immediately. -The {VARS.WARP_AUTOMATION_PLATFORM} remains the shared foundation for cloud agents. Warp Factories builds on those primitives for teams that need standing workflows with named agents, work intake, review stages, and measurement. +The {VARS.WARP_AUTOMATION_PLATFORM} remains the shared foundation for cloud agents. Warp Factories builds on that foundation for teams that need standing workflows with named agents, work intake, review stages, and measurement. ## Choose the right entry point @@ -19,16 +19,15 @@ The {VARS.WARP_AUTOMATION_PLATFORM} remains the shared foundation for cloud agen ## What stays available -Current workflows and configuration continue to work during this documentation transition. Links from legacy API, SDK, and CLI reference paths point to their current documentation locations: +Existing workflows and configuration continue to work today: -* **API and SDK documentation** - Available under [Developer tools for Warp Factories](/factories/developer-tools/). -* **Legacy {VARS.WARP_AGENT_CLI} documentation** - Available in the [legacy CLI reference](/agents/cli/oz-cli/). -* **Managed self-hosting documentation** - Available in [Managed self-hosting for Warp Factories](/factories/self-hosting/). -* **Standalone cloud-agent execution** - Available in [Unmanaged execution](/platform/unmanaged-execution/). +* **Cloud agents** - Continue to run from existing events, schedules, integrations, APIs, and the CLI. +* **Configuration** - Existing environments, integrations, schedules, API keys, and secrets remain available. +* **Current tools** - The {VARS.WARP_AGENT_CLI}, API and SDK, and managed self-hosting continue to support their current workflows. ## What comes next -This page will add verified migration actions, compatibility dates, and replacement destinations as the product transition is finalized. Until then, follow the documentation for the workflow you use today. +This page will add verified migration actions, compatibility dates, and replacement destinations as the product transition is finalized. Until then, continue using the workflow that fits your work today. ## Related pages diff --git a/src/sidebar.ts b/src/sidebar.ts index 0ba757e98..18e7a985b 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -27,12 +27,9 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { label: 'Getting started', items: [ - // Shortened at the 8/18 rename. This label duplicates index.mdx's - // frontmatter title, which IS tokenized, so the two would have - // disagreed once the variable flipped. "Getting started with Warp - // and the Automation Platform" is too long for a sidebar row, and - // Warp is the umbrella product anyway. Keep both in sync. - { label: 'Getting started with Warp', link: '/' }, + // The root product overview remains in the Terminal topic until + // the GA navigation change adds a separate Terminal landing page. + { label: 'Warp products', link: '/' }, { slug: 'quickstart', label: 'Warp quickstart' }, 'getting-started/quickstart/installation-and-setup', 'getting-started/quickstart/coding-in-warp', From be1f580b446f3304f40c6dbf1752f3f589db9602 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 16:13:21 -0600 Subject: [PATCH 08/63] docs: combine factories transition notice Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/factories/index.mdx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index 65a417718..645bb4576 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -11,13 +11,12 @@ import VideoEmbed from '@components/VideoEmbed.astro'; :::note Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. If your team already has access, sign in to the <a href={VARS.FACTORY_WEB_APP_URL}>{VARS.FACTORY_WEB_APP}</a>. + +The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing workflows remain available today. See [Transitioning from the {VARS.WEB_APP}](/platform/transitioning-from-oz/) for the current transition guidance. ::: A software factory takes in requests (bug reports, feature specs, support escalations), and a coordinated fleet of agents works them into a stream of mergeable pull requests instead of a growing backlog. Warp Factories gives you the building blocks, so your team stays in the loop where it matters, approving specs when needed and merging every pull request. -:::note -The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing workflows remain available today. See [Transitioning from the {VARS.WEB_APP}](/platform/transitioning-from-oz/) for the current transition guidance. -::: <VideoEmbed url="https://www.youtube.com/watch?v=0WBk4ai8y1A" title="Introducing Warp Factories" /> ## What is a software factory? From 6bccbf6a61a4112ec987c19694a06b91a8bf6ab3 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 16:20:58 -0600 Subject: [PATCH 09/63] docs: clarify factories and product overviews Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/factories/index.mdx | 2 +- src/content/docs/index.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index 645bb4576..a88f79102 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -15,7 +15,7 @@ Warp Factories is in **Early Access** and available to a limited set of teams. [ The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing workflows remain available today. See [Transitioning from the {VARS.WEB_APP}](/platform/transitioning-from-oz/) for the current transition guidance. ::: -A software factory takes in requests (bug reports, feature specs, support escalations), and a coordinated fleet of agents works them into a stream of mergeable pull requests instead of a growing backlog. Warp Factories gives you the building blocks, so your team stays in the loop where it matters, approving specs when needed and merging every pull request. +A software factory uses a coordinated fleet of agents to take in requests, manage them from triage through review, and turn a growing backlog into mergeable pull requests. Your team stays in the loop to approve specifications and merge each pull request. <VideoEmbed url="https://www.youtube.com/watch?v=0WBk4ai8y1A" title="Introducing Warp Factories" /> diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index b1d0e4c4b..5eda8814e 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -8,7 +8,7 @@ sidebar: --- import { VARS } from '@data/vars'; -Warp is an [open source](https://github.com/warpdotdev/warp) **Agentic Development Environment** for working in the terminal and with coding agents. Use Warp for interactive coding, run the Warp Agent from any terminal, automate recurring work in the cloud, or connect a team workflow to Warp Factories. +Warp is an [open-source](https://github.com/warpdotdev/warp) **Agentic Development Environment** that brings together the terminal, coding agents, cloud orchestration, and Warp Factories. Use Warp to work interactively, run the Warp Agent from any terminal, automate recurring work in the cloud, and build team workflows with Warp Factories. ## Warp From dd01342adfd38c23da9f3123e5a467280bb1cdd9 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 16:25:50 -0600 Subject: [PATCH 10/63] docs: address factories restructure review Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/platform/integrations/github-actions.mdx | 2 +- src/content/docs/platform/skills-as-agents.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/platform/integrations/github-actions.mdx b/src/content/docs/platform/integrations/github-actions.mdx index fd17644cd..adcffc9bd 100644 --- a/src/content/docs/platform/integrations/github-actions.mdx +++ b/src/content/docs/platform/integrations/github-actions.mdx @@ -48,7 +48,7 @@ The `oz-agent-action` is a GitHub Action that wraps the {VARS.WARP_AGENT_CLI} an To use agents in GitHub Actions, you need: -* A [**Warp API Key**](/agents/cli/oz-cli/api-keys/) stored as a [GitHub secret](https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions) — this authenticates the agent with Warp. Pick a personal key if you want commits attributed to you, or an agent key to run as a [cloud agent](/platform/agents/) on your team. See [API keys](/agents/cli/oz-cli/api-keys/) for when to pick each. +* A [**Warp API key**](/agents/cli/oz-cli/api-keys/) stored as a [GitHub secret](https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions) — this authenticates the agent with Warp. Pick a personal key if you want commits attributed to you, or an agent key to run as a [cloud agent](/platform/agents/) on your team. See [API keys](/agents/cli/oz-cli/api-keys/) for when to pick each. * Workflow permissions that match your intended actions (for example, `pull-requests: write` if the agent should commit or comment on PRs) — the agent performs actions on your behalf using the GitHub token available to the workflow * The `oz-agent-action` step added to your workflow * **For private repositories using `@oz-agent` mention workflows**: The [`oz-agent`](https://github.com/oz-agent) GitHub user must be [invited as a member](https://docs.github.com/en/organizations/managing-membership-in-your-organization/inviting-users-to-join-your-organization) of your GitHub organization (see [Responding to comments with @ mentions](#1-responding-to-comments-with--mentions) for details) diff --git a/src/content/docs/platform/skills-as-agents.mdx b/src/content/docs/platform/skills-as-agents.mdx index ff784aba6..56ec7cb5c 100644 --- a/src/content/docs/platform/skills-as-agents.mdx +++ b/src/content/docs/platform/skills-as-agents.mdx @@ -12,7 +12,7 @@ You can start an agent from a [skill](/agents/capabilities/skills/)—a reusable Skills work with both **local agents** (running on your machine) and **cloud agents** (running in Warp's infrastructure). -For reusable instructions scoped to a factory or one of its agents, use [factory skills](/factories/factory-skills/). This page describes skills that run independently of a factory. +Skills that run independently of a factory are covered here. For instructions scoped to a factory or one of its agents, see [factory skills](/factories/factory-skills/). This is useful when you want: From 3782f55227b0c304e84ccc055001ba1bed6ace8a Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 18:28:20 -0600 Subject: [PATCH 11/63] ci: avoid oversized agent review output Co-Authored-By: Warp <agent@warp.dev> --- .../test_agent_docs_review_workflow.py | 5 +++++ .github/workflows/agent-docs-review.yml | 15 +++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py index fec643842..bcf120f8c 100644 --- a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py +++ b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py @@ -33,6 +33,11 @@ def test_all_review_findings_must_supply_actionable_details(self): self.assertIn("actionable_findings", self.workflow) self.assertIn("critical, important, suggestion, or nit", self.workflow) self.assertIn("file and line or quoted text", self.workflow) + def test_review_signal_is_passed_through_a_file(self): + self.assertIn(".agent-docs-review-signal.txt", self.workflow) + self.assertNotIn( + "AGENT_OUTPUT: ${{ steps.oz-review.outputs.agent_output }}", self.workflow + ) if __name__ == "__main__": diff --git a/.github/workflows/agent-docs-review.yml b/.github/workflows/agent-docs-review.yml index 1918fc98c..8003ce2a4 100644 --- a/.github/workflows/agent-docs-review.yml +++ b/.github/workflows/agent-docs-review.yml @@ -60,8 +60,10 @@ jobs: changed file and line or quoted text, explain the problem, and state the requested resolution. Set reviewer_login to `github-actions[bot]`, the runner account that will publish the review. - 5. Your final response must contain only the single [SIGNAL:pr-review] JSON record. - Do not repeat the diff, review rationale, or findings outside that record. + 5. Before your final response, write the single [SIGNAL:pr-review] JSON record to + ${{ github.workspace }}/.agent-docs-review-signal.txt. Your final response must + contain that same single record. Do not repeat the diff, review rationale, or + findings outside that record. - name: Dismiss stale automated change requests env: GH_TOKEN: ${{ github.token }} @@ -80,11 +82,10 @@ jobs: - name: Publish the independent review env: GH_TOKEN: ${{ github.token }} - AGENT_OUTPUT: ${{ steps.oz-review.outputs.agent_output }} run: | - printf '%s' "$AGENT_OUTPUT" > /tmp/agent-output.txt + test -s .agent-docs-review-signal.txt python3 .agents/skills/doc_quality_policy/publish_review_signal.py \ - --agent-output /tmp/agent-output.txt \ + --agent-output .agent-docs-review-signal.txt \ --pr "${{ github.event.pull_request.number }}" \ --head-sha "${{ github.event.pull_request.head.sha }}" \ --output /tmp/review-request.json @@ -98,12 +99,10 @@ jobs: - name: Verify the current review signal and GitHub review env: GH_TOKEN: ${{ github.token }} - AGENT_OUTPUT: ${{ steps.oz-review.outputs.agent_output }} run: | - printf '%s' "$AGENT_OUTPUT" > /tmp/agent-output.txt python3 .agents/skills/doc_quality_policy/verify_review_signal.py \ --repo "${{ github.repository }}" \ --pr "${{ github.event.pull_request.number }}" \ --head-sha "${{ github.event.pull_request.head.sha }}" \ - --agent-output /tmp/agent-output.txt \ + --agent-output .agent-docs-review-signal.txt \ --reviewer-login github-actions[bot] From 5b5117dfdbb5bb1eda45da5840e818916995550a Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 18:43:11 -0600 Subject: [PATCH 12/63] ci: harden agent docs review handoff Co-Authored-By: Warp <agent@warp.dev> --- .../normalize_review_signal.py | 56 +++++++++++++++++++ .../test_agent_docs_review_workflow.py | 2 + .../test_normalize_review_signal.py | 38 +++++++++++++ .github/workflows/agent-docs-review.yml | 12 +++- .github/workflows/ci.yml | 1 + src/content/docs/factories/runners.mdx | 12 ++-- .../docs/platform/unmanaged-execution.mdx | 2 +- 7 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 .agents/skills/doc_quality_policy/normalize_review_signal.py create mode 100644 .agents/skills/doc_quality_policy/test_normalize_review_signal.py diff --git a/.agents/skills/doc_quality_policy/normalize_review_signal.py b/.agents/skills/doc_quality_policy/normalize_review_signal.py new file mode 100644 index 000000000..3f3b1bb04 --- /dev/null +++ b/.agents/skills/doc_quality_policy/normalize_review_signal.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +"""Apply workflow-owned identifiers to an agent-written review signal.""" +from __future__ import annotations + +import argparse +import importlib.util +import json +import sys +from pathlib import Path +from typing import List, Optional + +_HERE = Path(__file__).resolve().parent +_SPEC = importlib.util.spec_from_file_location( + "verify_review_signal", _HERE / "verify_review_signal.py" +) +vrs = importlib.util.module_from_spec(_SPEC) +sys.modules[_SPEC.name] = vrs +_SPEC.loader.exec_module(vrs) + + +def normalize_review_signal( + agent_output: str, pr_number: str, head_sha: str, reviewer_login: str +) -> str: + signal, problems = vrs._parse_signal(agent_output) + if signal is None: + raise ValueError("; ".join(problems)) + signal["pr"] = str(pr_number) + signal["head_sha"] = head_sha + signal["reviewer_login"] = reviewer_login + return f"[SIGNAL:pr-review] {json.dumps(signal, sort_keys=True)}\n" + + +def main(argv: Optional[List[str]] = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--agent-output", required=True) + parser.add_argument("--pr", required=True) + parser.add_argument("--head-sha", required=True) + parser.add_argument("--reviewer-login", default="github-actions[bot]") + parser.add_argument("--output", required=True) + args = parser.parse_args(argv) + try: + normalized = normalize_review_signal( + Path(args.agent_output).read_text(encoding="utf-8"), + args.pr, + args.head_sha, + args.reviewer_login, + ) + except (OSError, ValueError) as exc: + print(f"error: {exc}", file=sys.stderr) + return 1 + Path(args.output).write_text(normalized, encoding="utf-8") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py index bcf120f8c..a241b3429 100644 --- a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py +++ b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py @@ -35,6 +35,8 @@ def test_all_review_findings_must_supply_actionable_details(self): self.assertIn("file and line or quoted text", self.workflow) def test_review_signal_is_passed_through_a_file(self): self.assertIn(".agent-docs-review-signal.txt", self.workflow) + self.assertIn("Normalize the independent review signal", self.workflow) + self.assertIn("--output /tmp/agent-review-signal.txt", self.workflow) self.assertNotIn( "AGENT_OUTPUT: ${{ steps.oz-review.outputs.agent_output }}", self.workflow ) diff --git a/.agents/skills/doc_quality_policy/test_normalize_review_signal.py b/.agents/skills/doc_quality_policy/test_normalize_review_signal.py new file mode 100644 index 000000000..77eb0aa7a --- /dev/null +++ b/.agents/skills/doc_quality_policy/test_normalize_review_signal.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +"""Unit tests for normalize_review_signal.py.""" +from __future__ import annotations + +import importlib.util +import json +import sys +import unittest +from pathlib import Path + +_HERE = Path(__file__).resolve().parent +_SPEC = importlib.util.spec_from_file_location( + "normalize_review_signal", _HERE / "normalize_review_signal.py" +) +nrs = importlib.util.module_from_spec(_SPEC) +sys.modules[_SPEC.name] = nrs +_SPEC.loader.exec_module(nrs) + + +class TestNormalizeReviewSignal(unittest.TestCase): + def test_replaces_workflow_owned_identifiers(self): + output = ( + '[SIGNAL:pr-review] {"pr":"old","head_sha":"old","verdict":"Approve",' + '"critical":0,"important":0,"reviewer_login":"agent"}' + ) + + normalized = nrs.normalize_review_signal( + output, "748", "current-sha", "github-actions[bot]" + ) + signal = json.loads(normalized.removeprefix("[SIGNAL:pr-review] ")) + + self.assertEqual(signal["pr"], "748") + self.assertEqual(signal["head_sha"], "current-sha") + self.assertEqual(signal["reviewer_login"], "github-actions[bot]") + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/workflows/agent-docs-review.yml b/.github/workflows/agent-docs-review.yml index 8003ce2a4..0fda07399 100644 --- a/.github/workflows/agent-docs-review.yml +++ b/.github/workflows/agent-docs-review.yml @@ -64,6 +64,15 @@ jobs: ${{ github.workspace }}/.agent-docs-review-signal.txt. Your final response must contain that same single record. Do not repeat the diff, review rationale, or findings outside that record. + + - name: Normalize the independent review signal + run: | + test -s .agent-docs-review-signal.txt + python3 .agents/skills/doc_quality_policy/normalize_review_signal.py \ + --agent-output .agent-docs-review-signal.txt \ + --pr "${{ github.event.pull_request.number }}" \ + --head-sha "${{ github.event.pull_request.head.sha }}" \ + --output /tmp/agent-review-signal.txt - name: Dismiss stale automated change requests env: GH_TOKEN: ${{ github.token }} @@ -83,9 +92,8 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - test -s .agent-docs-review-signal.txt python3 .agents/skills/doc_quality_policy/publish_review_signal.py \ - --agent-output .agent-docs-review-signal.txt \ + --agent-output /tmp/agent-review-signal.txt \ --pr "${{ github.event.pull_request.number }}" \ --head-sha "${{ github.event.pull_request.head.sha }}" \ --output /tmp/review-request.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6a00fe72e..fbc9718df 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,6 +63,7 @@ jobs: python3 .agents/skills/doc_quality_policy/test_check_compression_contract.py python3 .agents/skills/doc_quality_policy/test_verify_review_signal.py python3 .agents/skills/doc_quality_policy/test_publish_review_signal.py + python3 .agents/skills/doc_quality_policy/test_normalize_review_signal.py python3 .agents/skills/doc_quality_policy/test_stale_review_requests.py python3 .agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py python3 .agents/skills/doc_quality_policy/test_manifest.py diff --git a/src/content/docs/factories/runners.mdx b/src/content/docs/factories/runners.mdx index 987835724..7e9fe8da9 100644 --- a/src/content/docs/factories/runners.mdx +++ b/src/content/docs/factories/runners.mdx @@ -4,14 +4,18 @@ sidebar: label: "Runners" description: >- Runners define the OS, architecture, instance size, and sandbox image for - Warp Factories work. + cloud agent runs, including work from Warp Factories. --- import { VARS } from '@data/vars'; import { Tabs, TabItem } from '@astrojs/starlight/components'; -Runners define the compute a factory agent runs on: the operating system, CPU architecture, instance size, and sandbox image used to execute a run. Select runners in the [factory definition](/factories/factory-as-code/) or the [factory dashboard](/factories/factory-dashboard/). +Runners define the compute a [cloud agent](/platform/) runs on: the operating system, CPU architecture, instance size, and sandbox image used to execute a run. Factory agents select runners through the [factory definition](/factories/factory-as-code/) or the [factory dashboard](/factories/factory-dashboard/). -A runner is a reusable compute configuration. Where an [environment](/platform/environments/) defines _what_ an agent works on (the repos, setup commands, and toolchain), a runner defines _where and on what hardware_ that work executes. Separating the two lets a factory use a small Linux runner for triage and a larger runner for builds. +A runner is a reusable compute configuration. Where an [environment](/platform/environments/) defines _what_ an agent works on (the repos, setup commands, and toolchain), a runner defines _where and on what hardware_ that work executes. This lets any cloud-agent workflow use different machine shapes for different workloads. + +## Configure runners for a factory + +Set a factory's default runner in `agentDefaults.runner`, then override it per agent or automation when the work needs different compute. For file-managed factories, edit `runners/*.yaml` in the factory definition. For Warp-managed factories, edit runner files in the factory dashboard. :::note Most runs don't need a custom runner. Every environment has a default runner, and Warp picks a sensible default shape when you don't specify one. Create a runner when you need a specific OS, architecture, instance size, or sandbox image. @@ -64,7 +68,7 @@ Each environment has a default runner. Specifying a runner for a run overrides t ## Managing runners with the legacy CLI -For a file-managed factory, edit `runners/*.yaml` in the factory definition. For a Warp-managed factory, edit runner files in the factory dashboard. The legacy [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) also supports creating, listing, updating, and deleting reusable runners. +The legacy [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) also supports creating, listing, updating, and deleting reusable runners for standalone cloud-agent workflows. ### Create a runner diff --git a/src/content/docs/platform/unmanaged-execution.mdx b/src/content/docs/platform/unmanaged-execution.mdx index 68df30864..eadd5dc62 100644 --- a/src/content/docs/platform/unmanaged-execution.mdx +++ b/src/content/docs/platform/unmanaged-execution.mdx @@ -135,6 +135,6 @@ Unmanaged runs don't ship with the bundled declarations script, so end-of-run wo * [Self-hosting overview](/factories/self-hosting/) — Compare managed and unmanaged, plus the architecture decision guide. * [GitHub Actions integration](/platform/integrations/github-actions/) — Run agents in CI with the official action. -* [Deployment patterns](/factories/deployment-patterns/) — Pattern 1 (CLI-only) explains the unmanaged model conceptually. +* [Deployment patterns](/factories/deployment-patterns/) — The Standalone CLI-only agents section describes the unmanaged model conceptually. * [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) — Full CLI reference for `oz agent run` and related commands. * [Agent Session Sharing](/agents/local-agents/session-sharing/) — Attach to running sessions to monitor or steer them. From 48eba7a82930f88661e04b31f29305e9635af358 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 15 Sep 2026 18:52:59 -0600 Subject: [PATCH 13/63] ci: capture agent docs review output to file Co-Authored-By: Warp <agent@warp.dev> --- .../normalize_review_signal.py | 56 ------------------- .../test_agent_docs_review_workflow.py | 5 +- .../test_normalize_review_signal.py | 38 ------------- .github/workflows/agent-docs-review.yml | 40 ++++++------- .github/workflows/ci.yml | 1 - 5 files changed, 22 insertions(+), 118 deletions(-) diff --git a/.agents/skills/doc_quality_policy/normalize_review_signal.py b/.agents/skills/doc_quality_policy/normalize_review_signal.py index 3f3b1bb04..e69de29bb 100644 --- a/.agents/skills/doc_quality_policy/normalize_review_signal.py +++ b/.agents/skills/doc_quality_policy/normalize_review_signal.py @@ -1,56 +0,0 @@ -#!/usr/bin/env python3 -"""Apply workflow-owned identifiers to an agent-written review signal.""" -from __future__ import annotations - -import argparse -import importlib.util -import json -import sys -from pathlib import Path -from typing import List, Optional - -_HERE = Path(__file__).resolve().parent -_SPEC = importlib.util.spec_from_file_location( - "verify_review_signal", _HERE / "verify_review_signal.py" -) -vrs = importlib.util.module_from_spec(_SPEC) -sys.modules[_SPEC.name] = vrs -_SPEC.loader.exec_module(vrs) - - -def normalize_review_signal( - agent_output: str, pr_number: str, head_sha: str, reviewer_login: str -) -> str: - signal, problems = vrs._parse_signal(agent_output) - if signal is None: - raise ValueError("; ".join(problems)) - signal["pr"] = str(pr_number) - signal["head_sha"] = head_sha - signal["reviewer_login"] = reviewer_login - return f"[SIGNAL:pr-review] {json.dumps(signal, sort_keys=True)}\n" - - -def main(argv: Optional[List[str]] = None) -> int: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--agent-output", required=True) - parser.add_argument("--pr", required=True) - parser.add_argument("--head-sha", required=True) - parser.add_argument("--reviewer-login", default="github-actions[bot]") - parser.add_argument("--output", required=True) - args = parser.parse_args(argv) - try: - normalized = normalize_review_signal( - Path(args.agent_output).read_text(encoding="utf-8"), - args.pr, - args.head_sha, - args.reviewer_login, - ) - except (OSError, ValueError) as exc: - print(f"error: {exc}", file=sys.stderr) - return 1 - Path(args.output).write_text(normalized, encoding="utf-8") - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py index a241b3429..cb2d2cb22 100644 --- a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py +++ b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py @@ -34,9 +34,8 @@ def test_all_review_findings_must_supply_actionable_details(self): self.assertIn("critical, important, suggestion, or nit", self.workflow) self.assertIn("file and line or quoted text", self.workflow) def test_review_signal_is_passed_through_a_file(self): - self.assertIn(".agent-docs-review-signal.txt", self.workflow) - self.assertIn("Normalize the independent review signal", self.workflow) - self.assertIn("--output /tmp/agent-review-signal.txt", self.workflow) + self.assertIn('oz "${args[@]}" > /tmp/agent-output.txt', self.workflow) + self.assertIn("--agent-output /tmp/agent-output.txt", self.workflow) self.assertNotIn( "AGENT_OUTPUT: ${{ steps.oz-review.outputs.agent_output }}", self.workflow ) diff --git a/.agents/skills/doc_quality_policy/test_normalize_review_signal.py b/.agents/skills/doc_quality_policy/test_normalize_review_signal.py index 77eb0aa7a..e69de29bb 100644 --- a/.agents/skills/doc_quality_policy/test_normalize_review_signal.py +++ b/.agents/skills/doc_quality_policy/test_normalize_review_signal.py @@ -1,38 +0,0 @@ -#!/usr/bin/env python3 -"""Unit tests for normalize_review_signal.py.""" -from __future__ import annotations - -import importlib.util -import json -import sys -import unittest -from pathlib import Path - -_HERE = Path(__file__).resolve().parent -_SPEC = importlib.util.spec_from_file_location( - "normalize_review_signal", _HERE / "normalize_review_signal.py" -) -nrs = importlib.util.module_from_spec(_SPEC) -sys.modules[_SPEC.name] = nrs -_SPEC.loader.exec_module(nrs) - - -class TestNormalizeReviewSignal(unittest.TestCase): - def test_replaces_workflow_owned_identifiers(self): - output = ( - '[SIGNAL:pr-review] {"pr":"old","head_sha":"old","verdict":"Approve",' - '"critical":0,"important":0,"reviewer_login":"agent"}' - ) - - normalized = nrs.normalize_review_signal( - output, "748", "current-sha", "github-actions[bot]" - ) - signal = json.loads(normalized.removeprefix("[SIGNAL:pr-review] ")) - - self.assertEqual(signal["pr"], "748") - self.assertEqual(signal["head_sha"], "current-sha") - self.assertEqual(signal["reviewer_login"], "github-actions[bot]") - - -if __name__ == "__main__": - unittest.main() diff --git a/.github/workflows/agent-docs-review.yml b/.github/workflows/agent-docs-review.yml index 0fda07399..35686e2e8 100644 --- a/.github/workflows/agent-docs-review.yml +++ b/.github/workflows/agent-docs-review.yml @@ -37,12 +37,16 @@ jobs: uses: actions/checkout@v4 - name: Run independent review-docs-pr agent - id: oz-review - uses: warpdotdev/oz-agent-action@main - with: - warp_api_key: ${{ secrets.WARP_API_KEY }} - profile: ${{ vars.WARP_AGENT_PROFILE || '' }} - prompt: | + env: + WARP_API_KEY: ${{ secrets.WARP_API_KEY }} + WARP_AGENT_PROFILE: ${{ vars.WARP_AGENT_PROFILE || '' }} + run: | + curl --fail --location \ + "https://app.warp.dev/download/cli?os=linux&package=deb&arch=x86_64&channel=stable" \ + --output /tmp/oz.deb + sudo dpkg -i /tmp/oz.deb + sudo apt-get -f install -y + PROMPT="$(cat <<'EOF' Run the review-docs-pr skill against warpdotdev/docs PR #${{ github.event.pull_request.number }} at head SHA ${{ github.event.pull_request.head.sha }}. This PR carries the warpy-factory agent marker, so it requires the independent v1 agent-doc quality review pass (see @@ -60,19 +64,15 @@ jobs: changed file and line or quoted text, explain the problem, and state the requested resolution. Set reviewer_login to `github-actions[bot]`, the runner account that will publish the review. - 5. Before your final response, write the single [SIGNAL:pr-review] JSON record to - ${{ github.workspace }}/.agent-docs-review-signal.txt. Your final response must - contain that same single record. Do not repeat the diff, review rationale, or - findings outside that record. - - - name: Normalize the independent review signal - run: | - test -s .agent-docs-review-signal.txt - python3 .agents/skills/doc_quality_policy/normalize_review_signal.py \ - --agent-output .agent-docs-review-signal.txt \ - --pr "${{ github.event.pull_request.number }}" \ - --head-sha "${{ github.event.pull_request.head.sha }}" \ - --output /tmp/agent-review-signal.txt + 5. Your final response must contain only the single [SIGNAL:pr-review] JSON record. + Do not repeat the diff, review rationale, or findings outside that record. + EOF + )" + args=(agent run --sandboxed --output-format text --prompt "$PROMPT") + if [ -n "$WARP_AGENT_PROFILE" ]; then + args+=(--profile "$WARP_AGENT_PROFILE") + fi + oz "${args[@]}" > /tmp/agent-output.txt - name: Dismiss stale automated change requests env: GH_TOKEN: ${{ github.token }} @@ -93,7 +93,7 @@ jobs: GH_TOKEN: ${{ github.token }} run: | python3 .agents/skills/doc_quality_policy/publish_review_signal.py \ - --agent-output /tmp/agent-review-signal.txt \ + --agent-output /tmp/agent-output.txt \ --pr "${{ github.event.pull_request.number }}" \ --head-sha "${{ github.event.pull_request.head.sha }}" \ --output /tmp/review-request.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fbc9718df..6a00fe72e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,7 +63,6 @@ jobs: python3 .agents/skills/doc_quality_policy/test_check_compression_contract.py python3 .agents/skills/doc_quality_policy/test_verify_review_signal.py python3 .agents/skills/doc_quality_policy/test_publish_review_signal.py - python3 .agents/skills/doc_quality_policy/test_normalize_review_signal.py python3 .agents/skills/doc_quality_policy/test_stale_review_requests.py python3 .agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py python3 .agents/skills/doc_quality_policy/test_manifest.py From 2681cd946e2ff7fd91552f9224d96a2dc81fb667 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Wed, 16 Sep 2026 11:40:04 -0600 Subject: [PATCH 14/63] docs: reconcile factories GA restructure with main Co-Authored-By: Warp <agent@warp.dev> --- .../test_agent_docs_review_workflow.py | 1 + .github/workflows/agent-docs-review.yml | 2 +- src/content/docs/factories/factory-as-code.mdx | 2 +- src/sidebar.ts | 9 ++++++++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py index cb2d2cb22..d30aae6d4 100644 --- a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py +++ b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py @@ -36,6 +36,7 @@ def test_all_review_findings_must_supply_actionable_details(self): def test_review_signal_is_passed_through_a_file(self): self.assertIn('oz "${args[@]}" > /tmp/agent-output.txt', self.workflow) self.assertIn("--agent-output /tmp/agent-output.txt", self.workflow) + self.assertNotIn(".agent-docs-review-signal.txt", self.workflow) self.assertNotIn( "AGENT_OUTPUT: ${{ steps.oz-review.outputs.agent_output }}", self.workflow ) diff --git a/.github/workflows/agent-docs-review.yml b/.github/workflows/agent-docs-review.yml index 35686e2e8..3043de760 100644 --- a/.github/workflows/agent-docs-review.yml +++ b/.github/workflows/agent-docs-review.yml @@ -112,5 +112,5 @@ jobs: --repo "${{ github.repository }}" \ --pr "${{ github.event.pull_request.number }}" \ --head-sha "${{ github.event.pull_request.head.sha }}" \ - --agent-output .agent-docs-review-signal.txt \ + --agent-output /tmp/agent-output.txt \ --reviewer-login github-actions[bot] diff --git a/src/content/docs/factories/factory-as-code.mdx b/src/content/docs/factories/factory-as-code.mdx index a7296832f..113eed296 100644 --- a/src/content/docs/factories/factory-as-code.mdx +++ b/src/content/docs/factories/factory-as-code.mdx @@ -725,7 +725,7 @@ agentDefaults: workerHost: SELF_HOSTED_WORKER_ID ``` -Pair `workerHost` with a runner whose `platform` matches the worker's operating system and architecture. Follow the [Self-hosting quickstart](/platform/self-hosting/quickstart/) to deploy and connect a managed worker, then see [choose an execution host](/factories/infrastructure-and-security/#choose-an-execution-host) for the factory-specific setup. For a working definition, see [`07-self-hosted-worker`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/07-self-hosted-worker). +Pair `workerHost` with a runner whose `platform` matches the worker's operating system and architecture. Follow the [Self-hosting quickstart](/factories/self-hosting/quickstart/) to deploy and connect a managed worker, then see [choose an execution host](/factories/infrastructure-and-security/#choose-an-execution-host) for the factory-specific setup. For a working definition, see [`07-self-hosted-worker`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/07-self-hosted-worker). ## Related pages diff --git a/src/sidebar.ts b/src/sidebar.ts index 18e7a985b..2a707aefd 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -470,7 +470,14 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'factories/api-and-sdk/troubleshooting', label: 'API troubleshooting' }, { slug: 'factories/api-and-sdk/troubleshooting/errors', label: 'API errors' }, { slug: 'factories/factory-mcp', label: 'Factory MCP' }, - { slug: 'factories/webhooks', label: 'Webhooks' }, + { + label: 'Webhooks', + collapsed: false, + items: [ + { slug: 'factories/webhooks', label: 'Overview' }, + { slug: 'factories/webhooks/vercel', label: 'Vercel' }, + ], + }, ], }, { From faaf2cdf52fa530ca9482f7acd77d4bc9cf2bd07 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Wed, 16 Sep 2026 12:03:30 -0600 Subject: [PATCH 15/63] docs: remove redirect chains and orphaned files Co-Authored-By: Warp <agent@warp.dev> --- vercel.json | 142 ++++++++++++++++++++++++++-------------------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/vercel.json b/vercel.json index 835e2d784..536550d61 100644 --- a/vercel.json +++ b/vercel.json @@ -359,7 +359,7 @@ }, { "source": "/platform/api-sdk", - "destination": "/reference/api-and-sdk/", + "destination": "/factories/api-and-sdk/", "statusCode": 308 }, { @@ -1924,12 +1924,12 @@ }, { "source": "/errors", - "destination": "/reference/api-and-sdk/troubleshooting/errors/", + "destination": "/factories/api-and-sdk/troubleshooting/errors/", "statusCode": 308 }, { "source": "/errors/:code", - "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", + "destination": "/factories/api-and-sdk/troubleshooting/errors/:code/", "statusCode": 308 }, { @@ -2759,12 +2759,12 @@ }, { "source": "/reference/agent-api-and-sdk(/?)", - "destination": "/reference/api-and-sdk/", + "destination": "/factories/api-and-sdk/", "statusCode": 308 }, { "source": "/reference/ambient-agents/mcp-servers-for-agents(/?)", - "destination": "/reference/cli/mcp-servers/", + "destination": "/agents/cli/oz-cli/mcp-servers/", "statusCode": 308 }, { @@ -2784,147 +2784,147 @@ }, { "source": "/reference/api-and-sdk/troubleshooting/errors/authentication_required(/?)", - "destination": "/reference/api-and-sdk/troubleshooting/errors/authentication-required/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/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/", + "destination": "/factories/api-and-sdk/troubleshooting/errors/resource-unavailable/", "statusCode": 308 }, { "source": "/reference/cli#api-key-authentication", - "destination": "/reference/cli/api-keys/", + "destination": "/agents/cli/oz-cli/api-keys/", "statusCode": 308 }, { "source": "/reference/cli#quickstart-guide", - "destination": "/reference/cli/quickstart/", + "destination": "/agents/cli/oz-cli/quickstart/", "statusCode": 308 }, { "source": "/reference/cli/README.md#api-key-authentication", - "destination": "/reference/cli/api-keys/", + "destination": "/agents/cli/oz-cli/api-keys/", "statusCode": 308 }, { "source": "/reference/cli/integrations-and-environments(/?)", - "destination": "/reference/cli/integration-setup/", + "destination": "/agents/cli/oz-cli/integration-setup/", "statusCode": 308 }, { "source": "/reference/cli/mcp-for-cloud-agents(/?)", - "destination": "/reference/cli/mcp-servers/", + "destination": "/agents/cli/oz-cli/mcp-servers/", "statusCode": 308 }, { "source": "/reference/cli/mcp-servers-for-cloud-agents(/?)", - "destination": "/reference/cli/mcp-servers/", + "destination": "/agents/cli/oz-cli/mcp-servers/", "statusCode": 308 }, { "source": "/reference/developers/cli(/?)", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/reference/developers/cli#api-key-authentication", - "destination": "/reference/cli/api-keys/#authenticating-with-api-keys", + "destination": "/agents/cli/oz-cli/api-keys/#authenticating-with-api-keys", "statusCode": 308 }, { "source": "/reference/developers/cli#generating-api-keys", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/reference/developers/cli#linux", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/reference/integrations/integrations-overview/integrations-and-environments(/?)", - "destination": "/reference/cli/integration-setup/", + "destination": "/agents/cli/oz-cli/integration-setup/", "statusCode": 308 }, { "source": "/reference/integrations/integrations-overview/integrations-and-environments#creating-an-environment", - "destination": "/reference/cli/integration-setup/#step-1-creating-an-environment", + "destination": "/agents/cli/oz-cli/integration-setup/#step-1-creating-an-environment", "statusCode": 308 }, { @@ -2939,57 +2939,57 @@ }, { "source": "/reference/platform/agent-api-and-sdk(/?)", - "destination": "/reference/api-and-sdk/", + "destination": "/factories/api-and-sdk/", "statusCode": 308 }, { "source": "/reference/platform/agent-api-and-sdk#agent-sdk", - "destination": "/reference/api-and-sdk/", + "destination": "/factories/api-and-sdk/", "statusCode": 308 }, { "source": "/reference/platform/agent-api-and-sdk/agent(/?)", - "destination": "/reference/api-and-sdk/", + "destination": "/factories/api-and-sdk/", "statusCode": 308 }, { "source": "/reference/platform/agent-api-and-sdk/agent-1(/?)", - "destination": "/reference/api-and-sdk/", + "destination": "/factories/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/", + "destination": "/factories/api-and-sdk/demo-sentry-monitoring-with-sdk/", "statusCode": 308 }, { "source": "/reference/platform/cli(/?)", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/reference/platform/cli#api-key-authentication", - "destination": "/reference/cli/api-keys/", + "destination": "/agents/cli/oz-cli/api-keys/", "statusCode": 308 }, { "source": "/reference/platform/cli/api-keys(/?)", - "destination": "/reference/cli/api-keys/", + "destination": "/agents/cli/oz-cli/api-keys/", "statusCode": 308 }, { "source": "/reference/platform/cli/integrations-and-environments(/?)", - "destination": "/reference/cli/integration-setup/", + "destination": "/agents/cli/oz-cli/integration-setup/", "statusCode": 308 }, { "source": "/reference/platform/cli/troubleshooting(/?)", - "destination": "/reference/cli/troubleshooting/", + "destination": "/agents/cli/oz-cli/troubleshooting/", "statusCode": 308 }, { "source": "/reference/platform/warp-platform(/?)", - "destination": "/reference/", + "destination": "/factories/developer-tools/", "statusCode": 308 }, { @@ -4574,17 +4574,17 @@ }, { "source": "/reference/api-and-sdk/api-and-sdk(/?)", - "destination": "/reference/api-and-sdk/", + "destination": "/factories/api-and-sdk/", "statusCode": 308 }, { "source": "/reference/api-and-sdk/models(/?)", - "destination": "/reference/api-and-sdk/", + "destination": "/factories/api-and-sdk/", "statusCode": 308 }, { "source": "/reference/cli/cli(/?)", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { @@ -4724,7 +4724,7 @@ }, { "source": "/platform/warp-platform(/?)", - "destination": "/reference/", + "destination": "/factories/developer-tools/", "statusCode": 308 }, { @@ -4779,12 +4779,12 @@ }, { "source": "/errors/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/", + "destination": "/factories/api-and-sdk/troubleshooting/errors/", "statusCode": 308 }, { "source": "/errors/:code/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", + "destination": "/factories/api-and-sdk/troubleshooting/errors/:code/", "statusCode": 308 }, { @@ -4814,7 +4814,7 @@ }, { "source": "/platform/cli", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { @@ -4959,7 +4959,7 @@ }, { "source": "/platform/agent-api-and-sdk", - "destination": "/reference/api-and-sdk/", + "destination": "/factories/api-and-sdk/", "statusCode": 308 }, { @@ -5199,7 +5199,7 @@ }, { "source": "/platform/agent-api-and-sdk/agent-1", - "destination": "/reference/api-and-sdk/", + "destination": "/factories/api-and-sdk/", "statusCode": 308 }, { @@ -5254,7 +5254,7 @@ }, { "source": "/platform/cli/troubleshooting", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { @@ -5864,7 +5864,7 @@ }, { "source": "/developers/cli", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { @@ -6054,72 +6054,72 @@ }, { "source": "/platform/agent-api-and-sdk/agent", - "destination": "/reference/api-and-sdk/", + "destination": "/factories/api-and-sdk/", "statusCode": 308 }, { "source": "/platform/agent-api-and-sdk/demo-sentry-monitoring-with-sdk", - "destination": "/reference/api-and-sdk/", + "destination": "/factories/api-and-sdk/", "statusCode": 308 }, { "source": "/platform/cli#api-key-authentication", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/platform/cli#bundled-with-warp", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/platform/cli#id-2.-authenticate", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/platform/cli#id-3.-run-an-agent", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/platform/cli#id-4.-add-github-context-optional", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/platform/cli#id-5.-next-steps", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/platform/cli#interactive-login-local-machines", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/platform/cli#running-agents", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/platform/cli#running-locally-warp-agent-run", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/platform/cli#running-the-cli", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/platform/cli#standalone-package", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { "source": "/platform/cli#what-is-the-warp-cli", - "destination": "/reference/cli/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { @@ -6249,7 +6249,7 @@ }, { "source": "/integrations/integrations-overview/integrations-and-environments", - "destination": "/reference/cli/integration-setup/", + "destination": "/agents/cli/oz-cli/integration-setup/", "statusCode": 308 }, { From bdbaf212d3a62f984a0d4db3c0b8aad2503ad2f9 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Wed, 16 Sep 2026 12:04:00 -0600 Subject: [PATCH 16/63] ci: remove orphaned review signal files Co-Authored-By: Warp <agent@warp.dev> --- .agents/skills/doc_quality_policy/normalize_review_signal.py | 0 .agents/skills/doc_quality_policy/test_normalize_review_signal.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .agents/skills/doc_quality_policy/normalize_review_signal.py delete mode 100644 .agents/skills/doc_quality_policy/test_normalize_review_signal.py diff --git a/.agents/skills/doc_quality_policy/normalize_review_signal.py b/.agents/skills/doc_quality_policy/normalize_review_signal.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/.agents/skills/doc_quality_policy/test_normalize_review_signal.py b/.agents/skills/doc_quality_policy/test_normalize_review_signal.py deleted file mode 100644 index e69de29bb..000000000 From 69a05429cc1a03daa2b6103413ed7b09b5bb77d5 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Wed, 16 Sep 2026 12:15:03 -0600 Subject: [PATCH 17/63] docs: address final factories review findings Co-Authored-By: Warp <agent@warp.dev> --- .github/workflows/agent-docs-review.yml | 4 +- .../docs/platform/transitioning-from-oz.mdx | 2 +- vercel.json | 37 ++++++++----------- 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/.github/workflows/agent-docs-review.yml b/.github/workflows/agent-docs-review.yml index 3043de760..f5d2c8afc 100644 --- a/.github/workflows/agent-docs-review.yml +++ b/.github/workflows/agent-docs-review.yml @@ -44,8 +44,8 @@ jobs: curl --fail --location \ "https://app.warp.dev/download/cli?os=linux&package=deb&arch=x86_64&channel=stable" \ --output /tmp/oz.deb - sudo dpkg -i /tmp/oz.deb - sudo apt-get -f install -y + sudo apt-get update + sudo apt-get install -y /tmp/oz.deb PROMPT="$(cat <<'EOF' Run the review-docs-pr skill against warpdotdev/docs PR #${{ github.event.pull_request.number }} at head SHA ${{ github.event.pull_request.head.sha }}. This PR carries the warpy-factory agent diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx index a981cdb32..810bc5325 100644 --- a/src/content/docs/platform/transitioning-from-oz.mdx +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -27,7 +27,7 @@ Existing workflows and configuration continue to work today: ## What comes next -This page will add verified migration actions, compatibility dates, and replacement destinations as the product transition is finalized. Until then, continue using the workflow that fits your work today. +Migration actions, compatibility dates, and replacement destinations will be documented after product mapping is finalized. Until then, continue using the workflow that fits your work today. ## Related pages diff --git a/vercel.json b/vercel.json index 536550d61..75bfc36ba 100644 --- a/vercel.json +++ b/vercel.json @@ -5157,11 +5157,6 @@ "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/", @@ -6558,77 +6553,77 @@ "statusCode": 308 }, { - "source": "/platform/deployment-patterns", + "source": "/platform/deployment-patterns(/?)", "destination": "/factories/deployment-patterns/", "statusCode": 308 }, { - "source": "/platform/warp-hosting", + "source": "/platform/warp-hosting(/?)", "destination": "/factories/warp-hosting/", "statusCode": 308 }, { - "source": "/platform/runners", + "source": "/platform/runners(/?)", "destination": "/factories/runners/", "statusCode": 308 }, { - "source": "/platform/self-hosting", + "source": "/platform/self-hosting(/?)", "destination": "/factories/self-hosting/", "statusCode": 308 }, { - "source": "/platform/self-hosting/quickstart", + "source": "/platform/self-hosting/quickstart(/?)", "destination": "/factories/self-hosting/quickstart/", "statusCode": 308 }, { - "source": "/platform/self-hosting/managed-docker", + "source": "/platform/self-hosting/managed-docker(/?)", "destination": "/factories/self-hosting/managed-docker/", "statusCode": 308 }, { - "source": "/platform/self-hosting/managed-kubernetes", + "source": "/platform/self-hosting/managed-kubernetes(/?)", "destination": "/factories/self-hosting/managed-kubernetes/", "statusCode": 308 }, { - "source": "/platform/self-hosting/managed-direct", + "source": "/platform/self-hosting/managed-direct(/?)", "destination": "/factories/self-hosting/managed-direct/", "statusCode": 308 }, { - "source": "/platform/self-hosting/monitoring", + "source": "/platform/self-hosting/monitoring(/?)", "destination": "/factories/self-hosting/monitoring/", "statusCode": 308 }, { - "source": "/platform/self-hosting/reference", + "source": "/platform/self-hosting/reference(/?)", "destination": "/factories/self-hosting/reference/", "statusCode": 308 }, { - "source": "/platform/self-hosting/troubleshooting", + "source": "/platform/self-hosting/troubleshooting(/?)", "destination": "/factories/self-hosting/troubleshooting/", "statusCode": 308 }, { - "source": "/platform/self-hosting/unmanaged", + "source": "/platform/self-hosting/unmanaged(/?)", "destination": "/platform/unmanaged-execution/", "statusCode": 308 }, { - "source": "/platform/self-hosting/security-and-networking", + "source": "/platform/self-hosting/security-and-networking(/?)", "destination": "/platform/execution-security/", "statusCode": 308 }, { - "source": "/reference", + "source": "/reference(/?)", "destination": "/factories/developer-tools/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk", + "source": "/reference/api-and-sdk(/?)", "destination": "/factories/api-and-sdk/", "statusCode": 308 }, @@ -6638,7 +6633,7 @@ "statusCode": 308 }, { - "source": "/reference/cli", + "source": "/reference/cli(/?)", "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, From 8adc6794115d445e9784264c9030bc2ea682d623 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Wed, 16 Sep 2026 12:25:46 -0600 Subject: [PATCH 18/63] docs: address agent review follow-up Co-Authored-By: Warp <agent@warp.dev> --- .github/workflows/agent-docs-review.yml | 2 +- src/content/docs/index.mdx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/agent-docs-review.yml b/.github/workflows/agent-docs-review.yml index f5d2c8afc..5bbfaad58 100644 --- a/.github/workflows/agent-docs-review.yml +++ b/.github/workflows/agent-docs-review.yml @@ -68,7 +68,7 @@ jobs: Do not repeat the diff, review rationale, or findings outside that record. EOF )" - args=(agent run --sandboxed --output-format text --prompt "$PROMPT") + args=(agent run --output-format text --prompt "$PROMPT") if [ -n "$WARP_AGENT_PROFILE" ]; then args+=(--profile "$WARP_AGENT_PROFILE") fi diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index 5eda8814e..f19440f69 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -46,3 +46,4 @@ Use Warp and the Warp Agent for interactive development. Use the {VARS.WARP_AUTO * [Start an agent conversation](/agents/) - Work with the Warp Agent in a local checkout. * [Run cloud agents](/platform/quickstart/) - Set up background automation. * [Set up a factory](/factories/quickstart/) - Route engineering work through Warp Factories. +* [Privacy and security](/support-and-community/privacy-and-security/privacy/) - Review Warp's data handling, privacy, and security practices. From 5695be5c3715032e832e27d9d02e34626b8796c3 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Wed, 16 Sep 2026 12:41:52 -0600 Subject: [PATCH 19/63] ci: pin and verify agent review CLI Co-Authored-By: Warp <agent@warp.dev> --- .../test_agent_docs_review_workflow.py | 5 +++++ .github/workflows/agent-docs-review.yml | 19 +++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py index d30aae6d4..230d5f826 100644 --- a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py +++ b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py @@ -41,6 +41,11 @@ def test_review_signal_is_passed_through_a_file(self): "AGENT_OUTPUT: ${{ steps.oz-review.outputs.agent_output }}", self.workflow ) + def test_review_uses_a_pinned_signed_oz_package(self): + self.assertIn("0913165C78D5B7A41B42AC657FF7AB39D60F803F", self.workflow) + self.assertIn("signed-by=/etc/apt/keyrings/warpdotdev.gpg", self.workflow) + self.assertIn("oz-stable=0.2026.09.09.08.26.stable.02", self.workflow) + if __name__ == "__main__": unittest.main() diff --git a/.github/workflows/agent-docs-review.yml b/.github/workflows/agent-docs-review.yml index 5bbfaad58..2c88e2a75 100644 --- a/.github/workflows/agent-docs-review.yml +++ b/.github/workflows/agent-docs-review.yml @@ -41,11 +41,22 @@ jobs: WARP_API_KEY: ${{ secrets.WARP_API_KEY }} WARP_AGENT_PROFILE: ${{ vars.WARP_AGENT_PROFILE || '' }} run: | - curl --fail --location \ - "https://app.warp.dev/download/cli?os=linux&package=deb&arch=x86_64&channel=stable" \ - --output /tmp/oz.deb sudo apt-get update - sudo apt-get install -y /tmp/oz.deb + sudo apt-get install -y gpg + curl --fail --location https://releases.warp.dev/linux/keys/warp.asc \ + --output /tmp/warpdotdev.asc + test "$( + gpg --show-keys --with-colons /tmp/warpdotdev.asc | + awk -F: '/^fpr:/ { print $10; exit }' + )" = "0913165C78D5B7A41B42AC657FF7AB39D60F803F" + gpg --dearmor --output /tmp/warpdotdev.gpg /tmp/warpdotdev.asc + sudo install -D -o root -g root -m 644 /tmp/warpdotdev.gpg \ + /etc/apt/keyrings/warpdotdev.gpg + sudo tee /etc/apt/sources.list.d/warpdotdev.list > /dev/null <<'EOF' + deb [arch=amd64 signed-by=/etc/apt/keyrings/warpdotdev.gpg] https://releases.warp.dev/linux/deb stable main + EOF + sudo apt-get update + sudo apt-get install -y oz-stable=0.2026.09.09.08.26.stable.02 PROMPT="$(cat <<'EOF' Run the review-docs-pr skill against warpdotdev/docs PR #${{ github.event.pull_request.number }} at head SHA ${{ github.event.pull_request.head.sha }}. This PR carries the warpy-factory agent From 8397fca628474b77755c068ee1f2aa9cd2a169a2 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Wed, 16 Sep 2026 12:47:04 -0600 Subject: [PATCH 20/63] docs: retarget self-hosted worker routing links Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/factories/self-hosting/managed-direct.mdx | 3 ++- src/content/docs/factories/self-hosting/managed-docker.mdx | 2 +- .../docs/factories/self-hosting/managed-kubernetes.mdx | 3 ++- src/content/docs/factories/self-hosting/quickstart.mdx | 3 ++- src/content/docs/factories/self-hosting/reference.mdx | 4 ++-- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/content/docs/factories/self-hosting/managed-direct.mdx b/src/content/docs/factories/self-hosting/managed-direct.mdx index d8c6035dd..f14722f2c 100644 --- a/src/content/docs/factories/self-hosting/managed-direct.mdx +++ b/src/content/docs/factories/self-hosting/managed-direct.mdx @@ -127,6 +127,7 @@ backend: * [Self-hosted worker reference](/factories/self-hosting/reference/#direct-backend-config) — Full config schema for the Direct backend. * [Self-hosting overview](/factories/self-hosting/) — Managed vs unmanaged and the backend decision guide. -* [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) — How to send tasks to your connected worker from the CLI, schedules, integrations, the API, and the web UI. +* [Factory definition](/factories/factory-as-code/#agentdefaultsworkerhost) — Route factory work to a compatible worker and runner. +* [CLI reference](/agents/cli/oz-cli/) — Route standalone cloud agents to the worker with `--host`. * [Security and networking](/platform/execution-security/) — Data boundaries and security considerations for the Direct backend. * [Troubleshooting](/factories/self-hosting/troubleshooting/#direct-backend) — Common Direct-backend issues. diff --git a/src/content/docs/factories/self-hosting/managed-docker.mdx b/src/content/docs/factories/self-hosting/managed-docker.mdx index 8206877c5..ed42a2625 100644 --- a/src/content/docs/factories/self-hosting/managed-docker.mdx +++ b/src/content/docs/factories/self-hosting/managed-docker.mdx @@ -212,7 +212,7 @@ Sidecar images (the `oz` binary and dependencies) are pulled from public registr ## Routing runs to this worker -Once your Docker worker is connected, route tasks to it with `--host "<your-worker-id>"`. Routing is the same across all managed backends — see [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) for CLI, scheduled, integration, API, and web UI examples. +Once your Docker worker is connected, route factory work to it with `workerHost` in the [factory definition](/factories/factory-as-code/#agentdefaultsworkerhost). To route a standalone cloud agent with `--host "<your-worker-id>"`, see the [CLI reference](/agents/cli/oz-cli/). --- diff --git a/src/content/docs/factories/self-hosting/managed-kubernetes.mdx b/src/content/docs/factories/self-hosting/managed-kubernetes.mdx index 50a53700a..44673a3c6 100644 --- a/src/content/docs/factories/self-hosting/managed-kubernetes.mdx +++ b/src/content/docs/factories/self-hosting/managed-kubernetes.mdx @@ -268,7 +268,8 @@ See [Monitoring](/factories/self-hosting/monitoring/) for the full list of Helm * [Self-hosted worker reference](/factories/self-hosting/reference/) — Full CLI flag and config file schema, including every Kubernetes backend field. * [Self-hosting overview](/factories/self-hosting/) — Managed vs unmanaged and the backend decision guide. -* [Routing runs to this worker](/factories/self-hosting/#routing-runs-to-self-hosted-workers) — How to send tasks to your connected worker from the CLI, schedules, integrations, the API, and the web UI. +* [Factory definition](/factories/factory-as-code/#agentdefaultsworkerhost) — Route factory work to a compatible worker and runner. +* [CLI reference](/agents/cli/oz-cli/) — Route standalone cloud agents to the worker with `--host`. * [Environments](/platform/environments/) — Define the task image, repos, and setup commands. * [Monitoring](/factories/self-hosting/monitoring/) — OpenTelemetry metrics, including Helm chart metrics values. * [Security and networking](/platform/execution-security/) — RBAC, admission policies, and data boundaries. diff --git a/src/content/docs/factories/self-hosting/quickstart.mdx b/src/content/docs/factories/self-hosting/quickstart.mdx index 4841addaf..7c324ae7d 100644 --- a/src/content/docs/factories/self-hosting/quickstart.mdx +++ b/src/content/docs/factories/self-hosting/quickstart.mdx @@ -76,7 +76,8 @@ Open the <a href={VARS.WEB_APP_URL}>{VARS.DASHBOARD}</a>, find the new task, and * [Unmanaged quickstart](/platform/unmanaged-execution/#unmanaged-quickstart) — ~5-minute CLI-only path: run `oz agent run` in your CI, Kubernetes pod, or dev box with no worker daemon and no Docker requirement. * [Managed: Docker](/factories/self-hosting/managed-docker/) — Full Docker backend setup, including private registries, volume mounts, and runtime configuration. * [Environments](/platform/environments/) — Define a repository, Docker image, and setup commands so agents have a reproducible workspace for every run. -* [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) — How to route tasks from schedules, integrations (Slack, Linear), the API, and the {VARS.WEB_APP}. +* [Factory definition](/factories/factory-as-code/#agentdefaultsworkerhost) — Route factory work to a compatible worker and runner. +* [CLI reference](/agents/cli/oz-cli/) — Route standalone cloud agents to the worker with `--host`. * [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/) — Deploy workers into a Kubernetes cluster with Helm. * [Self-hosted worker reference](/factories/self-hosting/reference/) — All CLI flags and config file options. diff --git a/src/content/docs/factories/self-hosting/reference.mdx b/src/content/docs/factories/self-hosting/reference.mdx index ae0e017a2..075ecf499 100644 --- a/src/content/docs/factories/self-hosting/reference.mdx +++ b/src/content/docs/factories/self-hosting/reference.mdx @@ -189,9 +189,9 @@ When deploying with the Helm chart, use the `metrics.*` values instead of settin --- -## Routing runs to self-hosted workers +## Routing work to self-hosted workers -Once a worker is running, route cloud agent runs to it with the `--host` flag or its equivalents. See [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) for examples across the CLI, schedules, integrations, the API, and the web UI. +To route factory work to a worker, set `workerHost` and a compatible runner in the [factory definition](/factories/factory-as-code/#agentdefaultsworkerhost). To route a standalone cloud agent to the worker with `--host`, see the [CLI reference](/agents/cli/oz-cli/). --- From e79711f09e89a38527d1b2742a6bd683c422c21f Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Wed, 16 Sep 2026 13:11:37 -0600 Subject: [PATCH 21/63] docs: refine Warp products introduction Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index f19440f69..10058c719 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -8,7 +8,7 @@ sidebar: --- import { VARS } from '@data/vars'; -Warp is an [open-source](https://github.com/warpdotdev/warp) **Agentic Development Environment** that brings together the terminal, coding agents, cloud orchestration, and Warp Factories. Use Warp to work interactively, run the Warp Agent from any terminal, automate recurring work in the cloud, and build team workflows with Warp Factories. +Warp is an [open-source](https://github.com/warpdotdev/warp) **Agentic Development Environment** that brings together terminal work, coding agents, and cloud automation. Use Warp to work interactively, run the Warp Agent from any terminal, automate recurring work in the cloud, and build team workflows with Warp Factories. ## Warp From dea36bb648a1f4ea796054fd885d22cd062f170e Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Wed, 16 Sep 2026 13:21:11 -0600 Subject: [PATCH 22/63] docs: consolidate factories sidebar group Co-Authored-By: Warp <agent@warp.dev> --- src/sidebar.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/sidebar.ts b/src/sidebar.ts index 2a707aefd..284b1d940 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -403,16 +403,13 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // next door, since the underlying concepts are the same. items: [ { - label: 'Overview', + label: 'Factories', items: [ { slug: 'factories', label: 'Overview' }, { slug: 'factories/how-factories-work', label: 'How Factories work' }, + { slug: 'factories/quickstart', label: 'Quickstart' }, ], }, - { - label: 'Get started', - items: [{ slug: 'factories/quickstart', label: 'Quickstart' }], - }, { // Parallel to 'Agent configuration' in the Automation Platform tab. // Scoped to the factory itself: who runs the work, how it is defined, From 809ab2c3329566d232f9e8acac441b48b8a11c18 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Wed, 16 Sep 2026 16:55:56 -0600 Subject: [PATCH 23/63] Update documentation for factory API and managed self-hosting --- src/content/docs/factories/api-and-sdk/index.mdx | 7 +++++-- src/content/docs/factories/self-hosting/index.mdx | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/content/docs/factories/api-and-sdk/index.mdx b/src/content/docs/factories/api-and-sdk/index.mdx index 943f9c759..6774e5817 100644 --- a/src/content/docs/factories/api-and-sdk/index.mdx +++ b/src/content/docs/factories/api-and-sdk/index.mdx @@ -10,9 +10,12 @@ description: >- import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; -The {VARS.API_SDK_NAME} lets you integrate with Warp Factories and operate the cloud agent runs behind them. Use the REST API from any HTTP client, or the official Python and TypeScript SDKs for typed requests, built-in retries, and structured error handling. +Use the [factory API](/factories/factory-api/) to find a factory and send it new work. Use the {VARS.API_SDK_NAME} to start standalone cloud-agent runs, or to monitor, continue, and cancel any run after it starts. -Use the [factory API](/factories/factory-api/) to discover a factory and send it work. Use this API and SDK reference to monitor factory runs, submit follow-ups, inspect results, or start standalone cloud-agent runs from CI, internal tools, and custom integrations. +| API | Use it for | +| --- | --- | +| **Factory API** | Find a factory and dispatch new work to its foreman. | +| **{VARS.API_SDK_NAME}** | Start standalone cloud-agent runs, and manage factory or standalone runs after they begin. | :::note Some examples in this reference and the [CLI reference](/agents/cli/oz-cli/) use `oz` commands (for example, `oz environment list`) from the {VARS.WARP_AGENT_CLI}. Those commands remain available during the transition. The [Warp Agent CLI reference](/agents/cli/reference/) does not yet document a `warp` equivalent. diff --git a/src/content/docs/factories/self-hosting/index.mdx b/src/content/docs/factories/self-hosting/index.mdx index d58babe69..7544bf4f2 100644 --- a/src/content/docs/factories/self-hosting/index.mdx +++ b/src/content/docs/factories/self-hosting/index.mdx @@ -14,6 +14,8 @@ Managed self-hosting runs factory work on infrastructure you control. A worker c Managed self-hosting is available to Enterprise teams. [Contact sales](https://www.warp.dev/contact-sales) to enable it for your team. ::: +Managed workers run on Linux `amd64` or `arm64` hosts. + <a id="managed-architecture"></a> ## How managed self-hosting works From cf148f0c11cbbadac830250bcf9cafc459686d08 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Wed, 16 Sep 2026 17:12:39 -0600 Subject: [PATCH 24/63] docs: resolve self-hosting review feedback Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/factories/deployment-patterns.mdx | 2 +- src/content/docs/factories/self-hosting/index.mdx | 4 ++-- .../docs/factories/self-hosting/quickstart.mdx | 13 ------------- 3 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/content/docs/factories/deployment-patterns.mdx b/src/content/docs/factories/deployment-patterns.mdx index e6d23f9ef..f993a5e3c 100644 --- a/src/content/docs/factories/deployment-patterns.mdx +++ b/src/content/docs/factories/deployment-patterns.mdx @@ -96,7 +96,7 @@ Think of managed self-hosting as **customer-hosted execution with Warp-hosted or Self-hosting has two architectures that differ on **who orchestrates agent runs** (both keep code and execution on your infrastructure): * **[Managed](/factories/self-hosting/#managed-architecture)** — The {VARS.WARP_AUTOMATION_PLATFORM} orchestrates. You run the `oz-agent-worker` daemon; the {VARS.WARP_AUTOMATION_PLATFORM} routes runs to it from Slack, Linear, schedules, the API, or `oz agent run-cloud`. Tasks execute in Docker containers, Kubernetes Jobs, or directly on the host. -* **[Unmanaged](/platform/unmanaged-execution/)** — You orchestrate. Invoke `oz agent run` directly from your CI, Kubernetes, or dev environment. This is a standalone-agent model, not a factory host. +* **[Unmanaged](/platform/unmanaged-execution/)** — You orchestrate. Invoke `oz agent run` directly from your CI, Kubernetes, or dev environment for standalone-agent work. Route factory work to a managed worker. Why teams choose self-hosted execution: diff --git a/src/content/docs/factories/self-hosting/index.mdx b/src/content/docs/factories/self-hosting/index.mdx index 7544bf4f2..8dec2503a 100644 --- a/src/content/docs/factories/self-hosting/index.mdx +++ b/src/content/docs/factories/self-hosting/index.mdx @@ -14,7 +14,7 @@ Managed self-hosting runs factory work on infrastructure you control. A worker c Managed self-hosting is available to Enterprise teams. [Contact sales](https://www.warp.dev/contact-sales) to enable it for your team. ::: -Managed workers run on Linux `amd64` or `arm64` hosts. +Managed workers run only on Linux `amd64` or `arm64` hosts. To run agents on macOS or Windows, use [unmanaged execution](/platform/unmanaged-execution/). <a id="managed-architecture"></a> @@ -22,7 +22,7 @@ Managed workers run on Linux `amd64` or `arm64` hosts. Run the `oz-agent-worker` daemon on infrastructure that can reach your repositories and internal services. The worker connects outbound to the {VARS.WARP_AUTOMATION_PLATFORM}, waits for factory work, and runs each task using the backend you configure. -A managed worker is the self-hosted execution option for a factory. [Unmanaged execution](/platform/unmanaged-execution/) runs `oz agent run` directly from your own CI or infrastructure, but it cannot run factory work. +A managed worker is the self-hosted execution option for a factory. [Unmanaged execution](/platform/unmanaged-execution/) runs standalone agents directly from your own CI or infrastructure. Route factory work to a managed worker through the [factory definition](/factories/factory-as-code/#agentdefaultsworkerhost). <a id="choosing-a-managed-backend"></a> diff --git a/src/content/docs/factories/self-hosting/quickstart.mdx b/src/content/docs/factories/self-hosting/quickstart.mdx index 7c324ae7d..34a8bcab5 100644 --- a/src/content/docs/factories/self-hosting/quickstart.mdx +++ b/src/content/docs/factories/self-hosting/quickstart.mdx @@ -80,16 +80,3 @@ Open the <a href={VARS.WEB_APP_URL}>{VARS.DASHBOARD}</a>, find the new task, and * [CLI reference](/agents/cli/oz-cli/) — Route standalone cloud agents to the worker with `--host`. * [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/) — Deploy workers into a Kubernetes cluster with Helm. * [Self-hosted worker reference](/factories/self-hosting/reference/) — All CLI flags and config file options. - -## Troubleshooting - -**Worker won't start**\ -Verify Docker is running (`docker info`) and that the daemon platform is `linux/amd64` or `linux/arm64`. Musl-based (Alpine) worker hosts are not supported. - -**Worker won't connect**\ -Verify your API key has team scope. Ensure the machine has outbound internet access to `oz.warp.dev:443`. Increase log verbosity with `--log-level debug` to see connection details. - -**Task stays queued and never runs**\ -Confirm the `--host` value you passed to `oz agent run-cloud` matches your `--worker-id` exactly (case-sensitive). Check that the worker's team matches the team creating the task. - -For more, see [Troubleshooting](/factories/self-hosting/troubleshooting/). From 4ebc0e9fcaba3af536e7d9fa694395339db31bb5 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Thu, 17 Sep 2026 10:16:36 -0600 Subject: [PATCH 25/63] docs: refine product and transition copy Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/index.mdx | 8 ++++---- .../docs/platform/transitioning-from-oz.mdx | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index 10058c719..ab6acde6b 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -8,11 +8,11 @@ sidebar: --- import { VARS } from '@data/vars'; -Warp is an [open-source](https://github.com/warpdotdev/warp) **Agentic Development Environment** that brings together terminal work, coding agents, and cloud automation. Use Warp to work interactively, run the Warp Agent from any terminal, automate recurring work in the cloud, and build team workflows with Warp Factories. +Warp is an [open-source](https://github.com/warpdotdev/warp) **Agentic Development Environment** that brings together terminal work, coding agents, and cloud automation. With Warp, you can work in a desktop terminal, use the Warp Agent in a local checkout or from any terminal, automate background work in the cloud, and run repeatable team workflows with Warp Factories. ## Warp -Warp is the desktop terminal for running commands, editing code, and working with agents in a local checkout. +With the [Warp desktop terminal](/), you can run commands, edit code, and work with agents in a local checkout. * [Modern terminal editing](/terminal/editor/) - Edit commands, navigate blocks, manage tabs, and customize your terminal. * [Code](/code/overview/) - Review agent changes and edit files alongside your terminal. @@ -20,7 +20,7 @@ Warp is the desktop terminal for running commands, editing code, and working wit ## Warp Agent -The Warp Agent helps you investigate issues, edit code, run commands, and complete multi-step work. Use it in the Warp app or from the [Warp Agent CLI](/agents/cli/), which runs the same agent in any terminal. +The Warp Agent helps you investigate issues, edit code, run commands, and complete multi-step work. Use it in the Warp terminal or from the [Warp Agent CLI](/agents/cli/), which runs the same agent in any terminal. ## {VARS.WARP_AUTOMATION_PLATFORM} @@ -38,7 +38,7 @@ Warp Factories is available in Early Access. A factory turns incoming engineerin ## How the products work together -Use Warp and the Warp Agent for interactive development. Use the {VARS.WARP_AUTOMATION_PLATFORM} for background agents and shared cloud configuration. Use Warp Factories when your team needs a standing workflow to route, review, and improve work across repositories. +The Warp terminal and Warp Agent support interactive development in a local checkout. The {VARS.WARP_AUTOMATION_PLATFORM} runs background agents and provides shared cloud configuration. Warp Factories gives teams a standing workflow for routing, reviewing, and improving work across repositories. ## Related pages diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx index 810bc5325..9f81aafcc 100644 --- a/src/content/docs/platform/transitioning-from-oz.mdx +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -1,8 +1,8 @@ --- title: Transitioning from the {{WEB_APP}} description: >- - The {{WEB_APP}} will retire after Warp Factories reaches general availability. - Existing workflows, configuration, and tools remain available today. + Understand the upcoming {{WEB_APP}} retirement while current cloud-agent + workflows remain available. sidebar: label: "Transitioning from the {{WEB_APP}}" --- @@ -10,16 +10,16 @@ import { VARS } from '@data/vars'; The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing cloud agents, integrations, schedules, API keys, and the `oz` CLI remain available today, so you don't need to migrate immediately. -The {VARS.WARP_AUTOMATION_PLATFORM} remains the shared foundation for cloud agents. Warp Factories builds on that foundation for teams that need standing workflows with named agents, work intake, review stages, and measurement. +The {VARS.WARP_AUTOMATION_PLATFORM} remains the shared foundation for cloud agents. Warp Factories builds on that foundation for teams that need standing workflows that route work through specialized agents, add review stages, and show the progress of work. ## Choose the right entry point -* **Use the {VARS.WARP_AUTOMATION_PLATFORM}** - Configure standalone cloud agents, environments, schedules, integrations, and orchestration. Start with the [{VARS.WARP_AUTOMATION_PLATFORM} overview](/platform/overview/) or [Cloud agents overview](/platform/). -* **Warp Factories** - Use a repeatable workflow that routes work through named agents and tracks it in one place. Start with the [Warp Factories overview](/factories/) or the [factory quickstart](/factories/quickstart/). +* **{VARS.WARP_AUTOMATION_PLATFORM}** - Configure standalone cloud agents, environments, schedules, integrations, and orchestration. Start with the [{VARS.WARP_AUTOMATION_PLATFORM} overview](/platform/overview/) or [Cloud agents overview](/platform/). +* **Warp Factories** - Build a repeatable workflow that routes work through specialized agents and tracks it in one place. Start with the [Warp Factories overview](/factories/) or the [factory quickstart](/factories/quickstart/). ## What stays available -Existing workflows and configuration continue to work today: +These existing workflows and configuration continue to work today: * **Cloud agents** - Continue to run from existing events, schedules, integrations, APIs, and the CLI. * **Configuration** - Existing environments, integrations, schedules, API keys, and secrets remain available. @@ -27,7 +27,7 @@ Existing workflows and configuration continue to work today: ## What comes next -Migration actions, compatibility dates, and replacement destinations will be documented after product mapping is finalized. Until then, continue using the workflow that fits your work today. +Migration guidance will identify each replacement workflow and its compatibility dates as the transition progresses. Continue using the workflow that fits your work today. ## Related pages From 30689bab059ab6789e18a5b51c05b025d6669dc2 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Thu, 17 Sep 2026 11:24:42 -0600 Subject: [PATCH 26/63] docs: refine factories and platform navigation Co-Authored-By: Warp <agent@warp.dev> --- .../docs/factories/api-and-sdk/index.mdx | 2 +- .../troubleshooting/errors/index.mdx | 4 +-- .../api-and-sdk/troubleshooting/index.mdx | 14 ---------- .../docs/factories/developer-tools.mdx | 3 ++- src/content/docs/factories/factory-api.mdx | 16 +++++------ src/content/docs/index.mdx | 2 +- src/content/docs/platform/overview.mdx | 5 ++-- src/sidebar.ts | 27 +++++++++++-------- vercel.json | 10 +++++++ 9 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/content/docs/factories/api-and-sdk/index.mdx b/src/content/docs/factories/api-and-sdk/index.mdx index 6774e5817..a95aeaafc 100644 --- a/src/content/docs/factories/api-and-sdk/index.mdx +++ b/src/content/docs/factories/api-and-sdk/index.mdx @@ -10,7 +10,7 @@ description: >- import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; -Use the [factory API](/factories/factory-api/) to find a factory and send it new work. Use the {VARS.API_SDK_NAME} to start standalone cloud-agent runs, or to monitor, continue, and cancel any run after it starts. +Use the {VARS.API_SDK_NAME} to start standalone cloud-agent runs, or to monitor, continue, and cancel any run after it starts. To find a factory and send it new work, use the [Factory API](/factories/factory-api/). | API | Use it for | | --- | --- | diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx index 1ca4dac8b..ef969c79d 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx @@ -1,6 +1,6 @@ --- topic: factories -title: Errors Overview +title: API errors description: >- Reference for all error codes returned by the {{API_SDK_NAME}}. Each error includes an HTTP status, machine-readable code, and actionable resolution @@ -8,7 +8,7 @@ description: >- --- import { VARS } from '@data/vars'; -When the {VARS.API_SDK_NAME} encounters an error, it returns a structured JSON response following [RFC 7807 (Problem Details for HTTP APIs)](https://datatracker.ietf.org/doc/html/rfc7807). Every error response includes a machine-readable error code, a human-readable message, and metadata to help you diagnose and resolve the issue. +When the {VARS.API_SDK_NAME} encounters an error, it returns a structured JSON response following [RFC 7807 (Problem Details for HTTP APIs)](https://datatracker.ietf.org/doc/html/rfc7807). Every error response includes a machine-readable error code, HTTP status, human-readable message, and resolution details. --- diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx index 29101c02a..e69de29bb 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx @@ -1,14 +0,0 @@ ---- -topic: factories -title: API Troubleshooting -description: >- - Troubleshooting resources for the {{API_SDK_NAME}}, including a full reference - for all platform error codes. ---- -import { VARS } from '@data/vars'; - -When the {VARS.API_SDK_NAME} encounters an error, it returns a structured response following [RFC 7807 (Problem Details for HTTP APIs)](https://datatracker.ietf.org/doc/html/rfc7807) with a machine-readable error code, HTTP status, and actionable resolution steps. - -## Resources - -* [**Errors**](/factories/api-and-sdk/troubleshooting/errors/) — Full reference for all API error codes, including causes, example responses, and resolution steps diff --git a/src/content/docs/factories/developer-tools.mdx b/src/content/docs/factories/developer-tools.mdx index 22c014a37..8e92a677f 100644 --- a/src/content/docs/factories/developer-tools.mdx +++ b/src/content/docs/factories/developer-tools.mdx @@ -19,9 +19,10 @@ Warp Factories provides programmatic interfaces for sending work to a factory, i * **[Webhooks](/factories/webhooks/)** - Receive events from systems that can send JSON and route matching deliveries into factory automations. ## Use the API and SDK + Use the API and SDK for typed requests, retries, and error handling. Start with the [API and SDK quickstart](/factories/api-and-sdk/quickstart/) to create and inspect a run, or use the [Sentry monitoring example](/factories/api-and-sdk/demo-sentry-monitoring-with-sdk/) to connect an external event source. -For request errors, see [API troubleshooting](/factories/api-and-sdk/troubleshooting/) and the [API error reference](/factories/api-and-sdk/troubleshooting/errors/). +For request errors, see [API errors](/factories/api-and-sdk/troubleshooting/errors/). ## Related pages diff --git a/src/content/docs/factories/factory-api.mdx b/src/content/docs/factories/factory-api.mdx index 40a03c247..6f0837e50 100644 --- a/src/content/docs/factories/factory-api.mdx +++ b/src/content/docs/factories/factory-api.mdx @@ -1,14 +1,14 @@ --- -title: Use the factory API +title: Use the Factory API description: >- - Discover factories and dispatch tasks by UID with the public factory API, + Discover factories and dispatch tasks by UID with the public Factory API, without learning the foreman agent's internals. sidebar: label: "Factory API" --- import { VARS } from '@data/vars'; -Use the factory API to find a factory and start work from a custom integration without managing agent details. Build it into a chat bot, script, or service for any tool Warp doesn't connect to directly. +Use the Factory API to find a factory and start work from a custom integration without managing agent details. Build it into a chat bot, script, or service for any tool Warp doesn't connect to directly. :::note Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. @@ -22,14 +22,14 @@ Warp Factories is in **Early Access** and available to a limited set of teams. [ A dispatched run is an ordinary [cloud agent run](/platform/): retrieve it, send it follow-ups, or cancel it through the same [Agent API](/factories/api-and-sdk/) you'd use for any run. -## When to use the factory API vs the Agent API +## When to use the Factory API vs the Agent API -Use the factory API to find or start work on a factory. Use the Agent API for everything else - a standalone cloud agent, run management, or orchestration. +Use the Factory API to find or start work on a factory. Use the Agent API for everything else - a standalone cloud agent, run management, or orchestration. | Task | Recommended API | | --- | --- | -| Find a factory by name before dispatching to it | factory API - `GET /factory?search=` | -| Start a new task on a factory | factory API - `POST /factory/{uid}/runs` | +| Find a factory by name before dispatching to it | Factory API - `GET /factory?search=` | +| Start a new task on a factory | Factory API - `POST /factory/{uid}/runs` | | Continue, monitor, or cancel a run (factory or standalone) | Agent API - `GET /agent/runs/{runId}`, `POST /agent/runs/{runId}/followups`, `POST /agent/runs/{runId}/cancel` | | Run a standalone cloud agent with no factory involved | Agent API - `POST /agent/run` | | Build a multi-agent orchestration | Agent API - see [multi-agent orchestration](/platform/orchestration/) | @@ -123,7 +123,7 @@ See [key endpoints](/factories/api-and-sdk/#key-endpoints) for the full set of r ## Related pages -* [Connect your factory](/factories/connect-your-factory/) - Every way work can enter a factory, including the factory API alongside Slack, GitHub, and Factory MCP. +* [Connect your factory](/factories/connect-your-factory/) - Every way work can enter a factory, including the Factory API alongside Slack, GitHub, and Factory MCP. * [Build a Mattermost bot for Warp Factories](/guides/external-tools/build-a-mattermost-bot-for-warp-factories/) - A worked example that discovers a factory and dispatches and continues a task from a custom chat integration. * [Factory MCP](/factories/factory-mcp/) - Connect a local coding agent to a factory instead of calling the REST API directly. * [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - Full endpoint reference, SDKs, and error codes for the underlying Agent API. diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index ab6acde6b..839a54952 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -38,7 +38,7 @@ Warp Factories is available in Early Access. A factory turns incoming engineerin ## How the products work together -The Warp terminal and Warp Agent support interactive development in a local checkout. The {VARS.WARP_AUTOMATION_PLATFORM} runs background agents and provides shared cloud configuration. Warp Factories gives teams a standing workflow for routing, reviewing, and improving work across repositories. +Start and steer interactive work in the Warp terminal with the Warp Agent. For work that starts from a schedule, integration, or API, the {VARS.WARP_AUTOMATION_PLATFORM} runs agents in the cloud. Warp Factories builds on the {VARS.WARP_AUTOMATION_PLATFORM} to turn incoming team work into a repeatable workflow with specialized agents and review stages. ## Related pages diff --git a/src/content/docs/platform/overview.mdx b/src/content/docs/platform/overview.mdx index 06257e7d2..0230b4434 100644 --- a/src/content/docs/platform/overview.mdx +++ b/src/content/docs/platform/overview.mdx @@ -9,13 +9,12 @@ sidebar: import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; -[Cloud agents](/platform/) run on the {VARS.WARP_AUTOMATION_PLATFORM}. You define the work (a prompt or a skill) and what starts it, and the platform runs the agent and records what it did. For example, an agent can triage each new issue as it's filed, or start fixing a build the moment CI fails. +[Cloud agents](/platform/) run on the {VARS.WARP_AUTOMATION_PLATFORM}. You define a task and its trigger. The {VARS.WARP_AUTOMATION_PLATFORM} runs the agent and records the results. For example, an agent can triage each new issue as it's filed, or start fixing a build the moment CI fails. If you're new to cloud agents, the [Cloud agents quickstart](/platform/quickstart/) gets you to your first run in about ten minutes. :::note -**The {VARS.WARP_AUTOMATION_PLATFORM} is the current name.** Your existing integrations, API keys, scheduled agents, and scripts keep working exactly as before — nothing to migrate. -The `oz` CLI and the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> retain their legacy names during the transition. See [Transitioning](/platform/transitioning-from-oz/) for the current guidance. +The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing cloud-agent workflows remain available today, so you don't need to migrate immediately. The `oz` CLI retains its legacy name during the transition. See [Transitioning from Oz](/platform/transitioning-from-oz/) for the current guidance. ::: <VideoEmbed url="https://youtu.be/poLkJhO7fdo" title={`${VARS.WARP_AUTOMATION_PLATFORM} cloud agents overview video`} /> diff --git a/src/sidebar.ts b/src/sidebar.ts index 284b1d940..540dedc1d 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -30,7 +30,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // The root product overview remains in the Terminal topic until // the GA navigation change adds a separate Terminal landing page. { label: 'Warp products', link: '/' }, - { slug: 'quickstart', label: 'Warp quickstart' }, + { slug: 'quickstart', label: 'Quickstart' }, 'getting-started/quickstart/installation-and-setup', 'getting-started/quickstart/coding-in-warp', 'getting-started/quickstart/customizing-warp', @@ -464,7 +464,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'factories/api-and-sdk', label: VARS.API_SDK_NAME }, { label: 'API reference', link: '/api' }, { slug: 'factories/api-and-sdk/demo-sentry-monitoring-with-sdk', label: 'Sentry monitoring with the SDK' }, - { slug: 'factories/api-and-sdk/troubleshooting', label: 'API troubleshooting' }, { slug: 'factories/api-and-sdk/troubleshooting/errors', label: 'API errors' }, { slug: 'factories/factory-mcp', label: 'Factory MCP' }, { @@ -484,14 +483,20 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'factories/deployment-patterns', label: 'Deployment patterns' }, { slug: 'factories/warp-hosting', label: 'Warp-hosted execution' }, { slug: 'factories/runners', label: 'Runners' }, - { slug: 'factories/self-hosting', label: 'Managed self-hosting' }, - { slug: 'factories/self-hosting/quickstart', label: 'Self-hosting quickstart' }, - { slug: 'factories/self-hosting/managed-docker', label: 'Docker backend' }, - { slug: 'factories/self-hosting/managed-kubernetes', label: 'Kubernetes backend' }, - { slug: 'factories/self-hosting/managed-direct', label: 'Direct backend' }, - 'factories/self-hosting/monitoring', - { slug: 'factories/self-hosting/reference', label: 'Worker reference' }, - 'factories/self-hosting/troubleshooting', + { + label: 'Managed self-hosting', + collapsed: false, + items: [ + { slug: 'factories/self-hosting', label: 'Overview' }, + { slug: 'factories/self-hosting/quickstart', label: 'Quickstart' }, + { slug: 'factories/self-hosting/managed-docker', label: 'Docker backend' }, + { slug: 'factories/self-hosting/managed-kubernetes', label: 'Kubernetes backend' }, + { slug: 'factories/self-hosting/managed-direct', label: 'Direct backend' }, + 'factories/self-hosting/monitoring', + { slug: 'factories/self-hosting/reference', label: 'Worker reference' }, + 'factories/self-hosting/troubleshooting', + ], + }, ], }, { @@ -548,7 +553,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ items: [ { slug: 'platform', label: 'Overview' }, { slug: 'platform/quickstart', label: 'Quickstart' }, - { slug: 'platform/transitioning-from-oz', label: 'Transitioning' }, + { slug: 'platform/transitioning-from-oz', label: 'Transitioning from Oz' }, { // Runtime (which agent executes the run) is kept separate from // configuration (how any run is set up) -- HYC review, 8/14. diff --git a/vercel.json b/vercel.json index 75bfc36ba..995cb5a8e 100644 --- a/vercel.json +++ b/vercel.json @@ -6627,6 +6627,16 @@ "destination": "/factories/api-and-sdk/", "statusCode": 308 }, + { + "source": "/reference/api-and-sdk/troubleshooting(/?)", + "destination": "/factories/api-and-sdk/troubleshooting/errors/", + "statusCode": 308 + }, + { + "source": "/factories/api-and-sdk/troubleshooting(/?)", + "destination": "/factories/api-and-sdk/troubleshooting/errors/", + "statusCode": 308 + }, { "source": "/reference/api-and-sdk/:path*", "destination": "/factories/api-and-sdk/:path*", From 6f844bc9e6a9a1fe19be42167260db0390065bff Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Thu, 17 Sep 2026 12:35:58 -0600 Subject: [PATCH 27/63] docs: remove empty API troubleshooting page Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/index.mdx deleted file mode 100644 index e69de29bb..000000000 From a4a17e3cecc9dd1e919f142f75522f137e6015dc Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Thu, 17 Sep 2026 13:17:16 -0600 Subject: [PATCH 28/63] fix: parse review findings with brace syntax Co-Authored-By: Warp <agent@warp.dev> --- .../test_verify_review_signal.py | 11 +++++++ .../verify_review_signal.py | 32 +++++++++---------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/.agents/skills/doc_quality_policy/test_verify_review_signal.py b/.agents/skills/doc_quality_policy/test_verify_review_signal.py index 9d02c1063..b333bdb37 100644 --- a/.agents/skills/doc_quality_policy/test_verify_review_signal.py +++ b/.agents/skills/doc_quality_policy/test_verify_review_signal.py @@ -77,6 +77,17 @@ def test_escaped_action_output_signal_passes(self): with mock.patch.object(vrs.cpc, "_fetch_reviews", return_value=[GOOD_REVIEW]): problems = vrs.check_review_signal("o/r", "1", "sha1", output) self.assertEqual(problems, []) + def test_signal_with_braces_in_an_actionable_finding_passes(self): + output = ( + '[SIGNAL:pr-review] {"pr":"1","head_sha":"sha1",' + '"reviewer_login":"github-actions[bot]","verdict":"Approve with nits",' + '"critical":0,"important":0,"suggestions":1,"nits":0,' + '"actionable_findings":["`factory-api.mdx:20` — Check ' + '`POST /factory/{uid}/runs`."]}' + ) + with mock.patch.object(vrs.cpc, "_fetch_reviews", return_value=[{**GOOD_REVIEW, "body": output}]): + problems = vrs.check_review_signal("o/r", "1", "sha1", output) + self.assertEqual(problems, []) def test_distinct_signals_fail(self): different_signal = GOOD_OUTPUT.replace('"Approve"', '"Approve with nits"') diff --git a/.agents/skills/doc_quality_policy/verify_review_signal.py b/.agents/skills/doc_quality_policy/verify_review_signal.py index f38866f18..626664aec 100644 --- a/.agents/skills/doc_quality_policy/verify_review_signal.py +++ b/.agents/skills/doc_quality_policy/verify_review_signal.py @@ -5,7 +5,6 @@ import argparse import importlib.util import json -import re import sys from pathlib import Path from typing import Dict, List, Optional, Tuple @@ -16,7 +15,7 @@ sys.modules[_spec.name] = cpc _spec.loader.exec_module(cpc) -_SIGNAL_RE = re.compile(r"\[SIGNAL:pr-review\]\s*(\{.*?\})", re.DOTALL) +_SIGNAL_PREFIX = "[SIGNAL:pr-review]" _PASSING_VERDICTS = {"approve", "approve with nits", "approve_with_nits"} @@ -25,25 +24,24 @@ def _parse_signal( pr_number: Optional[str] = None, head_sha: Optional[str] = None, ) -> Tuple[Optional[Dict[str, object]], List[str]]: - matches = _SIGNAL_RE.findall(text) - if not matches: + occurrences = text.count(_SIGNAL_PREFIX) + if not occurrences: return None, ["expected exactly one [SIGNAL:pr-review] record, found 0"] unique_signals = {} - for match in matches: - try: - signal = json.loads(match) - except json.JSONDecodeError as original_error: + offset = 0 + while True: + marker = text.find(_SIGNAL_PREFIX, offset) + if marker == -1: + break + offset = marker + len(_SIGNAL_PREFIX) + candidate = text[offset:].lstrip() + signal = None + for payload in (candidate, candidate.replace('\\"', '"')): try: - # The GitHub Action can serialize its text output once more, - # leaving an otherwise valid object in the form - # {\"key\":\"value\"}. Decode that wrapper only after direct - # JSON parsing has failed. - signal = json.loads(match.replace('\\"', '"')) + signal, _ = json.JSONDecoder().raw_decode(payload) + break except json.JSONDecodeError: - # Agent output includes the skill's marker examples and prior - # review transcripts. Ignore malformed candidates and require - # a valid, current-head record below. continue if not isinstance(signal, dict): continue @@ -57,7 +55,7 @@ def _parse_signal( if len(signals) != 1: return None, [ "expected one valid [SIGNAL:pr-review] record for the current PR head, " - f"found {len(signals)} across {len(matches)} occurrences" + f"found {len(signals)} across {occurrences} occurrences" ] return signals[0], [] From 9745f3a7f94685fc1d63c9e5038ededc65adba39 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Thu, 17 Sep 2026 13:56:12 -0600 Subject: [PATCH 29/63] docs: organize sidebar entry points Co-Authored-By: Warp <agent@warp.dev> --- src/sidebar.ts | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/sidebar.ts b/src/sidebar.ts index 540dedc1d..56e870c25 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -245,10 +245,9 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ icon: 'puzzle', items: [ { - label: 'Agents', + label: 'Overview', items: [ { slug: 'agents', label: 'Overview' }, - 'agents/getting-started/faqs', ], }, { @@ -385,6 +384,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'agents/agent-memory', label: 'Agent Memory' }, ], }, + { slug: 'agents/getting-started/faqs', label: 'Agent FAQs' }, ], }, { @@ -403,10 +403,15 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // next door, since the underlying concepts are the same. items: [ { - label: 'Factories', + label: 'Overview', items: [ { slug: 'factories', label: 'Overview' }, { slug: 'factories/how-factories-work', label: 'How Factories work' }, + ], + }, + { + label: 'Get started', + items: [ { slug: 'factories/quickstart', label: 'Quickstart' }, ], }, @@ -762,13 +767,17 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ icon: 'setting', items: [ { - label: 'Getting started', + label: 'Overview', items: [ { slug: 'enterprise', label: 'Overview' }, - { slug: 'enterprise/getting-started/quickstart', label: 'Quick start' }, + ], + }, + { + label: 'Get started', + items: [ + { slug: 'enterprise/getting-started/quickstart', label: 'Quickstart' }, { slug: 'enterprise/getting-started/getting-started-enterprise', label: 'Getting started for admins' }, { slug: 'enterprise/getting-started/getting-started-developers', label: 'Getting started for developers' }, - { slug: 'enterprise/getting-started/faq', label: 'FAQ' }, ], }, { @@ -804,6 +813,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ 'enterprise/support-and-resources/billing', { slug: 'enterprise/support-and-resources/troubleshooting-login', label: 'Troubleshooting login' }, { slug: 'enterprise/support-and-resources/feedback-and-feature-requests', label: 'Feedback and feature requests' }, + { slug: 'enterprise/getting-started/faq', label: 'FAQ' }, ], }, ], @@ -814,7 +824,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ link: '/guides/', icon: 'rocket', items: [ - { slug: 'guides', label: 'Guides' }, + { slug: 'guides', label: 'Overview' }, { label: 'Getting started', items: [ From 3fa3e6a31082418818190300f0e71326798213af Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:02:13 -0600 Subject: [PATCH 30/63] docs: resolve terminology and redirect review Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/factories/api-and-sdk/index.mdx | 4 ++-- src/content/docs/factories/factory-api.mdx | 16 ++++++++-------- src/content/docs/platform/overview.mdx | 2 +- vercel.json | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/content/docs/factories/api-and-sdk/index.mdx b/src/content/docs/factories/api-and-sdk/index.mdx index a95aeaafc..b1f54b026 100644 --- a/src/content/docs/factories/api-and-sdk/index.mdx +++ b/src/content/docs/factories/api-and-sdk/index.mdx @@ -10,11 +10,11 @@ description: >- import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; -Use the {VARS.API_SDK_NAME} to start standalone cloud-agent runs, or to monitor, continue, and cancel any run after it starts. To find a factory and send it new work, use the [Factory API](/factories/factory-api/). +Use the {VARS.API_SDK_NAME} to start standalone cloud-agent runs, or to monitor, continue, and cancel any run after it starts. To find a factory and send it new work, use the [factory API](/factories/factory-api/). | API | Use it for | | --- | --- | -| **Factory API** | Find a factory and dispatch new work to its foreman. | +| **factory API** | Find a factory and dispatch new work to its foreman. | | **{VARS.API_SDK_NAME}** | Start standalone cloud-agent runs, and manage factory or standalone runs after they begin. | :::note diff --git a/src/content/docs/factories/factory-api.mdx b/src/content/docs/factories/factory-api.mdx index 6f0837e50..40a03c247 100644 --- a/src/content/docs/factories/factory-api.mdx +++ b/src/content/docs/factories/factory-api.mdx @@ -1,14 +1,14 @@ --- -title: Use the Factory API +title: Use the factory API description: >- - Discover factories and dispatch tasks by UID with the public Factory API, + Discover factories and dispatch tasks by UID with the public factory API, without learning the foreman agent's internals. sidebar: label: "Factory API" --- import { VARS } from '@data/vars'; -Use the Factory API to find a factory and start work from a custom integration without managing agent details. Build it into a chat bot, script, or service for any tool Warp doesn't connect to directly. +Use the factory API to find a factory and start work from a custom integration without managing agent details. Build it into a chat bot, script, or service for any tool Warp doesn't connect to directly. :::note Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. @@ -22,14 +22,14 @@ Warp Factories is in **Early Access** and available to a limited set of teams. [ A dispatched run is an ordinary [cloud agent run](/platform/): retrieve it, send it follow-ups, or cancel it through the same [Agent API](/factories/api-and-sdk/) you'd use for any run. -## When to use the Factory API vs the Agent API +## When to use the factory API vs the Agent API -Use the Factory API to find or start work on a factory. Use the Agent API for everything else - a standalone cloud agent, run management, or orchestration. +Use the factory API to find or start work on a factory. Use the Agent API for everything else - a standalone cloud agent, run management, or orchestration. | Task | Recommended API | | --- | --- | -| Find a factory by name before dispatching to it | Factory API - `GET /factory?search=` | -| Start a new task on a factory | Factory API - `POST /factory/{uid}/runs` | +| Find a factory by name before dispatching to it | factory API - `GET /factory?search=` | +| Start a new task on a factory | factory API - `POST /factory/{uid}/runs` | | Continue, monitor, or cancel a run (factory or standalone) | Agent API - `GET /agent/runs/{runId}`, `POST /agent/runs/{runId}/followups`, `POST /agent/runs/{runId}/cancel` | | Run a standalone cloud agent with no factory involved | Agent API - `POST /agent/run` | | Build a multi-agent orchestration | Agent API - see [multi-agent orchestration](/platform/orchestration/) | @@ -123,7 +123,7 @@ See [key endpoints](/factories/api-and-sdk/#key-endpoints) for the full set of r ## Related pages -* [Connect your factory](/factories/connect-your-factory/) - Every way work can enter a factory, including the Factory API alongside Slack, GitHub, and Factory MCP. +* [Connect your factory](/factories/connect-your-factory/) - Every way work can enter a factory, including the factory API alongside Slack, GitHub, and Factory MCP. * [Build a Mattermost bot for Warp Factories](/guides/external-tools/build-a-mattermost-bot-for-warp-factories/) - A worked example that discovers a factory and dispatches and continues a task from a custom chat integration. * [Factory MCP](/factories/factory-mcp/) - Connect a local coding agent to a factory instead of calling the REST API directly. * [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - Full endpoint reference, SDKs, and error codes for the underlying Agent API. diff --git a/src/content/docs/platform/overview.mdx b/src/content/docs/platform/overview.mdx index 0230b4434..4f037a210 100644 --- a/src/content/docs/platform/overview.mdx +++ b/src/content/docs/platform/overview.mdx @@ -14,7 +14,7 @@ import { VARS } from '@data/vars'; If you're new to cloud agents, the [Cloud agents quickstart](/platform/quickstart/) gets you to your first run in about ten minutes. :::note -The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing cloud-agent workflows remain available today, so you don't need to migrate immediately. The `oz` CLI retains its legacy name during the transition. See [Transitioning from Oz](/platform/transitioning-from-oz/) for the current guidance. +The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing cloud-agent workflows remain available today, so you don't need to migrate immediately. The `oz` CLI retains its legacy name during the transition. See [Transitioning from the {VARS.WEB_APP}](/platform/transitioning-from-oz/) for the current guidance. ::: <VideoEmbed url="https://youtu.be/poLkJhO7fdo" title={`${VARS.WARP_AUTOMATION_PLATFORM} cloud agents overview video`} /> diff --git a/vercel.json b/vercel.json index 995cb5a8e..605a7bf9e 100644 --- a/vercel.json +++ b/vercel.json @@ -1549,7 +1549,7 @@ }, { "source": "/agent-platform/platform/deployment-patterns(/?)", - "destination": "/platform/deployment-patterns/", + "destination": "/factories/deployment-patterns/", "statusCode": 308 }, { From 74ede32d0bb4f687ad3fa21fc5738b509017de68 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:28:40 -0600 Subject: [PATCH 31/63] docs: simplify sidebar overview sections Co-Authored-By: Warp <agent@warp.dev> --- src/sidebar.ts | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/src/sidebar.ts b/src/sidebar.ts index 56e870c25..71988047a 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -244,12 +244,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ link: '/agents/', icon: 'puzzle', items: [ - { - label: 'Overview', - items: [ - { slug: 'agents', label: 'Overview' }, - ], - }, + { slug: 'agents', label: 'Overview' }, { label: 'Warp Agents', items: [ @@ -402,19 +397,9 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // sidebar. Two of these deliberately mirror the Automation Platform tab // next door, since the underlying concepts are the same. items: [ - { - label: 'Overview', - items: [ - { slug: 'factories', label: 'Overview' }, - { slug: 'factories/how-factories-work', label: 'How Factories work' }, - ], - }, - { - label: 'Get started', - items: [ - { slug: 'factories/quickstart', label: 'Quickstart' }, - ], - }, + { slug: 'factories', label: 'Overview' }, + { slug: 'factories/how-factories-work', label: 'How Factories work' }, + { slug: 'factories/quickstart', label: 'Quickstart' }, { // Parallel to 'Agent configuration' in the Automation Platform tab. // Scoped to the factory itself: who runs the work, how it is defined, @@ -773,7 +758,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ ], }, { - label: 'Get started', + label: 'Getting started', items: [ { slug: 'enterprise/getting-started/quickstart', label: 'Quickstart' }, { slug: 'enterprise/getting-started/getting-started-enterprise', label: 'Getting started for admins' }, From 704ad97c14cb33ea58a6f2bb04a4f04e4b06d255 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:34:38 -0600 Subject: [PATCH 32/63] docs: address sidebar navigation nits Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/index.mdx | 2 +- src/sidebar.ts | 40 +++++++++++++++++++------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index 839a54952..877aeead4 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -12,7 +12,7 @@ Warp is an [open-source](https://github.com/warpdotdev/warp) **Agentic Developme ## Warp -With the [Warp desktop terminal](/), you can run commands, edit code, and work with agents in a local checkout. +With the Warp desktop terminal, you can run commands, edit code, and work with agents in a local checkout. * [Modern terminal editing](/terminal/editor/) - Edit commands, navigate blocks, manage tabs, and customize your terminal. * [Code](/code/overview/) - Review agent changes and edit files alongside your terminal. diff --git a/src/sidebar.ts b/src/sidebar.ts index 71988047a..146fc5893 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -345,23 +345,23 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'agents/cli/reference', label: 'CLI reference' }, ], }, - { - label: `${VARS.WARP_AGENT_CLI} (legacy)`, - collapsed: true, - items: [ - { slug: 'agents/cli/oz-cli', label: 'Overview' }, - { slug: 'agents/cli/oz-cli/quickstart', label: 'Quickstart' }, - { slug: 'agents/cli/oz-cli/api-keys', label: 'API keys' }, - { slug: 'agents/cli/oz-cli/agent-profiles', label: 'Agent profiles' }, - { slug: 'agents/cli/oz-cli/mcp-servers', label: 'MCP servers' }, - { slug: 'agents/cli/oz-cli/skills', label: 'Skills' }, - { slug: 'agents/cli/oz-cli/warp-drive', label: 'Warp Drive context' }, - { slug: 'agents/cli/oz-cli/integration-setup', label: 'Integration setup' }, - { slug: 'agents/cli/oz-cli/artifacts', label: 'Artifacts' }, - { slug: 'agents/cli/oz-cli/federate', label: 'Federated identity' }, - 'agents/cli/oz-cli/troubleshooting', - ], - }, + { + label: `${VARS.WARP_AGENT_CLI} (legacy)`, + collapsed: true, + items: [ + { slug: 'agents/cli/oz-cli', label: 'Overview' }, + { slug: 'agents/cli/oz-cli/quickstart', label: 'Quickstart' }, + { slug: 'agents/cli/oz-cli/api-keys', label: 'API keys' }, + { slug: 'agents/cli/oz-cli/agent-profiles', label: 'Agent profiles' }, + { slug: 'agents/cli/oz-cli/mcp-servers', label: 'MCP servers' }, + { slug: 'agents/cli/oz-cli/skills', label: 'Skills' }, + { slug: 'agents/cli/oz-cli/warp-drive', label: 'Warp Drive context' }, + { slug: 'agents/cli/oz-cli/integration-setup', label: 'Integration setup' }, + { slug: 'agents/cli/oz-cli/artifacts', label: 'Artifacts' }, + { slug: 'agents/cli/oz-cli/federate', label: 'Federated identity' }, + 'agents/cli/oz-cli/troubleshooting', + ], + }, { label: 'Third-Party CLI Agents', items: [ @@ -435,9 +435,9 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // Integrations subgroup, which would have rendered as // Integrations > Integrations > Slack. // - // 'Connect your factory' leads because it is the overview for this - // group. The direct developer interfaces live in the Developer tools - // group rather than alongside third-party service integrations. + // 'Connect your factory' leads because it is the overview for this + // group. The direct developer interfaces live in the Developer tools + // group rather than alongside third-party service integrations. label: 'Integrations', items: [ { slug: 'factories/connect-your-factory', label: 'Connect your factory' }, From f2b14410e8a57c05fbbbf82a3d8eebe857390830 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Fri, 18 Sep 2026 10:01:05 -0600 Subject: [PATCH 33/63] docs: clarify factory self-hosting guidance Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/factories/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index a88f79102..22d0f7a16 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -55,7 +55,7 @@ Warp Factories is designed for engineering teams with repeatable work that exten * **Code forges and work sources** - Connect [GitHub](/factories/integrations/github/), [GitLab](/factories/integrations/gitlab/), or [another code forge](/factories/code-forges/other-code-forges/) to the repository your factory works in. Route work from [Slack](/factories/integrations/slack/), [Linear](/factories/integrations/linear/), [Jira](/factories/integrations/jira/), [custom webhooks](/factories/webhooks/), direct runs, or schedules. The [Factory MCP](/factories/factory-mcp/) connects coding agents and other MCP clients. * **Model and harness choice** - Each agent can use a different model and [supported harness](/platform/harnesses/), including the Warp Agent, Claude Code, and Codex. * **Measurement and self-improvement** - The [factory dashboard](/factories/factory-dashboard/) shows work-item status, runs, automations, costs, and benchmarks. [Scorers](/factories/measure-and-improve/scorers/) classify completed runs, [Benchmarks](/factories/benchmarks/) compare fixed tasks across configurations, and [Self-improvement](/factories/measure-and-improve/self-improvement/) turns repeated failures into follow-up work the factory proposes for review. -* **Infrastructure control** - Run on Warp-hosted infrastructure, or self-host execution on an eligible Enterprise plan. Teams can also connect supported inference providers and scope secrets. See [infrastructure and security](/factories/infrastructure-and-security/) for the available controls. +* **Infrastructure control** - Choose Warp-hosted or managed self-hosted execution on an eligible Enterprise plan. The [infrastructure and security](/factories/infrastructure-and-security/) page compares execution models and links to the self-hosting setup path, as well as available inference and credential controls. ## How Warp Factories relates to other Warp products From aeb03b728b09e7542331471437af4608b21ed3d6 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Fri, 18 Sep 2026 12:23:32 -0600 Subject: [PATCH 34/63] docs: reconcile factories restructure with main Co-Authored-By: Warp <agent@warp.dev> --- .../test_agent_docs_review_workflow.py | 5 ++-- .../test_verify_review_signal.py | 1 + .github/workflows/agent-docs-review.yml | 2 +- .../docs/factories/deployment-patterns.mdx | 13 ++------- .../docs/factories/how-factories-work.mdx | 2 +- src/content/docs/factories/index.mdx | 2 +- .../factories/infrastructure-and-security.mdx | 4 +-- src/content/docs/platform/architecture.mdx | 28 +++++++++---------- .../docs/platform/execution-security.mdx | 2 +- src/sidebar.ts | 4 ++- vercel.json | 14 +++++----- 11 files changed, 37 insertions(+), 40 deletions(-) diff --git a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py index 230d5f826..cbb225c65 100644 --- a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py +++ b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py @@ -33,6 +33,7 @@ def test_all_review_findings_must_supply_actionable_details(self): self.assertIn("actionable_findings", self.workflow) self.assertIn("critical, important, suggestion, or nit", self.workflow) self.assertIn("file and line or quoted text", self.workflow) + def test_review_signal_is_passed_through_a_file(self): self.assertIn('oz "${args[@]}" > /tmp/agent-output.txt', self.workflow) self.assertIn("--agent-output /tmp/agent-output.txt", self.workflow) @@ -41,10 +42,10 @@ def test_review_signal_is_passed_through_a_file(self): "AGENT_OUTPUT: ${{ steps.oz-review.outputs.agent_output }}", self.workflow ) - def test_review_uses_a_pinned_signed_oz_package(self): + def test_review_uses_a_signed_oz_package(self): self.assertIn("0913165C78D5B7A41B42AC657FF7AB39D60F803F", self.workflow) self.assertIn("signed-by=/etc/apt/keyrings/warpdotdev.gpg", self.workflow) - self.assertIn("oz-stable=0.2026.09.09.08.26.stable.02", self.workflow) + self.assertIn("sudo apt-get install -y oz-stable", self.workflow) if __name__ == "__main__": diff --git a/.agents/skills/doc_quality_policy/test_verify_review_signal.py b/.agents/skills/doc_quality_policy/test_verify_review_signal.py index b333bdb37..be53282cc 100644 --- a/.agents/skills/doc_quality_policy/test_verify_review_signal.py +++ b/.agents/skills/doc_quality_policy/test_verify_review_signal.py @@ -77,6 +77,7 @@ def test_escaped_action_output_signal_passes(self): with mock.patch.object(vrs.cpc, "_fetch_reviews", return_value=[GOOD_REVIEW]): problems = vrs.check_review_signal("o/r", "1", "sha1", output) self.assertEqual(problems, []) + def test_signal_with_braces_in_an_actionable_finding_passes(self): output = ( '[SIGNAL:pr-review] {"pr":"1","head_sha":"sha1",' diff --git a/.github/workflows/agent-docs-review.yml b/.github/workflows/agent-docs-review.yml index 2c88e2a75..235912604 100644 --- a/.github/workflows/agent-docs-review.yml +++ b/.github/workflows/agent-docs-review.yml @@ -56,7 +56,7 @@ jobs: deb [arch=amd64 signed-by=/etc/apt/keyrings/warpdotdev.gpg] https://releases.warp.dev/linux/deb stable main EOF sudo apt-get update - sudo apt-get install -y oz-stable=0.2026.09.09.08.26.stable.02 + sudo apt-get install -y oz-stable PROMPT="$(cat <<'EOF' Run the review-docs-pr skill against warpdotdev/docs PR #${{ github.event.pull_request.number }} at head SHA ${{ github.event.pull_request.head.sha }}. This PR carries the warpy-factory agent diff --git a/src/content/docs/factories/deployment-patterns.mdx b/src/content/docs/factories/deployment-patterns.mdx index f993a5e3c..03a47882f 100644 --- a/src/content/docs/factories/deployment-patterns.mdx +++ b/src/content/docs/factories/deployment-patterns.mdx @@ -22,13 +22,6 @@ Choose an execution model for your factory based on where its code must run and Both factory options use the same [factory definition](/factories/factory-as-code/), [runners](/factories/runners/), and [factory dashboard](/factories/factory-dashboard/). The execution host changes the location of checkout, command execution, and the sandbox filesystem. ---- - -## Standalone CLI-only agents - -This is not a factory deployment model. Use it when you already have a system that schedules work and need to run standalone agents from CI, developer infrastructure, or an internal orchestrator. See [Unmanaged execution](/platform/unmanaged-execution/) for the Platform reference. - ---- ## Warp-hosted execution @@ -49,13 +42,13 @@ See the [cloud agent run lifecycle](/platform/architecture/#cloud-agent-run-life * You want the simplest path to reproducible, scalable cloud execution. * You want to run many tasks in parallel without building your own sandboxing and scaling layer. -* You want a consistent “production” setup with standardized environments and centralized configuration. +* You want a consistent "production" setup with standardized environments and centralized configuration. ### Common ways to trigger * **First-party integrations (Slack, Linear, etc.)** that create tasks automatically from external events. * **[Scheduled agents](/platform/triggers/scheduled-agents/)** for recurring work (cron-like automation). -* **Custom triggers** from your own systems using Warp’s API/SDK. +* **Custom triggers** from your own systems using Warp's API/SDK. * **On-demand cloud jobs** using CLI commands like `oz agent run-cloud`. ### Example recipe: daily dead-code cleanup @@ -96,7 +89,7 @@ Think of managed self-hosting as **customer-hosted execution with Warp-hosted or Self-hosting has two architectures that differ on **who orchestrates agent runs** (both keep code and execution on your infrastructure): * **[Managed](/factories/self-hosting/#managed-architecture)** — The {VARS.WARP_AUTOMATION_PLATFORM} orchestrates. You run the `oz-agent-worker` daemon; the {VARS.WARP_AUTOMATION_PLATFORM} routes runs to it from Slack, Linear, schedules, the API, or `oz agent run-cloud`. Tasks execute in Docker containers, Kubernetes Jobs, or directly on the host. -* **[Unmanaged](/platform/unmanaged-execution/)** — You orchestrate. Invoke `oz agent run` directly from your CI, Kubernetes, or dev environment for standalone-agent work. Route factory work to a managed worker. +* **[Unmanaged](/platform/unmanaged-execution/)** — You orchestrate. Invoke `oz agent run` directly from your CI, Kubernetes, or dev environment for standalone-agent work. To route factory work to a worker instead, use the managed architecture above. Why teams choose self-hosted execution: diff --git a/src/content/docs/factories/how-factories-work.mdx b/src/content/docs/factories/how-factories-work.mdx index d481c0181..9f85f34fb 100644 --- a/src/content/docs/factories/how-factories-work.mdx +++ b/src/content/docs/factories/how-factories-work.mdx @@ -26,7 +26,7 @@ The diagram's components, from intake to improvement: * **Foreman and stage agents** - The foreman holds one conversation per work item and dispatches the Triage, Spec, Implement, and Review agents as the work needs them. See [factory agents](/factories/factory-agents/) and the stages below. * **Human handoff** - The factory opens a pull request with evidence, updates the original work item, and you review and merge. * **Factory definition** - Version-controlled agents, automations, runners, scorers, skills, and webhooks define the factory, either Warp-managed or in a GitHub repository your team owns. See [definitions as code](/factories/factory-as-code/). -* **Execution** - Every stage runs as a cloud agent run on Warp-hosted or [self-hosted](/platform/self-hosting/) compute, with the workspace from the factory's repositories and each stage's configured model and [harness](/platform/harnesses/). +* **Execution** - Every stage runs as a cloud agent run on Warp-hosted or [managed self-hosted](/factories/self-hosting/) compute, with the workspace from the factory's repositories and each stage's configured model and [harness](/platform/harnesses/). * **Factory dashboard** - Metrics, work items by stage, and runs and costs. See the [factory dashboard](/factories/factory-dashboard/). * **Measure and improve** - [Scorers](/factories/measure-and-improve/) classify completed runs, benchmarks compare configurations, and self-improvement turns repeat failures into follow-up pull requests for your review. diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index 22d0f7a16..d43c17c88 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -11,9 +11,9 @@ import VideoEmbed from '@components/VideoEmbed.astro'; :::note Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. If your team already has access, sign in to the <a href={VARS.FACTORY_WEB_APP_URL}>{VARS.FACTORY_WEB_APP}</a>. +::: The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing workflows remain available today. See [Transitioning from the {VARS.WEB_APP}](/platform/transitioning-from-oz/) for the current transition guidance. -::: A software factory uses a coordinated fleet of agents to take in requests, manage them from triage through review, and turn a growing backlog into mergeable pull requests. Your team stays in the loop to approve specifications and merge each pull request. diff --git a/src/content/docs/factories/infrastructure-and-security.mdx b/src/content/docs/factories/infrastructure-and-security.mdx index bd058ab91..a75d50504 100644 --- a/src/content/docs/factories/infrastructure-and-security.mdx +++ b/src/content/docs/factories/infrastructure-and-security.mdx @@ -27,7 +27,7 @@ flowchart LR C --> D["Warp-managed storage"] ``` -Self-hosting moves only the execution plane: with a managed self-hosted worker, repository checkouts, command execution, and the sandbox filesystem stay on machines you control, but content that enters prompts, results, transcripts, attachments, artifacts, or telemetry still flows through Warp and the providers you configure. See [deployment patterns](/factories/deployment-patterns/) and [self-hosting security and networking](/platform/execution-security/) for the broader data model. +Self-hosting moves only the execution plane: with a managed self-hosted worker, repository checkouts, command execution, and the sandbox filesystem stay on machines you control, but content that enters prompts, results, transcripts, attachments, artifacts, or telemetry still flows through Warp and the providers you configure. See [deployment patterns](/factories/deployment-patterns/) and [execution security](/platform/execution-security/) for the broader data model. The diagram below maps those boundaries for self-hosted execution; factory runs follow the same data model. See the [data security and boundaries](/platform/architecture/#data-security-and-boundaries) reference for a description of each data class. @@ -35,7 +35,7 @@ The diagram below maps those boundaries for self-hosted execution; factory runs ## Runners -A runner defines the compute a factory's agents work on: the operating system and architecture, the sandbox image, and the instance shape (vCPUs and memory). It's the infrastructure choice you make for a factory. The workspace itself — repositories, setup commands, and secrets — comes from the factory's [definition](/factories/factory-as-code/), and Warp keeps it in step for you. See the [runner reference](/factories/runners/) for the available compute options. +A runner defines the compute a factory's agents work on: the operating system and architecture, the sandbox image, and the instance shape (vCPUs and memory). The workspace itself — repositories, setup commands, and secrets — comes from the factory's [definition](/factories/factory-as-code/). See the [runner reference](/factories/runners/) for the available compute options. Declare runners as `runners/*.yaml` files. Every agent inherits `agentDefaults.runner`, and an agent or automation can override it. A self-hosted runner must match the worker's operating system and architecture. Warp provisions hosted runners within your plan limits; your team provisions and operates self-hosted compute. diff --git a/src/content/docs/platform/architecture.mdx b/src/content/docs/platform/architecture.mdx index 579efcc4c..26e455d24 100644 --- a/src/content/docs/platform/architecture.mdx +++ b/src/content/docs/platform/architecture.mdx @@ -6,7 +6,7 @@ description: >- --- import { VARS } from '@data/vars'; -The {VARS.WARP_AUTOMATION_PLATFORM} connects the tools that start agent work with the environments where that work runs. Warp operates the control plane, which coordinates runs and routes inference. Cloud agent runs execute in a Warp-hosted sandbox or on customer infrastructure. [Self-hosted](/platform/self-hosting/) execution and [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) change where specific work happens. +The {VARS.WARP_AUTOMATION_PLATFORM} connects the tools that start agent work with the environments where that work runs. Warp operates the control plane, which coordinates runs and routes inference. Cloud agent runs execute in a Warp-hosted sandbox or on customer infrastructure. [Managed self-hosting](/factories/self-hosting/) and [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) change where specific work happens. ## Stack overview @@ -15,11 +15,11 @@ The platform has five layers: clients, the Warp-operated control plane that coor ![Warp stack overview diagram showing clients, the Warp control plane, the data plane, Warp-hosted and customer-hosted execution planes, and external systems](../../../assets/agent-platform/warp-stack-overview.png) * **Clients** - The surfaces that start and observe work, like the Warp app, the {VARS.WARP_AGENT_CLI}, the web app, the [factory dashboard](/factories/factory-dashboard/), and clients connected through the [Factory MCP](/factories/factory-mcp/). All clients talk to the same control plane APIs. -* **APIs** - The control plane's entry points: the [Agent API and SDKs](/reference/api-and-sdk/), a webhook receiver for [integration](/platform/integrations/) events, and the hosted Factory MCP endpoint. +* **APIs** - The control plane's entry points: the [Agent API and SDKs](/factories/api-and-sdk/), a webhook receiver for [integration](/platform/integrations/) events, and the hosted Factory MCP endpoint. * **Control plane** - Warp coordinates runs, manages shared configuration, routes model calls, and records run history. * **Data plane** - Run data (transcripts, artifacts, and attachments) lives in Warp-managed storage, independent of where runs execute. -* **Warp-hosted execution** - By default, each cloud agent run gets an isolated sandbox prepared from its environment. See [Warp-hosted execution](/platform/warp-hosting/). -* **Self-hosted execution** - On Enterprise, a managed worker runs tasks on your infrastructure. Unmanaged setups run the {VARS.WARP_AGENT_CLI} in your CI or orchestrator. See [Self-hosting](/platform/self-hosting/). +* **Warp-hosted execution** - By default, each cloud agent run gets an isolated sandbox prepared from its environment. See [Warp-hosted execution](/factories/warp-hosting/). +* **Self-hosted execution** - On Enterprise, a managed worker runs tasks on your infrastructure. Unmanaged setups run the {VARS.WARP_AGENT_CLI} in your CI or orchestrator. See [Managed self-hosting](/factories/self-hosting/) and [unmanaged execution](/platform/unmanaged-execution/). * **External systems** - The platform connects to identity providers, source control, integration providers, model providers, and a payment provider. ## Cloud agent run lifecycle @@ -28,9 +28,9 @@ Every cloud agent run follows the same lifecycle, no matter what started it or w ![Cloud agent run lifecycle diagram showing triggers, the Warp control plane, the execution sandbox with its agent loop, LLM providers, and output targets](../../../assets/agent-platform/cloud-agent-run-lifecycle.png) -1. **A trigger fires** - A [schedule](/platform/triggers/scheduled-agents/), an [integration](/platform/integrations/) event, an [API or SDK](/reference/api-and-sdk/) call, a CLI command, or a [Handoff](/platform/handoff/) from the Warp app starts the run. +1. **A trigger fires** - A [schedule](/platform/triggers/scheduled-agents/), an [integration](/platform/integrations/) event, an [API or SDK](/factories/api-and-sdk/) call, a CLI command, or a [Handoff](/platform/handoff/) from the Warp app starts the run. 2. **The task is created** - The control plane opens a run record that tracks the task's state, inputs, and provenance. -3. **Configuration is resolved** - The platform picks the run's [environment](/platform/environments/), [runner](/platform/runners/), execution host, and [model and harness](/platform/harnesses/). +3. **Configuration is resolved** - The platform picks the run's [environment](/platform/environments/), [runner](/factories/runners/), execution host, and [model and harness](/platform/harnesses/). 4. **The sandbox is provisioned** - The execution host clones the environment's repositories, runs setup commands, and injects only the [secrets](/platform/secrets/) the run is allowed to use. 5. **The agent loop runs** - The harness gathers context, calls the model, and runs tools until the task is done. Tools run in the sandbox. With the Warp Agent, model calls route through Warp to providers under [Zero Data Retention](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr); Claude Code and Codex call their provider directly. 6. **Outputs land at their targets** - The agent pushes branches, opens pull requests, and replies to the Slack thread, Linear issue, or Jira work item that started the task. @@ -54,10 +54,10 @@ Self-hosted execution keeps checkout, commands, and the workspace on your infras ![Self-hosted execution architecture diagram showing the managed worker on customer infrastructure connecting outbound to the Warp control plane, with numbered flow steps](../../../assets/agent-platform/self-hosted-execution-flow.png) -1. **The worker connects** - You run the managed worker (`oz-agent-worker`) on your infrastructure. It authenticates with an agent API key and holds an outbound-only connection, waiting for tasks routed to its [`--host`](/platform/self-hosting/#routing-runs-to-self-hosted-workers) ID. +1. **The worker connects** - You run the managed worker (`oz-agent-worker`) on your infrastructure. It authenticates with an agent API key and holds an outbound-only connection, waiting for tasks routed to its `--host` ID. 2. **Warp assigns the task** - When a trigger targets your worker, the control plane sends the task, its resolved configuration, and scoped runtime credentials over that connection. -3. **The agent runs on your backend** - The worker clones repositories, runs setup, injects allowed [secrets](/platform/secrets/), and executes in a Docker container, a Kubernetes Job, or directly on the host, depending on the [backend](/platform/self-hosting/#managed-architecture) you chose. Code, build artifacts, and workspaces stay on your machines. -4. **Run data returns to Warp** - Status, transcripts, artifacts, attachments, and telemetry flow back for the run record. Content the agent puts into prompts or results can include code context; see [security and networking](/platform/self-hosting/security-and-networking/). +3. **The agent runs on your backend** - The worker clones repositories, runs setup, injects allowed [secrets](/platform/secrets/), and executes in a Docker container, a Kubernetes Job, or directly on the host, depending on the [managed backend](/factories/self-hosting/#managed-architecture) you chose. Code, build artifacts, and workspaces stay on your machines. +4. **Run data returns to Warp** - Status, transcripts, artifacts, attachments, and telemetry flow back for the run record. Content the agent puts into prompts or results can include code context; see [execution security](/platform/execution-security/). 5. **Warp routes inference** - With the Warp Agent, model calls go from your worker through Warp to LLM providers under [Zero Data Retention](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr), or through your own provider account with [team-managed keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) or [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/). Claude Code and Codex call their provider directly from your infrastructure. 6. **Your team monitors the run** - Runs on self-hosted workers appear in the {VARS.DASHBOARD} and support [Agent Session Sharing](/agents/local-agents/session-sharing/), the same as Warp-hosted runs. @@ -91,7 +91,7 @@ Every run moves a few distinct classes of data, and each class has its own bound ![Warp-hosted data security and boundaries diagram showing repositories, clients, and integrations in customer infrastructure, the per-run sandbox and control plane on the Warp platform, model providers, and Warp-managed run-data storage](../../../assets/agent-platform/warp-hosted-data-boundaries.png) -* **Source code** - For Warp-hosted runs, repositories are cloned into an isolated per-run sandbox and destroyed with it; Warp does not persistently store repository clones or train on your code. For [self-hosted execution](/platform/self-hosting/), checkout and the workspace stay on your infrastructure. Either way, code context the agent puts into prompts, transcripts, or artifacts transits Warp and may persist as run data. +* **Source code** - For Warp-hosted runs, repositories are cloned into an isolated per-run sandbox and destroyed with it; Warp does not persistently store repository clones or train on your code. For [managed self-hosting](/factories/self-hosting/), checkout and the workspace stay on your infrastructure. Either way, code context the agent puts into prompts, transcripts, or artifacts transits Warp and may persist as run data. * **Prompts and context** - With the Warp Agent, model calls route through Warp to LLM providers under [Zero Data Retention](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr) agreements: providers don't retain or train on the traffic. [Team-managed keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) and [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) keep the same route but use your provider account. Claude Code and Codex call their provider directly from the execution environment, under your provider agreement rather than Warp's. * **Run data** - Transcripts, artifacts, and run attachments are stored in Warp-managed storage, encrypted at rest and access-controlled by your team's roles. * **Control-plane data** - Warp always retains what it needs to operate the platform: user and organization settings, agent and factory configuration, orchestration and lifecycle metadata, trigger and integration metadata, operational logs, and usage and billing. @@ -102,15 +102,15 @@ Every run moves a few distinct classes of data, and each class has its own bound ### With self-hosted execution -[Self-hosted execution](/platform/self-hosting/) moves the execution boundary: checkout, builds, and command execution stay on your infrastructure, and no Warp-hosted sandbox is involved. The control plane still coordinates runs, holds control-plane data, routes inference for the Warp Agent, and stores run data. +[Managed self-hosting](/factories/self-hosting/) moves the execution boundary: checkout, builds, and command execution stay on your infrastructure, and no Warp-hosted sandbox is involved. The control plane still coordinates runs, holds control-plane data, routes inference for the Warp Agent, and stores run data. ![Self-hosted data security and boundaries diagram showing what stays in customer infrastructure, what Warp retains, Warp-managed run-data storage, and what transits Warp to model providers](../../../assets/agent-platform/data-security-boundaries.png) ## Related pages -* [Deployment patterns](/platform/deployment-patterns/) - Choose between CLI-only, Warp-hosted, and self-hosted deployments. -* [Self-hosting overview](/platform/self-hosting/) - Managed vs unmanaged architectures and setup guides. -* [Self-hosting security and networking](/platform/self-hosting/security-and-networking/) - The data model and egress requirements for self-hosted workers. +* [Deployment patterns](/factories/deployment-patterns/) - Choose between CLI-only, Warp-hosted, and self-hosted deployments. +* [Managed self-hosting](/factories/self-hosting/) - Configure a managed worker for factory execution. +* [Execution security](/platform/execution-security/) - The data model and egress requirements for self-hosted workers. * [Security overview](/enterprise/security-and-compliance/security-overview/) - Warp's data handling, encryption, and compliance posture. * [How Warp Factories work](/factories/how-factories-work/) - The work-item lifecycle in depth. * [Warp Factories infrastructure and security](/factories/infrastructure-and-security/) - The same boundaries applied to factories. diff --git a/src/content/docs/platform/execution-security.mdx b/src/content/docs/platform/execution-security.mdx index ae07b84dd..a66f43a03 100644 --- a/src/content/docs/platform/execution-security.mdx +++ b/src/content/docs/platform/execution-security.mdx @@ -38,7 +38,7 @@ Repositories are cloned and stored only on your infrastructure, but code content Self-hosted agents **do not require any network ingress**. They require outbound (egress) access to the following services: -![Self-hosted worker network egress diagram showing outbound-only connections from customer infrastructure to Warp backend endpoints, Docker Hub, Google Cloud Storage, and GitHub](../../../../assets/agent-platform/self-hosted-network-egress.png) +![Self-hosted worker network egress diagram showing outbound-only connections from customer infrastructure to Warp backend endpoints, Docker Hub, Google Cloud Storage, and GitHub](../../../assets/agent-platform/self-hosted-network-egress.png) **Warp's backend (all architectures):** diff --git a/src/sidebar.ts b/src/sidebar.ts index 146fc5893..b5edb1f78 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -452,6 +452,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'factories/developer-tools', label: 'Overview' }, { slug: 'factories/factory-api', label: 'Factory API' }, { slug: 'factories/api-and-sdk', label: VARS.API_SDK_NAME }, + { slug: 'factories/api-and-sdk/quickstart', label: 'Quickstart' }, { label: 'API reference', link: '/api' }, { slug: 'factories/api-and-sdk/demo-sentry-monitoring-with-sdk', label: 'Sentry monitoring with the SDK' }, { slug: 'factories/api-and-sdk/troubleshooting/errors', label: 'API errors' }, @@ -538,12 +539,13 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ icon: 'cloud-download', items: [ { slug: 'platform/overview', label: 'Overview' }, + { slug: 'platform/architecture', label: 'Architecture' }, { label: 'Cloud Agents', items: [ { slug: 'platform', label: 'Overview' }, { slug: 'platform/quickstart', label: 'Quickstart' }, - { slug: 'platform/transitioning-from-oz', label: 'Transitioning from Oz' }, + { slug: 'platform/transitioning-from-oz', label: `Transitioning from the ${VARS.WEB_APP}` }, { // Runtime (which agent executes the run) is kept separate from // configuration (how any run is set up) -- HYC review, 8/14. diff --git a/vercel.json b/vercel.json index 605a7bf9e..74ef548d5 100644 --- a/vercel.json +++ b/vercel.json @@ -1094,32 +1094,32 @@ }, { "source": "/agent-platform/cloud-agents/managed-worker-reference(/?)", - "destination": "/platform/self-hosting/reference/", + "destination": "/factories/self-hosting/reference/", "statusCode": 308 }, { "source": "/agent-platform/cloud-agents/managed-worker-reference/direct-backend(/?)", - "destination": "/platform/self-hosting/managed-direct/", + "destination": "/factories/self-hosting/managed-direct/", "statusCode": 308 }, { "source": "/agent-platform/cloud-agents/managed-worker-reference/docker-connectivity(/?)", - "destination": "/platform/self-hosting/managed-docker/", + "destination": "/factories/self-hosting/managed-docker/", "statusCode": 308 }, { "source": "/agent-platform/cloud-agents/managed-worker-reference/helm-chart(/?)", - "destination": "/platform/self-hosting/managed-kubernetes/", + "destination": "/factories/self-hosting/managed-kubernetes/", "statusCode": 308 }, { "source": "/agent-platform/cloud-agents/managed-worker-reference/kubernetes-backend(/?)", - "destination": "/platform/self-hosting/managed-kubernetes/", + "destination": "/factories/self-hosting/managed-kubernetes/", "statusCode": 308 }, { "source": "/agent-platform/cloud-agents/managed-worker-reference/private-docker-registries(/?)", - "destination": "/platform/self-hosting/managed-docker/", + "destination": "/factories/self-hosting/managed-docker/", "statusCode": 308 }, { @@ -6619,7 +6619,7 @@ }, { "source": "/reference(/?)", - "destination": "/factories/developer-tools/", + "destination": "/agents/cli/oz-cli/", "statusCode": 308 }, { From 81b41a25127a693eec970b8b236cd380db453401 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Fri, 18 Sep 2026 13:26:37 -0600 Subject: [PATCH 35/63] docs: clarify legacy Oz workflow transition Co-Authored-By: Warp <agent@warp.dev> --- .../docs/agents/cli/oz-cli/agent-profiles.mdx | 2 +- .../docs/agents/cli/oz-cli/api-keys.mdx | 2 +- .../docs/agents/cli/oz-cli/artifacts.mdx | 2 +- .../docs/agents/cli/oz-cli/federate.mdx | 2 +- src/content/docs/agents/cli/oz-cli/index.mdx | 2 +- .../agents/cli/oz-cli/integration-setup.mdx | 2 +- .../docs/agents/cli/oz-cli/mcp-servers.mdx | 2 +- .../docs/agents/cli/oz-cli/quickstart.mdx | 2 +- src/content/docs/agents/cli/oz-cli/skills.mdx | 2 +- .../agents/cli/oz-cli/troubleshooting.mdx | 2 +- .../docs/agents/cli/oz-cli/warp-drive.mdx | 2 +- src/content/docs/factories/index.mdx | 2 -- src/content/docs/platform/overview.mdx | 4 --- .../docs/platform/transitioning-from-oz.mdx | 30 +++++++++---------- src/sidebar.ts | 3 +- 15 files changed, 28 insertions(+), 33 deletions(-) diff --git a/src/content/docs/agents/cli/oz-cli/agent-profiles.mdx b/src/content/docs/agents/cli/oz-cli/agent-profiles.mdx index b79d1c77e..b22350238 100644 --- a/src/content/docs/agents/cli/oz-cli/agent-profiles.mdx +++ b/src/content/docs/agents/cli/oz-cli/agent-profiles.mdx @@ -9,7 +9,7 @@ sidebar: import { VARS } from '@data/vars'; :::caution -The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). `oz` commands remain supported through the end of September 2026. See the [Warp Agent CLI docs](/agents/cli/) for what is available today. +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is a supported legacy interface. Existing users do not need to change their workflows. For new multi-stage development workflows, use [Warp Factories](/factories/). Warp will publish guidance before any support change. ::: Agent profiles control what the agent can do, how it behaves, and where it can act when running from the {VARS.WARP_AGENT_CLI}. Create profiles in the Warp app to configure file access, command execution, MCP server usage, model selection, and directory permissions, then reference them by ID in CLI commands. diff --git a/src/content/docs/agents/cli/oz-cli/api-keys.mdx b/src/content/docs/agents/cli/oz-cli/api-keys.mdx index 240b02a53..bda48d596 100644 --- a/src/content/docs/agents/cli/oz-cli/api-keys.mdx +++ b/src/content/docs/agents/cli/oz-cli/api-keys.mdx @@ -8,7 +8,7 @@ sidebar: import { VARS } from '@data/vars'; :::caution -The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). `oz` commands remain supported through the end of September 2026. See the [Warp Agent CLI docs](/agents/cli/) for what is available today. +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is a supported legacy interface. Existing users do not need to change their workflows. For new multi-stage development workflows, use [Warp Factories](/factories/). Warp will publish guidance before any support change. ::: API keys let the {VARS.WARP_AGENT_CLI} and cloud agents authenticate without human interaction. Use API keys for CI pipelines, headless servers, VMs, Codespaces, containers, and other automated environments. diff --git a/src/content/docs/agents/cli/oz-cli/artifacts.mdx b/src/content/docs/agents/cli/oz-cli/artifacts.mdx index 7d36ce629..7a948c1d7 100644 --- a/src/content/docs/agents/cli/oz-cli/artifacts.mdx +++ b/src/content/docs/agents/cli/oz-cli/artifacts.mdx @@ -9,7 +9,7 @@ sidebar: import { VARS } from '@data/vars'; :::caution -The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). `oz` commands remain supported through the end of September 2026. See the [Warp Agent CLI docs](/agents/cli/) for what is available today. +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is a supported legacy interface. Existing users do not need to change their workflows. For new multi-stage development workflows, use [Warp Factories](/factories/). Warp will publish guidance before any support change. ::: Artifacts are files that an agent produces during a run and uploads to Warp — screenshots, generated reports, build outputs, logs, or any other file the agent saves alongside its conversation. Use `oz artifact` to inspect those files from outside the run and pull them down to your machine. diff --git a/src/content/docs/agents/cli/oz-cli/federate.mdx b/src/content/docs/agents/cli/oz-cli/federate.mdx index a2bda5c55..38283ee29 100644 --- a/src/content/docs/agents/cli/oz-cli/federate.mdx +++ b/src/content/docs/agents/cli/oz-cli/federate.mdx @@ -9,7 +9,7 @@ sidebar: import { VARS } from '@data/vars'; :::caution -The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). `oz` commands remain supported through the end of September 2026. See the [Warp Agent CLI docs](/agents/cli/) for what is available today. +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is a supported legacy interface. Existing users do not need to change their workflows. For new multi-stage development workflows, use [Warp Factories](/factories/). Warp will publish guidance before any support change. ::: `oz federate` issues short-lived OIDC identity tokens for the agent that's currently running. Use these tokens to authenticate to cloud providers (AWS, GCP, Azure, and other OIDC-aware systems) without baking long-lived credentials into your environment. diff --git a/src/content/docs/agents/cli/oz-cli/index.mdx b/src/content/docs/agents/cli/oz-cli/index.mdx index f58f2c61b..bb40faeb7 100644 --- a/src/content/docs/agents/cli/oz-cli/index.mdx +++ b/src/content/docs/agents/cli/oz-cli/index.mdx @@ -9,7 +9,7 @@ import { Tabs, TabItem } from '@astrojs/starlight/components'; import { VARS } from '@data/vars'; :::caution -The {VARS.WARP_AGENT_CLI} (the `oz` binary, which previously shipped as `warp-cli`) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). `oz` commands remain supported through the end of September 2026. The [Warp Agent CLI reference](/agents/cli/reference/) does not yet document `warp` equivalents for every workflow on this page. See the [Warp Agent CLI docs](/agents/cli/) for what is available today. +The {VARS.WARP_AGENT_CLI} (the `oz` binary, which previously shipped as `warp-cli`) is a supported legacy interface. Existing users do not need to change their workflows. For new multi-stage development workflows, use [Warp Factories](/factories/). Warp will publish guidance before any support change. ::: The {VARS.WARP_AGENT_CLI} is the command-line tool for running and managing Warp's cloud agents from any terminal, script, or CI pipeline. Use it to start agents locally or in the cloud, connect MCP servers, configure integrations, and authenticate without requiring the Warp desktop app. diff --git a/src/content/docs/agents/cli/oz-cli/integration-setup.mdx b/src/content/docs/agents/cli/oz-cli/integration-setup.mdx index 5cc68e8e6..5bb3b80cd 100644 --- a/src/content/docs/agents/cli/oz-cli/integration-setup.mdx +++ b/src/content/docs/agents/cli/oz-cli/integration-setup.mdx @@ -9,7 +9,7 @@ sidebar: import { VARS } from '@data/vars'; :::caution -The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). `oz` commands remain supported through the end of September 2026. See the [Warp Agent CLI docs](/agents/cli/) for what is available today. +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is a supported legacy interface. Existing users do not need to change their workflows. For new multi-stage development workflows, use [Warp Factories](/factories/). Warp will publish guidance before any support change. ::: This article describes the environment and integration setup that is required before you can trigger agents from external tools, like Slack or Linear. You will learn how to: diff --git a/src/content/docs/agents/cli/oz-cli/mcp-servers.mdx b/src/content/docs/agents/cli/oz-cli/mcp-servers.mdx index 6b109e612..2c2fb78f9 100644 --- a/src/content/docs/agents/cli/oz-cli/mcp-servers.mdx +++ b/src/content/docs/agents/cli/oz-cli/mcp-servers.mdx @@ -9,7 +9,7 @@ sidebar: import { VARS } from '@data/vars'; :::caution -The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). `oz` commands remain supported through the end of September 2026. See the [Warp Agent CLI docs](/agents/cli/) for what is available today. +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is a supported legacy interface. Existing users do not need to change their workflows. For new multi-stage development workflows, use [Warp Factories](/factories/). Warp will publish guidance before any support change. ::: MCP servers connect agents to external systems like GitHub, Linear, or Sentry. To use a [Model Context Protocol (MCP)](/agents/capabilities/mcp/) server from the CLI, use the `--mcp` flag with `oz agent run` or `oz agent run-cloud`. diff --git a/src/content/docs/agents/cli/oz-cli/quickstart.mdx b/src/content/docs/agents/cli/oz-cli/quickstart.mdx index 3198f28c1..a636edc7a 100644 --- a/src/content/docs/agents/cli/oz-cli/quickstart.mdx +++ b/src/content/docs/agents/cli/oz-cli/quickstart.mdx @@ -9,7 +9,7 @@ import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; :::caution -The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). `oz` commands remain supported through the end of September 2026. See the [Warp Agent CLI docs](/agents/cli/) for what is available today. +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is a supported legacy interface. Existing users do not need to change their workflows. For new multi-stage development workflows, use [Warp Factories](/factories/). Warp will publish guidance before any support change. ::: This guide walks you through the essentials to get up and running with the {VARS.WARP_AGENT_CLI} in less than 5 minutes: installing the CLI, authenticating, running your first local agent, and optionally connecting MCP servers to give the agent access to external tools. diff --git a/src/content/docs/agents/cli/oz-cli/skills.mdx b/src/content/docs/agents/cli/oz-cli/skills.mdx index e873bb474..460e4d7a6 100644 --- a/src/content/docs/agents/cli/oz-cli/skills.mdx +++ b/src/content/docs/agents/cli/oz-cli/skills.mdx @@ -9,7 +9,7 @@ description: >- import { VARS } from '@data/vars'; :::caution -The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). `oz` commands remain supported through the end of September 2026. See the [Warp Agent CLI docs](/agents/cli/) for what is available today. +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is a supported legacy interface. Existing users do not need to change their workflows. For new multi-stage development workflows, use [Warp Factories](/factories/). Warp will publish guidance before any support change. ::: [Skills](/agents/capabilities/skills/) are reusable instruction sets that teach agents how to perform specific tasks. Use the `--skill` flag to run an agent from a skill in a repository accessible to your environment. diff --git a/src/content/docs/agents/cli/oz-cli/troubleshooting.mdx b/src/content/docs/agents/cli/oz-cli/troubleshooting.mdx index 1d0cbac60..1c96360fd 100644 --- a/src/content/docs/agents/cli/oz-cli/troubleshooting.mdx +++ b/src/content/docs/agents/cli/oz-cli/troubleshooting.mdx @@ -7,7 +7,7 @@ description: >- import { VARS } from '@data/vars'; :::caution -The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). `oz` commands remain supported through the end of September 2026. See the [Warp Agent CLI docs](/agents/cli/) for what is available today. +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is a supported legacy interface. Existing users do not need to change their workflows. For new multi-stage development workflows, use [Warp Factories](/factories/). Warp will publish guidance before any support change. ::: Solutions for common {VARS.WARP_AGENT_CLI} errors, including authentication issues, agent failures, environment configuration, GitHub access problems, and Docker image compatibility. Use `oz help` for built-in documentation on any command. diff --git a/src/content/docs/agents/cli/oz-cli/warp-drive.mdx b/src/content/docs/agents/cli/oz-cli/warp-drive.mdx index 6d501db51..e15cb8439 100644 --- a/src/content/docs/agents/cli/oz-cli/warp-drive.mdx +++ b/src/content/docs/agents/cli/oz-cli/warp-drive.mdx @@ -9,7 +9,7 @@ sidebar: import { VARS } from '@data/vars'; :::caution -The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). `oz` commands remain supported through the end of September 2026. See the [Warp Agent CLI docs](/agents/cli/) for what is available today. +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is a supported legacy interface. Existing users do not need to change their workflows. For new multi-stage development workflows, use [Warp Factories](/factories/). Warp will publish guidance before any support change. ::: Reference saved Warp Drive objects in {VARS.WARP_AGENT_CLI} commands to reuse prompts, notebooks, workflows, and rules as agent context. Pass a saved prompt ID with `--saved-prompt` or inline Warp Drive references using `<workflow:id>`, `<notebook:id>`, or `<rule:id>` syntax. diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index d43c17c88..f9bc6ada1 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -13,8 +13,6 @@ import VideoEmbed from '@components/VideoEmbed.astro'; Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. If your team already has access, sign in to the <a href={VARS.FACTORY_WEB_APP_URL}>{VARS.FACTORY_WEB_APP}</a>. ::: -The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing workflows remain available today. See [Transitioning from the {VARS.WEB_APP}](/platform/transitioning-from-oz/) for the current transition guidance. - A software factory uses a coordinated fleet of agents to take in requests, manage them from triage through review, and turn a growing backlog into mergeable pull requests. Your team stays in the loop to approve specifications and merge each pull request. <VideoEmbed url="https://www.youtube.com/watch?v=0WBk4ai8y1A" title="Introducing Warp Factories" /> diff --git a/src/content/docs/platform/overview.mdx b/src/content/docs/platform/overview.mdx index 4f037a210..7243c720d 100644 --- a/src/content/docs/platform/overview.mdx +++ b/src/content/docs/platform/overview.mdx @@ -13,10 +13,6 @@ import { VARS } from '@data/vars'; If you're new to cloud agents, the [Cloud agents quickstart](/platform/quickstart/) gets you to your first run in about ten minutes. -:::note -The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing cloud-agent workflows remain available today, so you don't need to migrate immediately. The `oz` CLI retains its legacy name during the transition. See [Transitioning from the {VARS.WEB_APP}](/platform/transitioning-from-oz/) for the current guidance. -::: - <VideoEmbed url="https://youtu.be/poLkJhO7fdo" title={`${VARS.WARP_AUTOMATION_PLATFORM} cloud agents overview video`} /> ## How a run works diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx index 9f81aafcc..9712108e9 100644 --- a/src/content/docs/platform/transitioning-from-oz.mdx +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -1,36 +1,36 @@ --- title: Transitioning from the {{WEB_APP}} description: >- - Understand the upcoming {{WEB_APP}} retirement while current cloud-agent - workflows remain available. + Continue supported legacy cloud-agent workflows and decide whether Warp + Factories fits new multi-stage development work. sidebar: label: "Transitioning from the {{WEB_APP}}" --- import { VARS } from '@data/vars'; -The {VARS.WEB_APP} will retire after Warp Factories reaches general availability. Existing cloud agents, integrations, schedules, API keys, and the `oz` CLI remain available today, so you don't need to migrate immediately. +Existing Oz workflows remain supported. You don't need to change an existing workflow to use Warp Factories. -The {VARS.WARP_AUTOMATION_PLATFORM} remains the shared foundation for cloud agents. Warp Factories builds on that foundation for teams that need standing workflows that route work through specialized agents, add review stages, and show the progress of work. +For new multi-stage development workflows, use Warp Factories. A factory builds on the {VARS.WARP_AUTOMATION_PLATFORM} to route work through specialized agents, add review stages, and show the progress of work. -## Choose the right entry point +## Where to manage work -* **{VARS.WARP_AUTOMATION_PLATFORM}** - Configure standalone cloud agents, environments, schedules, integrations, and orchestration. Start with the [{VARS.WARP_AUTOMATION_PLATFORM} overview](/platform/overview/) or [Cloud agents overview](/platform/). -* **Warp Factories** - Build a repeatable workflow that routes work through specialized agents and tracks it in one place. Start with the [Warp Factories overview](/factories/) or the [factory quickstart](/factories/quickstart/). +* **Existing Oz workflows** - Continue using the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> for existing cloud agents, environments, schedules, integrations, and runs. +* **New Factory workflows** - Use the <a href={VARS.FACTORY_WEB_APP_URL}>Factory Dashboard</a> to build and operate multi-stage development workflows. Start with the [Warp Factories overview](/factories/) or the [factory quickstart](/factories/quickstart/). -## What stays available +## CLI, API, and SDK support -These existing workflows and configuration continue to work today: +Existing interfaces remain supported: -* **Cloud agents** - Continue to run from existing events, schedules, integrations, APIs, and the CLI. -* **Configuration** - Existing environments, integrations, schedules, API keys, and secrets remain available. -* **Current tools** - The {VARS.WARP_AGENT_CLI}, API and SDK, and managed self-hosting continue to support their current workflows. +* **{VARS.WARP_AGENT_CLI}** - Existing `oz` commands continue to work. +* **{VARS.API_SDK_NAME}** - Existing API endpoints and SDK packages continue to work. +* **Cloud-agent configuration** - Existing agents, environments, schedules, integrations, API keys, and secrets remain available. -## What comes next +## Moving an existing workflow into a factory -Migration guidance will identify each replacement workflow and its compatibility dates as the transition progresses. Continue using the workflow that fits your work today. +Moving an existing Oz workflow into a factory is optional. Each workflow has different integrations, configuration, and operating requirements, so work with an engineering DRI to evaluate the move. Warp will publish guidance before any support change. ## Related pages -* [{VARS.WARP_AUTOMATION_PLATFORM} overview](/platform/overview/) - Configure the reusable primitives behind cloud-agent workflows. +* [{VARS.WARP_AUTOMATION_PLATFORM} overview](/platform/overview/) - Configure standalone cloud-agent workflows. * [Warp Factories overview](/factories/) - Build and operate a standing software factory. * [Factory dashboard](/factories/factory-dashboard/) - Inspect work items, runs, and factory settings. diff --git a/src/sidebar.ts b/src/sidebar.ts index b5edb1f78..763beaf58 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -511,13 +511,14 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ }, ], }, - // Troubleshooting sits outside the groups, last in the tab. It was in + // Troubleshooting sits outside the groups near the end of the tab. It was in // 'Management & observability' next to the dashboard and Scorers pages, // which read as a sibling of the measurement surfaces rather than as // the place you go when something is broken. A bare trailing item is // the same shape the Automation Platform tab uses for its leading // 'Overview'. { slug: 'factories/troubleshooting', label: 'Troubleshooting' }, + { slug: 'platform/transitioning-from-oz', label: 'Legacy Oz workflows' }, ], }, { From 9f0253e040bbd55a278c89e96b32aa09c2560c65 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Fri, 18 Sep 2026 13:44:25 -0600 Subject: [PATCH 36/63] docs: align transition guide terminology Co-Authored-By: Warp <agent@warp.dev> --- src/content/docs/platform/transitioning-from-oz.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx index 9712108e9..9f0686126 100644 --- a/src/content/docs/platform/transitioning-from-oz.mdx +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -8,14 +8,14 @@ sidebar: --- import { VARS } from '@data/vars'; -Existing Oz workflows remain supported. You don't need to change an existing workflow to use Warp Factories. +Existing {VARS.WARP_AUTOMATION_PLATFORM} workflows remain supported. You don't need to change an existing workflow to use Warp Factories. For new multi-stage development workflows, use Warp Factories. A factory builds on the {VARS.WARP_AUTOMATION_PLATFORM} to route work through specialized agents, add review stages, and show the progress of work. ## Where to manage work -* **Existing Oz workflows** - Continue using the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> for existing cloud agents, environments, schedules, integrations, and runs. -* **New Factory workflows** - Use the <a href={VARS.FACTORY_WEB_APP_URL}>Factory Dashboard</a> to build and operate multi-stage development workflows. Start with the [Warp Factories overview](/factories/) or the [factory quickstart](/factories/quickstart/). +* **Existing {VARS.WARP_AUTOMATION_PLATFORM} workflows** - Continue using the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> for existing cloud agents, environments, schedules, integrations, and runs. +* **New factory workflows** - Use the <a href={VARS.FACTORY_WEB_APP_URL}>factory dashboard</a> to build and operate multi-stage development workflows. Start with the [Warp Factories overview](/factories/) or the [factory quickstart](/factories/quickstart/). ## CLI, API, and SDK support @@ -27,7 +27,7 @@ Existing interfaces remain supported: ## Moving an existing workflow into a factory -Moving an existing Oz workflow into a factory is optional. Each workflow has different integrations, configuration, and operating requirements, so work with an engineering DRI to evaluate the move. Warp will publish guidance before any support change. +Moving an existing {VARS.WARP_AUTOMATION_PLATFORM} workflow into a factory is optional. Each workflow has different integrations, configuration, and operating requirements, so work with an engineering DRI to evaluate the move. Warp will publish guidance before any support change. ## Related pages From 44c834287d98e1fcc62cbf63b8c057d5cd7fbb62 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Fri, 18 Sep 2026 16:12:39 -0600 Subject: [PATCH 37/63] docs: unify platform API guidance Co-Authored-By: Warp <agent@warp.dev> --- developers/agent-api-openapi.yaml | 4 +- .../docs/agents/agent-memory/index.mdx | 2 +- .../capabilities/computer-use/index.mdx | 4 +- .../docs/agents/cli/oz-cli/artifacts.mdx | 4 +- src/content/docs/agents/cli/oz-cli/index.mdx | 2 +- src/content/docs/changelog/2026.mdx | 2 +- .../demo-sentry-monitoring-with-sdk.mdx | 2 +- .../docs/factories/api-and-sdk/index.mdx | 67 ++++++----- .../docs/factories/api-and-sdk/quickstart.mdx | 14 +-- .../errors/authentication-required.mdx | 2 +- .../troubleshooting/errors/conflict.mdx | 2 +- .../troubleshooting/errors/index.mdx | 6 +- .../errors/invalid-request.mdx | 2 +- .../troubleshooting/errors/not-authorized.mdx | 2 +- .../errors/operation-not-supported.mdx | 2 +- .../docs/factories/connect-your-factory.mdx | 6 +- .../docs/factories/developer-tools.mdx | 28 ++--- src/content/docs/factories/factory-api.mdx | 30 ++--- .../docs/factories/factory-as-code.mdx | 2 +- .../docs/factories/how-factories-work.mdx | 4 +- src/content/docs/factories/index.mdx | 32 ++---- src/content/docs/factories/quickstart.mdx | 2 +- .../how-to-run-multiple-ai-coding-agents.mdx | 6 +- .../how-to-run-unattended-agents.mdx | 6 +- .../run-a-software-factory-in-the-cloud.mdx | 2 +- ...ld-a-mattermost-bot-for-warp-factories.mdx | 10 +- src/content/docs/platform/agents.mdx | 4 +- src/content/docs/platform/architecture.mdx | 2 +- src/content/docs/platform/index.mdx | 6 +- .../platform/integrations/cloud-providers.mdx | 2 +- .../docs/platform/orchestration/index.mdx | 12 +- .../orchestration/multi-agent-runs.mdx | 12 +- src/content/docs/platform/overview.mdx | 4 +- src/content/docs/platform/oz-web-app.mdx | 2 +- src/content/docs/platform/quickstart.mdx | 2 +- src/content/docs/platform/secrets.mdx | 2 +- .../docs/platform/skills-as-agents.mdx | 4 +- .../team-access-billing-and-identity.mdx | 2 +- .../docs/platform/transitioning-from-oz.mdx | 36 +++--- .../docs/platform/unmanaged-execution.mdx | 2 +- .../plans-and-billing/credits.mdx | 2 +- src/data/vars.ts | 26 ++--- src/pages/api.astro | 24 ++-- src/pages/openapi.yaml.ts | 2 +- src/sidebar.ts | 104 +++++++++--------- 45 files changed, 242 insertions(+), 253 deletions(-) diff --git a/developers/agent-api-openapi.yaml b/developers/agent-api-openapi.yaml index eef3209a8..7f7c59d71 100644 --- a/developers/agent-api-openapi.yaml +++ b/developers/agent-api-openapi.yaml @@ -1,8 +1,8 @@ openapi: 3.0.0 info: - title: Warp Agent API + title: Warp Platform API version: 1.0.0 - description: "API for creating, managing, and querying Warp cloud agent runs.\n\nThese endpoints allow users to programmatically spawn agents, list runs, \nand retrieve detailed run information.\n" + description: "API for creating, managing, and querying factory and cloud agent runs.\n\nThese endpoints allow users to send work to factories, start standalone agents, list runs, \nand retrieve detailed run information.\n" contact: name: Warp Support url: https://docs.warp.dev diff --git a/src/content/docs/agents/agent-memory/index.mdx b/src/content/docs/agents/agent-memory/index.mdx index 1f63001e3..f4c8b38cb 100644 --- a/src/content/docs/agents/agent-memory/index.mdx +++ b/src/content/docs/agents/agent-memory/index.mdx @@ -85,7 +85,7 @@ Attach stores to agents with read-only or read-write access. Each attachment inc These capabilities aren't part of the research preview yet, but they're on the way: -* **Programmatic API access** - Read and manage memories and stores through the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/), in addition to managing them in the {VARS.WEB_APP}. +* **Programmatic API access** - Read and manage memories and stores through the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/), in addition to managing them in the {VARS.WEB_APP}. * **Self-hosting support** - Run Agent Memory on a [self-hosted {VARS.WARP_AUTOMATION_PLATFORM}](/factories/self-hosting/) instance to meet security, privacy, and compliance requirements. ## Join the waitlist diff --git a/src/content/docs/agents/capabilities/computer-use/index.mdx b/src/content/docs/agents/capabilities/computer-use/index.mdx index 4f3a915be..8f4dc46d8 100644 --- a/src/content/docs/agents/capabilities/computer-use/index.mdx +++ b/src/content/docs/agents/capabilities/computer-use/index.mdx @@ -53,7 +53,7 @@ oz agent run-cloud --no-computer-use --prompt "<task>" ### API -When creating a cloud agent run with the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/), the optional `config.computer_use_enabled` field controls Computer Use. When omitted, it defaults to `true` for runs on Warp's built-in harness and `false` for runs on third-party harnesses. Set it to `false` to disable Computer Use for the run: +When creating a cloud agent run with the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/), the optional `config.computer_use_enabled` field controls Computer Use. When omitted, it defaults to `true` for runs on Warp's built-in harness and `false` for runs on third-party harnesses. Set it to `false` to disable Computer Use for the run: ```json { @@ -65,7 +65,7 @@ When creating a cloud agent run with the [{VARS.API_SDK_NAME}](/factories/api-an } ``` -For full API documentation, see the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) reference. +For full API documentation, see the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) reference. ### Web app diff --git a/src/content/docs/agents/cli/oz-cli/artifacts.mdx b/src/content/docs/agents/cli/oz-cli/artifacts.mdx index 7a948c1d7..cf2acab1a 100644 --- a/src/content/docs/agents/cli/oz-cli/artifacts.mdx +++ b/src/content/docs/agents/cli/oz-cli/artifacts.mdx @@ -22,7 +22,7 @@ Use artifacts when you need to retrieve files an agent produced after a run comp * **Local inspection** - Pull a generated file (HTML, image, CSV) onto your laptop to review. * **CI integration** - Fetch an agent-produced build artifact from a pipeline step that runs after the agent finishes. -Artifacts are referenced by an artifact UID. You can find UIDs in the agent's run detail view, in the JSON returned by [`oz run get`](/agents/cli/oz-cli/), or in the response from the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/). +Artifacts are referenced by an artifact UID. You can find UIDs in the agent's run detail view, in the JSON returned by [`oz run get`](/agents/cli/oz-cli/), or in the response from the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/). ## `oz artifact get` @@ -78,5 +78,5 @@ oz artifact download "$ARTIFACT_UID" --out ./latest-report.html ## Related -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - retrieve artifacts programmatically over HTTP. +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) - retrieve artifacts programmatically over HTTP. * [Scheduled cloud agents](/platform/triggers/scheduled-agents/) - common producer of recurring artifacts that downstream tooling consumes. diff --git a/src/content/docs/agents/cli/oz-cli/index.mdx b/src/content/docs/agents/cli/oz-cli/index.mdx index bb40faeb7..6fa1b9bb5 100644 --- a/src/content/docs/agents/cli/oz-cli/index.mdx +++ b/src/content/docs/agents/cli/oz-cli/index.mdx @@ -306,7 +306,7 @@ The `--name` flag assigns a config name to the run. Use it to group related runs **Why naming matters:** -When your team runs many agents across schedules, integrations, and ad-hoc triggers, `name` lets you answer questions like "how many distinct workflows are we running?" and "how often does this particular workflow run?" You can filter runs by name using the `name` query parameter on `GET /agent/runs` in the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/). +When your team runs many agents across schedules, integrations, and ad-hoc triggers, `name` lets you answer questions like "how many distinct workflows are we running?" and "how often does this particular workflow run?" You can filter runs by name using the `name` query parameter on `GET /agent/runs` in the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/). **Examples:** diff --git a/src/content/docs/changelog/2026.mdx b/src/content/docs/changelog/2026.mdx index b52f9e911..9d8a85995 100644 --- a/src/content/docs/changelog/2026.mdx +++ b/src/content/docs/changelog/2026.mdx @@ -1673,7 +1673,7 @@ Oz is Warp's orchestration platform for cloud agents: launch parallel agents, au * **Cloud environments for consistent execution** — configure Docker-based environments (unlimited repos + setup commands) and run agents in isolated cloud sandboxes. [Environments docs →](https://docs.warp.dev/platform/environments) * **Track agents from the web** — manage runs, create schedules, configure environments, and set up integrations from any browser in the <a href="https://oz.warp.dev">Oz web app</a>. * **Schedule agents based on Skills** — run agents automatically on a cron schedule for code cleanup, dependency updates, and issue triage. See [Scheduled Agents](/platform/triggers/scheduled-agents/). -* **Programmable by default** — orchestrate agents via the CLI and integrate Oz into tools and services via the [API and CLI reference](/factories/developer-tools/). +* **Programmable by default** — orchestrate agents via the CLI and integrate Oz into tools and services via the [API reference](/factories/developer-tools/). #### Warp Upgrades diff --git a/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx b/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx index 51250f461..b45b694f7 100644 --- a/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx +++ b/src/content/docs/factories/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx @@ -18,7 +18,7 @@ Example repository: [**Sentry monitor example repository**](https://github.com/w In this demo, Ben builds a small TypeScript “Sentry monitor” service that listens for specific Sentry alerts (like a Go nil pointer dereference) and triggers a Warp cloud agent to investigate. The server validates the webhook, extracts the stack trace, and injects it into an agent run inside a Warp Environment so the agent can inspect the repo and propose a fix. -To route the alert through a factory's named agents and workflow instead, use the [factory API](/factories/factory-api/) to dispatch the request. This example remains useful for custom standalone cloud-agent intake. +To route the alert through a factory's named agents and workflow instead, use [factory endpoints](/factories/factory-api/) to dispatch the request. This example remains useful for custom standalone cloud-agent intake. He also covers the task lifecycle basics in the TypeScript SDK (running an agent, polling task state to fetch a session link for debugging), and shows the end result: a draft GitHub pull request created from the Sentry event for a maintainer to review. diff --git a/src/content/docs/factories/api-and-sdk/index.mdx b/src/content/docs/factories/api-and-sdk/index.mdx index b1f54b026..7746f0776 100644 --- a/src/content/docs/factories/api-and-sdk/index.mdx +++ b/src/content/docs/factories/api-and-sdk/index.mdx @@ -1,29 +1,24 @@ --- topic: factories -title: "{{API_SDK_NAME}} reference" +title: Agent & run endpoints sidebar: - label: "{{API_SDK_NAME}}" + label: "Agent & run endpoints" description: >- - Create and operate factory and cloud agent runs over HTTP, or use the Python - and TypeScript SDKs for typed requests, retries, and error handling. + Start, manage, and inspect cloud agent runs with the Agent and run endpoints + in the Warp Platform API. --- import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; -Use the {VARS.API_SDK_NAME} to start standalone cloud-agent runs, or to monitor, continue, and cancel any run after it starts. To find a factory and send it new work, use the [factory API](/factories/factory-api/). - -| API | Use it for | -| --- | --- | -| **factory API** | Find a factory and dispatch new work to its foreman. | -| **{VARS.API_SDK_NAME}** | Start standalone cloud-agent runs, and manage factory or standalone runs after they begin. | +Agent & run endpoints are part of the {VARS.WARP_PLATFORM_API}. Use them to start standalone cloud agent runs and to monitor, continue, or cancel any run after it starts. To find a factory and send it new work, use [factory endpoints](/factories/factory-api/). :::note -Some examples in this reference and the [CLI reference](/agents/cli/oz-cli/) use `oz` commands (for example, `oz environment list`) from the {VARS.WARP_AGENT_CLI}. Those commands remain available during the transition. The [Warp Agent CLI reference](/agents/cli/reference/) does not yet document a `warp` equivalent. +Some examples use `oz` commands, such as `oz environment list`, from the {VARS.WARP_AGENT_CLI}. Existing commands remain supported during the transition. ::: -### API overview +## Use Agent & run endpoints -The {VARS.API_SDK_NAME} lets you create and inspect [Cloud Agent](/platform/) runs over HTTP from any system (CI, cron, backend services, internal tools), without requiring the Warp desktop app. +Agent & run endpoints let you create and inspect [cloud agent](/platform/) runs over HTTP from CI, cron, backend services, and internal tools, without requiring the Warp desktop app. **With the API you can:** @@ -34,14 +29,14 @@ The {VARS.API_SDK_NAME} lets you create and inspect [Cloud Agent](/platform/) ru :::caution This page is a high-level overview.\ \ -For full API endpoint details, refer to the [**Agents API Reference**](/api). For schema definitions, see the SDK repos: [**Python SDK**](https://github.com/warpdotdev/oz-sdk-python) and [**TypeScript SDK**](https://github.com/warpdotdev/oz-sdk-typescript). +For endpoint details, use the [**Warp Platform API reference**](/api). For SDK schemas, use the [**Python SDK**](https://github.com/warpdotdev/oz-sdk-python) and [**TypeScript SDK**](https://github.com/warpdotdev/oz-sdk-typescript) repositories. ::: -To send work to a [Warp factory](/factories/), use the [factory API](/factories/factory-api/) to discover it and dispatch by UID instead of calling `POST /agent/run` with a foreman's `agent_identity_uid`. Everything on this page - follow-ups, cancellation, status - still applies once a factory run is dispatched. +To send work to a [Warp factory](/factories/), use [factory endpoints](/factories/factory-api/) to discover it and dispatch by UID instead of calling `POST /agent/run` with a foreman's `agent_identity_uid`. The follow-up, cancellation, and status endpoints still apply after a factory run is dispatched. -### SDK overview +## SDKs -Warp provides official [Python](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript](https://github.com/warpdotdev/oz-sdk-typescript) SDKs that wrap the {VARS.API_SDK_NAME} with: +Warp provides official [Python](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript](https://github.com/warpdotdev/oz-sdk-typescript) SDKs that wrap the {VARS.WARP_PLATFORM_API} with: * **Typed requests and responses** (editor autocomplete, fewer schema mistakes) * **Built-in retries and timeouts** (with per-request overrides) @@ -50,7 +45,7 @@ Warp provides official [Python](https://github.com/warpdotdev/oz-sdk-python) and If you’re building an integration (CI, Slack bots, internal tooling, orchestrators), the SDKs are typically the quickest and safest starting point. -<VideoEmbed url="https://www.youtube.com/watch?v=0cf7383MZSk" title={`${VARS.API_SDK_NAME} reference overview video`} /> +<VideoEmbed url="https://www.youtube.com/watch?v=0cf7383MZSk" title={`${VARS.WARP_PLATFORM_API} reference overview video`} /> **SDK vs raw REST** @@ -63,9 +58,7 @@ For the full SDK surface area and latest usage, refer to the GitHub repos: [**Py --- -## API reference - -### REST API base URL +## API base URL All endpoints are served over HTTPS: @@ -73,9 +66,7 @@ All endpoints are served over HTTPS: https://app.warp.dev/api/v1 ``` -### Core concepts - -#### **Agent runs** +### Agent runs An agent run represents a single execution of a cloud agent, created with a prompt and optional configuration. Each run has: @@ -87,9 +78,9 @@ An agent run represents a single execution of a cloud agent, created with a prom * Optional session information (`session_id`, `session_link`) * Optional resolved configuration (`agent_config`) -See the [**Agents API Reference**](/api) for details on how runs are created and listed. +See the [**Warp Platform API reference**](/api) for details on how runs are created and listed. -#### **Agent configuration** +### Agent configuration You can influence how an agent runs using AmbientAgentConfig, including: @@ -97,6 +88,7 @@ You can influence how an agent runs using AmbientAgentConfig, including: * `model_id` for LLM selection * `base_prompt` to shape behavior * `environment_id` to choose a `CloudEnvironment` +* `worker_host` to run a standalone cloud agent on a [self-hosted worker](/factories/self-hosting/) * `skill_spec` to use a [skill](/agents/capabilities/skills/) as the base prompt (format: `owner/repo:skill-name` or `owner/repo:path/to/SKILL.md`) * `mcp_servers` to enable specific tools via MCP @@ -104,9 +96,24 @@ See the [**Python SDK**](https://github.com/warpdotdev/oz-sdk-python) or [**Type --- -### Key endpoints +## Route a run to a self-hosted worker + +Set `worker_host` in the request configuration to select a connected self-hosted worker. Omit it, or set it to `warp`, to use Warp-hosted workers. + +```json +{ + "prompt": "Run the dependency audit", + "config": { + "worker_host": "WORKER_HOST" + } +} +``` + +Replace `WORKER_HOST` with the ID of a connected worker. For factory work, set `workerHost` in the [factory definition](/factories/factory-as-code/#agentdefaultsworkerhost) instead. + +## Key endpoints -**The Agents API exposes these primary endpoints:** +Agent & run endpoints include: * `POST /agent/run` @@ -124,11 +131,11 @@ See the [**Python SDK**](https://github.com/warpdotdev/oz-sdk-python) or [**Type Cancel a run that is currently queued or in progress. Returns the ID of the cancelled run. -All endpoint semantics, query parameters, and [error codes](/factories/api-and-sdk/troubleshooting/errors/) are documented on the [Agents API Reference](/api). +All endpoint semantics, query parameters, and [error codes](/factories/api-and-sdk/troubleshooting/errors/) are documented in the [Warp Platform API reference](/api). --- -#### Models reference +## Models The API shares a set of reusable models across endpoints. Detailed JSON schemas, types, and enums are available in the SDK repos ([Python](https://github.com/warpdotdev/oz-sdk-python), [TypeScript](https://github.com/warpdotdev/oz-sdk-typescript)). Key models include: diff --git a/src/content/docs/factories/api-and-sdk/quickstart.mdx b/src/content/docs/factories/api-and-sdk/quickstart.mdx index 725c5f9bd..89533d3fc 100644 --- a/src/content/docs/factories/api-and-sdk/quickstart.mdx +++ b/src/content/docs/factories/api-and-sdk/quickstart.mdx @@ -1,8 +1,8 @@ --- topic: factories -title: "API & SDK quickstart" +title: "Warp Platform API quickstart" description: >- - Create and monitor your first cloud agent run via the {{API_SDK_NAME}} in ~5 + Create and monitor your first cloud agent run via the {{WARP_PLATFORM_API}} in ~5 minutes. sidebar: label: "Quickstart" @@ -10,12 +10,12 @@ sidebar: import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; -The {VARS.API_SDK_NAME} lets you run and manage cloud agents from anywhere — CI/CD pipelines, backend services, scripts, or custom tooling — without the Warp desktop app. This quickstart walks you through creating your first run and checking its status. +The {VARS.WARP_PLATFORM_API} lets you run and manage cloud agents from CI/CD pipelines, backend services, scripts, or custom tooling without the Warp desktop app. This quickstart walks you through creating your first run and checking its status. -To dispatch work through a factory's named agents and workflow, use the [factory API](/factories/factory-api/) after this quickstart. The run-management steps below also apply to the factory run that API creates. +To dispatch work through a factory's named agents and workflow, use [factory endpoints](/factories/factory-api/) after this quickstart. The run-management steps below also apply to the factory run those endpoints create. Watch this short demo of how the REST API can power agent-backed apps like [PowerFixer](https://github.com/warpdotdev/power-fixer-setup), an issue triage bot built by the Warp team: -<VideoEmbed url="https://youtu.be/N6qMe641K34" title={`${VARS.API_SDK_NAME} quickstart video`} /> +<VideoEmbed url="https://youtu.be/N6qMe641K34" title={`${VARS.WARP_PLATFORM_API} quickstart video`} /> --- @@ -76,7 +76,7 @@ The `state` has the following possible values: * `SUCCEEDED` - The run completed successfully. * `FAILED` - The run encountered an error. Check the `status_message` field in the response for details, then use the [API error reference](/factories/api-and-sdk/troubleshooting/errors/) to interpret the error code. -These are the most common states. See the [full API reference](/factories/api-and-sdk/) for all possible values. +These are the most common states. See the [Agent & run endpoints](/factories/api-and-sdk/) and [Warp Platform API reference](/api) for all possible values. To list all recent runs: @@ -95,7 +95,7 @@ You can also view and manage all runs in the <a href={`${VARS.WEB_APP_URL}/runs` ## Next steps -* **Read the full API reference** - [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) documents all endpoint parameters, query filters, and response schemas. +* **Read the endpoint guide** - [Agent & run endpoints](/factories/api-and-sdk/) documents the configuration and run lifecycle, while the [Warp Platform API reference](/api) lists all parameters, query filters, and response schemas. * **Explore the SDKs** - [Python SDK](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript SDK](https://github.com/warpdotdev/oz-sdk-typescript) include typed request/response models, retries, and error handling. * **See a real-world example** - [Demo: Sentry monitoring with SDK](/factories/api-and-sdk/demo-sentry-monitoring-with-sdk/) shows how to build a webhook handler that triggers agents from production errors. * **Schedule and automate** - See [Scheduled Agents Quickstart](/platform/triggers/scheduled-agents-quickstart/) to run agents on a cron, or [Integrations Quickstart](/platform/integrations/quickstart/) to trigger agents from Slack or Linear. diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/authentication-required.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/authentication-required.mdx index 332140f14..af1d74d29 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/authentication-required.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/authentication-required.mdx @@ -58,5 +58,5 @@ This error is returned when: ## Related -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — API authentication +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) — API authentication * [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) — API key management diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/conflict.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/conflict.mdx index 3cf340fdb..344c0f5d1 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/conflict.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/conflict.mdx @@ -58,4 +58,4 @@ For task cancellation specifically, wait until the task moves from **pending** t ## Related * [Managing Cloud Agents](/platform/managing-cloud-agents/) — Viewing and managing agent tasks -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — API reference for managing agent tasks +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) — API reference for managing agent tasks diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx index ef969c79d..7dfbfd57f 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/index.mdx @@ -2,13 +2,13 @@ topic: factories title: API errors description: >- - Reference for all error codes returned by the {{API_SDK_NAME}}. Each error + Reference for all error codes returned by the {{WARP_PLATFORM_API}}. Each error includes an HTTP status, machine-readable code, and actionable resolution steps. --- import { VARS } from '@data/vars'; -When the {VARS.API_SDK_NAME} encounters an error, it returns a structured JSON response following [RFC 7807 (Problem Details for HTTP APIs)](https://datatracker.ietf.org/doc/html/rfc7807). Every error response includes a machine-readable error code, HTTP status, human-readable message, and resolution details. +When the {VARS.WARP_PLATFORM_API} encounters an error, it returns a structured JSON response following [RFC 7807 (Problem Details for HTTP APIs)](https://datatracker.ietf.org/doc/html/rfc7807). Every error response includes a machine-readable error code, HTTP status, human-readable message, and resolution details. --- @@ -88,6 +88,6 @@ When an error response includes a `trace_id`, you can include it when [contactin ## Related -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — API reference for creating and managing agent tasks +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) — API reference for creating and managing agent tasks * [Cloud Agents Overview](/platform/) — How cloud agents work * [Access, Billing, and Identity](/platform/team-access-billing-and-identity/) — Plan requirements and billing details diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/invalid-request.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/invalid-request.mdx index 3bce443c3..67bd7db3f 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/invalid-request.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/invalid-request.mdx @@ -59,4 +59,4 @@ The `detail` field in the response will describe the specific validation issue. ## Related -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — API request format and parameters +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) — API request format and parameters diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/not-authorized.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/not-authorized.mdx index df721242f..fd42806e3 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/not-authorized.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/not-authorized.mdx @@ -57,4 +57,4 @@ This error is returned when: ## Related * [Access, Billing, and Identity](/platform/team-access-billing-and-identity/) — Permission model and identity -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — API authentication and authorization +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) — API authentication and authorization diff --git a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx index b88945263..d2ee357e0 100644 --- a/src/content/docs/factories/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx +++ b/src/content/docs/factories/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx @@ -58,4 +58,4 @@ This error is returned when: * [Cloud Agents Overview](/platform/) — How cloud agent tasks work * [Self-hosting](/factories/self-hosting/) — Self-hosted agent configuration -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — API reference for managing agent tasks +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) — API reference for managing agent tasks diff --git a/src/content/docs/factories/connect-your-factory.mdx b/src/content/docs/factories/connect-your-factory.mdx index ec829d6d1..7e398dd0b 100644 --- a/src/content/docs/factories/connect-your-factory.mdx +++ b/src/content/docs/factories/connect-your-factory.mdx @@ -27,7 +27,7 @@ Once a source is connected, here's the concrete action that hands it work — ea | [Linear](/factories/integrations/linear/) | Planned issues | [Assigning the issue to the factory, or mentioning the Warp app in a comment](/factories/integrations/linear/#route-agent-sessions) | The Linear issue and its agent session | | [Jira](/factories/integrations/jira/) | Work items assigned to Warp | [Assigning or mentioning **Warp** on a work item](/factories/integrations/jira/#connect-jira-and-add-an-automation) | The Jira agent session | | [Custom webhooks](/factories/webhooks/) | Any system that can POST JSON: CI, monitoring, alerting, and internal tools | [Posting JSON to the webhook's URL from the external system](/factories/webhooks/#configure-the-sender) | The factory work item | -| [Factory API](/factories/factory-api/) | Custom integrations and scripts that dispatch by factory UID | [Calling `POST /factory/{uid}/runs` with a prompt](/factories/factory-api/#dispatch-a-run-to-a-factory) | The factory work item | +| [factory endpoints](/factories/factory-api/) | Custom integrations and scripts that dispatch by factory UID | [Calling `POST /factory/{uid}/runs` with a prompt](/factories/factory-api/#dispatch-a-run-to-a-factory) | The factory work item | | [Factory MCP](/factories/factory-mcp/) | Exchanging work with a local coding agent, in both directions | [Calling `send_task` from a connected coding agent](/factories/factory-mcp/#send-new-work-to-a-factory) | The factory work item | | Direct runs and schedules | One-off or recurring work | [Clicking **New** on the factory's Runs page, or adding a schedule trigger](#direct-runs-and-schedules) | The factory work item | @@ -71,9 +71,9 @@ These defaults are starting points. Review each automation's filters, agent, and A [custom webhook](/factories/webhooks/) gives the factory an authenticated URL that any system can POST JSON to, and an automation decides which deliveries start work by filtering on the payload. Use it for tools Warp doesn't connect to directly, such as your CI system, PagerDuty, Sentry, or Stripe, without writing any code on your side. -## Factory API +## factory endpoints -The [factory API](/factories/factory-api/) lets your own code discover a factory and dispatch a task to it by UID, without knowing which agent handles the work. Use it to build a custom integration for a tool Warp doesn't connect to directly - see [Build a Mattermost bot for Warp Factories](/guides/external-tools/build-a-mattermost-bot-for-warp-factories/) for a worked example. +[factory endpoints](/factories/factory-api/) let your own code discover a factory and dispatch a task to it by UID, without knowing which agent handles the work. Use them to build a custom integration for a tool Warp doesn't connect to directly - see [Build a Mattermost bot for Warp Factories](/guides/external-tools/build-a-mattermost-bot-for-warp-factories/) for a worked example. ## Factory MCP diff --git a/src/content/docs/factories/developer-tools.mdx b/src/content/docs/factories/developer-tools.mdx index 8e92a677f..e845a1254 100644 --- a/src/content/docs/factories/developer-tools.mdx +++ b/src/content/docs/factories/developer-tools.mdx @@ -1,28 +1,28 @@ --- -title: Developer tools for Warp Factories +title: Warp Platform API & SDKs description: >- - Use APIs, SDKs, webhooks, and MCP to integrate Warp Factories with your - services, tools, and development workflows. + Use the Warp Platform API, SDKs, Factory MCP, and webhooks to integrate + factories and cloud agent runs with your tools and services. sidebar: - label: "Developer tools" + label: "Overview" --- import { VARS } from '@data/vars'; -Warp Factories provides programmatic interfaces for sending work to a factory, integrating external systems, and inspecting the runs a factory produces. +The {VARS.WARP_PLATFORM_API} serves both factories and standalone cloud agent runs. factory endpoints send work to a factory; agent and run endpoints start and manage standalone runs. Both endpoint families use the same API key, API reference, SDKs, and error model. -## Choose an interface +## Choose an API surface -* **[Factory API](/factories/factory-api/)** - Find a factory and send work to it by UID from your own application or service. -* **[{VARS.API_SDK_NAME}](/factories/api-and-sdk/)** - Create, monitor, and manage cloud agent runs from scripts, CI, and backend services. -* **[API reference](/api)** - Look up the full HTTP API schema, parameters, and responses. +* **[factory endpoints](/factories/factory-api/)** - Find a factory and send work to it by UID from your application or service. +* **[Agent & run endpoints](/factories/api-and-sdk/)** - Start, monitor, continue, and cancel cloud agent runs from scripts, CI, and backend services. +* **[Warp Platform API reference](/api)** - Look up the full HTTP schema, parameters, and responses. +* **[Python SDK](https://github.com/warpdotdev/oz-sdk-python)** - Make typed requests from Python. The current package retains its `oz-sdk-python` name. +* **[TypeScript SDK](https://github.com/warpdotdev/oz-sdk-typescript)** - Make typed requests from TypeScript. The current package retains its `oz-sdk-typescript` name. +* **[API errors](/factories/api-and-sdk/troubleshooting/errors/)** - Resolve error responses by HTTP status and machine-readable code. * **[Factory MCP](/factories/factory-mcp/)** - Exchange work between a factory and a connected coding agent or MCP client. * **[Webhooks](/factories/webhooks/)** - Receive events from systems that can send JSON and route matching deliveries into factory automations. +## Get started -## Use the API and SDK - -Use the API and SDK for typed requests, retries, and error handling. Start with the [API and SDK quickstart](/factories/api-and-sdk/quickstart/) to create and inspect a run, or use the [Sentry monitoring example](/factories/api-and-sdk/demo-sentry-monitoring-with-sdk/) to connect an external event source. - -For request errors, see [API errors](/factories/api-and-sdk/troubleshooting/errors/). +Start with the [API & SDK quickstart](/factories/api-and-sdk/quickstart/) to create and inspect a run. For a production event source, use the [Sentry monitoring example](/factories/api-and-sdk/demo-sentry-monitoring-with-sdk/) to connect a webhook handler. ## Related pages diff --git a/src/content/docs/factories/factory-api.mdx b/src/content/docs/factories/factory-api.mdx index 40a03c247..a713b479c 100644 --- a/src/content/docs/factories/factory-api.mdx +++ b/src/content/docs/factories/factory-api.mdx @@ -1,14 +1,14 @@ --- -title: Use the factory API +title: Factory endpoints description: >- - Discover factories and dispatch tasks by UID with the public factory API, + Discover factories and dispatch tasks by UID with factory endpoints, without learning the foreman agent's internals. sidebar: - label: "Factory API" + label: "Factory endpoints" --- import { VARS } from '@data/vars'; -Use the factory API to find a factory and start work from a custom integration without managing agent details. Build it into a chat bot, script, or service for any tool Warp doesn't connect to directly. +The factory endpoints are part of the {VARS.WARP_PLATFORM_API}. Use them to find a factory and start work from a custom integration without managing agent details. Build them into a chat bot, script, or service for any tool Warp doesn't connect to directly. :::note Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. @@ -20,21 +20,21 @@ Warp Factories is in **Early Access** and available to a limited set of teams. [ * `GET /factory/{uid}` - get one factory by UID. * `POST /factory/{uid}/runs` - dispatch a run to the factory's foreman agent. Pass a `prompt`; the server resolves the foreman for you. -A dispatched run is an ordinary [cloud agent run](/platform/): retrieve it, send it follow-ups, or cancel it through the same [Agent API](/factories/api-and-sdk/) you'd use for any run. +A dispatched run is an ordinary [cloud agent run](/platform/): retrieve it, send it follow-ups, or cancel it through the same [agent and run endpoints](/factories/api-and-sdk/) used for any run. -## When to use the factory API vs the Agent API +## Choosing an endpoint family -Use the factory API to find or start work on a factory. Use the Agent API for everything else - a standalone cloud agent, run management, or orchestration. +Use factory endpoints to find or start work on a factory. Use Agent & run endpoints for everything else: a standalone cloud agent, run management, or orchestration. | Task | Recommended API | | --- | --- | -| Find a factory by name before dispatching to it | factory API - `GET /factory?search=` | -| Start a new task on a factory | factory API - `POST /factory/{uid}/runs` | -| Continue, monitor, or cancel a run (factory or standalone) | Agent API - `GET /agent/runs/{runId}`, `POST /agent/runs/{runId}/followups`, `POST /agent/runs/{runId}/cancel` | -| Run a standalone cloud agent with no factory involved | Agent API - `POST /agent/run` | -| Build a multi-agent orchestration | Agent API - see [multi-agent orchestration](/platform/orchestration/) | +| Find a factory by name before dispatching to it | factory endpoints - `GET /factory?search=` | +| Start a new task on a factory | factory endpoints - `POST /factory/{uid}/runs` | +| Continue, monitor, or cancel a run (factory or standalone) | Agent & run endpoints - `GET /agent/runs/{runId}`, `POST /agent/runs/{runId}/followups`, `POST /agent/runs/{runId}/cancel` | +| Run a standalone cloud agent with no factory involved | Agent & run endpoints - `POST /agent/run` | +| Build a multi-agent orchestration | Agent & run endpoints - see [multi-agent orchestration](/platform/orchestration/) | -The Agent API isn't deprecated: every factory run is still an ordinary run, so the same endpoints handle status, follow-ups, and cancellation no matter which API started it. +Every factory run is still an ordinary run, so Agent & run endpoints handle status, follow-ups, and cancellation no matter which endpoint family started it. ## Discover a factory @@ -123,8 +123,8 @@ See [key endpoints](/factories/api-and-sdk/#key-endpoints) for the full set of r ## Related pages -* [Connect your factory](/factories/connect-your-factory/) - Every way work can enter a factory, including the factory API alongside Slack, GitHub, and Factory MCP. +* [Connect your factory](/factories/connect-your-factory/) - Every way work can enter a factory, including factory endpoints alongside Slack, GitHub, and Factory MCP. * [Build a Mattermost bot for Warp Factories](/guides/external-tools/build-a-mattermost-bot-for-warp-factories/) - A worked example that discovers a factory and dispatches and continues a task from a custom chat integration. * [Factory MCP](/factories/factory-mcp/) - Connect a local coding agent to a factory instead of calling the REST API directly. -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - Full endpoint reference, SDKs, and error codes for the underlying Agent API. +* [Agent & run endpoints](/factories/api-and-sdk/) - Full endpoint reference, SDKs, and error codes for the underlying Warp Platform API. * [How Warp Factories work](/factories/how-factories-work/) - The stages a dispatched task moves through after the foreman picks it up. diff --git a/src/content/docs/factories/factory-as-code.mdx b/src/content/docs/factories/factory-as-code.mdx index 113eed296..f0aa1d243 100644 --- a/src/content/docs/factories/factory-as-code.mdx +++ b/src/content/docs/factories/factory-as-code.mdx @@ -257,7 +257,7 @@ harness: ### `agentDefaults.harness` -The harness and model that runs execute with. Use the `harness` form to run a third-party harness or to set advanced options. `type` accepts `oz`, `claude`, `codex`, or `gemini` — the values the definition schema validates. `claude-code` is also accepted as an alias for `claude`; prefer `claude`, the canonical [harness identifier](/platform/harnesses/#harness-identifiers) that the CLI and the Agent API use for the same harness. For what each harness does and which ones your team can run, see [supported harnesses](/platform/harnesses/). +The harness and model that runs execute with. Use the `harness` form to run a third-party harness or to set advanced options. `type` accepts `oz`, `claude`, `codex`, or `gemini` — the values the definition schema validates. `claude-code` is also accepted as an alias for `claude`; prefer `claude`, the canonical [harness identifier](/platform/harnesses/#harness-identifiers) that the CLI and the Warp Platform API use for the same harness. For what each harness does and which ones your team can run, see [supported harnesses](/platform/harnesses/). ```yaml harness: diff --git a/src/content/docs/factories/how-factories-work.mdx b/src/content/docs/factories/how-factories-work.mdx index 9f85f34fb..daa8b4c55 100644 --- a/src/content/docs/factories/how-factories-work.mdx +++ b/src/content/docs/factories/how-factories-work.mdx @@ -11,7 +11,7 @@ sidebar: Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. ::: -A factory is a team of cloud agents that ships software the way your team does: a request comes in, moves through the stages it needs, and comes back as a pull request ready for review. You talk to one agent, the **foreman**, from the tool that sends the request, such as Slack or Linear. The foreman dispatches the factory's other agents, and each one owns a part of the software development lifecycle. +A factory is a standing software development workflow that connects your repositories and engineering tools to a team of agents and execution infrastructure. It takes in requests, moves them through the stages they need, and turns them into pull requests ready for review. You talk to one agent, the **foreman**, from the tool that sends the request, such as Slack or Linear. The foreman dispatches the factory's other agents, and each one owns a part of the software development lifecycle. Deciding which repositories belong in this factory is a separate question. See [sizing a factory](/factories/#sizing-a-factory) for that guidance. @@ -21,7 +21,7 @@ A **work item** is a single request the factory acts on, such as an issue, suppo The diagram's components, from intake to improvement: -* **Work sources** - Work items arrive from [Slack](/factories/integrations/slack/), [GitHub](/factories/integrations/github/), [GitLab](/factories/integrations/gitlab/), [Linear](/factories/integrations/linear/), or [Jira](/factories/integrations/jira/), from [custom webhooks](/factories/webhooks/) and the [factory API](/factories/factory-api/), from local coding agents through the [Factory MCP](/factories/factory-mcp/), or from direct runs and schedules. +* **Work sources** - Work items arrive from [Slack](/factories/integrations/slack/), [GitHub](/factories/integrations/github/), [GitLab](/factories/integrations/gitlab/), [Linear](/factories/integrations/linear/), or [Jira](/factories/integrations/jira/), from [custom webhooks](/factories/webhooks/) and [factory endpoints](/factories/factory-api/), from local coding agents through the [Factory MCP](/factories/factory-mcp/), or from direct runs and schedules. * **Automations** - [Automations](/factories/automations/) filter provider events and decide which agent handles them. Schedules fire them on a timer; direct requests go straight to the foreman. * **Foreman and stage agents** - The foreman holds one conversation per work item and dispatches the Triage, Spec, Implement, and Review agents as the work needs them. See [factory agents](/factories/factory-agents/) and the stages below. * **Human handoff** - The factory opens a pull request with evidence, updates the original work item, and you review and merge. diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index f9bc6ada1..0bbe6894d 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -13,7 +13,7 @@ import VideoEmbed from '@components/VideoEmbed.astro'; Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. If your team already has access, sign in to the <a href={VARS.FACTORY_WEB_APP_URL}>{VARS.FACTORY_WEB_APP}</a>. ::: -A software factory uses a coordinated fleet of agents to take in requests, manage them from triage through review, and turn a growing backlog into mergeable pull requests. Your team stays in the loop to approve specifications and merge each pull request. +A factory is a standing software development workflow that connects your repositories and engineering tools to a team of agents and execution infrastructure. It takes in requests, manages them from triage through review, and turns a growing backlog into mergeable pull requests. Your team stays in the loop to approve specifications and merge each pull request. <VideoEmbed url="https://www.youtube.com/watch?v=0WBk4ai8y1A" title="Introducing Warp Factories" /> @@ -21,7 +21,7 @@ A software factory uses a coordinated fleet of agents to take in requests, manag In practice, that means tracking each request as a work item, such as an issue, ticket, or triggered task, and moving it through specialized agents that triage it, write a specification when one is needed, implement the change, and review the result. -A factory is one deployed instance of that pattern, connecting your repositories and engineering tools to a team of agents, execution infrastructure, and a measurable workflow. Each factory applies a single policy across all of its work sources, so deploy separate factories for repository groups that need different policies. +Each factory applies a single policy across its work sources, so deploy separate factories for repository groups that need different policies. ### Sizing a factory @@ -55,33 +55,21 @@ Warp Factories is designed for engineering teams with repeatable work that exten * **Measurement and self-improvement** - The [factory dashboard](/factories/factory-dashboard/) shows work-item status, runs, automations, costs, and benchmarks. [Scorers](/factories/measure-and-improve/scorers/) classify completed runs, [Benchmarks](/factories/benchmarks/) compare fixed tasks across configurations, and [Self-improvement](/factories/measure-and-improve/self-improvement/) turns repeated failures into follow-up work the factory proposes for review. * **Infrastructure control** - Choose Warp-hosted or managed self-hosted execution on an eligible Enterprise plan. The [infrastructure and security](/factories/infrastructure-and-security/) page compares execution models and links to the self-hosting setup path, as well as available inference and credential controls. -## How Warp Factories relates to other Warp products +## How Warp Factories fits into Warp -| Product | How it relates | -| --- | --- | -| **Warp** | The interactive terminal where you develop locally with agents and code review. A factory runs independently in the cloud. | -| **Warp Agent** | Warp's built-in agent harness. A factory's agents can run on it or on another supported harness. | -| **{VARS.WARP_CLI}** | Runs the Warp Agent in any terminal and exchanges work with a factory through the Factory MCP. | -| **{VARS.WARP_AUTOMATION_PLATFORM}** | Provides the cloud runs, runners, integrations, secrets, [multi-agent orchestration](/platform/orchestration/), and APIs that a factory assembles into one workflow. | - -## The platform behind a factory - -Warp Factories is built on the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/), Warp's programmable system for running and coordinating agents at scale. A factory doesn't replace the platform; it assembles the platform's primitives into one standing workflow, so what you already know about cloud agents carries over: +Warp Factories builds on the same agent infrastructure used across Warp. Every factory agent produces a standard [cloud agent run](/platform/), so the same APIs, runners, models, security controls, and observability apply. -* **Runs** - Every factory agent executes as a [cloud agent run](/platform/), with the same run records and [session sharing](/platform/viewing-cloud-agent-runs/) as any other cloud agent. -* **Execution** - [Runners](/factories/runners/) provide the compute each agent works on, and eligible Enterprise teams can route execution to [managed self-hosted workers](/factories/self-hosting/). -* **Agent configuration** - Each agent runs on a supported [harness](/platform/harnesses/) and model, with [secrets](/platform/secrets/) and [MCP servers](/platform/mcp/) scoping what it can reach. -* **Billing** - A factory's runs consume [platform credits](/support-and-community/plans-and-billing/platform-credits/) the same way as any other cloud agent run. - -The factory layer adds the workflow on top: the foreman and its agents, work items that carry each request across runs, definitions as code, default automations for connected tools, and the Scorer and Self-improvement loop. - -Use a standalone [cloud agent](/platform/) for a single task or one-trigger automation. Any agent can spawn children with [multi-agent orchestration](/platform/orchestration/) without a factory. Use a factory for standing, multi-stage work that needs named agents with separate configuration and one place to route, measure, and improve the process. +| Product | Role | +| --- | --- | +| **Warp** | The interactive development experience for local work with agents and code review. | +| **Warp Agent** | The built-in agent harness that can power an individual factory agent. | +| **Warp Factories** | Standing multi-agent workflows for software development. | ## Key terms Setup gives a factory and its foreman the same name by default, so it's easy to mistake one for the other. Here's how the terms differ: -* **factory** - An individual deployed software factory, built on Warp Factories infrastructure and connecting your repositories and tools to a team of agents. Distinct from Warp Factories, the product, and from the foreman, its coordinating agent. +* **factory** - A standing software development workflow that connects repositories, tools, agents, execution infrastructure, and a measurable workflow. Distinct from Warp Factories, the product, and from the foreman, its coordinating agent. * **foreman** - The coordinating agent inside a factory, and the only one you talk to. It dispatches the other [factory agents](/factories/factory-agents/) and reports back. Every factory has exactly one. * **Foreman name** - The handle your team @-mentions in Slack and Linear to reach the foreman. Setup copies it from the factory's name, so the two usually match even though they're different things. See [Foreman name](/factories/factory-agents/#foreman-name). diff --git a/src/content/docs/factories/quickstart.mdx b/src/content/docs/factories/quickstart.mdx index 923df95f6..88612a194 100644 --- a/src/content/docs/factories/quickstart.mdx +++ b/src/content/docs/factories/quickstart.mdx @@ -12,7 +12,7 @@ import { VARS } from '@data/vars'; Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. ::: -A factory is a group of cloud agents that turns incoming requests into pull requests. You talk to one agent, the **foreman**. It picks up the request from wherever it starts, such as Slack, an issue tracker, or a code host, then dispatches the factory's other agents, each owning one part of the software development lifecycle. People stay in the loop at the points that matter: approving specs when needed and merging pull requests. +A factory is a standing software development workflow that connects your repositories and engineering tools to a team of agents and execution infrastructure. You talk to one agent, the **foreman**. It picks up the request from wherever it starts, such as Slack, an issue tracker, or a code host, then dispatches the factory's other agents, each owning one part of the software development lifecycle. People stay in the loop at the points that matter: approving specs when needed and merging pull requests. In this quickstart, you will create a factory and take one small work item from prompt to pull request in less than 10 minutes. diff --git a/src/content/docs/guides/agent-workflows/how-to-run-multiple-ai-coding-agents.mdx b/src/content/docs/guides/agent-workflows/how-to-run-multiple-ai-coding-agents.mdx index a7a3ff042..0a70e0ddf 100644 --- a/src/content/docs/guides/agent-workflows/how-to-run-multiple-ai-coding-agents.mdx +++ b/src/content/docs/guides/agent-workflows/how-to-run-multiple-ai-coding-agents.mdx @@ -17,7 +17,7 @@ Use multiple coding agents, including Warp Agent, Claude Code, Codex, and other * **Local parallel sessions** - run Warp Agent, Claude Code, Codex, OpenCode, or another CLI agent in separate tabs or panes. * **Isolated worktrees** - give each agent its own Git worktree and branch so parallel edits do not collide. -* **{VARS.WARP_AUTOMATION_PLATFORM} cloud orchestration** - use `/orchestrate`, `/plan`, the {VARS.WARP_AGENT_CLI}, the {VARS.WEB_APP}, or the {VARS.API_SDK_NAME} to fan work out to child agents in cloud environments. +* **{VARS.WARP_AUTOMATION_PLATFORM} cloud orchestration** - use `/orchestrate`, `/plan`, the {VARS.WARP_AGENT_CLI}, the {VARS.WEB_APP}, or the {VARS.WARP_PLATFORM_API} to fan work out to child agents in cloud environments. The best multi-agent workflows have one thing in common: each agent owns a clear slice of work, reports back with validation results, and hands off a branch, diff, PR, or concise finding you can review. @@ -217,7 +217,7 @@ Use cloud agents when the work is long-running, resource-intensive, easy to shar ``` 2. Use `/plan` for larger changes where you want to review the plan, orchestration config, child ownership, and merge strategy before agents launch. -3. For repeatable or unattended workflows, start the parent from the {VARS.WARP_AGENT_CLI}, the {VARS.WEB_APP}, or the {VARS.API_SDK_NAME}. See [Running orchestrated agents](/platform/orchestration/multi-agent-runs/) for launch options. +3. For repeatable or unattended workflows, start the parent from the {VARS.WARP_AGENT_CLI}, the {VARS.WEB_APP}, or the {VARS.WARP_PLATFORM_API}. See [Running orchestrated agents](/platform/orchestration/multi-agent-runs/) for launch options. 4. Inspect parent and child runs from the [{VARS.WEB_APP}](/platform/oz-web-app/) or the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app. Cloud orchestration is the best fit when you need: @@ -255,7 +255,7 @@ Explore related guides and features: * [How to review AI-generated code](/guides/agent-workflows/how-to-review-ai-generated-code/) — review and refine the code your agents produced * [Attach agent session context to GitHub PRs](/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs/) — give reviewers the agent context behind a PR * [Multi-agent orchestration](/platform/orchestration/) — coordinate parent and child agents across local and cloud runs -* [Running orchestrated agents](/platform/orchestration/multi-agent-runs/) — start orchestrated runs from Warp, the {VARS.WARP_AGENT_CLI}, the {VARS.WEB_APP}, or the {VARS.API_SDK_NAME} +* [Running orchestrated agents](/platform/orchestration/multi-agent-runs/) — start orchestrated runs from Warp, the {VARS.WARP_AGENT_CLI}, the {VARS.WEB_APP}, or the {VARS.WARP_PLATFORM_API} * [Set up Claude Code](/guides/external-tools/how-to-set-up-claude-code/) or [Set up Codex CLI](/guides/external-tools/how-to-set-up-codex-cli/) — install both agents if you haven't already * [Claude Code in Warp](https://www.warp.dev/agents/claude-code) — overview of Claude Code support in Warp * [Codex in Warp](https://www.warp.dev/agents/codex) — overview of Codex support in Warp diff --git a/src/content/docs/guides/agent-workflows/how-to-run-unattended-agents.mdx b/src/content/docs/guides/agent-workflows/how-to-run-unattended-agents.mdx index b41efbb88..3cddbfada 100644 --- a/src/content/docs/guides/agent-workflows/how-to-run-unattended-agents.mdx +++ b/src/content/docs/guides/agent-workflows/how-to-run-unattended-agents.mdx @@ -29,7 +29,7 @@ Use this table to decide where an unattended agent should start. | GitHub | Someone should delegate work by mentioning `@warp-agent` on an issue, pull request, or review comment. | [GitHub integration](/platform/integrations/github/) | GitHub thread comments, {VARS.WEB_APP} Runs page, Agent Management Panel in the Warp app, and the shared run session | | GitHub Actions | A repository event, PR workflow, issue workflow, or CI failure should start the agent. | [GitHub Actions](/platform/integrations/github-actions/) | GitHub Actions logs, PR or issue comments, {VARS.WEB_APP}, and cloud agent runs | | {VARS.WARP_AGENT_CLI} | You want to start a named cloud run from a terminal, script, or local automation. | [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/#running-agents-remotely-oz-agent-run-cloud) | CLI output, {VARS.WEB_APP} Runs page, Agent Management Panel in the Warp app, and cloud agent session links | -| {VARS.API_SDK_NAME} | Your internal system should create, query, or monitor runs programmatically. | [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) | Your system, API results, {VARS.WEB_APP}, and run sessions | +| {VARS.WARP_PLATFORM_API} | Your internal system should create, query, or monitor runs programmatically. | [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) | Your system, API results, {VARS.WEB_APP}, and run sessions | ## Choose a workflow pattern @@ -82,7 +82,7 @@ The GitHub Action can pass event data, prior step output, and repository context ### Start runs from scripts or internal systems -Use the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/#running-agents-remotely-oz-agent-run-cloud) for scripts and terminal workflows. Use the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) when another service should create or monitor runs. This is useful for: +Use the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/#running-agents-remotely-oz-agent-run-cloud) for scripts and terminal workflows. Use the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) when another service should create or monitor runs. This is useful for: * internal dashboards * custom webhooks @@ -112,7 +112,7 @@ Unattended does not mean invisible. Use these surfaces to review what happened: * [{VARS.WEB_APP}](/platform/oz-web-app/) - View runs, schedules, run metadata, and session transcripts from a browser or mobile device. * [Managing cloud agents](/platform/managing-cloud-agents/) - Filter runs by source, status, day, creator, or trigger. * [Cloud agent session sharing](/platform/viewing-cloud-agent-runs/) - Inspect the prompt, plan, commands, logs, output, and follow-up messages where available. -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - Query runs and build internal monitoring around status, runtime, or outcomes. +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) - Query runs and build internal monitoring around status, runtime, or outcomes. When a run creates a PR, include the cloud run link in the PR description or a comment. See [Attach agent session context to GitHub PRs](/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs/) for a template. diff --git a/src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx b/src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx index 55588cff3..28cbe86a2 100644 --- a/src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx +++ b/src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx @@ -67,7 +67,7 @@ With GitHub Actions, your factory already has event-based triggers. The {VARS.WA * **Slack** — Teammates can kick off a run by mentioning `@warp` in a Slack thread. Useful for one-off requests that don't need the full label workflow. See [Slack integration](/platform/integrations/slack). * **Linear** — When an issue in Linear reaches a specific status, a cloud agent run starts automatically. Useful for teams that track work in Linear rather than GitHub Issues. See [Linear integration](/platform/integrations/linear). * **Scheduled agents** — For the outer improvement loop (which runs on a cadence rather than an event), use a scheduled cloud agent. See [Scheduled agents](/platform/triggers/scheduled-agents). -* **{VARS.API_SDK_NAME}** — For custom triggers — webhooks, internal dashboards, other events — use the [{VARS.API_SDK_NAME}](/factories/api-and-sdk) to start runs programmatically. +* **{VARS.WARP_PLATFORM_API}** — For custom triggers — webhooks, internal dashboards, other events — use the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk) to start runs programmatically. ## 4. Monitor factory runs diff --git a/src/content/docs/guides/external-tools/build-a-mattermost-bot-for-warp-factories.mdx b/src/content/docs/guides/external-tools/build-a-mattermost-bot-for-warp-factories.mdx index d5641e581..c54df95a2 100644 --- a/src/content/docs/guides/external-tools/build-a-mattermost-bot-for-warp-factories.mdx +++ b/src/content/docs/guides/external-tools/build-a-mattermost-bot-for-warp-factories.mdx @@ -8,14 +8,14 @@ sidebar: --- import { VARS } from '@data/vars'; -Build a Mattermost bot that sends work to a [Warp factory](/factories/) and posts progress back into the thread where it started, the same experience Warp's own [Slack integration](/factories/integrations/slack/) gives teams that use Slack. Warp doesn't ship a Mattermost integration directly, so this guide uses the [factory API](/factories/factory-api/) to build the equivalent yourself. It takes about 20 minutes if you already have a Mattermost bot account and a factory set up. +Build a Mattermost bot that sends work to a [Warp factory](/factories/) and posts progress back into the thread where it started, the same experience Warp's own [Slack integration](/factories/integrations/slack/) gives teams that use Slack. Warp doesn't ship a Mattermost integration directly, so this guide uses [factory endpoints](/factories/factory-api/) to build the equivalent yourself. It takes about 20 minutes if you already have a Mattermost bot account and a factory set up. ## Prerequisites * **A Warp Factories factory** - [Set up a factory](/factories/quickstart/) before starting; this guide dispatches work to an existing factory rather than creating one. * **A Warp API key** - Create an [agent API key](/agents/cli/oz-cli/api-keys/#personal-vs-agent-keys) rather than a personal key, so the bot's requests aren't tied to your individual account. * **A Mattermost bot account and access token** - Create one from your Mattermost System Console under **Integrations** > **Bot Accounts**, and generate a personal access token for it. Mattermost's own [bot accounts documentation](https://developers.mattermost.com/integrate/reference/bot-accounts/) covers the exact steps, since they vary by Mattermost version and hosting setup. -* **The {VARS.API_SDK_NAME} Python SDK** - Install it with `pip install oz-agent-sdk`. If you're working in another language, the [factory API page](/factories/factory-api/) shows the equivalent REST calls. +* **The {VARS.WARP_PLATFORM_API} Python SDK** - Install it with `pip install oz-agent-sdk`. If you're working in another language, [factory endpoints](/factories/factory-api/) show the equivalent REST calls. ## 1. Store your credentials @@ -28,7 +28,7 @@ export MATTERMOST_WEBHOOK_TOKEN=YOUR_MATTERMOST_WEBHOOK_TOKEN export MATTERMOST_URL=https://YOUR_MATTERMOST_SERVER ``` -The bot uses the Warp API key to call the factory API, the bot token to post replies back into the channel, and the webhook token to confirm each inbound request actually came from Mattermost. +The bot uses the Warp API key to call factory endpoints, the bot token to post replies back into the channel, and the webhook token to confirm each inbound request actually came from Mattermost. ## 2. Create an outgoing webhook in Mattermost @@ -167,6 +167,6 @@ Call `check_and_report` from a scheduled job (a cron-triggered script, or a ligh You've built a Mattermost bot that discovers a factory by name, dispatches tasks with source context attached, and routes replies to the run that's already in progress. From here: -* [Use the factory API](/factories/factory-api/) - The full discover-and-dispatch reference this guide builds on. +* [Use factory endpoints](/factories/factory-api/) - The full discover-and-dispatch reference this guide builds on. * [Connect your factory](/factories/connect-your-factory/) - Compare this custom integration against Warp's built-in intake sources. -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - Full endpoint reference for run status, follow-ups, and cancellation. +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) - Full endpoint reference for run status, follow-ups, and cancellation. diff --git a/src/content/docs/platform/agents.mdx b/src/content/docs/platform/agents.mdx index 7ac6aa772..a6ffb6406 100644 --- a/src/content/docs/platform/agents.mdx +++ b/src/content/docs/platform/agents.mdx @@ -18,7 +18,7 @@ A run executes as a cloud agent when it's authenticated with an [agent API key]( * **Schedules** — Cron-style recurring runs. See [Scheduled agents](/platform/triggers/scheduled-agents/). * **Integrations** — Slack mentions, Linear issue updates, GitHub Actions workflow steps. See [Integrations](/platform/integrations/). -* **API and SDK** — Programmatic runs from your own backend, scripts, or webhooks via the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/). +* **API and SDK** — Programmatic runs from your own backend, scripts, or webhooks via the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/). * **CLI** — `oz agent run-cloud` from a developer machine, CI pipeline, or self-hosted worker. See the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/). Each run is tracked in the <a href={`${VARS.WEB_APP_URL}/runs`}>{VARS.DASHBOARD}</a> with its trigger source, the environment it ran in, and the full transcript. @@ -76,7 +76,7 @@ Cloud agents — and individual runs — can also be granted specific capabiliti * [Environments](/platform/environments/) - The runtime context (Docker image, repos, setup commands) a cloud agent uses. * [Multi-agent orchestration](/platform/orchestration/) - Coordinate a parent cloud agent and its children across local and cloud runs. * [API keys](/agents/cli/oz-cli/api-keys/) - Create personal and agent API keys. -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - Programmatic access to the cloud agent endpoints. +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) - Programmatic access to the cloud agent endpoints. * [Federated identity tokens](/agents/cli/oz-cli/federate/) - Issue OIDC tokens from inside a run. * [{VARS.WEB_APP}](/platform/oz-web-app/) - Manage cloud agents and inspect their runs in the web UI. * [Admin Panel](/knowledge-and-collaboration/admin-panel/) - Team-level billing and access controls. diff --git a/src/content/docs/platform/architecture.mdx b/src/content/docs/platform/architecture.mdx index 26e455d24..a14e8f706 100644 --- a/src/content/docs/platform/architecture.mdx +++ b/src/content/docs/platform/architecture.mdx @@ -15,7 +15,7 @@ The platform has five layers: clients, the Warp-operated control plane that coor ![Warp stack overview diagram showing clients, the Warp control plane, the data plane, Warp-hosted and customer-hosted execution planes, and external systems](../../../assets/agent-platform/warp-stack-overview.png) * **Clients** - The surfaces that start and observe work, like the Warp app, the {VARS.WARP_AGENT_CLI}, the web app, the [factory dashboard](/factories/factory-dashboard/), and clients connected through the [Factory MCP](/factories/factory-mcp/). All clients talk to the same control plane APIs. -* **APIs** - The control plane's entry points: the [Agent API and SDKs](/factories/api-and-sdk/), a webhook receiver for [integration](/platform/integrations/) events, and the hosted Factory MCP endpoint. +* **APIs** - The control plane's entry points: the [Warp Platform API and SDKs](/factories/developer-tools/), a webhook receiver for [integration](/platform/integrations/) events, and the hosted Factory MCP endpoint. * **Control plane** - Warp coordinates runs, manages shared configuration, routes model calls, and records run history. * **Data plane** - Run data (transcripts, artifacts, and attachments) lives in Warp-managed storage, independent of where runs execute. * **Warp-hosted execution** - By default, each cloud agent run gets an isolated sandbox prepared from its environment. See [Warp-hosted execution](/factories/warp-hosting/). diff --git a/src/content/docs/platform/index.mdx b/src/content/docs/platform/index.mdx index a50628c65..ae7e6747d 100644 --- a/src/content/docs/platform/index.mdx +++ b/src/content/docs/platform/index.mdx @@ -98,7 +98,7 @@ For details on configuring MCP servers for cloud agents, see [MCP Servers](/plat #### API access to tasks -The {VARS.WARP_AUTOMATION_PLATFORM} exposes task visibility via the [**{VARS.API_SDK_NAME}**](/factories/api-and-sdk/), so teams can: +The {VARS.WARP_AUTOMATION_PLATFORM} exposes task visibility via the [**{VARS.WARP_PLATFORM_API}**](/factories/api-and-sdk/), so teams can: * Query which tasks are running or have run. * Fetch task metadata and outcomes. @@ -155,7 +155,7 @@ If your credit balance reaches zero, cloud agent runs will not be able to execut ### Learn more * [Cloud agents quickstart](/platform/quickstart/) — run your first cloud agent with an environment in ~10 minutes. -* [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) — CLI, {VARS.API_SDK_NAME}, orchestration, tasks, environments, hosts, integrations, and more. +* [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) — CLI, {VARS.WARP_PLATFORM_API}, orchestration, tasks, environments, hosts, integrations, and more. * [Warp Factories](/factories/) — assemble cloud agents into a standing triage-to-merge workflow with named agents, automations, and measurement. * [Harnesses](/platform/harnesses/) — pick between Warp Agent, Claude Code, and Codex for any cloud agent run. * [Agents](/platform/agents/) — cloud agents that own and execute runs on your team. @@ -163,7 +163,7 @@ If your credit balance reaches zero, cloud agent runs will not be able to execut * [Skills as Agents](/platform/skills-as-agents/) — run agents based on reusable skill definitions from the CLI, web app, API, or on a schedule. * [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) — shows how to run agents in non-interactive mode from CI, scripts, or remote machines, including auth and common commands. * [Environments](/platform/environments/) — explains how environments provide the runtime context (repo, image, startup commands) for agent tasks. -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — documents the REST API for creating, querying, and monitoring agent tasks programmatically. +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) — documents the REST API for creating, querying, and monitoring agent tasks programmatically. * [Agent Secrets](/platform/secrets/) — covers how to store, scope, and inject credentials into agent runs safely. * [MCP Servers](/platform/mcp/) — how to configure MCP servers for agent tool access and how MCP configuration is applied across runs. * [Deployment Patterns](/factories/deployment-patterns/) (beta) — compares common ways to deploy cloud agents and when to use each. diff --git a/src/content/docs/platform/integrations/cloud-providers.mdx b/src/content/docs/platform/integrations/cloud-providers.mdx index 19fb399b0..16320d869 100644 --- a/src/content/docs/platform/integrations/cloud-providers.mdx +++ b/src/content/docs/platform/integrations/cloud-providers.mdx @@ -300,7 +300,7 @@ Team ID: xyz789 Team Name: My Team ``` -You can also check the user IDs from past runs using the {VARS.API_SDK_NAME}: +You can also check the user IDs from past runs using the {VARS.WARP_PLATFORM_API}: ```bash curl https://app.warp.dev/api/v1/agent/runs -H "Authorization: Bearer $WARP_API_KEY" diff --git a/src/content/docs/platform/orchestration/index.mdx b/src/content/docs/platform/orchestration/index.mdx index a0c97d2cd..82b5b5b2a 100644 --- a/src/content/docs/platform/orchestration/index.mdx +++ b/src/content/docs/platform/orchestration/index.mdx @@ -7,7 +7,7 @@ sidebar: import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; -Multi-agent orchestration lets one agent spawn and coordinate other agents to parallelize work, delegate specialized tasks, or verify another agent's output. The parent/child model works from the Warp app, the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/), and the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/), and supports local, cloud, and mixed execution. +Multi-agent orchestration lets one agent spawn and coordinate other agents to parallelize work, delegate specialized tasks, or verify another agent's output. The parent/child model works from the Warp app, the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/), and the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/), and supports local, cloud, and mixed execution. Watch this walkthrough to see how a cloud agent can coordinate a team of agents in the cloud. @@ -15,7 +15,7 @@ Watch this walkthrough to see how a cloud agent can coordinate a team of agents To start an orchestrated run, see [Running orchestrated agents](/platform/orchestration/multi-agent-runs/). -To orchestrate work inside a [Warp factory](/factories/), dispatch through the [factory API](/factories/factory-api/) instead of calling `POST /agent/runs` with the foreman's `agent_identity_uid` directly. The server resolves the foreman for you, and everything on this page still applies to the run it starts. +To orchestrate work inside a [Warp factory](/factories/), dispatch through [factory endpoints](/factories/factory-api/) instead of calling `POST /agent/runs` with the foreman's `agent_identity_uid` directly. The server resolves the foreman for you, and everything on this page still applies to the run it starts. ## The parent/child model @@ -24,7 +24,7 @@ An orchestrated workflow always has one **parent agent** and one or more **child * **Parent agent** - the agent that decides what work needs to be done, spawns child agents, and (optionally) merges their results. Any agent can become a parent the first time it spawns a child. * **Child agent** - an agent spawned by a parent with its own prompt, environment, and (optionally) a different model or agent runtime. A child runs its own work and reports back; it does not spawn its own children. -Orchestrations today are exactly one level deep: a parent and its direct children. The Warp app, the [{VARS.WEB_APP}](/platform/oz-web-app/), and the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) render that single level. The parent and each child each have an independent **run** with its own lifecycle, transcript, conversation, and credit usage. +Orchestrations today are exactly one level deep: a parent and its direct children. The Warp app, the [{VARS.WEB_APP}](/platform/oz-web-app/), and the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) render that single level. The parent and each child each have an independent **run** with its own lifecycle, transcript, conversation, and credit usage. ### Where parent and child agents can run @@ -63,7 +63,7 @@ Track run state transitions in these places: * **The parent's transcript** - the parent agent receives child state transitions as it runs and reflects them in its own conversation. * **The orchestration pill bar** - in the Warp app, while you're viewing the parent agent, a horizontal pill bar above the agent view header shows the parent on the left and one pill per child. Each pill displays the child's name and a status badge that updates live. Click a pill to switch the pane to that child's conversation in place; click the parent pill to switch back. * **The {VARS.WEB_APP}** - cloud children appear under the parent on the <a href={`${VARS.WEB_APP_URL}/runs`}>Runs page</a> and in the parent's **Sub-agents** tab, with their status updating live. -* **The {VARS.API_SDK_NAME}** - `GET /agent/runs/{runId}` returns the latest state of any run, and `GET /agent/runs?ancestor_run_id=PARENT_RUN_ID` lists every descendant in one call. +* **The {VARS.WARP_PLATFORM_API}** - `GET /agent/runs/{runId}` returns the latest state of any run, and `GET /agent/runs?ancestor_run_id=PARENT_RUN_ID` lists every descendant in one call. ## Messaging between agents @@ -124,13 +124,13 @@ Because every parent and child is tracked as its own conversation or run, the ex * **[Managing cloud agents](/platform/managing-cloud-agents/)** - in the Warp app, the orchestration pill bar above the agent view header lets you switch between the parent and each child while you're viewing the parent. Cloud children also appear as their own rows in the Agent Management Panel list. * **[{VARS.WEB_APP}](/platform/oz-web-app/)** - the Runs page groups cloud children under the parent's row, and the parent's detail pane adds a **Sub-agents** tab. -* **[{VARS.API_SDK_NAME}](/factories/api-and-sdk/)** - list every descendant of a parent in one call and fetch any run with its conversation, transcript, and artifacts. See [Running orchestrated agents](/platform/orchestration/multi-agent-runs/#retrieving-conversations-and-artifacts). +* **[{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/)** - list every descendant of a parent in one call and fetch any run with its conversation, transcript, and artifacts. See [Running orchestrated agents](/platform/orchestration/multi-agent-runs/#retrieving-conversations-and-artifacts). * **[Agent notifications](/agents/capabilities/agent-notifications/)** - in-app notifications fire on the parent agent's conversation only. Use the pill bar or the **Sub-agents** tab to drill into a specific child. ## Related pages * [Running orchestrated agents](/platform/orchestration/multi-agent-runs/) - how to start an orchestrated run from the CLI, slash command, web app, or API. * [How to run multiple AI coding agents](/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/) - practical guidance for splitting tasks, assigning worktrees, validating child output, and handing work off for review. -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - REST endpoints for runs, conversations, and artifacts. +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) - REST endpoints for runs, conversations, and artifacts. * [Cloud agents overview](/platform/) - what a cloud agent run is and how it fits into the {VARS.WARP_AUTOMATION_PLATFORM}. * [Deployment patterns](/factories/deployment-patterns/) - higher-level deployment models that orchestration composes with. diff --git a/src/content/docs/platform/orchestration/multi-agent-runs.mdx b/src/content/docs/platform/orchestration/multi-agent-runs.mdx index efbf2e416..9878a7f2f 100644 --- a/src/content/docs/platform/orchestration/multi-agent-runs.mdx +++ b/src/content/docs/platform/orchestration/multi-agent-runs.mdx @@ -1,13 +1,13 @@ --- title: Running orchestrated agents -description: Start multi-agent orchestrations from the Warp app, the {{WARP_AGENT_CLI}}, the {{WEB_APP}}, or the {{API_SDK_NAME}}, and inspect parent and child conversations and artifacts. +description: Start multi-agent orchestrations from the Warp app, the {{WARP_AGENT_CLI}}, the {{WEB_APP}}, or the {{WARP_PLATFORM_API}}, and inspect parent and child conversations and artifacts. sidebar: label: "Running orchestrated agents" --- import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; -An orchestrated run starts with a parent agent that spawns one or more child agents. You can start a parent from the Warp app, the {VARS.WARP_AGENT_CLI}, the {VARS.WEB_APP}, or the {VARS.API_SDK_NAME}. Use orchestrated runs to review a plan before fan-out, execute children locally or in the cloud, and inspect parent and child conversations as they work. +An orchestrated run starts with a parent agent that spawns one or more child agents. You can start a parent from the Warp app, the {VARS.WARP_AGENT_CLI}, the {VARS.WEB_APP}, or the {VARS.WARP_PLATFORM_API}. Use orchestrated runs to review a plan before fan-out, execute children locally or in the cloud, and inspect parent and child conversations as they work. Watch this walkthrough to see how to start and inspect an orchestrated agent run from Warp. @@ -18,7 +18,7 @@ Watch this walkthrough to see how to start and inspect an orchestrated agent run Pick where the parent will run. Every orchestration starts with a single parent that spawns children: * **Parent in the Warp app** - use the `/orchestrate` or `/plan` slash command. This is the fastest way to try orchestration. -* **Parent in the cloud** - trigger the parent through the {VARS.WARP_AGENT_CLI} (`oz agent run-cloud`), the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/), any [integration](/platform/integrations/) such as [Slack](/platform/integrations/slack/) or [Linear](/platform/integrations/linear/), or a [schedule](/platform/triggers/scheduled-agents/). The parent runs in an environment and spawns children from there. +* **Parent in the cloud** - trigger the parent through the {VARS.WARP_AGENT_CLI} (`oz agent run-cloud`), the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/), any [integration](/platform/integrations/) such as [Slack](/platform/integrations/slack/) or [Linear](/platform/integrations/linear/), or a [schedule](/platform/triggers/scheduled-agents/). The parent runs in an environment and spawns children from there. Cloud parents that spawn cloud children need access to one or more [environments](/platform/environments/) the children can run in. To keep child execution on your own infrastructure, route those children to a [self-hosted worker](/factories/self-hosting/). @@ -79,7 +79,7 @@ The parent run starts and children appear in the Runs list as the parent spawns Spawn the parent with `POST /agent/runs`. Children can either be spawned by the parent agent at runtime, or you can spawn each child explicitly from your code and link it to the parent with `parent_run_id`. Once they're running, coordination between the parent and its children flows through Warp's durable agent-to-agent messaging - see [Messaging between agents](/platform/orchestration/#messaging-between-agents) for the model. -This section spawns a standalone parent run. If the parent you want to start is a [Warp factory](/factories/)'s foreman, use the [factory API](/factories/factory-api/) to dispatch by factory UID instead of looking up the foreman's `agent_identity_uid` and calling `POST /agent/run` directly. +This section spawns a standalone parent run. If the parent you want to start is a [Warp factory](/factories/)'s foreman, use [factory endpoints](/factories/factory-api/) to dispatch by factory UID instead of looking up the foreman's `agent_identity_uid` and calling `POST /agent/run` directly. ### Agent-driven orchestration @@ -151,7 +151,7 @@ done ## Retrieving conversations and artifacts -Every parent and child started through the {VARS.API_SDK_NAME} is tracked as a {VARS.PLATFORM_RUN}. Run responses include the run's `state`, `parent_run_id` (set on children only), `conversation_id`, `session_link`, and an `artifacts` array of any pull requests, plans, screenshots, or files the run produced. Use the same endpoints you'd use for any other run: +Every parent and child started through the {VARS.WARP_PLATFORM_API} is tracked as a {VARS.PLATFORM_RUN}. Run responses include the run's `state`, `parent_run_id` (set on children only), `conversation_id`, `session_link`, and an `artifacts` array of any pull requests, plans, screenshots, or files the run produced. Use the same endpoints you'd use for any other run: * **List every descendant of a parent** - `GET /api/v1/agent/runs?ancestor_run_id=YOUR_PARENT_RUN_ID`. From the CLI: `oz run list --ancestor-run YOUR_PARENT_RUN_ID`. * **Get one run's details and artifacts** - `GET /api/v1/agent/runs/YOUR_RUN_ID`. @@ -194,7 +194,7 @@ Self-hosted, local, and GitHub Action runs cannot be cancelled through this endp * [Multi-agent orchestration](/platform/orchestration/) - parent/child model, run state transitions, and common patterns. * [How to run multiple AI coding agents](/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/) - practical task decomposition, worktree ownership, validation, and review handoff guidance. * [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) - command reference for `oz agent run-cloud` and `oz run`. -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - full HTTP reference and typed SDKs. +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) - full HTTP reference and typed SDKs. * [Managing cloud agents](/platform/managing-cloud-agents/) - how parent and child runs appear in the Agent Management Panel in the Warp app and the Runs page in the {VARS.WEB_APP}. * [Scheduled agents](/platform/triggers/scheduled-agents/) - start a recurring cloud parent that fans out children on a cron cadence. * [Self-hosting](/factories/self-hosting/) - keep parent or child execution on your infrastructure while Warp tracks the runs. diff --git a/src/content/docs/platform/overview.mdx b/src/content/docs/platform/overview.mdx index 7243c720d..aa656eee6 100644 --- a/src/content/docs/platform/overview.mdx +++ b/src/content/docs/platform/overview.mdx @@ -54,7 +54,7 @@ The [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) starts and manages runs where t ## API and SDKs -The [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) creates and inspects tasks over HTTP: submit a prompt with optional configuration, poll status, and fetch results with full provenance. Teams use it to start agents from incident tooling and internal systems, build dashboards over run history, and coordinate large batches of runs. Official [Python](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript](https://github.com/warpdotdev/oz-sdk-typescript) SDKs add typed requests and responses, built-in retries, and consistent errors. Start with an SDK unless you need full control over your HTTP client. +The [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) creates and inspects tasks over HTTP: submit a prompt with optional configuration, poll status, and fetch results with full provenance. Teams use it to start agents from incident tooling and internal systems, build dashboards over run history, and coordinate large batches of runs. Official [Python](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript](https://github.com/warpdotdev/oz-sdk-typescript) SDKs add typed requests and responses, built-in retries, and consistent errors. Start with an SDK unless you need full control over your HTTP client. ## Secrets @@ -74,4 +74,4 @@ Runs pick up your team's shared setup no matter what triggered them: [MCP server * [Cloud agents](/platform/) - what cloud agents are, how they get triggered, and how to run them with or without the Warp app. * [Cloud agents quickstart](/platform/quickstart/) - run your first cloud agent in about ten minutes. * [Environments](/platform/environments/) - define the toolchain and repos a run executes against. -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) - drive the platform programmatically. +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) - drive the platform programmatically. diff --git a/src/content/docs/platform/oz-web-app.mdx b/src/content/docs/platform/oz-web-app.mdx index 131cfca2e..12fc8807d 100644 --- a/src/content/docs/platform/oz-web-app.mdx +++ b/src/content/docs/platform/oz-web-app.mdx @@ -252,4 +252,4 @@ For detailed integration setup instructions, see [Slack](/platform/integrations/ * [Environments](/platform/environments/) — Configure runtime context for cloud agents * [Managing Cloud Agents](/platform/managing-cloud-agents/) — Monitor agent activity and inspect runs * [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) — Command-line interface for running agents -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — Programmatic access to cloud agents +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) — Programmatic access to cloud agents diff --git a/src/content/docs/platform/quickstart.mdx b/src/content/docs/platform/quickstart.mdx index 45bbc2d73..dc62652c9 100644 --- a/src/content/docs/platform/quickstart.mdx +++ b/src/content/docs/platform/quickstart.mdx @@ -114,7 +114,7 @@ Now that you've run your first cloud agent, try these next steps: * [**Trigger agents from Slack or Linear**](/platform/integrations/quickstart/) - Connect Warp to team tools so mentions and issue updates can launch cloud agent runs. * [**Orchestrate multiple agents**](/platform/orchestration/multi-agent-runs/) - Fan work out across parent and child agents for large refactors, PR review swarms, and parallel package migrations. * [**Turn successful prompts into reusable skills**](/platform/skills-as-agents/) - Save repeatable agent workflows and run them again from the CLI, web app, API, or a schedule. -* [**Build programmatic automations**](/factories/api-and-sdk/quickstart/) - Start cloud agent runs from your own systems with the {VARS.API_SDK_NAME}. +* [**Build programmatic automations**](/factories/api-and-sdk/quickstart/) - Start cloud agent runs from your own systems with the {VARS.WARP_PLATFORM_API}. For example, schedule a recurring agent from the CLI: diff --git a/src/content/docs/platform/secrets.mdx b/src/content/docs/platform/secrets.mdx index 528e53d30..d11582d61 100644 --- a/src/content/docs/platform/secrets.mdx +++ b/src/content/docs/platform/secrets.mdx @@ -292,7 +292,7 @@ Individual runs can override which secrets the run receives by listing them on t * **Explicit list of secret names** - Only the listed secrets are injected. Any other secrets the caller can access are skipped for this run. * **Empty list** - The run opts out of all secret injection. No managed secrets are injected, even for triggers that would otherwise receive them. -Run-level scoping is exposed through the public REST API on the run config. See the [{VARS.API_SDK_NAME} reference](/factories/api-and-sdk/) for the exact field and shape. +Run-level scoping is exposed through the public REST API on the run config. See the [{VARS.WARP_PLATFORM_API} reference](/factories/api-and-sdk/) for the exact field and shape. :::note Secret names that don't exist in the caller's scope are silently skipped at injection time rather than failing the run. The run detail view surfaces any references that were requested but not resolved so you can spot typos or stale names. diff --git a/src/content/docs/platform/skills-as-agents.mdx b/src/content/docs/platform/skills-as-agents.mdx index 56ec7cb5c..d70e0fa49 100644 --- a/src/content/docs/platform/skills-as-agents.mdx +++ b/src/content/docs/platform/skills-as-agents.mdx @@ -54,7 +54,7 @@ For cloud agent runs (`oz agent run-cloud`), skills are discovered from reposito 3. **The skill appears** in the Agents list in the {VARS.WEB_APP} :::note -You can also list available skills programmatically using the `GET /agent` endpoint. See the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) reference for details. +You can also list available skills programmatically using the `GET /agent` endpoint. See the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) reference for details. ::: ### Extra skill directories in cloud runs @@ -167,4 +167,4 @@ Suggested skills appear on the Agents page under the **Suggested** filter. * [Scheduled Agents](/platform/triggers/scheduled-agents/) — Run agents automatically on a cron schedule * [{VARS.WEB_APP}](/platform/oz-web-app/) — Visual interface for managing cloud agents * [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) — Command-line interface for running agents -* [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) — Programmatic access to cloud agents +* [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) — Programmatic access to cloud agents diff --git a/src/content/docs/platform/team-access-billing-and-identity.mdx b/src/content/docs/platform/team-access-billing-and-identity.mdx index 413c04936..0ff3590b0 100644 --- a/src/content/docs/platform/team-access-billing-and-identity.mdx +++ b/src/content/docs/platform/team-access-billing-and-identity.mdx @@ -38,7 +38,7 @@ Individual users can run cloud agents via the CLI or API without being part of a **How it works:** -* Run agents using `oz agent run-cloud` or the {VARS.API_SDK_NAME} +* Run agents using `oz agent run-cloud` or the {VARS.WARP_PLATFORM_API} * Credits are drawn from your Warp credits (including cloud agent credits, when applicable) * Agents execute on Warp-hosted infrastructure diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx index 9f0686126..f70d419d6 100644 --- a/src/content/docs/platform/transitioning-from-oz.mdx +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -1,36 +1,42 @@ --- title: Transitioning from the {{WEB_APP}} description: >- - Continue supported legacy cloud-agent workflows and decide whether Warp - Factories fits new multi-stage development work. + Understand how legacy web app, CLI, SDK, and API workflows remain supported + while Warp Factories becomes the path for new software factories. sidebar: label: "Transitioning from the {{WEB_APP}}" --- import { VARS } from '@data/vars'; -Existing {VARS.WARP_AUTOMATION_PLATFORM} workflows remain supported. You don't need to change an existing workflow to use Warp Factories. +Existing users do not need to take action to keep using their current workflows. Warp Factories is the path for new standing, multi-stage software development workflows. -For new multi-stage development workflows, use Warp Factories. A factory builds on the {VARS.WARP_AUTOMATION_PLATFORM} to route work through specialized agents, add review stages, and show the progress of work. +## Current status and future direction -## Where to manage work +| Surface | Current status | Future direction | +| --- | --- | --- | +| **{VARS.WEB_APP}** | Existing workflows continue to work. | Existing workflows remain supported. Migration guidance will be available over time. | +| **{VARS.WARP_AGENT_CLI} (`oz`)** | Existing commands continue to work. | Relevant functionality moves toward the {VARS.WARP_CLI}. Warp will publish migration guidance before support changes. | +| **{VARS.WARP_CLI} (`warp`)** | Available for its current supported functionality. | The preferred direction for CLI functionality. | +| **`oz-sdk-python` and `oz-sdk-typescript`** | Existing SDK packages continue to work. | Packages may be renamed or repackaged under Warp with migration guidance. | +| **{VARS.WARP_PLATFORM_API}** | Existing endpoints continue to work; no endpoint migration is required. | Documentation and naming may change while compatibility remains. | +| **New software factories** | Use [Warp Factories](https://platform.warp.dev) for new multi-stage development workflows. | Warp Factories remains the primary product experience for software factories. | -* **Existing {VARS.WARP_AUTOMATION_PLATFORM} workflows** - Continue using the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> for existing cloud agents, environments, schedules, integrations, and runs. -* **New factory workflows** - Use the <a href={VARS.FACTORY_WEB_APP_URL}>factory dashboard</a> to build and operate multi-stage development workflows. Start with the [Warp Factories overview](/factories/) or the [factory quickstart](/factories/quickstart/). +## Moving an existing workflow -## CLI, API, and SDK support +### Existing web app workflows -Existing interfaces remain supported: +Continue using the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> for existing cloud agents, environments, schedules, integrations, and runs. Moving an existing workflow into a factory is optional and evaluated case by case with an engineering DRI. -* **{VARS.WARP_AGENT_CLI}** - Existing `oz` commands continue to work. -* **{VARS.API_SDK_NAME}** - Existing API endpoints and SDK packages continue to work. -* **Cloud-agent configuration** - Existing agents, environments, schedules, integrations, API keys, and secrets remain available. +### CLI functionality -## Moving an existing workflow into a factory +Continue using `oz` commands for existing workflows. Use the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) for current command reference and the [{VARS.WARP_CLI}](/agents/cli/) for current `warp` functionality. -Moving an existing {VARS.WARP_AUTOMATION_PLATFORM} workflow into a factory is optional. Each workflow has different integrations, configuration, and operating requirements, so work with an engineering DRI to evaluate the move. Warp will publish guidance before any support change. +### SDK packages and API + +The official SDK repositories retain their current package names: [Python](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript](https://github.com/warpdotdev/oz-sdk-typescript). Existing API integrations remain compatible as documentation moves to the [{VARS.WARP_PLATFORM_API}](/factories/developer-tools/). ## Related pages * [{VARS.WARP_AUTOMATION_PLATFORM} overview](/platform/overview/) - Configure standalone cloud-agent workflows. * [Warp Factories overview](/factories/) - Build and operate a standing software factory. -* [Factory dashboard](/factories/factory-dashboard/) - Inspect work items, runs, and factory settings. +* [{VARS.WARP_PLATFORM_API} & SDKs](/factories/developer-tools/) - Use factory endpoints, Agent & run endpoints, SDKs, and API errors. diff --git a/src/content/docs/platform/unmanaged-execution.mdx b/src/content/docs/platform/unmanaged-execution.mdx index eadd5dc62..15df82c37 100644 --- a/src/content/docs/platform/unmanaged-execution.mdx +++ b/src/content/docs/platform/unmanaged-execution.mdx @@ -123,7 +123,7 @@ Unmanaged agents are tracked on Warp's backend. Each run creates a persistent se * **View** in the <a href={VARS.WEB_APP_URL}>{VARS.DASHBOARD}</a>. * **Attach to** via [Agent Session Sharing](/agents/local-agents/session-sharing/) to monitor or steer. -* **Query** through the [{VARS.API_SDK_NAME}](/factories/api-and-sdk/) for custom dashboards or monitoring. +* **Query** through the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) for custom dashboards or monitoring. Unmanaged sessions benefit from the same shared configuration as other cloud agent runs — [MCP servers](/platform/mcp/), [secrets](/platform/secrets/), Warp Drive context, and saved prompts all apply. diff --git a/src/content/docs/support-and-community/plans-and-billing/credits.mdx b/src/content/docs/support-and-community/plans-and-billing/credits.mdx index 4d4cdf2dc..6d42f9ee4 100644 --- a/src/content/docs/support-and-community/plans-and-billing/credits.mdx +++ b/src/content/docs/support-and-community/plans-and-billing/credits.mdx @@ -129,7 +129,7 @@ The following scenarios use compute credits: * **First-party integrations** - Running agents through Warp's integrations (Slack, Linear, GitHub, and others) * **Cloud agent runs** - Using `oz agent run-cloud` via the CLI -* **{VARS.API_SDK_NAME}** - Running agents through Warp's API +* **{VARS.WARP_PLATFORM_API}** - Running agents through Warp's API * **Cloud Mode** - Running an agent from Cloud Mode in the Warp app ### Not eligible for compute credits diff --git a/src/data/vars.ts b/src/data/vars.ts index eb2dab80c..41058f032 100644 --- a/src/data/vars.ts +++ b/src/data/vars.ts @@ -7,9 +7,8 @@ // Use the future/conceptual name as the key; the value holds the current string. export const VARS = { - // Platform — renamed 8/18. The remaining Oz-valued keys below are the - // deliberate 10/6 holdouts: the `oz` binary and the Oz v1 webapp keep their - // names until that date, so they are NOT stale, they are pending. + // The `oz` binary and Oz web app are supported legacy surfaces. Their names + // remain in place while Warp publishes transition guidance for each surface. // // IMPORTANT: "Automation Platform" is a common-noun phrase, not a proper // noun like "Oz" was. Referential uses need a definite article in the prose @@ -17,9 +16,9 @@ export const VARS = { // attributive uses do not ("{{…}} settings", "{{…}}-hosted"). style_lint // enforces this. Do not add a bare referential use. WARP_AUTOMATION_PLATFORM: "Automation Platform", - WARP_AGENT_CLI: "Oz CLI", // the `oz` binary — holds until 10/6, then "Warp Agent CLI" - WEB_APP: "Oz web app", // legacy Oz v1 webapp (oz.warp.dev) — holds until 10/6 - WEB_APP_URL: "https://oz.warp.dev", // holds until 10/6, then "https://app.warp.dev" + WARP_AGENT_CLI: "Oz CLI", + WEB_APP: "Oz web app", + WEB_APP_URL: "https://oz.warp.dev", // Renamed per HYC (8/17), same shape as PLATFORM_RUN below: a plain // platform-level term, with "factory dashboard" written directly on pages // that are specifically about a factory. Lowercase: "Warp Factories" is the @@ -41,7 +40,7 @@ export const VARS = { // Kept singular so `{VARS.PLATFORM_RUN}s` pluralizes correctly at the call // sites that do that. PLATFORM_RUN: "cloud agent run", - API_SDK_NAME: "Oz API & SDK", // holds until 10/6, then "Warp API & SDK" + WARP_PLATFORM_API: "Warp Platform API", // Warp Factories web app — a net-new product surface at platform.warp.dev // (soft launch ~2026-08-18), separate from the legacy Oz v1 webapp above. @@ -50,17 +49,8 @@ export const VARS = { FACTORY_WEB_APP: "Warp Factories web app", FACTORY_WEB_APP_URL: "https://platform.warp.dev", - // Warp Agent CLI — the standalone terminal front-end (the `warp` binary). - // Launch name confirmed via the launch blog draft (2026-07-28). - // - // NOTE: the WARP_AGENT_CLI key above was reserved for renaming the Oz CLI to - // this same name. That overlap is now resolved by product direction: on - // 2026-10-06 (the same holdout date as the WARP_AGENT_CLI value above, not - // the 8/18 platform rename) the Oz CLI is retired and wrapped into the Warp - // Agent CLI, leaving a single CLI. The two keys are expected to collapse - // into one at that point. Keeping them separate until the convergence - // ships, since merging them now would rewrite prose across both CLI doc - // surfaces. + // Warp Agent CLI — the preferred direction for CLI functionality (the + // `warp` binary). Relevant Oz CLI functionality will move here over time. WARP_CLI: "Warp Agent CLI", // Feature names (stable — keys and values expected to remain unchanged) diff --git a/src/pages/api.astro b/src/pages/api.astro index 4701d9132..68fd401c4 100644 --- a/src/pages/api.astro +++ b/src/pages/api.astro @@ -36,24 +36,24 @@ const specBaseUrl = (specObject.servers as Array<{ url?: string }> | undefined)? <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> - <title>Agent API Reference | Warp - + Warp Platform API reference | Warp + - - + + - + - - + + @@ -199,17 +199,17 @@ const specBaseUrl = (specObject.servers as Array<{ url?: string }> | undefined)? document.body.classList.add(resolved === 'dark' ? 'dark-mode' : 'light-mode'); })(); - +
llms.txt. -

Warp Automation Platform HTTP API reference

+

Warp Platform API reference

-
+

{specInfo?.title}

{specInfo?.description}

Base URL: {specBaseUrl}

@@ -261,8 +261,8 @@ const specBaseUrl = (specObject.servers as Array<{ url?: string }> | undefined)? // doesn't show a fake "interactive" affordance (per scalar/scalar#5079). defaultOpenAllTags: true, metaData: { - title: 'Agent API Reference', - description: 'Interactive API reference for the Agent API.', + title: 'Warp Platform API reference', + description: 'Interactive reference for the Warp Platform API.', }, // --------------------------------------------------------------- // Scalar consumes `customCss` as a runtime string, so we can't diff --git a/src/pages/openapi.yaml.ts b/src/pages/openapi.yaml.ts index 801660a5b..b846187a1 100644 --- a/src/pages/openapi.yaml.ts +++ b/src/pages/openapi.yaml.ts @@ -4,7 +4,7 @@ import fs from 'node:fs'; export const prerender = true; /** - * Serves the raw Oz Agent API OpenAPI spec at /openapi.yaml so LLMs, crawlers, + * Serves the raw Warp Platform API OpenAPI spec at /openapi.yaml so LLMs, crawlers, * and developer tooling can consume the machine-readable definition directly. * * The spec source of truth is `developers/agent-api-openapi.yaml` (same file diff --git a/src/sidebar.ts b/src/sidebar.ts index 763beaf58..41ec8ea40 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -397,9 +397,23 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // sidebar. Two of these deliberately mirror the Automation Platform tab // next door, since the underlying concepts are the same. items: [ - { slug: 'factories', label: 'Overview' }, - { slug: 'factories/how-factories-work', label: 'How Factories work' }, - { slug: 'factories/quickstart', label: 'Quickstart' }, + { + label: 'Overview', + items: [ + { slug: 'factories', label: 'Overview' }, + { slug: 'factories/how-factories-work', label: 'How Factories work' }, + { slug: 'factories/quickstart', label: 'Quickstart' }, + ], + }, + { + label: 'Measure and improve', + items: [ + { slug: 'factories/measure-and-improve', label: 'Overview' }, + { slug: 'factories/measure-and-improve/scorers', label: 'Scorers' }, + { slug: 'factories/measure-and-improve/self-improvement', label: 'Self-improvement' }, + { slug: 'factories/benchmarks', label: 'Benchmarks' }, + ], + }, { // Parallel to 'Agent configuration' in the Automation Platform tab. // Scoped to the factory itself: who runs the work, how it is defined, @@ -413,6 +427,29 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // agents and Factory skills, not just a filters reference. { slug: 'factories/automations', label: 'Factory automations' }, { slug: 'factories/factory-as-code', label: 'Definitions as code' }, + { + label: 'Infrastructure', + items: [ + { slug: 'factories/infrastructure-and-security', label: 'Overview' }, + { slug: 'factories/deployment-patterns', label: 'Deployment patterns' }, + { slug: 'factories/warp-hosting', label: 'Warp-hosted execution' }, + { slug: 'factories/runners', label: 'Runners' }, + { + label: 'Managed self-hosting', + collapsed: false, + items: [ + { slug: 'factories/self-hosting', label: 'Overview' }, + { slug: 'factories/self-hosting/quickstart', label: 'Quickstart' }, + { slug: 'factories/self-hosting/managed-docker', label: 'Docker backend' }, + { slug: 'factories/self-hosting/managed-kubernetes', label: 'Kubernetes backend' }, + { slug: 'factories/self-hosting/managed-direct', label: 'Direct backend' }, + 'factories/self-hosting/monitoring', + { slug: 'factories/self-hosting/reference', label: 'Worker reference' }, + 'factories/self-hosting/troubleshooting', + ], + }, + ], + }, ], }, { @@ -436,7 +473,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // Integrations > Integrations > Slack. // // 'Connect your factory' leads because it is the overview for this - // group. The direct developer interfaces live in the Developer tools + // group. The direct developer interfaces live in the API & SDKs // group rather than alongside third-party service integrations. label: 'Integrations', items: [ @@ -447,15 +484,15 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ ], }, { - label: 'Developer tools', + label: 'API & SDKs', items: [ { slug: 'factories/developer-tools', label: 'Overview' }, - { slug: 'factories/factory-api', label: 'Factory API' }, - { slug: 'factories/api-and-sdk', label: VARS.API_SDK_NAME }, - { slug: 'factories/api-and-sdk/quickstart', label: 'Quickstart' }, + { slug: 'factories/factory-api', label: 'Factory endpoints' }, + { slug: 'factories/api-and-sdk', label: 'Agent & run endpoints' }, { label: 'API reference', link: '/api' }, - { slug: 'factories/api-and-sdk/demo-sentry-monitoring-with-sdk', label: 'Sentry monitoring with the SDK' }, - { slug: 'factories/api-and-sdk/troubleshooting/errors', label: 'API errors' }, + { label: 'Python SDK', link: 'https://github.com/warpdotdev/oz-sdk-python' }, + { label: 'TypeScript SDK', link: 'https://github.com/warpdotdev/oz-sdk-typescript' }, + { slug: 'factories/api-and-sdk/troubleshooting/errors', label: 'Errors' }, { slug: 'factories/factory-mcp', label: 'Factory MCP' }, { label: 'Webhooks', @@ -468,55 +505,16 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ ], }, { - label: 'Infrastructure & security', - items: [ - { slug: 'factories/infrastructure-and-security', label: 'Overview' }, - { slug: 'factories/deployment-patterns', label: 'Deployment patterns' }, - { slug: 'factories/warp-hosting', label: 'Warp-hosted execution' }, - { slug: 'factories/runners', label: 'Runners' }, - { - label: 'Managed self-hosting', - collapsed: false, - items: [ - { slug: 'factories/self-hosting', label: 'Overview' }, - { slug: 'factories/self-hosting/quickstart', label: 'Quickstart' }, - { slug: 'factories/self-hosting/managed-docker', label: 'Docker backend' }, - { slug: 'factories/self-hosting/managed-kubernetes', label: 'Kubernetes backend' }, - { slug: 'factories/self-hosting/managed-direct', label: 'Direct backend' }, - 'factories/self-hosting/monitoring', - { slug: 'factories/self-hosting/reference', label: 'Worker reference' }, - 'factories/self-hosting/troubleshooting', - ], - }, - ], - }, - { - // Same label as the Automation Platform tab's group for watching and - // steering runs, because it covers the same ground one level up: the - // factory dashboard is where you watch a factory, and scorers are how - // you measure it. + // The factory dashboard and inbox are operational surfaces. Measurement + // and optimization pages live earlier under 'Measure and improve'. label: 'Management & observability', items: [ { slug: 'factories/factory-inbox', label: 'Factory inbox' }, { slug: 'factories/factory-dashboard', label: 'Factory dashboard' }, - { - label: 'Measure and improve', - collapsed: false, - items: [ - { slug: 'factories/measure-and-improve', label: 'Overview' }, - { slug: 'factories/measure-and-improve/scorers', label: 'Scorers' }, - { slug: 'factories/measure-and-improve/self-improvement', label: 'Self-improvement' }, - { slug: 'factories/benchmarks', label: 'Benchmarks' }, - ], - }, ], }, - // Troubleshooting sits outside the groups near the end of the tab. It was in - // 'Management & observability' next to the dashboard and Scorers pages, - // which read as a sibling of the measurement surfaces rather than as - // the place you go when something is broken. A bare trailing item is - // the same shape the Automation Platform tab uses for its leading - // 'Overview'. + // Keep troubleshooting and legacy transition guidance as direct trailing + // items rather than creating singleton groups. { slug: 'factories/troubleshooting', label: 'Troubleshooting' }, { slug: 'platform/transitioning-from-oz', label: 'Legacy Oz workflows' }, ], From e0e043c04e755f291f758afbf06a2e6379b9a472 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Fri, 18 Sep 2026 16:35:17 -0600 Subject: [PATCH 38/63] docs: clarify transition review metadata Co-Authored-By: Warp --- .github/workflows/agent-docs-review.yml | 2 ++ src/content/docs/factories/developer-tools.mdx | 3 ++- src/content/docs/platform/transitioning-from-oz.mdx | 2 +- src/data/vars.ts | 6 +++++- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/agent-docs-review.yml b/.github/workflows/agent-docs-review.yml index 235912604..5ea082e98 100644 --- a/.github/workflows/agent-docs-review.yml +++ b/.github/workflows/agent-docs-review.yml @@ -45,6 +45,8 @@ jobs: sudo apt-get install -y gpg curl --fail --location https://releases.warp.dev/linux/keys/warp.asc \ --output /tmp/warpdotdev.asc + # Verified against releases.warp.dev/linux/keys/warp.asc on 2026-09-18. + # Reverify this fingerprint before updating the Warp signing key. test "$( gpg --show-keys --with-colons /tmp/warpdotdev.asc | awk -F: '/^fpr:/ { print $10; exit }' diff --git a/src/content/docs/factories/developer-tools.mdx b/src/content/docs/factories/developer-tools.mdx index e845a1254..5f8d2da0b 100644 --- a/src/content/docs/factories/developer-tools.mdx +++ b/src/content/docs/factories/developer-tools.mdx @@ -8,7 +8,7 @@ sidebar: --- import { VARS } from '@data/vars'; -The {VARS.WARP_PLATFORM_API} serves both factories and standalone cloud agent runs. factory endpoints send work to a factory; agent and run endpoints start and manage standalone runs. Both endpoint families use the same API key, API reference, SDKs, and error model. +The {VARS.WARP_PLATFORM_API} serves both factories and standalone cloud agent runs. The factory endpoints send work to a factory; agent and run endpoints start and manage standalone runs. Both endpoint families use the same API key, API reference, SDKs, and error model. ## Choose an API surface @@ -20,6 +20,7 @@ The {VARS.WARP_PLATFORM_API} serves both factories and standalone cloud agent ru * **[API errors](/factories/api-and-sdk/troubleshooting/errors/)** - Resolve error responses by HTTP status and machine-readable code. * **[Factory MCP](/factories/factory-mcp/)** - Exchange work between a factory and a connected coding agent or MCP client. * **[Webhooks](/factories/webhooks/)** - Receive events from systems that can send JSON and route matching deliveries into factory automations. + ## Get started Start with the [API & SDK quickstart](/factories/api-and-sdk/quickstart/) to create and inspect a run. For a production event source, use the [Sentry monitoring example](/factories/api-and-sdk/demo-sentry-monitoring-with-sdk/) to connect a webhook handler. diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx index f70d419d6..cf0df5846 100644 --- a/src/content/docs/platform/transitioning-from-oz.mdx +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -25,7 +25,7 @@ Existing users do not need to take action to keep using their current workflows. ### Existing web app workflows -Continue using the {VARS.WEB_APP} for existing cloud agents, environments, schedules, integrations, and runs. Moving an existing workflow into a factory is optional and evaluated case by case with an engineering DRI. +Continue using the {VARS.WEB_APP} for existing cloud agents, environments, schedules, integrations, and runs. Moving an existing workflow into a factory is optional. Contact your account team to evaluate the move for your workflow. ### CLI functionality diff --git a/src/data/vars.ts b/src/data/vars.ts index 41058f032..36ff3f24c 100644 --- a/src/data/vars.ts +++ b/src/data/vars.ts @@ -16,6 +16,8 @@ export const VARS = { // attributive uses do not ("{{…}} settings", "{{…}}-hosted"). style_lint // enforces this. Do not add a bare referential use. WARP_AUTOMATION_PLATFORM: "Automation Platform", + // Legacy key retained for existing Oz CLI references. It refers only to the + // `oz` binary; use WARP_CLI for the separate Warp Agent CLI (`warp` binary). WARP_AGENT_CLI: "Oz CLI", WEB_APP: "Oz web app", WEB_APP_URL: "https://oz.warp.dev", @@ -50,7 +52,9 @@ export const VARS = { FACTORY_WEB_APP_URL: "https://platform.warp.dev", // Warp Agent CLI — the preferred direction for CLI functionality (the - // `warp` binary). Relevant Oz CLI functionality will move here over time. + // `warp` binary). This is distinct from WARP_AGENT_CLI, which references + // the legacy Oz CLI (`oz` binary). Relevant Oz CLI functionality will move + // here over time. WARP_CLI: "Warp Agent CLI", // Feature names (stable — keys and values expected to remain unchanged) From 4ac79e160bd7c5784b24531f25a1ee5dfcae63db Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Fri, 18 Sep 2026 16:52:56 -0600 Subject: [PATCH 39/63] docs: tokenize API transition references Co-Authored-By: Warp --- src/content/docs/factories/developer-tools.mdx | 4 ++-- src/content/docs/platform/transitioning-from-oz.mdx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/docs/factories/developer-tools.mdx b/src/content/docs/factories/developer-tools.mdx index 5f8d2da0b..b0e515296 100644 --- a/src/content/docs/factories/developer-tools.mdx +++ b/src/content/docs/factories/developer-tools.mdx @@ -1,7 +1,7 @@ --- -title: Warp Platform API & SDKs +title: "{{WARP_PLATFORM_API}} & SDKs" description: >- - Use the Warp Platform API, SDKs, Factory MCP, and webhooks to integrate + Use the {{WARP_PLATFORM_API}}, SDKs, Factory MCP, and webhooks to integrate factories and cloud agent runs with your tools and services. sidebar: label: "Overview" diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx index cf0df5846..3e094e7bd 100644 --- a/src/content/docs/platform/transitioning-from-oz.mdx +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -19,7 +19,7 @@ Existing users do not need to take action to keep using their current workflows. | **{VARS.WARP_CLI} (`warp`)** | Available for its current supported functionality. | The preferred direction for CLI functionality. | | **`oz-sdk-python` and `oz-sdk-typescript`** | Existing SDK packages continue to work. | Packages may be renamed or repackaged under Warp with migration guidance. | | **{VARS.WARP_PLATFORM_API}** | Existing endpoints continue to work; no endpoint migration is required. | Documentation and naming may change while compatibility remains. | -| **New software factories** | Use [Warp Factories](https://platform.warp.dev) for new multi-stage development workflows. | Warp Factories remains the primary product experience for software factories. | +| **New software factories** | Use Warp Factories for new multi-stage development workflows. | Warp Factories remains the primary product experience for software factories. | ## Moving an existing workflow From fc2c1d6cf7a81a6a0d2fdace5ba8e3e8e92b7789 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Fri, 18 Sep 2026 17:26:09 -0600 Subject: [PATCH 40/63] docs: refine factories navigation and transition copy Co-Authored-By: Warp --- .../docs/factories/developer-tools.mdx | 2 +- .../docs/platform/transitioning-from-oz.mdx | 6 ++--- src/sidebar.ts | 27 +++++++++++-------- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/content/docs/factories/developer-tools.mdx b/src/content/docs/factories/developer-tools.mdx index b0e515296..d6dfa9ecf 100644 --- a/src/content/docs/factories/developer-tools.mdx +++ b/src/content/docs/factories/developer-tools.mdx @@ -12,7 +12,7 @@ The {VARS.WARP_PLATFORM_API} serves both factories and standalone cloud agent ru ## Choose an API surface -* **[factory endpoints](/factories/factory-api/)** - Find a factory and send work to it by UID from your application or service. +* **[Factory endpoints](/factories/factory-api/)** - Find a factory and send work to it by UID from your application or service. * **[Agent & run endpoints](/factories/api-and-sdk/)** - Start, monitor, continue, and cancel cloud agent runs from scripts, CI, and backend services. * **[Warp Platform API reference](/api)** - Look up the full HTTP schema, parameters, and responses. * **[Python SDK](https://github.com/warpdotdev/oz-sdk-python)** - Make typed requests from Python. The current package retains its `oz-sdk-python` name. diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx index 3e094e7bd..9a132166c 100644 --- a/src/content/docs/platform/transitioning-from-oz.mdx +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -1,14 +1,14 @@ --- title: Transitioning from the {{WEB_APP}} description: >- - Understand how legacy web app, CLI, SDK, and API workflows remain supported - while Warp Factories becomes the path for new software factories. + Keep existing legacy web app, CLI, SDK, and API workflows while using Warp + Factories for new multi-stage software development workflows. sidebar: label: "Transitioning from the {{WEB_APP}}" --- import { VARS } from '@data/vars'; -Existing users do not need to take action to keep using their current workflows. Warp Factories is the path for new standing, multi-stage software development workflows. +Warp Factories supports new multi-stage software development workflows. Existing users can continue using their current workflows without taking action. ## Current status and future direction diff --git a/src/sidebar.ts b/src/sidebar.ts index 41ec8ea40..a0e56df77 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -473,8 +473,8 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // Integrations > Integrations > Slack. // // 'Connect your factory' leads because it is the overview for this - // group. The direct developer interfaces live in the API & SDKs - // group rather than alongside third-party service integrations. + // group. The direct developer interfaces live in Developer tools + // rather than alongside third-party service integrations. label: 'Integrations', items: [ { slug: 'factories/connect-your-factory', label: 'Connect your factory' }, @@ -484,15 +484,20 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ ], }, { - label: 'API & SDKs', + label: 'Developer tools', items: [ - { slug: 'factories/developer-tools', label: 'Overview' }, - { slug: 'factories/factory-api', label: 'Factory endpoints' }, - { slug: 'factories/api-and-sdk', label: 'Agent & run endpoints' }, - { label: 'API reference', link: '/api' }, - { label: 'Python SDK', link: 'https://github.com/warpdotdev/oz-sdk-python' }, - { label: 'TypeScript SDK', link: 'https://github.com/warpdotdev/oz-sdk-typescript' }, - { slug: 'factories/api-and-sdk/troubleshooting/errors', label: 'Errors' }, + { + label: 'API & SDKs', + items: [ + { slug: 'factories/developer-tools', label: 'Overview' }, + { slug: 'factories/factory-api', label: 'Factory endpoints' }, + { slug: 'factories/api-and-sdk', label: 'Agent & run endpoints' }, + { label: 'API reference', link: '/api' }, + { label: 'Python SDK', link: 'https://github.com/warpdotdev/oz-sdk-python' }, + { label: 'TypeScript SDK', link: 'https://github.com/warpdotdev/oz-sdk-typescript' }, + { slug: 'factories/api-and-sdk/troubleshooting/errors', label: 'Errors' }, + ], + }, { slug: 'factories/factory-mcp', label: 'Factory MCP' }, { label: 'Webhooks', @@ -544,7 +549,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ items: [ { slug: 'platform', label: 'Overview' }, { slug: 'platform/quickstart', label: 'Quickstart' }, - { slug: 'platform/transitioning-from-oz', label: `Transitioning from the ${VARS.WEB_APP}` }, + { slug: 'platform/transitioning-from-oz', label: 'Transitioning from Oz' }, { // Runtime (which agent executes the run) is kept separate from // configuration (how any run is set up) -- HYC review, 8/14. From 960f26733486d8089d3373a115066c2b10877c12 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Sat, 19 Sep 2026 17:06:35 -0600 Subject: [PATCH 41/63] docs: audit self-hosting redirect and review CLI Co-Authored-By: Warp --- .../doc_quality_policy/test_agent_docs_review_workflow.py | 1 + .github/workflows/agent-docs-review.yml | 1 + vercel.json | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py index cbb225c65..483bb47cd 100644 --- a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py +++ b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py @@ -46,6 +46,7 @@ def test_review_uses_a_signed_oz_package(self): self.assertIn("0913165C78D5B7A41B42AC657FF7AB39D60F803F", self.workflow) self.assertIn("signed-by=/etc/apt/keyrings/warpdotdev.gpg", self.workflow) self.assertIn("sudo apt-get install -y oz-stable", self.workflow) + self.assertIn("oz --version", self.workflow) if __name__ == "__main__": diff --git a/.github/workflows/agent-docs-review.yml b/.github/workflows/agent-docs-review.yml index 5ea082e98..fa6946366 100644 --- a/.github/workflows/agent-docs-review.yml +++ b/.github/workflows/agent-docs-review.yml @@ -59,6 +59,7 @@ jobs: EOF sudo apt-get update sudo apt-get install -y oz-stable + oz --version PROMPT="$(cat <<'EOF' Run the review-docs-pr skill against warpdotdev/docs PR #${{ github.event.pull_request.number }} at head SHA ${{ github.event.pull_request.head.sha }}. This PR carries the warpy-factory agent diff --git a/vercel.json b/vercel.json index 74ef548d5..1ee6a3c17 100644 --- a/vercel.json +++ b/vercel.json @@ -5204,7 +5204,7 @@ }, { "source": "/agent-platform/cloud-agents/self-hosting/managed-worker-reference", - "destination": "/platform/self-hosting/", + "destination": "/factories/self-hosting/", "statusCode": 308 }, { From 3d1bc763c920cbe617371c23bed2fc00ca94dd2a Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Sat, 19 Sep 2026 17:36:56 -0600 Subject: [PATCH 42/63] docs: collapse managed self-hosting navigation Co-Authored-By: Warp --- src/sidebar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidebar.ts b/src/sidebar.ts index a0e56df77..c3d3055a1 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -436,7 +436,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'factories/runners', label: 'Runners' }, { label: 'Managed self-hosting', - collapsed: false, + collapsed: true, items: [ { slug: 'factories/self-hosting', label: 'Overview' }, { slug: 'factories/self-hosting/quickstart', label: 'Quickstart' }, From ef2d3db11cc7ec9f433d5e17c014c44d7d778427 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Sat, 19 Sep 2026 17:45:20 -0600 Subject: [PATCH 43/63] docs: reorder measure and improve navigation Co-Authored-By: Warp --- src/sidebar.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/sidebar.ts b/src/sidebar.ts index c3d3055a1..12b4b7c98 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -405,15 +405,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'factories/quickstart', label: 'Quickstart' }, ], }, - { - label: 'Measure and improve', - items: [ - { slug: 'factories/measure-and-improve', label: 'Overview' }, - { slug: 'factories/measure-and-improve/scorers', label: 'Scorers' }, - { slug: 'factories/measure-and-improve/self-improvement', label: 'Self-improvement' }, - { slug: 'factories/benchmarks', label: 'Benchmarks' }, - ], - }, { // Parallel to 'Agent configuration' in the Automation Platform tab. // Scoped to the factory itself: who runs the work, how it is defined, @@ -462,6 +453,15 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'factories/code-forges/other-code-forges', label: 'Other code forges' }, ], }, + { + label: 'Measure & improve', + items: [ + { slug: 'factories/measure-and-improve', label: 'Overview' }, + { slug: 'factories/measure-and-improve/scorers', label: 'Scorers' }, + { slug: 'factories/measure-and-improve/self-improvement', label: 'Self-improvement' }, + { slug: 'factories/benchmarks', label: 'Benchmarks' }, + ], + }, { // 'Integrations' per HYC (8/17), replacing 'Work intake'. // @@ -521,7 +521,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // Keep troubleshooting and legacy transition guidance as direct trailing // items rather than creating singleton groups. { slug: 'factories/troubleshooting', label: 'Troubleshooting' }, - { slug: 'platform/transitioning-from-oz', label: 'Legacy Oz workflows' }, + { slug: 'platform/transitioning-from-oz', label: `Transitioning from the ${VARS.WEB_APP}` }, ], }, { @@ -549,7 +549,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ items: [ { slug: 'platform', label: 'Overview' }, { slug: 'platform/quickstart', label: 'Quickstart' }, - { slug: 'platform/transitioning-from-oz', label: 'Transitioning from Oz' }, + { slug: 'platform/transitioning-from-oz', label: `Transitioning from the ${VARS.WEB_APP}` }, { // Runtime (which agent executes the run) is kept separate from // configuration (how any run is set up) -- HYC review, 8/14. From 4edbe89d2710001896432c699dcc620d87396564 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Sat, 19 Sep 2026 17:50:52 -0600 Subject: [PATCH 44/63] docs: clarify factory definition Co-Authored-By: Warp --- src/content/docs/factories/how-factories-work.mdx | 2 +- src/content/docs/factories/index.mdx | 6 +++--- src/content/docs/factories/quickstart.mdx | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/content/docs/factories/how-factories-work.mdx b/src/content/docs/factories/how-factories-work.mdx index daa8b4c55..435685dcb 100644 --- a/src/content/docs/factories/how-factories-work.mdx +++ b/src/content/docs/factories/how-factories-work.mdx @@ -11,7 +11,7 @@ sidebar: Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. ::: -A factory is a standing software development workflow that connects your repositories and engineering tools to a team of agents and execution infrastructure. It takes in requests, moves them through the stages they need, and turns them into pull requests ready for review. You talk to one agent, the **foreman**, from the tool that sends the request, such as Slack or Linear. The foreman dispatches the factory's other agents, and each one owns a part of the software development lifecycle. +A factory is a fleet of agents wired to your software development lifecycle. It connects your repositories and tools to move requests through triage, specification, implementation, review, and verification, while people stay in control of key decisions. You talk to one agent, the **foreman**, from the tool that sends the request, such as Slack or Linear. The foreman dispatches the factory's other agents, and each one owns a part of the software development lifecycle. Deciding which repositories belong in this factory is a separate question. See [sizing a factory](/factories/#sizing-a-factory) for that guidance. diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index 0bbe6894d..ab6592660 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -13,7 +13,7 @@ import VideoEmbed from '@components/VideoEmbed.astro'; Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. If your team already has access, sign in to the {VARS.FACTORY_WEB_APP}. ::: -A factory is a standing software development workflow that connects your repositories and engineering tools to a team of agents and execution infrastructure. It takes in requests, manages them from triage through review, and turns a growing backlog into mergeable pull requests. Your team stays in the loop to approve specifications and merge each pull request. +A factory is a cloud automation loop around your software development lifecycle. It combines repositories, tools, agents, and execution infrastructure to move requests through triage, specification, implementation, review, and verification, while people stay in control of key decisions. @@ -63,13 +63,13 @@ Warp Factories builds on the same agent infrastructure used across Warp. Every f | --- | --- | | **Warp** | The interactive development experience for local work with agents and code review. | | **Warp Agent** | The built-in agent harness that can power an individual factory agent. | -| **Warp Factories** | Standing multi-agent workflows for software development. | +| **Warp Factories** | Multi-agent workflows for software development. | ## Key terms Setup gives a factory and its foreman the same name by default, so it's easy to mistake one for the other. Here's how the terms differ: -* **factory** - A standing software development workflow that connects repositories, tools, agents, execution infrastructure, and a measurable workflow. Distinct from Warp Factories, the product, and from the foreman, its coordinating agent. +* **factory** - A cloud automation loop around your software development lifecycle. It combines repositories, tools, agents, and execution infrastructure to move requests through the factory workflow. Distinct from Warp Factories, the product, and from the foreman, its coordinating agent. * **foreman** - The coordinating agent inside a factory, and the only one you talk to. It dispatches the other [factory agents](/factories/factory-agents/) and reports back. Every factory has exactly one. * **Foreman name** - The handle your team @-mentions in Slack and Linear to reach the foreman. Setup copies it from the factory's name, so the two usually match even though they're different things. See [Foreman name](/factories/factory-agents/#foreman-name). diff --git a/src/content/docs/factories/quickstart.mdx b/src/content/docs/factories/quickstart.mdx index 88612a194..0439bcc9b 100644 --- a/src/content/docs/factories/quickstart.mdx +++ b/src/content/docs/factories/quickstart.mdx @@ -12,7 +12,7 @@ import { VARS } from '@data/vars'; Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. ::: -A factory is a standing software development workflow that connects your repositories and engineering tools to a team of agents and execution infrastructure. You talk to one agent, the **foreman**. It picks up the request from wherever it starts, such as Slack, an issue tracker, or a code host, then dispatches the factory's other agents, each owning one part of the software development lifecycle. People stay in the loop at the points that matter: approving specs when needed and merging pull requests. +A factory is a fleet of agents wired to your software development lifecycle. It connects your repositories and tools to move requests through triage, specification, implementation, review, and verification, while people stay in control of key decisions. You talk to one agent, the **foreman**. It picks up the request from wherever it starts, such as Slack, an issue tracker, or a code host, then dispatches the factory's other agents, each owning one part of the software development lifecycle. In this quickstart, you will create a factory and take one small work item from prompt to pull request in less than 10 minutes. From fa760ca8dfadfbb5804af95fa50982dc2f4d056d Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Sat, 19 Sep 2026 18:04:00 -0600 Subject: [PATCH 45/63] docs: condense factories quickstart Co-Authored-By: Warp --- src/content/docs/factories/quickstart.mdx | 50 ++++++++--------------- 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/src/content/docs/factories/quickstart.mdx b/src/content/docs/factories/quickstart.mdx index 0439bcc9b..b6e410ee1 100644 --- a/src/content/docs/factories/quickstart.mdx +++ b/src/content/docs/factories/quickstart.mdx @@ -18,20 +18,13 @@ In this quickstart, you will create a factory and take one small work item from ## What you'll decide -Warp walks you through factory setup. Along the way, you decide: - -* The code host and repositories the factory works on. -* The factory's name and its foreman's @-mention alias. -* Which default agents the foreman can dispatch. -* Whether to connect a chat tool and an issue tracker, or add them later. - -You can change any of these after setup, so a best guess is fine for now. +Setup connects your code host, selects repositories, names the factory and its foreman, and chooses default agents. You can also connect Slack and an issue tracker now or add them later. Every choice can be changed after setup. ## Prerequisites -* **Warp Factories access** - Warp Factories is in Early Access. [Request access](https://www.warp.dev/factories/request-access) for your team. -* **A Warp team with credits** - A factory belongs to a [Warp team](/knowledge-and-collaboration/teams/). Factory agents consume the team's [credits](/support-and-community/plans-and-billing/platform-credits/). -* **Repository access** - You authorize a code host during setup and choose which repositories the factory can reach. If your organization restricts app installations, ask an owner to approve the connection. See the [GitHub](/factories/integrations/github/) and [GitLab](/factories/integrations/gitlab/) integration guides. +* **Warp Factories access** - [Request Early Access](https://www.warp.dev/factories/request-access) for your team. +* **A Warp team with credits** - The team's [credits](/support-and-community/plans-and-billing/platform-credits/) are consumed by factory agents. +* **Repository access** - Authorize GitHub or GitLab during setup. If your organization restricts app installations, ask an owner to approve the connection. ## Set up your factory @@ -50,44 +43,37 @@ Warp walks you through a setup wizard:
Click + next to Factories to open the setup wizard.
-2. Click **I want to use repos from GitHub** or **I want to use repos from GitLab**, then choose the organization or group you want to connect. +2. Click **I want to use repos from GitHub** or **I want to use repos from GitLab**, then choose the organization or group to connect. - :::note - To use a repository hosted on another code forge, select **No repo**, finish creating the factory, then [configure repository access from the default runner](/factories/code-forges/other-code-forges/). - ::: + To use another code forge, select **No repo**, finish creating the factory, then [configure repository access from the default runner](/factories/code-forges/other-code-forges/).
![The Connect a GitHub organization screen, with an already-connected organization shown as an option.](../../../assets/factories/quickstart-connect-organization.png)
Choose the organization or group whose repositories the factory will use. GitLab shows an equivalent screen for groups.
-3. On **Select your repos**, search for and select the repositories the factory works in, then click **Add repos**. Start with one or two. Every agent in the factory shares this repo set, so a focused set keeps their context tight, and you can add more later. This step applies to GitHub and GitLab connections. - - :::note - Group repositories by product surface, not by team or task. For example, group all the repos behind one application. See [sizing a factory](/factories/#sizing-a-factory) before adding a repository another factory already covers. - ::: +3. On **Select your repos**, select the repositories the factory works in, then click **Add repos**. Start with one or two repositories that ship together, and add more later. See [sizing a factory](/factories/#sizing-a-factory) before adding a repository another factory already covers.
![The Select your repos screen, searching for repositories by name.](../../../assets/factories/quickstart-select-repos.png)
Search for and select the repositories the factory works in.
-4. Name the factory. This also sets its [**Foreman name**](/factories/factory-agents/#foreman-name), the handle your team @-mentions in Slack and Linear. Keep it short and recognizable, or set your own. The two match by default, but they name different things: the handle reaches the factory's foreman, the agent that coordinates its work. +4. Name the factory. This also sets its [**Foreman name**](/factories/factory-agents/#foreman-name), the handle your team @-mentions in Slack and Linear. The factory and foreman names match by default, but the foreman is the agent that coordinates its work.
![The Give your factory some personality screen, with Factory name and Foreman name fields filled in.](../../../assets/factories/quickstart-name-factory.png)
Name the factory and, optionally, add a description and avatar.
-5. Optionally, connect a chat tool so teammates can hand work to the factory from Slack. You can also skip this step and connect Slack later. See [connect your factory](/factories/connect-your-factory/). -6. Toggle the agents the foreman can dispatch: **Triage**, **Spec**, **Implement**, and **Review**. All four start enabled, and at least one is required. Leave **Implement** on so this quickstart can end in a pull request. See [factory agents](/factories/factory-agents/) for what each does. +5. Toggle the agents the foreman can dispatch: **Triage**, **Spec**, **Implement**, and **Review**. All four start enabled. Leave **Implement** on so this quickstart can end in a pull request. See [factory agents](/factories/factory-agents/) for details.
![The Pick your factory agents screen, with the Foreman and all four default agents shown as enabled.](../../../assets/factories/quickstart-pick-agents.png)
Toggle which default agents the foreman can dispatch.
-7. Optionally, connect an issue tracker so teammates can hand work to the factory from Linear or Jira. You can also skip this step and connect one later. See [connect your factory](/factories/connect-your-factory/). +6. Optionally connect Slack and an issue tracker so teammates can hand work to the factory from the tools they already use. You can add either later from [connect your factory](/factories/connect-your-factory/). Warp creates the factory and opens its [dashboard](/factories/factory-dashboard/). @@ -95,7 +81,7 @@ Warp creates the factory and opens its [dashboard](/factories/factory-dashboard/ _~5 minutes_ -You can request work from the tools your team already uses. Mention the factory in a Slack channel, or assign it an issue in your tracker, and it replies right there. If you skipped the integrations, start a run from the **Runs** page of the factory's [dashboard](/factories/factory-dashboard/) instead. +Send work from Slack or an issue tracker. If you skipped integrations, start a run from the **Runs** page of the factory's [dashboard](/factories/factory-dashboard/). 1. Describe one small, verifiable change and send it: @@ -105,9 +91,9 @@ You can request work from the tools your team already uses. Mention the factory repo's lint check, and open a pull request. ``` - Adapt the pattern to your repository: name the file, the change you expect, and the command that verifies it. A narrow, explicit request makes the first run easy to judge. + Name the file, expected change, and verification command. -2. The foreman picks up the request, dispatches the factory's agents as child runs, and posts progress and questions back where the request started. Follow the foreman's run and the child runs it dispatches on the factory's [Runs page](/factories/factory-dashboard/#inspect-runs). If anything needs your input, such as a spec approval or a finished pull request to review, it also appears in your [inbox](/factories/factory-inbox/). +2. The foreman dispatches the agents needed for the request and posts progress where it started. Follow the foreman and child runs on the factory's [Runs page](/factories/factory-dashboard/#inspect-runs). Requests for input also appear in your [inbox](/factories/factory-inbox/). If you connected Slack, you can follow along there instead: @@ -116,12 +102,12 @@ You can request work from the tools your team already uses. Mention the factory
The factory's Slack app posting progress updates back in the thread where you sent the request.
-3. When the Implement agent finishes, the work item links to the pull request. Review and merge it the way you would any other: a factory hands off at the pull request and never merges for you. +3. When the Implement agent finishes, review and merge the linked pull request as you would any other. ## Next steps -* [**Connect your factory**](/factories/connect-your-factory/) - Route work in from Slack threads, Linear issues, and other intake paths. -* [**Factory MCP**](/factories/factory-mcp/) - Send work to the factory from a coding agent or MCP client. -* [**How Warp Factories work**](/factories/how-factories-work/) - The work-item lifecycle and where people stay in the loop. +* [**Connect your factory**](/factories/connect-your-factory/) - Configure intake sources. +* [**Factory MCP**](/factories/factory-mcp/) - Send work from a coding agent or MCP client. +* [**How Warp Factories work**](/factories/how-factories-work/) - Understand the work-item lifecycle. * [**warp-factory-examples**](https://github.com/warpdotdev/warp-factory-examples) - Complete working definitions to copy, from a single-repo quickstart to the full issue-to-PR lifecycle. -* [**Troubleshooting Warp Factories**](/factories/troubleshooting/) - Fixes for common issues during setup and your first runs. +* [**Troubleshooting Warp Factories**](/factories/troubleshooting/) - Fix common setup and run issues. From a6a30e8ac0cf0dc693be3ccadb36caf171dcf8e1 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Sat, 19 Sep 2026 18:08:04 -0600 Subject: [PATCH 46/63] docs: remove stale LLM reference set Co-Authored-By: Warp --- astro.config.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/astro.config.mjs b/astro.config.mjs index 3393454db..0e7f43640 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -228,7 +228,6 @@ export default defineConfig({ { label: 'Enterprise', description: 'Enterprise features, SSO, team management, and security.', paths: ['enterprise/**'] }, { label: 'Getting Started', description: 'Installation, quickstart, and migration guides.', paths: ['index', 'quickstart', 'getting-started/**'] }, { label: 'Knowledge and Collaboration', description: 'Warp Drive, teams, and the Admin Panel.', paths: ['knowledge-and-collaboration/**'] }, - { label: 'API & Reference', description: 'CLI and API reference.', paths: ['reference/**'] }, // All support-and-community/ pages. open-source-licenses.mdx is excluded // globally above (stack overflow in hast-util-to-text); the patch ensures // it's excluded from this custom set as well. From 98cc0cfba6a0e4327b0a6e92421b8f26767b2c39 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Mon, 21 Sep 2026 10:17:00 -0600 Subject: [PATCH 47/63] docs: address API documentation review Co-Authored-By: Warp --- .agents/references/terminology.md | 4 ++-- .agents/skills/style_lint/style_lint.py | 3 ++- .../sync-openapi-spec/references/sync-policy.md | 13 ++++++++++++- .../sync-openapi-spec/scripts/sync_openapi.py | 15 +++++++++++++++ .../docs/factories/api-and-sdk/index.mdx | 17 +++++------------ .../docs/factories/api-and-sdk/quickstart.mdx | 6 +++--- .../docs/factories/deployment-patterns.mdx | 3 +-- src/content/docs/factories/developer-tools.mdx | 2 +- src/content/docs/factories/factory-api.mdx | 2 +- src/content/docs/factories/factory-as-code.mdx | 2 +- src/content/docs/factories/quickstart.mdx | 3 --- src/content/docs/platform/architecture.mdx | 6 +++--- src/content/docs/platform/index.mdx | 2 +- src/data/vars.ts | 2 +- 14 files changed, 48 insertions(+), 32 deletions(-) diff --git a/.agents/references/terminology.md b/.agents/references/terminology.md index c786e3eed..b47ccb4d5 100644 --- a/.agents/references/terminology.md +++ b/.agents/references/terminology.md @@ -248,7 +248,6 @@ Not every "Oz" in the docs is stale. These are deliberate and correct until - **The `oz` binary** and every `oz ` invocation. Commands inside code fences are never rewritten. `{VARS.WARP_AGENT_CLI}` renders "Oz CLI". - **`oz.warp.dev`** and the Oz v1 web app. `{VARS.WEB_APP}`, `{VARS.WEB_APP_URL}`. -- **`{VARS.API_SDK_NAME}`**, which renders "Oz API & SDK". - **`oz-agent-worker`, `oz-agent-action`, `oz-skills`** — repository and package names, not product names. These may never change. - **The `@oz-agent` GitHub handle.** Handles are strings the product owns; @@ -262,7 +261,8 @@ Not every "Oz" in the docs is stale. These are deliberate and correct until ## Platform terms -- **Agent API** — The HTTP API for triggering and inspecting Platform runs programmatically. +- **Warp Platform API** — The HTTP API for sending work to factories and triggering and inspecting cloud agent runs programmatically. + *Usage note:* Use `{VARS.WARP_PLATFORM_API}` in body prose and `{{WARP_PLATFORM_API}}` in frontmatter. - **Auth** — The agent settings field for choosing or creating the credential (a team-owned secret) a harness uses to authenticate with its provider, matched to that harness's supported credential types (Anthropic keys for Claude Code, an OpenAI key for Codex). *Usage note:* Capitalize as **Auth** when referring to the settings field name. diff --git a/.agents/skills/style_lint/style_lint.py b/.agents/skills/style_lint/style_lint.py index 801d2f3dc..b5ed0dcab 100644 --- a/.agents/skills/style_lint/style_lint.py +++ b/.agents/skills/style_lint/style_lint.py @@ -108,7 +108,8 @@ ("oz.warp.dev", "WEB_APP_URL", "{VARS.WEB_APP_URL} in prose or {{WEB_APP_URL}} in frontmatter"), ("Oz dashboard", "DASHBOARD", "{VARS.DASHBOARD} in prose or {{DASHBOARD}} in frontmatter"), ("Oz run", "PLATFORM_RUN", "{VARS.PLATFORM_RUN} in prose or {{PLATFORM_RUN}} in frontmatter"), - ("Oz API & SDK", "API_SDK_NAME", "{VARS.API_SDK_NAME} in prose or {{API_SDK_NAME}} in frontmatter"), + ("Oz API & SDK", "WARP_PLATFORM_API", "{VARS.WARP_PLATFORM_API} in prose or {{WARP_PLATFORM_API}} in frontmatter"), + ("Warp Platform API", "WARP_PLATFORM_API", "{VARS.WARP_PLATFORM_API} in prose or {{WARP_PLATFORM_API}} in frontmatter"), ("Oz Platform", "WARP_AUTOMATION_PLATFORM", "{VARS.WARP_AUTOMATION_PLATFORM} in prose or {{WARP_AUTOMATION_PLATFORM}} in frontmatter"), ("Automation Platform", "WARP_AUTOMATION_PLATFORM", "{VARS.WARP_AUTOMATION_PLATFORM} in prose or {{WARP_AUTOMATION_PLATFORM}} in frontmatter"), ("Oz", "WARP_AUTOMATION_PLATFORM", "{VARS.WARP_AUTOMATION_PLATFORM} in prose or {{WARP_AUTOMATION_PLATFORM}} in frontmatter"), diff --git a/.agents/skills/sync-openapi-spec/references/sync-policy.md b/.agents/skills/sync-openapi-spec/references/sync-policy.md index 896b71069..f82586b18 100644 --- a/.agents/skills/sync-openapi-spec/references/sync-policy.md +++ b/.agents/skills/sync-openapi-spec/references/sync-policy.md @@ -18,7 +18,7 @@ This skill is the manual fallback for the same job, so its output has to match t top-level path operations. 2. Drop every tag listed in `EXCLUDED_TAGS`. 3. Drop every path whose tags are a subset of `EXCLUDED_TAGS`, plus every path listed explicitly in `EXCLUDED_PATHS` or matching a prefix in `EXCLUDED_PATH_PREFIXES`. -4. Keep top-level `openapi`, `info`, `servers`, and `components.securitySchemes` verbatim. +4. Keep top-level `openapi`, `servers`, and `components.securitySchemes` verbatim. Keep `info` from the source except for the docs-specific title and description override in `DOCS_INFO_OVERRIDES`. 5. Keep only reusable component entries that are reachable from surviving paths via `$ref` walking (recursive over `allOf`/`oneOf`/`anyOf`/`items`/`additionalProperties`/etc.). 6. Remove Factory-only values and matching description lines from `RunSourceType`. 7. Recursively strip every key in `STRIP_FLAGS` from whatever survives @@ -27,6 +27,17 @@ This skill is the manual fallback for the same job, so its output has to match t Rule 1 mirrors warp-server's own filter, so a surface the server team marks private stays private here without anyone having to maintain a matching allowlist entry. +## Public API metadata + +The docs copy keeps endpoint behavior, contact details, licensing, and server +configuration from `warp-server/public_api/openapi.yaml`. It overrides only +`info.title` and `info.description` through `DOCS_INFO_OVERRIDES` in +`scripts/sync_openapi.py`, so the Scalar reference uses the public docs name, +**Warp Platform API**, and describes both factory and cloud-agent runs. + +Keep this override when syncing the docs subset. Update the source spec when +its endpoint behavior or non-product metadata changes. + ## `x-internal` deletes the whole marked object, not just the flag (`_prune_internal`) `x-internal: true` mirrors openapi-format's `flagValues` semantics in diff --git a/.agents/skills/sync-openapi-spec/scripts/sync_openapi.py b/.agents/skills/sync-openapi-spec/scripts/sync_openapi.py index 2901ca2da..177100c63 100644 --- a/.agents/skills/sync-openapi-spec/scripts/sync_openapi.py +++ b/.agents/skills/sync-openapi-spec/scripts/sync_openapi.py @@ -109,6 +109,17 @@ EXCLUDED_RUN_SOURCE_VALUES: frozenset[str] = frozenset( {"BENCHMARK_TRIAL", "CREATE_BENCHMARK_TASK", "CUSTOM_WEBHOOK"} ) +# The upstream spec owns endpoint behavior and non-product metadata. The docs +# copy uses the public product name and description that frame the Scalar +# reference alongside the Factory and cloud-agent documentation. +DOCS_INFO_OVERRIDES: dict[str, str] = { + "title": "Warp Platform API", + "description": ( + "API for creating, managing, and querying factory and cloud agent runs.\n\n" + "These endpoints allow users to send work to factories, start standalone agents, " + "list runs, and retrieve detailed run information.\n" + ), +} # Default checkout layout: docs/ and warp-server/ as siblings. DEFAULT_SOURCE = Path("../warp-server/public_api/openapi.yaml") @@ -411,6 +422,8 @@ def transform(source: dict[str, Any]) -> dict[str, Any]: for top_key in ("openapi", "info", "servers"): if top_key in source: out[top_key] = source[top_key] + if isinstance(out.get("info"), dict): + out["info"] = {**out["info"], **DOCS_INFO_OVERRIDES} src_tags = source.get("tags") or [] out_tags = [ @@ -743,6 +756,8 @@ def _self_test() -> int: assert tag_names == ["agent"], f"unexpected tags: {tag_names}" assert out["components"].get("securitySchemes"), "securitySchemes should be preserved" + assert out["info"]["title"] == "Warp Platform API" + assert out["info"]["description"] == DOCS_INFO_OVERRIDES["description"] ref_errors = _validate_output(out) assert not ref_errors, f"unexpected unresolved refs: {ref_errors}" diff --git a/src/content/docs/factories/api-and-sdk/index.mdx b/src/content/docs/factories/api-and-sdk/index.mdx index 7746f0776..887df9c5e 100644 --- a/src/content/docs/factories/api-and-sdk/index.mdx +++ b/src/content/docs/factories/api-and-sdk/index.mdx @@ -5,7 +5,7 @@ sidebar: label: "Agent & run endpoints" description: >- Start, manage, and inspect cloud agent runs with the Agent and run endpoints - in the Warp Platform API. + in the {{WARP_PLATFORM_API}}. --- import VideoEmbed from '@components/VideoEmbed.astro'; import { VARS } from '@data/vars'; @@ -26,15 +26,11 @@ Agent & run endpoints let you create and inspect [cloud agent](/platform/) runs * Monitor execution by listing runs and tracking state transitions over time (queued → in progress → succeeded/failed) * Inspect results and provenance by fetching a run's full details, including the original prompt, source/creator metadata, session link, and resolved agent configuration -:::caution -This page is a high-level overview.\ -\ -For endpoint details, use the [**Warp Platform API reference**](/api). For SDK schemas, use the [**Python SDK**](https://github.com/warpdotdev/oz-sdk-python) and [**TypeScript SDK**](https://github.com/warpdotdev/oz-sdk-typescript) repositories. -::: +For endpoint details, use the [**{VARS.WARP_PLATFORM_API} reference**](/api). For SDK schemas, use the [Python SDK](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript SDK](https://github.com/warpdotdev/oz-sdk-typescript) repositories. To send work to a [Warp factory](/factories/), use [factory endpoints](/factories/factory-api/) to discover it and dispatch by UID instead of calling `POST /agent/run` with a foreman's `agent_identity_uid`. The follow-up, cancellation, and status endpoints still apply after a factory run is dispatched. -## SDKs +## Choose the SDK or raw REST Warp provides official [Python](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript](https://github.com/warpdotdev/oz-sdk-typescript) SDKs that wrap the {VARS.WARP_PLATFORM_API} with: @@ -52,9 +48,6 @@ If you’re building an integration (CI, Slack bots, internal tooling, orchestra * Use the SDK when you want strong typing, standardized error handling, and easy concurrency patterns. * Use raw REST when you want minimal dependencies or full control over your HTTP client (the SDKs also support calling undocumented endpoints when needed). -:::caution -For the full SDK surface area and latest usage, refer to the GitHub repos: [**Python SDK**](https://github.com/warpdotdev/oz-sdk-python) and [**TypeScript SDK**](https://github.com/warpdotdev/oz-sdk-typescript). -::: --- @@ -78,7 +71,7 @@ An agent run represents a single execution of a cloud agent, created with a prom * Optional session information (`session_id`, `session_link`) * Optional resolved configuration (`agent_config`) -See the [**Warp Platform API reference**](/api) for details on how runs are created and listed. +See the [**{VARS.WARP_PLATFORM_API} reference**](/api) for details on how runs are created and listed. ### Agent configuration @@ -131,7 +124,7 @@ Agent & run endpoints include: Cancel a run that is currently queued or in progress. Returns the ID of the cancelled run. -All endpoint semantics, query parameters, and [error codes](/factories/api-and-sdk/troubleshooting/errors/) are documented in the [Warp Platform API reference](/api). +All endpoint semantics, query parameters, and [error codes](/factories/api-and-sdk/troubleshooting/errors/) are documented in the [{VARS.WARP_PLATFORM_API} reference](/api). --- diff --git a/src/content/docs/factories/api-and-sdk/quickstart.mdx b/src/content/docs/factories/api-and-sdk/quickstart.mdx index 89533d3fc..a210f5a07 100644 --- a/src/content/docs/factories/api-and-sdk/quickstart.mdx +++ b/src/content/docs/factories/api-and-sdk/quickstart.mdx @@ -1,6 +1,6 @@ --- topic: factories -title: "Warp Platform API quickstart" +title: "{{WARP_PLATFORM_API}} quickstart" description: >- Create and monitor your first cloud agent run via the {{WARP_PLATFORM_API}} in ~5 minutes. @@ -76,7 +76,7 @@ The `state` has the following possible values: * `SUCCEEDED` - The run completed successfully. * `FAILED` - The run encountered an error. Check the `status_message` field in the response for details, then use the [API error reference](/factories/api-and-sdk/troubleshooting/errors/) to interpret the error code. -These are the most common states. See the [Agent & run endpoints](/factories/api-and-sdk/) and [Warp Platform API reference](/api) for all possible values. +These are the most common states. See the [Agent & run endpoints](/factories/api-and-sdk/) and [{VARS.WARP_PLATFORM_API} reference](/api) for all possible values. To list all recent runs: @@ -95,7 +95,7 @@ You can also view and manage all runs in the Date: Mon, 21 Sep 2026 13:06:32 -0600 Subject: [PATCH 48/63] Apply suggestion from @rachaelrenk --- src/content/docs/factories/quickstart.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/factories/quickstart.mdx b/src/content/docs/factories/quickstart.mdx index dc65d1d6a..d5384d7b5 100644 --- a/src/content/docs/factories/quickstart.mdx +++ b/src/content/docs/factories/quickstart.mdx @@ -49,7 +49,7 @@ Warp walks you through a setup wizard:
Choose the organization or group whose repositories the factory will use. GitLab shows an equivalent screen for groups.
-3. On **Select your repos**, select the repositories the factory works in, then click **Add repos**. Start with one or two repositories that ship together, and add more later. See [sizing a factory](/factories/#sizing-a-factory) before adding a repository another factory already covers. +3. On **Select your repos**, select the repositories the factory works in, then click **Add repos**. Start with one or two repositories that ship together, and add more later. See [sizing a factory](/factories/#sizing-a-factory) before adding a repository already covered by another factory.
![The Select your repos screen, searching for repositories by name.](../../../assets/factories/quickstart-select-repos.png) From 3cafb99648ed0e674c74826ca4d2b52008a6d19b Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Mon, 21 Sep 2026 13:23:43 -0600 Subject: [PATCH 49/63] Apply suggestion from @rachaelrenk --- src/content/docs/factories/quickstart.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/factories/quickstart.mdx b/src/content/docs/factories/quickstart.mdx index d5384d7b5..175859bb0 100644 --- a/src/content/docs/factories/quickstart.mdx +++ b/src/content/docs/factories/quickstart.mdx @@ -70,7 +70,7 @@ Warp walks you through a setup wizard:
Toggle which default agents the foreman can dispatch.
-6. Optionally connect Slack and an issue tracker so teammates can hand work to the factory from the tools they already use. You can add either later from [connect your factory](/factories/connect-your-factory/). +6. Optionally, connect Slack and an issue tracker so teammates can hand work to the factory from the tools they already use. You can add either later from [connect your factory](/factories/connect-your-factory/). Warp creates the factory and opens its [dashboard](/factories/factory-dashboard/). From 45be6f430c9348307dca14b178c923533b360730 Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:53:55 -0600 Subject: [PATCH 50/63] docs: resolve factories navigation review Co-Authored-By: Warp --- developers/agent-api-openapi.yaml | 2 +- .../docs/factories/deployment-patterns.mdx | 39 ++++--------------- src/content/docs/factories/quickstart.mdx | 2 +- .../docs/factories/self-hosting/index.mdx | 11 +++++- src/content/docs/index.mdx | 2 +- .../docs/platform/transitioning-from-oz.mdx | 4 +- src/sidebar.ts | 4 +- vercel.json | 2 +- 8 files changed, 25 insertions(+), 41 deletions(-) diff --git a/developers/agent-api-openapi.yaml b/developers/agent-api-openapi.yaml index 7f7c59d71..1250965b1 100644 --- a/developers/agent-api-openapi.yaml +++ b/developers/agent-api-openapi.yaml @@ -2,7 +2,7 @@ openapi: 3.0.0 info: title: Warp Platform API version: 1.0.0 - description: "API for creating, managing, and querying factory and cloud agent runs.\n\nThese endpoints allow users to send work to factories, start standalone agents, list runs, \nand retrieve detailed run information.\n" + description: "API for creating, managing, and querying factory and cloud agent runs.\n\nThese endpoints allow users to send work to factories, start standalone agents, list runs, and retrieve detailed run information.\n" contact: name: Warp Support url: https://docs.warp.dev diff --git a/src/content/docs/factories/deployment-patterns.mdx b/src/content/docs/factories/deployment-patterns.mdx index e3d77327c..1aa63a3fe 100644 --- a/src/content/docs/factories/deployment-patterns.mdx +++ b/src/content/docs/factories/deployment-patterns.mdx @@ -33,9 +33,9 @@ See the [cloud agent run lifecycle](/platform/architecture/#cloud-agent-run-life ### What it looks like -* **Trigger**: first-party integrations, cron schedules, API/SDK calls, or on-demand commands +* **Work intake**: Factory automations, configured integrations, Factory MCP, or factory endpoints * **Execution**: {VARS.WARP_AUTOMATION_PLATFORM}-hosted environments (Docker-based) -* **Visibility**: {VARS.DASHBOARD} + session sharing + APIs/SDKs +* **Visibility**: Factory dashboard, session sharing, and APIs ### Why teams choose it @@ -43,37 +43,14 @@ See the [cloud agent run lifecycle](/platform/architecture/#cloud-agent-run-life * You want to run many tasks in parallel without building your own sandboxing and scaling layer. * You want a consistent "production" setup with standardized environments and centralized configuration. -### Common ways to trigger +### Send work to a factory -* **First-party integrations (Slack, Linear, etc.)** that create tasks automatically from external events. -* **[Scheduled agents](/platform/triggers/scheduled-agents/)** for recurring work (cron-like automation). -* **Custom triggers** from your own systems using Warp's API/SDK. -* **On-demand cloud jobs** using CLI commands like `oz agent run-cloud`. +* [Factory automations](/factories/automations/) route integration events, schedules, and webhooks to agents in the factory. +* [Factory integrations](/factories/connect-your-factory/) let teammates send work from Slack, Linear, Jira, GitHub, and GitLab. +* [Factory endpoints](/factories/factory-api/) let your service find a factory and dispatch work by UID. +* [Factory MCP](/factories/factory-mcp/) lets a coding agent hand work to a factory. -### Example recipe: daily dead-code cleanup - -1. Define a Warp [Environment](/platform/environments/) with the repo + toolchain. -2. Create a [schedule](/platform/triggers/scheduled-agents/) with a fixed prompt for cleanup. -3. The {VARS.WARP_AUTOMATION_PLATFORM} runs the agent on the cadence. -4. Your team monitors runs in the [{VARS.WEB_APP}](/platform/oz-web-app/) and [viewing cloud agent runs](/platform/viewing-cloud-agent-runs/), reviews artifacts (PRs, plans), and intervenes when needed. - -### Example recipe: crash triage via Sentry webhook - -1. Define a Warp Environment with the target repo. -2. Register a Sentry webhook to your handler (server, cloud function, Zapier/n8n). -3. The handler extracts crash details, constructs a prompt, and calls the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) to start a task. -4. Warp spins up the run in the environment and you monitor progress via UI/API. - -### Example recipe: fan-out parallel work (sharding) - -When a task is naturally divisible, use [multi-agent orchestration](/platform/orchestration/) to spawn one child agent per shard from a single parent run. The parent owns coordination and result aggregation; the children execute in parallel, each with their own repo subset, prompt, and (optionally) model. See [Running orchestrated agents](/platform/orchestration/multi-agent-runs/) for slash command, CLI, web app, and API examples. - -### Example recipe: same task across multiple models - -* Launch N runs with the same prompt, but different profiles that map to different models. -* Compare results and choose the best output (or merge). - ---- +For standalone cloud-agent triggers, see [cloud agents](/platform/). ## Managed self-hosting diff --git a/src/content/docs/factories/quickstart.mdx b/src/content/docs/factories/quickstart.mdx index 175859bb0..871773b36 100644 --- a/src/content/docs/factories/quickstart.mdx +++ b/src/content/docs/factories/quickstart.mdx @@ -12,7 +12,7 @@ import { VARS } from '@data/vars'; Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. ::: -A factory is a fleet of agents wired to your software development lifecycle. It connects your repositories and tools to move requests through triage, specification, implementation, review, and verification, while people stay in control of key decisions. You talk to one agent, the **foreman**. It picks up the request from wherever it starts, such as Slack, an issue tracker, or a code host, then dispatches the factory's other agents, each owning one part of the software development lifecycle. +A factory is a fleet of agents wired to your software development lifecycle. It connects your repositories and tools to move requests through triage, specification, implementation, review, and verification, while people stay in control of key decisions. You talk to one agent, the **foreman**. It picks up the request from wherever it starts, such as Slack, an issue tracker, or a code host, then dispatches the factory's other agents. In this quickstart, you will create a factory and take one small work item from prompt to pull request in less than 10 minutes. diff --git a/src/content/docs/factories/self-hosting/index.mdx b/src/content/docs/factories/self-hosting/index.mdx index 8dec2503a..a13c5ab45 100644 --- a/src/content/docs/factories/self-hosting/index.mdx +++ b/src/content/docs/factories/self-hosting/index.mdx @@ -39,10 +39,17 @@ Managed self-hosting moves execution to your infrastructure. Warp still provides The worker requires outbound HTTPS access to Warp and any repositories, registries, and services that its tasks use. It does not require inbound firewall access.
+## Route runs to a worker -## Configure a factory to use a worker +For a factory, define the worker host and a compatible runner in the [factory definition](/factories/factory-as-code/#agentdefaultsworkerhost). The factory dashboard shows each configured runner and the worker that executes its work. -Define the worker host and a compatible runner in your [factory definition](/factories/factory-as-code/). The factory dashboard shows each configured runner and the worker that executes its work. Use the [worker reference](/factories/self-hosting/reference/) to configure the worker process and the [factory dashboard](/factories/factory-dashboard/) to inspect its runs. +For standalone cloud agents, choose the worker ID with `--host`: + +* `oz agent run-cloud --host WORKER_ID` - Start an ad hoc cloud agent on the worker. See the [CLI reference](/agents/cli/oz-cli/#running-agents-remotely-oz-agent-run-cloud). +* `oz schedule create --host WORKER_ID` - Route future scheduled runs to the worker. See [scheduled agents](/platform/triggers/scheduled-agents/). +* `oz integration create slack --host WORKER_ID` or `oz integration create linear --host WORKER_ID` - Route runs triggered by that integration to the worker. See [integration setup](/agents/cli/oz-cli/integration-setup/). + +Use the [worker reference](/factories/self-hosting/reference/) to configure the worker process and the [factory dashboard](/factories/factory-dashboard/) to inspect factory runs. ## Monitor and troubleshoot workers diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index 877aeead4..5ce13adc8 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -1,5 +1,5 @@ --- -title: Warp products +title: Warp products and getting started description: >- Warp combines a modern terminal, coding agents, cloud automation, and software factories for teams that build and ship software. diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx index 9a132166c..36c93b1dd 100644 --- a/src/content/docs/platform/transitioning-from-oz.mdx +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -1,10 +1,10 @@ --- -title: Transitioning from the {{WEB_APP}} +title: About the transition from the {{WEB_APP}} description: >- Keep existing legacy web app, CLI, SDK, and API workflows while using Warp Factories for new multi-stage software development workflows. sidebar: - label: "Transitioning from the {{WEB_APP}}" + label: "About the transition from the {{WEB_APP}}" --- import { VARS } from '@data/vars'; diff --git a/src/sidebar.ts b/src/sidebar.ts index 12b4b7c98..1988d9af8 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -521,7 +521,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // Keep troubleshooting and legacy transition guidance as direct trailing // items rather than creating singleton groups. { slug: 'factories/troubleshooting', label: 'Troubleshooting' }, - { slug: 'platform/transitioning-from-oz', label: `Transitioning from the ${VARS.WEB_APP}` }, + { label: `About the transition from the ${VARS.WEB_APP}`, link: '/platform/transitioning-from-oz/' }, ], }, { @@ -549,7 +549,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ items: [ { slug: 'platform', label: 'Overview' }, { slug: 'platform/quickstart', label: 'Quickstart' }, - { slug: 'platform/transitioning-from-oz', label: `Transitioning from the ${VARS.WEB_APP}` }, + { slug: 'platform/transitioning-from-oz', label: `About the transition from the ${VARS.WEB_APP}` }, { // Runtime (which agent executes the run) is kept separate from // configuration (how any run is set up) -- HYC review, 8/14. diff --git a/vercel.json b/vercel.json index 1ee6a3c17..d1a26390b 100644 --- a/vercel.json +++ b/vercel.json @@ -6619,7 +6619,7 @@ }, { "source": "/reference(/?)", - "destination": "/agents/cli/oz-cli/", + "destination": "/factories/developer-tools/", "statusCode": 308 }, { From 780a9b77fbe96310e2e18378c2a9fad5ee56320f Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 22 Sep 2026 11:03:07 -0600 Subject: [PATCH 51/63] docs: clarify quickstart length guidance Co-Authored-By: Warp --- .agents/references/doc-quality-policy.md | 9 ++-- .../check_compression_contract.py | 41 +++++++++++++++---- .../test_check_compression_contract.py | 12 ++++-- .agents/skills/draft_docs/SKILL.md | 2 +- .agents/skills/draft_guide/SKILL.md | 2 +- .agents/skills/draft_quickstart/SKILL.md | 6 +-- .agents/templates/guide-page.md | 2 +- .agents/templates/quickstart.md | 2 +- AGENTS.md | 4 +- 9 files changed, 57 insertions(+), 23 deletions(-) diff --git a/.agents/references/doc-quality-policy.md b/.agents/references/doc-quality-policy.md index dc38b3094..3e4425eb1 100644 --- a/.agents/references/doc-quality-policy.md +++ b/.agents/references/doc-quality-policy.md @@ -145,14 +145,17 @@ All content-generating skills share one compression contract: - Lead with a one-to-three-sentence user-facing summary. - Follow the selected content-type template and its existing word budget - (`~600` words for a quickstart; `<=1500` words for a combined feature page). + (600 words is the quickstart target; up to 800 words is acceptable with a + PR rationale; `<=1500` words for a combined feature page). - Run the deletion-only "Cut again" pass (see `draft_docs/SKILL.md` step 6.5 / `AGENTS.md` → Voice & tone) before opening the PR. - Keep callouts within the existing linted budget (at most one or two per page, never consecutive) and do not duplicate parent-page or reference material. -- Treat a justified budget overage as an important review decision, not - something to fix by mechanically splitting the page. +- Treat a quickstart between 601 and 800 words as a documented exception, not + something to fix by mechanically splitting the page. For a quickstart above + 800 words or with more than two callouts, record the exception in the PR and + schedule a later cut pass or reclassify the page as a tutorial. Generated changelog, license, and telemetry data is exempt from the page-summary and word-budget rules, but not from duplicate-content, style, or diff --git a/.agents/skills/doc_quality_policy/check_compression_contract.py b/.agents/skills/doc_quality_policy/check_compression_contract.py index 415c88bc5..8191106c2 100644 --- a/.agents/skills/doc_quality_policy/check_compression_contract.py +++ b/.agents/skills/doc_quality_policy/check_compression_contract.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """Check the mechanically-checkable parts of the shared compression contract. -Word-budget and callout-count checks only — the rest of the contract (lead +Word-target, maximum-length, and callout-count checks only — the rest of the contract (lead summary, "Cut again" pass, no duplication) needs human/agent judgment and is covered by `draft_docs`'s checklist and `review-docs-pr`. Generated changelog/license/telemetry pages are exempt from the word budget (see @@ -12,8 +12,9 @@ python3 check_compression_contract.py FILE --content-type feature-doc Exit codes: - 0 within budget - 1 over budget (a reportable finding for review-docs-pr, not a hard CI gate) + 0 within the hard maximum (may still print a documented-exception notice) + 1 over the hard maximum or callout budget (a reportable finding for + review-docs-pr, not a hard CI gate) 2 usage / file error """ from __future__ import annotations @@ -24,11 +25,14 @@ from pathlib import Path from typing import List, Optional -# ~600 words for a quickstart; <=1500 words for a combined feature page. +# Quickstarts target 600 words and can extend to 800 with a PR rationale. # Other content types have no fixed budget here; the drafting skills' own # length guidance applies. -WORD_BUDGETS = { +WORD_TARGETS = { "quickstart": 600, +} +WORD_BUDGETS = { + "quickstart": 800, "feature-doc": 1500, } @@ -79,7 +83,7 @@ def count_callouts(text: str) -> int: def check_compression_contract(text: str, content_type: str) -> List[str]: - """Return a list of findings; empty means within the mechanical budget.""" + """Return hard-limit findings; empty means within the mechanical maximum.""" findings: List[str] = [] budget = WORD_BUDGETS.get(content_type) @@ -87,8 +91,8 @@ def check_compression_contract(text: str, content_type: str) -> List[str]: words = count_words(text) if words > budget: findings.append( - f"word count {words} exceeds the {content_type} budget of {budget} " - "(a justified overage is an important review decision, not an automatic split)" + f"word count {words} exceeds the {content_type} maximum of {budget} " + "(record the exception in the PR and schedule a later cut pass or reclassify the page)" ) callouts = count_callouts(text) @@ -98,6 +102,22 @@ def check_compression_contract(text: str, content_type: str) -> List[str]: return findings +def check_compression_notices(text: str, content_type: str) -> List[str]: + """Return non-blocking notices that still require a PR rationale.""" + target = WORD_TARGETS.get(content_type) + maximum = WORD_BUDGETS.get(content_type) + if content_type in EXEMPT_CONTENT_TYPES or target is None or maximum is None: + return [] + + words = count_words(text) + if target < words <= maximum: + return [ + f"word count {words} exceeds the {content_type} target of {target} " + f"but is within the documented exception range of {maximum}; record the rationale in the PR" + ] + return [] + + def main(argv: Optional[List[str]] = None) -> int: parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument("file", help="path to the markdown/MDX file, or '-' for stdin") @@ -117,6 +137,11 @@ def main(argv: Optional[List[str]] = None) -> int: return 2 findings = check_compression_contract(text, args.content_type) + notices = check_compression_notices(text, args.content_type) + if notices: + print("Compression contract notices:", file=sys.stderr) + for notice in notices: + print(f" - {notice}", file=sys.stderr) if findings: print("Compression contract findings:", file=sys.stderr) for finding in findings: diff --git a/.agents/skills/doc_quality_policy/test_check_compression_contract.py b/.agents/skills/doc_quality_policy/test_check_compression_contract.py index 60356fa52..a28825385 100644 --- a/.agents/skills/doc_quality_policy/test_check_compression_contract.py +++ b/.agents/skills/doc_quality_policy/test_check_compression_contract.py @@ -54,15 +54,21 @@ def test_quickstart_within_budget_passes(self): text = _page(500) self.assertEqual(ccc.check_compression_contract(text, "quickstart"), []) - def test_quickstart_over_budget_fails(self): + def test_quickstart_within_exception_range_passes(self): text = _page(700) + self.assertEqual(ccc.check_compression_contract(text, "quickstart"), []) + notices = ccc.check_compression_notices(text, "quickstart") + self.assertTrue(any("record the rationale" in f for f in notices)) + + def test_quickstart_over_maximum_fails(self): + text = _page(801) findings = ccc.check_compression_contract(text, "quickstart") - self.assertTrue(any("exceeds the quickstart budget" in f for f in findings)) + self.assertTrue(any("exceeds the quickstart maximum" in f for f in findings)) def test_feature_doc_over_budget_fails(self): text = _page(1600) findings = ccc.check_compression_contract(text, "feature-doc") - self.assertTrue(any("exceeds the feature-doc budget" in f for f in findings)) + self.assertTrue(any("exceeds the feature-doc maximum" in f for f in findings)) def test_generated_changelog_is_exempt_from_word_budget(self): text = _page(5000) diff --git a/.agents/skills/draft_docs/SKILL.md b/.agents/skills/draft_docs/SKILL.md index c30f05dea..70bbe251e 100644 --- a/.agents/skills/draft_docs/SKILL.md +++ b/.agents/skills/draft_docs/SKILL.md @@ -104,7 +104,7 @@ Record the content type chosen in the design plan, and pick its template and typ Two of these carry admission rules rather than just structure, and both are checked in review: - **FAQ** defaults to "not an FAQ." All three admission rules in `AGENTS.md` must hold before you create or extend one. Most FAQ-shaped content belongs on the page that owns the topic. -- **Quickstart vs. tutorial** is a scope decision, not a location one. A quickstart is ~5 minutes and ~600 words for someone who already knows the product; a tutorial walks a full workflow and requires that a quickstart already exists. "Guides" is the section name and holds both. +- **Quickstart vs. tutorial** is a scope decision, not a location one. A quickstart is ~5 minutes with a 600-word target; up to 800 words is acceptable with a PR rationale. A tutorial walks a full workflow and requires that a quickstart already exists. "Guides" is the section name and holds both. Once the content type is identified: - Use the corresponding **template** as the starting scaffold for the page. diff --git a/.agents/skills/draft_guide/SKILL.md b/.agents/skills/draft_guide/SKILL.md index 9001f7eec..e681c3b20 100644 --- a/.agents/skills/draft_guide/SKILL.md +++ b/.agents/skills/draft_guide/SKILL.md @@ -11,7 +11,7 @@ Draft a tutorial that walks a developer through an entire workflow, start to fin "Guides" is the name of the section, not a content type. It holds both, and the choice is about scope: -- **Quickstart** — about five minutes, ~600 words, essential steps only, for someone who already knows the product. Use `draft_quickstart`. +- **Quickstart** — about five minutes, with 600 words as the target and up to 800 words allowed with a PR rationale, for someone who already knows the product. Use `draft_quickstart`. - **Tutorial** — a full workflow with context at the decision points, for someone extending a basic understanding to solve a real problem. This skill. **A tutorial requires that a quickstart already exists** for the product area. Check before drafting. If there is no quickstart, write that first — otherwise the tutorial absorbs setup content that belongs in a shorter page, and readers who only wanted to get started have to wade through the whole workflow. diff --git a/.agents/skills/draft_quickstart/SKILL.md b/.agents/skills/draft_quickstart/SKILL.md index 1f59d5167..4a1964f27 100644 --- a/.agents/skills/draft_quickstart/SKILL.md +++ b/.agents/skills/draft_quickstart/SKILL.md @@ -1,6 +1,6 @@ --- name: draft_quickstart -description: Draft a new quickstart documentation page or update an existing one. Use when the reader already understands the product and wants the fastest path to a working result - about five minutes and 600 words, essential steps only. If the task needs explanation along the way or exceeds that budget, it is a tutorial, not a quickstart. +description: Draft a new quickstart documentation page or update an existing one. Use when the reader already understands the product and wants the fastest path to a working result - about five minutes and 600 words, with up to 800 words allowed when documented in the PR. If the task needs explanation along the way, it is a tutorial, not a quickstart. --- # Draft quickstart page @@ -9,7 +9,7 @@ Draft a quickstart that gets the reader to a working result in about five minute ## Scope is the defining constraint -**About five minutes and roughly 600 words.** This is a budget, not a target. A quickstart that outgrows it has become a tutorial and should be reworked as one rather than allowed to sprawl. +**About five minutes and 600 words is the target.** Up to 800 words is acceptable when visual confirmation or a complete first-use path needs the room; record the rationale in the PR. Above 800 words, record the exception and schedule a later cut pass or reclassify the page as a tutorial. Quickstarts are for readers who **already understand the feature or product** and are ready to try it. Deliberately omit how it works and why they would want it — if the reader needs that, they need conceptual content. If the task needs context at its decision points, they need a tutorial. @@ -41,7 +41,7 @@ These rules are specific to quickstart pages (from the "Drafting by content type - **Troubleshooting is optional and link-only.** Point at existing troubleshooting content; do not write new troubleshooting into a quickstart. - End with a one-line recap, then 2-3 actionable next steps. Always include a link to the conceptual page for the feature. - Title convention: "[Feature] quickstart" or "Quickstart for [product]" -- **Length is the constraint, not just the tone.** A quickstart has a hard ~600-word budget — tighter than any other content type, because speed to a working result is the entire point. Cut every section that isn't on the critical path (AGENTS.md → Voice & tone → Cut again) before adding a word of new content. Also apply the general tone rules: no marketing buzzwords, no meta-openers. +- **Length is the constraint, not just the tone.** A quickstart targets 600 words. Up to 800 words is acceptable with a PR rationale; above 800 words, record the exception and schedule a later cut pass or reclassify the page as a tutorial. Cut every section that isn't on the critical path (AGENTS.md → Voice & tone → Cut again) before adding new content. Also apply the general tone rules: no marketing buzzwords, no meta-openers. ## Heading case diff --git a/.agents/templates/guide-page.md b/.agents/templates/guide-page.md index ad7e2dcaf..934f94b6b 100644 --- a/.agents/templates/guide-page.md +++ b/.agents/templates/guide-page.md @@ -9,7 +9,7 @@ description: >- [VARS: If this page names a product from src/data/vars.ts, add `import { VARS } from '@data/vars';` below, then use {VARS.KEY} in prose and {{TOKEN}} in frontmatter. See AGENTS.md → Content variables.] [AEO: If this page is driven by Peec, search-query, or answer-engine data, run `.agents/skills/aeo_brief/SKILL.md` first.] -[SCOPE: This is a tutorial — a full workflow, start to finish, with context at the decision points. If the task fits in about five minutes and 600 words of essential steps, it is a quickstart instead; use `.agents/templates/quickstart.md`. A tutorial also requires that a quickstart already exists for this product area. If none does, write that first.] +[SCOPE: This is a tutorial — a full workflow, start to finish, with context at the decision points. If the task fits in about five minutes with 600 words as the target (up to 800 with a PR rationale), it is a quickstart instead; use `.agents/templates/quickstart.md`. A tutorial also requires that a quickstart already exists for this product area. If none does, write that first.] [Introduction: who this is for, what prior knowledge it assumes, and what the reader will build. Do NOT state an expected completion time — it varies too much by experience level. (Quickstarts do state one; tutorials do not.)] diff --git a/.agents/templates/quickstart.md b/.agents/templates/quickstart.md index 2a562d6bd..55d5103e5 100644 --- a/.agents/templates/quickstart.md +++ b/.agents/templates/quickstart.md @@ -9,7 +9,7 @@ description: >- [BEFORE PUBLISHING: Delete every bracketed instruction in this file, including this one. They are guidance for the author, not page content.] [VARS: If this page names a product from src/data/vars.ts, add `import { VARS } from '@data/vars';` on the line directly below the frontmatter, then use {VARS.KEY} in prose. See AGENTS.md → Content variables.] -[SCOPE — the defining constraint: about five minutes and roughly 600 words. This is a budget, not a target. A quickstart that outgrows it has become a tutorial and should be reworked as one. Written for someone who already understands the product and is ready to try it, so leave out how it works and why they would want it. If the task needs context at its decision points, it is a tutorial.] +[SCOPE — the defining constraint: about five minutes and 600 words is the target. Up to 800 words is acceptable when visual confirmation or a complete first-use path needs the room; record why in the PR. Above 800 words, record the exception and schedule a later cut pass or reclassify it as a tutorial. Written for someone who already understands the product and is ready to try it, so leave out how it works and why they would want it. If the task needs context at its decision points, it is a tutorial.] [Opening paragraph: who this is for, what prior knowledge it assumes, what the reader will end up with, and the time budget. 2-3 sentences.] diff --git a/AGENTS.md b/AGENTS.md index 721455a83..7edd572c9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -588,7 +588,7 @@ These rules apply regardless of content type: **When to use**: When the reader already understands the feature or product and is ready to try it. A quickstart deliberately omits explanation of how something works or why they would want it — if the reader needs that, they need conceptual content, and if the task is complex enough to need context along the way, they need a tutorial. -**Scope**: About five minutes and roughly 600 words. That budget is the defining constraint, not a suggestion. A quickstart that no longer fits it has become a tutorial and should be reworked as one. +**Scope**: About five minutes and 600 words is the target. A quickstart can run up to 800 words when visual confirmation or a complete first-use path needs the room; record the rationale in the PR. Above 800 words, record the exception and schedule a later cut pass or reclassify the page as a tutorial. **Structure**: 1. Opening paragraph: who it is for, the prerequisites and prior knowledge assumed, what the reader will end up with, and the time budget ("in about five minutes") @@ -703,7 +703,7 @@ Direct answer with actionable information. Include links to relevant documentati "Guides" is the name of the section, not a content type. It holds both **tutorials** and **quickstarts**; pick between them by scope before drafting: -- **Quickstart** — about five minutes, ~600 words, essential steps only, for someone who already understands the product. +- **Quickstart** — about five minutes, with 600 words as the target and up to 800 words allowed with a PR rationale, for someone who already understands the product. - **Tutorial** — a full workflow with context at the decision points, for someone extending a basic understanding to solve a real problem. **A tutorial requires that a quickstart already exists** for the product area. If there is no quickstart, write that first — otherwise the tutorial absorbs setup content that belongs in a shorter page, and readers who only wanted to get started have to wade through the whole workflow. From 9b41176828976388068e1d8c940a710b4b1b02fc Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Tue, 22 Sep 2026 11:55:08 -0600 Subject: [PATCH 52/63] docs: tokenize API reference metadata Co-Authored-By: Warp --- src/pages/api.astro | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/pages/api.astro b/src/pages/api.astro index 68fd401c4..4738c273c 100644 --- a/src/pages/api.astro +++ b/src/pages/api.astro @@ -12,6 +12,7 @@ // script tag well-formed. import fs from 'node:fs'; import { parse } from 'yaml'; +import { VARS } from '@data/vars'; import WarpTopbar from '../components/WarpTopbar.astro'; import DocsFeedbackLinks from '../components/DocsFeedbackLinks.astro'; const yamlContent = fs.readFileSync('developers/agent-api-openapi.yaml', 'utf-8'); @@ -36,24 +37,24 @@ const specBaseUrl = (specObject.servers as Array<{ url?: string }> | undefined)? - Warp Platform API reference | Warp - + {VARS.WARP_PLATFORM_API} reference | Warp + - - + + - + - - + + @@ -199,17 +200,17 @@ const specBaseUrl = (specObject.servers as Array<{ url?: string }> | undefined)? document.body.classList.add(resolved === 'dark' ? 'dark-mode' : 'light-mode'); })(); - + -

Warp Platform API reference

+

{VARS.WARP_PLATFORM_API} reference

-
+

{specInfo?.title}

{specInfo?.description}

Base URL: {specBaseUrl}

@@ -261,8 +262,8 @@ const specBaseUrl = (specObject.servers as Array<{ url?: string }> | undefined)? // doesn't show a fake "interactive" affordance (per scalar/scalar#5079). defaultOpenAllTags: true, metaData: { - title: 'Warp Platform API reference', - description: 'Interactive reference for the Warp Platform API.', + title: `${VARS.WARP_PLATFORM_API} reference`, + description: `Interactive reference for the ${VARS.WARP_PLATFORM_API}.`, }, // --------------------------------------------------------------- // Scalar consumes `customCss` as a runtime string, so we can't From b6e954d3d05317a37dce1a82f3361de0e47e52ad Mon Sep 17 00:00:00 2001 From: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> Date: Wed, 23 Sep 2026 07:35:11 -0600 Subject: [PATCH 53/63] docs: fix deployment cross-references Co-Authored-By: Warp --- .../agent-workflows/run-a-software-factory-in-the-cloud.mdx | 2 +- src/content/docs/platform/unmanaged-execution.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx b/src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx index 6cacc817c..511fe9544 100644 --- a/src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx +++ b/src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx @@ -31,7 +31,7 @@ The practical difference: * **Team visibility** — Any teammate can open a run in the {VARS.WEB_APP} to inspect the session transcript, steer a stuck agent, or [hand the work off](/platform/handoff/) to keep going from another session. * **Scale without contention** — Multiple triage runs can execute in parallel without fighting over a shared dev box, local git checkouts, or CPU. -See [Deployment patterns](/factories/deployment-patterns) for a full comparison of {VARS.WARP_AUTOMATION_PLATFORM}-hosted, CLI-based, and self-hosted execution patterns. +See [Deployment patterns](/factories/deployment-patterns) for Warp-hosted and managed self-hosted factory execution. For CLI-based execution, see [Unmanaged architecture](/platform/unmanaged-execution/). ## 1. Set up a cloud environment diff --git a/src/content/docs/platform/unmanaged-execution.mdx b/src/content/docs/platform/unmanaged-execution.mdx index 15df82c37..7d5e20c8e 100644 --- a/src/content/docs/platform/unmanaged-execution.mdx +++ b/src/content/docs/platform/unmanaged-execution.mdx @@ -135,6 +135,6 @@ Unmanaged runs don't ship with the bundled declarations script, so end-of-run wo * [Self-hosting overview](/factories/self-hosting/) — Compare managed and unmanaged, plus the architecture decision guide. * [GitHub Actions integration](/platform/integrations/github-actions/) — Run agents in CI with the official action. -* [Deployment patterns](/factories/deployment-patterns/) — The Standalone CLI-only agents section describes the unmanaged model conceptually. +* [Deployment patterns](/factories/deployment-patterns/) — Compare Warp-hosted and managed self-hosted factory execution; the model-choice table links here for unmanaged execution. * [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) — Full CLI reference for `oz agent run` and related commands. * [Agent Session Sharing](/agents/local-agents/session-sharing/) — Attach to running sessions to monitor or steer them. From 68d2393cf43a80b2c9df95430ca08ae620a57e85 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 00:57:12 +0000 Subject: [PATCH 54/63] docs: prepare Factories docs for launch Co-Authored-By: Warp --- scripts/check_redirects.py | 8 +- .../docs/agents/capabilities/skills.mdx | 2 +- .../docs/agents/cli/oz-cli/agent-profiles.mdx | 2 +- .../docs/agents/cli/oz-cli/api-keys.mdx | 2 +- .../docs/agents/cli/oz-cli/federate.mdx | 3 +- .../docs/agents/cli/oz-cli/quickstart.mdx | 2 +- .../agent-context/images-as-context.mdx | 2 +- src/content/docs/changelog/2025.mdx | 2 +- .../docs/factories/api-and-sdk/index.mdx | 27 + src/content/docs/factories/automations.mdx | 3 +- .../code-forges/other-code-forges.mdx | 5 +- .../docs/factories/connect-your-factory.mdx | 9 +- .../docs/factories/factory-as-code.mdx | 107 ++- src/content/docs/factories/factory-mcp.mdx | 2 +- src/content/docs/factories/factory-skills.mdx | 2 +- src/content/docs/factories/index.mdx | 2 +- .../factories/integrations/azure-devops.mdx | 107 +++ src/content/docs/factories/quickstart.mdx | 8 +- .../self-hosting/managed-kubernetes.mdx | 32 + .../factories/self-hosting/quickstart.mdx | 14 +- .../self-hosting/troubleshooting.mdx | 2 +- src/content/docs/platform/data-storage.mdx | 2 +- .../platform/integrations/azure-devops.mdx | 34 +- src/sidebar.ts | 65 +- vercel.json | 816 +++++++++--------- 25 files changed, 736 insertions(+), 524 deletions(-) create mode 100644 src/content/docs/factories/integrations/azure-devops.mdx diff --git a/scripts/check_redirects.py b/scripts/check_redirects.py index 7a418eac3..1373ea7ad 100644 --- a/scripts/check_redirects.py +++ b/scripts/check_redirects.py @@ -62,6 +62,7 @@ ".svg", ".ico", ) +NAMED_PARAMETER_RE = re.compile(r":[A-Za-z][A-Za-z0-9_]*(?:\*|\([^)]*\))?") def load_redirects() -> list[dict]: @@ -113,7 +114,12 @@ def static_check(redirects: list[dict]) -> tuple[int, int, list[str]]: # Skip wildcard sources/destinations — we can't fully verify these # statically since the captured group is dynamic. - if "(" in source or "$" in dest: + if ( + "(" in source + or "$" in dest + or NAMED_PARAMETER_RE.search(source) + or NAMED_PARAMETER_RE.search(dest) + ): continue # Skip external URLs and special endpoints. diff --git a/src/content/docs/agents/capabilities/skills.mdx b/src/content/docs/agents/capabilities/skills.mdx index b99f6f254..eed3dde8a 100644 --- a/src/content/docs/agents/capabilities/skills.mdx +++ b/src/content/docs/agents/capabilities/skills.mdx @@ -73,7 +73,7 @@ The [Conversation API](/api) returns skill loads as `read_skill` actions. The ac To measure usage of skills your team owns, exclude `read_skill` actions whose `input` contains `bundled_skill_id`. From the remaining actions, count only `skill_path` values under skill roots your team manages. Don't classify other path-based entries as customer-owned because Warp-bundled skills can also use `skill_path`. -See the [bundled skill ID catalog](/reference/api-and-sdk/#skill-actions-in-conversation-data) for Warp-provided IDs and availability details. +See the [bundled skill ID catalog](/factories/api-and-sdk/#skill-actions-in-conversation-data) for Warp-provided IDs and availability details. ## Skill file format diff --git a/src/content/docs/agents/cli/oz-cli/agent-profiles.mdx b/src/content/docs/agents/cli/oz-cli/agent-profiles.mdx index 541e435bd..06a4ae0f3 100644 --- a/src/content/docs/agents/cli/oz-cli/agent-profiles.mdx +++ b/src/content/docs/agents/cli/oz-cli/agent-profiles.mdx @@ -29,7 +29,7 @@ Agent profiles are automatically synced to each host where you have Warp install ::: :::caution -The default profile for CLI usage is broadly permissive and gives the agent the ability to read and write files, apply code diffs, execute commands with a default denylist, and use MCP actions. Its profile MCP allowlist starts empty. Select run-scoped servers with `--mcp`, use a profile that allowlists installed servers, or configure an eligible file-based or global server. See [MCP servers](/reference/cli/mcp-servers/) for details. +The default profile for CLI usage is broadly permissive and gives the agent the ability to read and write files, apply code diffs, execute commands with a default denylist, and use MCP actions. Its profile MCP allowlist starts empty. Select run-scoped servers with `--mcp`, use a profile that allowlists installed servers, or configure an eligible file-based or global server. See [MCP servers](/agents/cli/oz-cli/mcp-servers/) for details. ::: ## Using a profile with the CLI diff --git a/src/content/docs/agents/cli/oz-cli/api-keys.mdx b/src/content/docs/agents/cli/oz-cli/api-keys.mdx index 38dd37243..2e744e724 100644 --- a/src/content/docs/agents/cli/oz-cli/api-keys.mdx +++ b/src/content/docs/agents/cli/oz-cli/api-keys.mdx @@ -23,7 +23,7 @@ Choose a key type based on what needs to authenticate: ## Self-hosted worker API keys -Self-hosted worker API keys authenticate managed `oz-agent-worker` daemons as your team. Use this key type with the [Docker](/platform/self-hosting/managed-docker/), [Kubernetes](/platform/self-hosting/managed-kubernetes/), or [Direct](/platform/self-hosting/managed-direct/) backend. You don't need to select an agent when creating one. +Self-hosted worker API keys authenticate managed `oz-agent-worker` daemons as your team. Use this key type with the [Docker](/factories/self-hosting/managed-docker/), [Kubernetes](/factories/self-hosting/managed-kubernetes/), or [Direct](/factories/self-hosting/managed-direct/) backend. You don't need to select an agent when creating one. ## Creating an API key diff --git a/src/content/docs/agents/cli/oz-cli/federate.mdx b/src/content/docs/agents/cli/oz-cli/federate.mdx index a4e066862..c4531df74 100644 --- a/src/content/docs/agents/cli/oz-cli/federate.mdx +++ b/src/content/docs/agents/cli/oz-cli/federate.mdx @@ -58,8 +58,7 @@ isn't available for the current principal or run. Colons and commas within compo underscores. Use `principal`, `scoped_principal`, or any available claim listed under -[principal claims](/platform/integrations/cloud-providers/#principal-claims) and -[run claims](/platform/integrations/cloud-providers/#run-claims), except `user` and +[OIDC token claims](/platform/integrations/cloud-providers/#oidc-token-claims), except `user` and `service_account`. Use `principal` in place of those emitted claim names. See [the subject claim](/platform/integrations/cloud-providers/#subject-sub) for the `principal` and `scoped_principal` formats. diff --git a/src/content/docs/agents/cli/oz-cli/quickstart.mdx b/src/content/docs/agents/cli/oz-cli/quickstart.mdx index 9bc538578..f64be2d33 100644 --- a/src/content/docs/agents/cli/oz-cli/quickstart.mdx +++ b/src/content/docs/agents/cli/oz-cli/quickstart.mdx @@ -55,7 +55,7 @@ From any directory, run: oz agent run --prompt "summarize this directory" ``` -This uses the default agent profile and executes the run locally. The default profile permits MCP actions but does not automatically start every configured server. Select run-scoped servers with `--mcp`, or use a profile that allowlists installed servers. See [MCP servers](/reference/cli/mcp-servers/) for the available startup paths. +This uses the default agent profile and executes the run locally. The default profile permits MCP actions but does not automatically start every configured server. Select run-scoped servers with `--mcp`, or use a profile that allowlists installed servers. See [MCP servers](/agents/cli/oz-cli/mcp-servers/) for the available startup paths. What happens: diff --git a/src/content/docs/agents/local-agents/agent-context/images-as-context.mdx b/src/content/docs/agents/local-agents/agent-context/images-as-context.mdx index eae72f44f..ea0ec3224 100644 --- a/src/content/docs/agents/local-agents/agent-context/images-as-context.mdx +++ b/src/content/docs/agents/local-agents/agent-context/images-as-context.mdx @@ -25,7 +25,7 @@ Warp accepts the following image formats: `.jpg`, `.jpeg`, `.png`, `.gif`, and ` In an interactive cloud conversation, attach an image with the file button in the input footer, paste an image from your clipboard, or drag and drop an image into the input. -Legacy `oz agent run-cloud --attach` task creation uses separate file-attachment limits. See [running agents remotely](/reference/cli/#running-agents-remotely-oz-agent-run-cloud) for those limits. +Legacy `oz agent run-cloud --attach` task creation uses separate file-attachment limits. See [running agents remotely](/agents/cli/oz-cli/#running-agents-remotely-oz-agent-run-cloud) for those limits. ### Model behavior and image handling diff --git a/src/content/docs/changelog/2025.mdx b/src/content/docs/changelog/2025.mdx index 118869e0f..b730cd620 100644 --- a/src/content/docs/changelog/2025.mdx +++ b/src/content/docs/changelog/2025.mdx @@ -192,7 +192,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **New Features** -* Warp agents are now available via the command line. See the [CLI reference](https://docs.warp.dev/agents/cli/oz-cli). +* Warp agents are now available via the command line. See the [CLI reference](/agents/cli/oz-cli/). * Added support for custom Regex names in Enterprise Secret Redaction. **Improvements** diff --git a/src/content/docs/factories/api-and-sdk/index.mdx b/src/content/docs/factories/api-and-sdk/index.mdx index 30c39b4c9..dd1fe0f8a 100644 --- a/src/content/docs/factories/api-and-sdk/index.mdx +++ b/src/content/docs/factories/api-and-sdk/index.mdx @@ -87,6 +87,33 @@ You can influence how an agent runs using AmbientAgentConfig, including: See the [**Python SDK**](https://github.com/warpdotdev/oz-sdk-python) or [**TypeScript SDK**](https://github.com/warpdotdev/oz-sdk-typescript) for the full configuration schema. +#### Skill actions in conversation data + +The Conversation API returns skill loads as `read_skill` actions. When `input.bundled_skill_id` is present, it identifies a Warp-provided bundled reference. `input.skill_path` is the path used to resolve a skill, but doesn't prove ownership: file-based skills and path-referenced bundled skills, including skills from a remote host, can both use this field. + +The following stable, user-facing IDs are bundled directly with Warp: + +| Bundled skill ID | Purpose | +| --- | --- | +| `add-mcp-server` | Add an MCP server to Warp configuration. | +| `change-keybinding` | Change or remove Warp keyboard shortcuts. | +| `claude-api` | Build and maintain applications that use the Anthropic SDK. | +| `create-skill` | Create, improve, and evaluate skills. | +| `create-tab-config` | Create a Warp tab configuration. | +| `factory-files` | Create and validate file-based Warp factory definitions. | +| `factory-mcp` | Send work to a factory and collaborate through Factory MCP. | +| `modify-settings` | View or change Warp settings using the bundled settings schema. | +| `oz-platform` | Run, configure, and inspect cloud agents through the API and CLI. | +| `pr-comments` | Fetch GitHub pull request review comments for the current branch. | +| `tab-configs` | Look up the tab configuration schema and validation rules. | +| `tui-migrate-setup` | Migrate supported settings into the Warp Agent CLI. | +| `update-tab-config` | Update an existing Warp tab configuration. | +| `warpctrl` | Control and inspect a running Warp app with Warp Control. | + +The catalog helps group usage across conversations; it isn't an availability manifest. Use each run's advertised skills for availability and its conversation's `read_skill` actions for invocation. The bundled set can vary by Warp release, release channel, enabled features, required files, and connected integrations. + +For example, `oz-platform`, `factory-files`, and `factory-mcp` are Warp-provided. `factory-mcp` appears only where Factory MCP is available, `tui-migrate-setup` is specific to the Warp Agent CLI, and connected integrations can add bundled IDs that aren't listed here. + --- ## Route a run to a self-hosted worker diff --git a/src/content/docs/factories/automations.mdx b/src/content/docs/factories/automations.mdx index b3f7a9ecd..3a3d308ce 100644 --- a/src/content/docs/factories/automations.mdx +++ b/src/content/docs/factories/automations.mdx @@ -37,6 +37,7 @@ Every source filters on where the event happened: a repository, project, convers | [Microsoft Teams](/factories/integrations/teams/) | Team, channels (standard picker; shared by channel ID), authors, and keywords | | [GitHub](/factories/integrations/github/) | Repository, branches, base branches, paths, labels, authors, assignees, mentioned users or teams, reviewers, review states, workflows, and conclusions | | [GitLab](/factories/integrations/gitlab/) | Project, actions, and base branch | +| [Azure DevOps](/factories/integrations/azure-devops/) | Repository, branches, work item types, labels, assignees, authors, and mentioned identities | | [Linear](/factories/integrations/linear/) | Teams, labels, project, workflow state, assignee, mentioned user, and, for comment events, a specific issue | | [Jira](/factories/integrations/jira/) | Jira projects and assignment keywords | | [Custom webhooks](/factories/webhooks/) | The webhooks the trigger listens to, and a pattern over the delivery's JSON payload | @@ -143,7 +144,7 @@ For exact matching semantics, limits, and validation rules, see [payload filter ## Related pages * [**Connect your factory**](/factories/connect-your-factory/) - Choose the sources that route work into the factory. -* [Slack](/factories/integrations/slack/), [Microsoft Teams](/factories/integrations/teams/), [GitHub](/factories/integrations/github/), [GitLab](/factories/integrations/gitlab/), [Linear](/factories/integrations/linear/), and [Jira](/factories/integrations/jira/) integration guides - Per-source setup, events, and filter details. +* [Slack](/factories/integrations/slack/), [Microsoft Teams](/factories/integrations/teams/), [GitHub](/factories/integrations/github/), [GitLab](/factories/integrations/gitlab/), [Azure DevOps](/factories/integrations/azure-devops/), [Linear](/factories/integrations/linear/), and [Jira](/factories/integrations/jira/) integration guides - Per-source setup, events, and filter details. * [**Custom webhooks**](/factories/webhooks/) - Start automations from any system that can POST JSON, with the setup flow and authentication modes. * [**Definitions as code**](/factories/factory-as-code/) - Manage automations, triggers, and filters as version-controlled files. * [**warp-factory-examples**](https://github.com/warpdotdev/warp-factory-examples) - Complete factory definitions with example automations and filters. diff --git a/src/content/docs/factories/code-forges/other-code-forges.mdx b/src/content/docs/factories/code-forges/other-code-forges.mdx index 1f0d203b1..21ba09308 100644 --- a/src/content/docs/factories/code-forges/other-code-forges.mdx +++ b/src/content/docs/factories/code-forges/other-code-forges.mdx @@ -8,7 +8,7 @@ sidebar: --- import { VARS } from '@data/vars'; -Connect your factory to a repository on Bitbucket, Azure DevOps, self-managed GitLab, or another code forge without first-class factory support. You can create the factory with no connected repository, then clone the repository from its default runner. +Connect your factory to a repository on Bitbucket, self-managed GitLab, or another code forge without first-class factory support. You can create the factory with no connected repository, then clone the repository from its default runner. :::caution This setup gives factory agents repository access. It does not add provider-specific events or automations for the code forge. @@ -19,7 +19,7 @@ This setup gives factory agents repository access. It does not add provider-spec * **Factory access** - Permission to create the factory, add Agent Secrets, and edit its default runner. * **Repository access** - An HTTPS clone URL and a token that can read the repository. -For provider-specific token and clone formats, see [Bitbucket repository access](/platform/integrations/bitbucket/), [Azure DevOps repository access](/platform/integrations/azure-devops/), or [self-managed GitLab repository access](/platform/integrations/gitlab/#self-managed-gitlab-instances). +For provider-specific token and clone formats, see [Bitbucket repository access](/platform/integrations/bitbucket/) or [self-managed GitLab repository access](/platform/integrations/gitlab/#self-managed-gitlab-instances). ## Create the factory without a repository @@ -77,5 +77,6 @@ This code forge cannot start factory work from its own repository events. Start * [Connect GitHub to your factory](/factories/integrations/github/) - Use GitHub's first-class code-forge connection. * [Connect GitLab to your factory](/factories/integrations/gitlab/) - Use GitLab.com's first-class code-forge connection. +* [Connect Azure DevOps to your factory](/factories/integrations/azure-devops/) - Use Azure DevOps Services' first-class code-forge connection. * [Connect your factory](/factories/connect-your-factory/) - Add the sources that start work after the repository is available. * [Cloud agent secrets](/platform/secrets/) - Store and scope credentials for cloud agents. diff --git a/src/content/docs/factories/connect-your-factory.mdx b/src/content/docs/factories/connect-your-factory.mdx index 55cc1eff0..17bc2d685 100644 --- a/src/content/docs/factories/connect-your-factory.mdx +++ b/src/content/docs/factories/connect-your-factory.mdx @@ -2,7 +2,7 @@ title: Connect your factory description: >- Route work into your factory from Slack, Microsoft Teams, GitHub, GitLab, - Linear, Jira, local agents, direct runs, and schedules. + Azure DevOps, Linear, Jira, local agents, direct runs, and schedules. sidebar: label: "Connect your factory" --- @@ -11,7 +11,7 @@ Connect your factory to the tools where your team already discusses, tracks, and Each source feeds into this factory's repositories. If the work belongs to a different product surface, [start a new factory](/factories/#sizing-a-factory) for it instead. -GitHub and GitLab.com connect both repositories and provider-specific work sources. To use another code forge for repository access, [connect another code forge to your factory](/factories/code-forges/other-code-forges/). That fallback does not receive provider-specific events or automations. +GitHub, GitLab.com, and Azure DevOps Services connect both repositories and provider-specific work sources. To use another code forge for repository access, [connect another code forge to your factory](/factories/code-forges/other-code-forges/). That fallback does not receive provider-specific events or automations. ## Choose a source @@ -25,6 +25,7 @@ Once a source is connected, here's the concrete action that hands it work — ea | [Microsoft Teams](/factories/integrations/teams/) | Chat in standard and shared channels | [Mentioning the Warp app in a configured channel](/factories/integrations/teams/#start-and-continue-work) | The Teams thread | | [GitHub](/factories/integrations/github/) | Issues, pull requests, reviews, and CI | [Adding the factory's label and mentioning **@warp**](/factories/integrations/github/#mention-the-factory) | The issue, pull request, or review thread | | [GitLab](/factories/integrations/gitlab/) | Merge request activity and bot mentions | [Mentioning the factory's bot in a merge request comment](/factories/integrations/gitlab/#mention-the-factory) | The merge request thread | +| [Azure DevOps](/factories/integrations/azure-devops/) | Work items and pull requests | [Creating an automation for an Azure DevOps event](/factories/integrations/azure-devops/#supported-triggers) | The factory work item | | [Linear](/factories/integrations/linear/) | Planned issues | [Assigning the issue to the factory, or mentioning the Warp app in a comment](/factories/integrations/linear/#route-agent-sessions) | The Linear issue and its agent session | | [Jira](/factories/integrations/jira/) | Work items assigned to Warp | [Assigning or mentioning **Warp** on a work item](/factories/integrations/jira/#connect-jira-and-add-an-automation) | The Jira agent session | | [Custom webhooks](/factories/webhooks/) | Any system that can POST JSON: CI, monitoring, alerting, and internal tools | [Posting JSON to the webhook's URL from the external system](/factories/webhooks/#configure-the-sender) | The factory work item | @@ -34,7 +35,7 @@ Once a source is connected, here's the concrete action that hands it work — ea ## Connect a source -Each integration guide walks through authorizing access — grant only what the factory needs. New connections add default automations, so events start working right away. Review the [automations](/factories/automations/) and adjust their filters and run settings to fit your workflow. +Each integration guide walks through authorizing access — grant only what the factory needs. Most connections add default automations; Azure DevOps requires you to create the automations you need. Review the [automations](/factories/automations/) and adjust their filters and run settings to fit your workflow. After connecting, send a test request, such as mentioning the factory in Slack or assigning it an issue, and confirm it picks up the work and replies at the source. @@ -69,6 +70,8 @@ When you create a factory through the setup wizard, Warp adds default automation These defaults are starting points. Review each automation's filters, agent, and run settings, and adjust them to match your workflow. For automation files you can adapt, such as CI failure triage, a scheduled dependency audit, and Slack reaction intake, see [`06-common-automations`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/06-common-automations) in the [warp-factory-examples](https://github.com/warpdotdev/warp-factory-examples) repository. +Azure DevOps doesn't add a default automation. Create one for the work-item, pull-request, or repository events you want to route. See the [Azure DevOps integration guide](/factories/integrations/azure-devops/). + ## Custom webhooks A [custom webhook](/factories/webhooks/) gives the factory an authenticated URL that any system can POST JSON to, and an automation decides which deliveries start work by filtering on the payload. Use it for tools Warp doesn't connect to directly, such as your CI system, PagerDuty, Sentry, or Stripe, without writing any code on your side. diff --git a/src/content/docs/factories/factory-as-code.mdx b/src/content/docs/factories/factory-as-code.mdx index 7858218f9..f98516eff 100644 --- a/src/content/docs/factories/factory-as-code.mdx +++ b/src/content/docs/factories/factory-as-code.mdx @@ -1,14 +1,14 @@ --- title: Factory definition syntax description: >- - Look up every file and key in a factory definition: factory.yaml, agents, - automations, runners, benchmarks, scorers, skills, and webhooks. + Look up the files and public keys in a factory definition: factory.yaml, + agents, automations, runners, routers, benchmarks, scorers, skills, and webhooks. sidebar: label: "Factory definition" --- import { VARS } from '@data/vars'; -Every factory is defined by files: a `factory.yaml` plus directories of agents, automations, runners, benchmarks, scorers, skills, and webhooks, versioned in a Git repository. The files are the source of truth — when they change, Warp updates the factory to match. +Every factory is defined by files: a `factory.yaml` plus directories of agents, automations, runners, model routers, benchmarks, scorers, skills, and webhooks, versioned in a Git repository. The files are the source of truth — when they change, Warp updates the factory to match. Definition files are YAML and Markdown. Keys are case-sensitive. @@ -67,7 +67,7 @@ Warp publishes the definition format as JSON Schema documents for editor complet * `https://app.warp.dev/api/v1/factory-files/schemas/v1alpha1` - Every `v1alpha1` document in one bundle, keyed by document name. * `https://app.warp.dev/api/v1/factory-files/schemas/v1alpha1/` - One document on its own, usable directly as a schema reference. -There is one document per file kind: `factory.schema.json` for `factory.yaml`; `agent.schema.json`, `automation.schema.json`, and `scorer.schema.json` for the frontmatter of the corresponding Markdown files; `runner.schema.json`, `webhook.schema.json`, `benchmark_suite.schema.json`, and `benchmark_suite_task.schema.json` for the YAML files; and `common.schema.json` for the definitions the others share. +There is one document per file kind: `factory.schema.json` for `factory.yaml`; `agent.schema.json`, `automation.schema.json`, and `scorer.schema.json` for the frontmatter of the corresponding Markdown files; `runner.schema.json`, `router.schema.json`, `webhook.schema.json`, `benchmark_suite.schema.json`, and `benchmark_suite_task.schema.json` for the YAML files; and `common.schema.json` for the definitions the others share. Editors with a YAML language server can read a document from its URL, for completion and inline validation as you type. In VS Code with the YAML extension, add the reference as a comment on the file's first line: @@ -98,6 +98,8 @@ automations/ automation.md runners/ linux-build.yaml +routers/ + by-task.yaml benchmarks/ pull-request-review/ suite.yaml @@ -151,11 +153,13 @@ Optional. Whose credentials the factory's runs execute with: `EXECUTOR` (the pri ### `codeForges` -Optional. The code hosts enabled for the factory: `GITHUB` and `GITLAB`. Omit this key to use the factory's existing code host. To use repositories from both hosts, list both values and set `codeForge` on every repository. An empty `codeForges` list requires an empty `repositories` list and creates a factory with no code host. +Optional. The code hosts enabled for the factory: `GITHUB`, `GITLAB`, and `AZURE_DEVOPS`. Omit this key to keep the factory's existing code hosts. To use repositories from more than one host, list each value and set `codeForge` on every repository. An empty `codeForges` list requires an empty `repositories` list and creates a factory with no code host. ### `repositories` -Required. The repositories the factory works in. Each entry requires `owner` and `name`; an optional `codeForge` selects `GITHUB` or `GITLAB`. Omit `codeForge` to use the factory's primary code host. When [`codeForges`](#codeforges) lists both hosts, every repository must declare `codeForge`. +Required. The repositories the factory works in. Each entry requires `owner` and `name`; an optional `codeForge` selects `GITHUB`, `GITLAB`, or `AZURE_DEVOPS`. Omit `codeForge` to use the factory's primary code host. When [`codeForges`](#codeforges) lists more than one host, every repository must declare `codeForge`. + +Set `deferred: true` to attach a repository without preparing it for every run. Warp still prepares a deferred repository when an agent or automation lists it in `required_repos`, or when a run adds it explicitly. ```yaml codeForges: @@ -170,6 +174,10 @@ repositories: name: deployment-config ``` +### `benchmarkRepoSubstitutions` + +Optional. Replaces a GitHub repository from the factory's scope with an external GitHub repository when a benchmark trial prepares its starting state. Each entry has `source` and `target` objects with `codeForge`, `owner`, and `name`. The source must belong to the factory, and the target must not. + ### `secrets` Optional. Names of [managed secrets](/platform/secrets/) granted to every agent in the factory, in addition to anything individual agents declare. @@ -202,30 +210,39 @@ cloudProviders: ### `integrations` -Optional. The integration providers attached to the factory. `type` accepts `slack`, `linear`, or `jira`. Use `linear.teamIds` or `jira.projectKeys` to limit the teams or projects available to the factory. Declare at most one issue tracker: `linear` and `jira` are mutually exclusive, and omitting a tracker is also valid. GitHub is not declared here; repository access comes from `repositories` and the connected GitHub App. +Optional. The integration providers attached to the factory. Supported types include `slack`, `microsoft-teams`, `linear`, and `jira`. Declare at most one issue tracker: `linear` and `jira` are mutually exclusive, and omitting a tracker is also valid. Code-forge access comes from `repositories`, not this list. ```yaml integrations: - type: slack - type: linear - linear: - teamIds: - - LINEAR_TEAM_ID ``` -For Linear, `linear.teamIds` limits issue discovery and routing to those team IDs. Omit it to include every team in the connected Linear workspace. For Jira, `jira.projectKeys` provides the equivalent scope; omit it to include every project on the connected Jira site. +For Slack and Microsoft Teams, `autoRespondToThreadReplies` controls whether eligible plain replies in an existing factory thread can continue work without another mention. It defaults to `true`. ```yaml integrations: - - type: jira - jira: - projectKeys: - - ENG - - OPS + - type: slack + slack: + autoRespondToThreadReplies: false ``` +The legacy `linear.teamIds` and `jira.projectKeys` settings are accepted when reading older definitions, but they no longer control issue discovery. Scope Linear and Jira events with automation filters instead. + The legacy `providers` key is accepted when reading older definitions. Use `cloudProviders`; when Warp rewrites the definition, it emits `cloudProviders`. +### `scorerDefaults` + +Optional. Sets `runner`, `secrets`, and `mcpServers` for every file-defined scorer. A scorer can override any of these values. + +### `selfImprovement` + +Optional. Configures scheduled self-improvement for a GitHub-backed factory: + +* `failedRunThreshold` - Distinct scored failures per agent required before a scheduled self-improvement run. Use a value from 1 through 50, or omit it for the server default. +* `reviewerType` - The pool used to request one reviewer: `admins` (the default), `team`, `custom`, or `none`. +* `reviewerEmails` - Active members of the factory's team to use when `reviewerType` is `custom`. + ### `agentDefaults` Required. The execution defaults every agent inherits. Declare exactly one of `model` or `harness`; the other keys are optional. An agent that sets one of these keys for itself overrides the default. @@ -291,7 +308,7 @@ MCP servers for agents that don't declare their own, in the same form as [`mcpSe ### `agentDefaults.workerHost` -Where runs execute: `warp` for Warp-hosted compute, or the ID of a connected [self-hosted worker](/factories/self-hosting/). Configure the worker's Docker, Kubernetes, or Direct backend on the worker itself; the factory definition selects the worker and a compatible runner. +Where runs execute: `warp` for Warp-hosted compute, or the ID of a connected [self-hosted worker](/factories/self-hosting/). Omit the key to use the workspace default. At the agent or automation level, set it to `null` or an empty string to clear an inherited host and return to the workspace default. Configure the worker's Docker, Kubernetes, or Direct backend on the worker itself; the factory definition selects the worker and runner. ### `agentDefaults.computerUseModel` @@ -343,7 +360,10 @@ The frontmatter accepts: * `description` - Optional. What the agent does. * [`agentType`](#agenttype) - Optional. The agent's role. * `credentialStrategy` - Optional. Overrides the factory-level [`credentialStrategy`](#credentialstrategy) for this agent's runs. +* `spawnableBy` - Optional. The factory agents allowed to start this agent. Omit it to allow only the foreman, use an empty list to allow none, or list the exact agent names that can start it. * `model` or `harness`, `runner`, `environmentId`, `secrets`, `mcpServers`, `workerHost`, `computerUseModel` - Optional. The same keys as [`agentDefaults`](#agentdefaults); a key declared here overrides the default for this agent. +* `idleTimeoutMinutes` - Optional. How long a completed session remains available for follow-up, from 1 through 60 minutes. +* `required_repos` - Optional. Repositories that Warp prepares for every run by this agent. Each entry uses `owner`, `name`, and, when needed to disambiguate the same repository across hosts, `codeForge`. ### `agentType` @@ -382,16 +402,17 @@ Required. One or more events that start runs. Each trigger declares a `provider` The providers and their events: -* `github` - `check_run_rerequested`, `check_suite_completed`, `check_suite_rerequested`, `issue_assigned`, `issue_created`, `issue_labeled`, `issue_mentioned`, `pull_request_assigned`, `pull_request_closed`, `pull_request_labeled`, `pull_request_mentioned`, `pull_request_merged`, `pull_request_opened`, `pull_request_ready`, `pull_request_reopened`, `pull_request_review_requested`, `pull_request_review_submitted`, `pull_request_synchronized`, `push`, `workflow_run_completed` +* `azure_devops` - `pull_request_closed`, `pull_request_commented`, `pull_request_created`, `pull_request_mentioned`, `pull_request_merged`, `pull_request_updated`, `push`, `work_item_assigned`, `work_item_created`, `work_item_labeled`, `work_item_mentioned` +* `github` - `check_run_rerequested`, `check_suite_completed`, `check_suite_rerequested`, `issue_assigned`, `issue_commented`, `issue_created`, `issue_labeled`, `issue_mentioned`, `pull_request_assigned`, `pull_request_closed`, `pull_request_commented`, `pull_request_labeled`, `pull_request_mentioned`, `pull_request_merged`, `pull_request_opened`, `pull_request_ready`, `pull_request_reopened`, `pull_request_review_requested`, `pull_request_review_submitted`, `pull_request_synchronized`, `push`, `workflow_run_completed` * `gitlab` - `bot_mentioned`, `merge_request`, `push` * `linear` - `agent_session_created`, `comment_created`, `issue_assigned`, `issue_created`, `issue_labeled`, `issue_state_changed` * `jira` - `agent_session_created`, `issue_created`, `issue_labeled`, `status_changed` -* `slack` - `app_mention`, `member_joined_channel`, `message_dm`, `message_posted`, `reaction_added` +* `slack` - `app_mention`, `member_joined_channel`, `message_dm`, `message_im`, `message_mpim`, `message_posted`, `reaction_added` * `schedule` - `cron_fired` * `webhook` - `received` * `factory` - `work_item_stage_changed` -Slack, Linear, and Jira triggers require the matching [integration](/platform/integrations/) to be connected. GitHub triggers work through the factory's `repositories`, and GitLab triggers through the group connected to your workspace — see the [GitLab integration](/factories/integrations/gitlab/). `webhook` triggers listen to [custom webhooks](/factories/webhooks/) declared under [`webhooks/`](#webhooksnameyaml). +Slack, Linear, and Jira triggers require the matching [integration](/platform/integrations/) to be connected. Code-forge triggers use the factory's repositories and provider connection; see the [GitHub](/factories/integrations/github/), [GitLab](/factories/integrations/gitlab/), and [Azure DevOps](/factories/integrations/azure-devops/) integration guides. `webhook` triggers listen to [custom webhooks](/factories/webhooks/) declared under [`webhooks/`](#webhooksnameyaml). ### `triggers[].filter` @@ -402,6 +423,7 @@ A `webhook` trigger with the `received` event requires `webhook_ids` in its filt The published trigger catalog currently uses these filter keys across its provider and event combinations: * Factory: `stages`. +* Azure DevOps: `assignees`, `authors`, `base_branches`, `branches`, `labels`, `mentioned`, `repos`, `source_repos`, and `work_item_types`. * GitHub: `assignees`, `authors`, `baseBranches`, `base_branches`, `branches`, `conclusions`, `labels`, `mentioned`, `paths`, `prNumbers`, `pr_numbers`, `repos`, `review_states`, `reviewer_teams`, `reviewers`, and `workflows`. * GitLab: `actions`, `base_branches`, `branches`, `mentioned`, and `repos`. * Jira: `keywords`, `labels`, `project_keys`, and `status_ids`. @@ -439,7 +461,7 @@ triggers: ### Execution overrides -An automation may also declare `model` or `harness`, `runner`, `environmentId`, `secrets`, `mcpServers`, `workerHost`, and `computerUseModel` (the same keys as [`agentDefaults`](#agentdefaults)) to override the target agent's settings for the runs it starts. +An automation may also declare `displayName`, plus `model` or `harness`, `runner`, `environmentId`, `secrets`, `mcpServers`, `workerHost`, `computerUseModel`, `idleTimeoutMinutes`, and `required_repos`. Execution settings override the target agent for runs this automation starts. Automation `required_repos` entries are added to the target agent's required repositories. ## `runners/.yaml` @@ -469,10 +491,31 @@ Optional. The compute size, as `vcpus` and `memoryGb`. Omit it to take the works ### `platform` -The operating system and architecture. `os` is `linux` (the default) or `macos`, and `arch` is `x86_64` (the default on Linux) or `aarch64` (the only option on macOS). Linux runners require `linux.dockerImage`, the container image the sandbox boots, so every Linux runner declares a `platform` section. macOS runners accept an optional `mac.version` (`"14"`, `"15"`, `"26"`, or `"27"`; quote it, and it defaults to `"26"`). +The operating system and architecture. `os` is `linux` (the default), `macos`, or `windows`. `arch` is `x86_64` (the default on Linux and the only option on Windows) or `aarch64` (supported on Linux and required on macOS). Linux runners require `linux.dockerImage`, the container image the sandbox boots, so every Linux runner declares a `platform` section. macOS runners accept an optional `mac.version` (`"14"`, `"15"`, `"26"`, or `"27"`; quote it, and it defaults to `"26"`). For a private Linux image, set `linux.registryCredentialSecretName` to the name of a managed `docker_registry` secret. The secret's registry host must match the host in `linux.dockerImage`. +### `failureSessionRetentionMinutes` + +Optional. Keeps a failed session open for inspection for 1 through 60 minutes. Omit it to use the environment's setting. + +## `routers/.yaml` + +Optional. Each file defines a factory-owned custom model router. Use the file name as a value anywhere the definition accepts a model. `name` is an optional display label, `type` is `complexity` or `prompt`, and `default` is the concrete model to use when no route matches. + +```yaml title="routers/by-task.yaml" +name: By task +type: prompt +default: claude-4-6-sonnet-high +routing: + - description: Routine documentation changes + model: claude-4-5-haiku + - description: Complex implementation or debugging + model: claude-4-8-opus-high +``` + +For `type: complexity`, `routing` maps `easy`, `medium`, and `hard` to concrete models. For `type: prompt`, `routing` is an ordered list of `description` and `model` pairs. Router targets must be concrete supported models, not Auto models or other routers. See [custom model routers](/agents/inference/custom-routers/) for routing behavior. + ## `benchmarks//suite.yaml` Optional. This file defines a [benchmark suite](/factories/benchmarks/): one agent, optional reusable configurations, and an ordered set of reusable tasks. The suite slug is its stable file location, not its display name, so renaming `name` does not move the file or change the suite's identity. @@ -546,6 +589,14 @@ Required. The requirements the Correctness Scorer uses to evaluate each trial. Optional. The ID of the prior run the task came from. This records provenance only and can refer to a deleted run. +### `tags` + +Optional. An ordered list of labels for the task. + +### `linearSeed` + +Optional. JSON-compatible starting state for the isolated Linear workspace used by the benchmark trial. + ### `startingRepoRefs` Optional. The GitHub or GitLab repositories and exact commits the task starts from. Each entry can use `github.com:OWNER/REPO@COMMIT_SHA` or `gitlab.com:OWNER/REPO@COMMIT_SHA`. It can instead use an object with `codeForge` (`GITHUB` or `GITLAB`), `owner`, `repo`, and `ref`. `COMMIT_SHA` and `ref` must be full 40-character commit SHAs, not branches or tags. Omit this key to use the agent's normal checkout defaults. @@ -584,7 +635,17 @@ Optional. A short summary of what the scorer checks. ### `agents` -Required. The agents whose runs this scorer evaluates, as a list of one or more agent names. Each name matches an agent defined under [`agents/`](#agentsnameagentmd). +Required. The agents whose runs this scorer evaluates. A string names one agent and scores that run alone. To include an agent's child runs as evidence, use an object with `name` and `includeDescendants: true`. + +```yaml +agents: + - name: foreman + includeDescendants: true +``` + +### Scorer execution settings + +Optional `runner`, `secrets`, and `mcpServers` keys override the factory's `scorerDefaults` for this scorer. Use `scorerDefaults` in `factory.yaml` to set those values for every file-defined scorer. ### `output` diff --git a/src/content/docs/factories/factory-mcp.mdx b/src/content/docs/factories/factory-mcp.mdx index 96338c571..9b4bfc330 100644 --- a/src/content/docs/factories/factory-mcp.mdx +++ b/src/content/docs/factories/factory-mcp.mdx @@ -33,7 +33,7 @@ Paste this prompt into a coding agent that can run commands and configure MCP se Set up a factory for me. Read https://docs.warp.dev/factories/factory-mcp.md, follow the setup instructions for your coding environment to connect to and authenticate with Factory MCP, then use Factory MCP to onboard me. ``` -The agent connects to Factory MCP, opens a browser sign-in where you log in or create a Warp account, then walks you through the same choices as the [setup wizard](/factories/quickstart/#set-up-your-factory): team, code host, repositories, agents, and integrations. It finishes by linking your new factory's dashboard. If the {VARS.FACTORY_WEB_APP} is still open to its setup screen in your browser, refresh the page to pick up the new factory. +The agent connects to Factory MCP, opens a browser sign-in where you log in or create a Warp account, then walks you through the same choices as the [setup wizard](/factories/quickstart/#set-up-your-factory): team, code host, repositories, agents, and integrations. Factory MCP onboarding currently connects GitHub and GitLab repositories; use the web setup wizard to connect Azure DevOps. It finishes by linking your new factory's dashboard. If the {VARS.FACTORY_WEB_APP} is still open to its setup screen in your browser, refresh the page to pick up the new factory. diff --git a/src/content/docs/factories/factory-skills.mdx b/src/content/docs/factories/factory-skills.mdx index 8af412ce1..5135d59ff 100644 --- a/src/content/docs/factories/factory-skills.mdx +++ b/src/content/docs/factories/factory-skills.mdx @@ -74,7 +74,7 @@ Warp provides these stable bundled-skill IDs: | `update-tab-config` | Update an existing Warp tab configuration. | | `warpctrl` | Control and inspect a running Warp app with Warp Control. | -See [skill actions in conversation data](/reference/api-and-sdk/#skill-actions-in-conversation-data) for the API reference. +See [skill actions in conversation data](/factories/api-and-sdk/#skill-actions-in-conversation-data) for the API reference. ## Attribute team-owned skill usage diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index ab6592660..39685584c 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -50,7 +50,7 @@ Warp Factories is designed for engineering teams with repeatable work that exten * **Coordinated specialist agents** - A team of [factory agents](/factories/factory-agents/) handles each work item. A coordinating foreman routes it through the triage, spec, implement, and review agents, skipping stages that don't apply. You can add custom agents and automations to handle work the defaults don't cover. * **Definitions as code** - [Version-controlled definition files](/factories/factory-as-code/) describe your repositories, agents, automations, runners, [skills](/factories/factory-skills/), and MCP servers, so factory changes get the same review, history, and rollback as code changes. -* **Code forges and work sources** - Connect [GitHub](/factories/integrations/github/), [GitLab](/factories/integrations/gitlab/), or [another code forge](/factories/code-forges/other-code-forges/) to the repository your factory works in. Route work from [Slack](/factories/integrations/slack/), [Linear](/factories/integrations/linear/), [Jira](/factories/integrations/jira/), [custom webhooks](/factories/webhooks/), direct runs, or schedules. The [Factory MCP](/factories/factory-mcp/) connects coding agents and other MCP clients. +* **Code forges and work sources** - Connect [GitHub](/factories/integrations/github/), [GitLab](/factories/integrations/gitlab/), [Azure DevOps](/factories/integrations/azure-devops/), or [another code forge](/factories/code-forges/other-code-forges/) to the repository your factory works in. Route work from [Slack](/factories/integrations/slack/), [Linear](/factories/integrations/linear/), [Jira](/factories/integrations/jira/), [custom webhooks](/factories/webhooks/), direct runs, or schedules. The [Factory MCP](/factories/factory-mcp/) connects coding agents and other MCP clients. * **Model and harness choice** - Each agent can use a different model and [supported harness](/platform/harnesses/), including the Warp Agent, Claude Code, and Codex. * **Measurement and self-improvement** - The [factory dashboard](/factories/factory-dashboard/) shows work-item status, runs, automations, costs, and benchmarks. [Scorers](/factories/measure-and-improve/scorers/) classify completed runs, [Benchmarks](/factories/benchmarks/) compare fixed tasks across configurations, and [Self-improvement](/factories/measure-and-improve/self-improvement/) turns repeated failures into follow-up work the factory proposes for review. * **Infrastructure control** - Choose Warp-hosted or managed self-hosted execution on an eligible Enterprise plan. The [infrastructure and security](/factories/infrastructure-and-security/) page compares execution models and links to the self-hosting setup path, as well as available inference and credential controls. diff --git a/src/content/docs/factories/integrations/azure-devops.mdx b/src/content/docs/factories/integrations/azure-devops.mdx new file mode 100644 index 000000000..4ae0bdaca --- /dev/null +++ b/src/content/docs/factories/integrations/azure-devops.mdx @@ -0,0 +1,107 @@ +--- +title: Connecting Azure DevOps to your factory +description: >- + Connect Azure DevOps to a factory so work items, pull requests, comments, + and repository changes can start factory runs. +sidebar: + label: "Azure DevOps" +--- +import { VARS } from '@data/vars'; + +Connect an Azure DevOps organization and project to give a factory access to selected repositories. Azure DevOps events can then start factory automations, and runs authenticate with a dedicated identity for that factory. + +This native integration supports Azure DevOps Services. To connect Azure DevOps Server or to configure a standalone cloud agent, see the [Azure DevOps integration for cloud agents](/platform/integrations/azure-devops/). + +## Prerequisites + +* **Azure DevOps access** - Your Microsoft account must have access to the organization and project you want to connect. +* **Administrators for first-time setup** - A Microsoft Entra administrator and an Azure DevOps Project Collection Administrator must approve the Azure DevOps Manager once for the organization. One person can complete both approvals if they hold both roles. +* **Azure DevOps Basic seats** - The Azure DevOps Manager can consume one Basic seat, and every factory identity can consume another. + +## Connect Azure DevOps to a factory + +1. In the {VARS.FACTORY_WEB_APP}, click **+** next to **Factories** to open the setup wizard. +2. Under **Connect your code hosts**, click **Connect** next to **Azure DevOps**, then complete Microsoft authorization. +3. Choose one Azure DevOps organization and one project for the factory. +4. If the organization doesn't have an active Azure DevOps Manager, complete its one-time setup or send the setup request to the administrators listed in [Prerequisites](#prerequisites). A person completing the setup must acknowledge the possible Basic-seat usage. If you request setup from someone else, Warp waits to create the factory until the Manager is active. +5. On **Set up your factory**, select the repositories the factory can access. All selected repositories must belong to the organization and project you chose. +6. Complete the remaining setup steps. After Warp creates the factory, it begins provisioning the factory's Azure DevOps identity. + +Identity provisioning creates a Microsoft Entra application and service principal, configures a federated credential, assigns Azure DevOps Basic access, and grants access to the selected repositories. You can retry an incomplete setup from the factory's settings without creating a second identity. + +## Supported triggers + +Create or edit an automation from the factory dashboard to start runs from these Azure DevOps events: + +| Source | Supported activity | +| --- | --- | +| Work items | Created, assigned, labeled, or mentioned | +| Pull requests | Created, merged, closed, updated, commented on, or mentioned | + +A factory definition also accepts the Azure DevOps `push` event. The automation editor doesn't currently offer this event. + +### Automation filters + +The available filters depend on the event: + +| Event | Filters | +| --- | --- | +| Work item created, assigned, or labeled | Work item types, labels, assignees, and authors | +| Work item mentioned | Mentioned identities | +| Pull request created, merged, closed, updated, or commented on | Repositories and target branches | +| Pull request mentioned | Repository and mentioned identities | +| Push in a definition file | Repositories and branches | + +Definition files also accept `source_repos` for pull-request events. Use it to match the repository that contains the pull request's source branch. + +For example, this definition starts a run when a pull request is created against `main` in one repository: + +```markdown title="automations/review-azure-devops-pr/automation.md" +--- +enabled: true +agent: reviewer +triggers: + - provider: azure_devops + event: pull_request_created + filter: + repos: [contoso/Payments/api] + base_branches: [main] +--- + +Review the pull request. Post a concise summary and any blocking findings. +``` + +For the complete automation-file schema, see [triggers in a factory definition](/factories/factory-as-code/#triggers). + +## Permissions and identity + +The factory's selected repositories determine what its dedicated identity can access. Automation filters decide when work starts, not what a run can reach. + +The identity uses federated authentication instead of a stored personal access token. Pull requests and other repository changes created by the factory use this identity rather than the account of the person whose activity started the run. + +The Azure DevOps Manager belongs to the organization, not to one factory. After its one-time approval, Warp uses it to provision and maintain the dedicated identity for each factory connected to that organization. + +## Troubleshooting + +### Your organization or project isn't listed + +Confirm that the Microsoft account you authorized can access the organization and project. Return to **Connect your code hosts**, refresh the Azure DevOps connection, and try again. + +### The Azure DevOps Manager is pending + +Complete both the Microsoft Entra administrator approval and the Azure DevOps Project Collection Administrator approval. If you requested setup from someone else, wait for that request to be completed before provisioning the factory identity. + +### Identity provisioning fails + +Retry provisioning from the factory's settings. Warp keeps the resources that were created successfully and reuses them on the next attempt. The progress list identifies the failed step. + +### An event doesn't start work + +Confirm that the automation is enabled and uses the expected event. Check every filter, including the repository, target branch, work item type, label, assignee, author, or mentioned identity. + +## Related pages + +* [**Factory automations**](/factories/automations/) - Configure triggers, filters, agents, and run settings. +* [**Definitions as code**](/factories/factory-as-code/) - Manage Azure DevOps repositories and automations in version-controlled files. +* [**Connect your factory**](/factories/connect-your-factory/) - Choose the other sources that route work into the factory. +* [**Azure DevOps for standalone cloud agents**](/platform/integrations/azure-devops/) - Clone Azure DevOps repositories with a personal access token outside Warp Factories. diff --git a/src/content/docs/factories/quickstart.mdx b/src/content/docs/factories/quickstart.mdx index 871773b36..8d84264fa 100644 --- a/src/content/docs/factories/quickstart.mdx +++ b/src/content/docs/factories/quickstart.mdx @@ -21,14 +21,14 @@ In this quickstart, you will create a factory and take one small work item from * **Warp Factories access** - [Request Early Access](https://www.warp.dev/factories/request-access) for your team. * **A Warp team with credits** - The team's [credits](/support-and-community/plans-and-billing/platform-credits/) are consumed by factory agents. -* **Repository access** - Authorize GitHub or GitLab during setup. If your organization restricts app installations, ask an owner to approve the connection. +* **Repository access** - Authorize GitHub, GitLab, or Azure DevOps during setup. If your organization restricts app installations, ask an owner to approve the connection. Azure DevOps also requires [one-time administrator approval](/factories/integrations/azure-devops/#prerequisites). ## Set up your factory _~5 minutes_ :::note -An agent connected to [Factory MCP](/factories/factory-mcp/#set-up-with-your-coding-agent) can run this whole setup: ask it to set up a factory, and it walks you through the same choices as the wizard. If this wizard is still open when the agent finishes, refresh the page to see the new factory. +For GitHub and GitLab repositories, an agent connected to [Factory MCP](/factories/factory-mcp/#set-up-with-your-coding-agent) can run this whole setup. Use the web setup wizard for Azure DevOps. If the wizard is still open when the agent finishes, refresh the page to see the new factory. ::: Warp walks you through a setup wizard: @@ -40,13 +40,13 @@ Warp walks you through a setup wizard:
Click + next to Factories to open the setup wizard.
-2. Click **I want to use repos from GitHub** or **I want to use repos from GitLab**, then choose the organization or group to connect. +2. Under **Connect your code hosts**, connect GitHub, GitLab, or Azure DevOps. Choose the GitHub organization, GitLab group, or Azure DevOps organization and project to connect. To use another code forge, select **No repo**, finish creating the factory, then [configure repository access from the default runner](/factories/code-forges/other-code-forges/).
![The Connect a GitHub organization screen, with an already-connected organization shown as an option.](../../../assets/factories/quickstart-connect-organization.png) -
Choose the organization or group whose repositories the factory will use. GitLab shows an equivalent screen for groups.
+
Choose the organization whose repositories the factory will use.
3. On **Select your repos**, select the repositories the factory works in, then click **Add repos**. Start with one or two repositories that ship together, and add more later. See [sizing a factory](/factories/#sizing-a-factory) before adding a repository already covered by another factory. diff --git a/src/content/docs/factories/self-hosting/managed-kubernetes.mdx b/src/content/docs/factories/self-hosting/managed-kubernetes.mdx index 12d35f255..3a93cca39 100644 --- a/src/content/docs/factories/self-hosting/managed-kubernetes.mdx +++ b/src/content/docs/factories/self-hosting/managed-kubernetes.mdx @@ -234,6 +234,38 @@ Use `kubernetesBackend.setupCommand` (Helm value) or `backend.kubernetes.setup_c --- +## Protect active task pods from disruption + +Terminating the worker pod normally leaves active task Jobs running. Evicting a task pod interrupts the run and deletes its pod-local `emptyDir` workspace. Configure node lifecycle tooling to avoid voluntary disruption of active task pods. + +For Karpenter, add its pod-level disruption annotation to every task Job through the Helm values: + +```yaml title="values.yaml" +kubernetesBackend: + extraAnnotations: + karpenter.sh/do-not-disrupt: "true" +``` + +The annotation blocks Karpenter consolidation. It blocks drift only when the NodePool omits `terminationGracePeriod`. Expiration, interruption, node repair, and manual deletion can still terminate the node. With `terminationGracePeriod`, Karpenter can terminate blocking pods when the period ends. Review [Karpenter's pod-level disruption controls](https://karpenter.sh/docs/concepts/disruption/#pod-level-controls). + +A PodDisruptionBudget (PDB) constrains tools that use the Kubernetes Eviction API. It protects a group of pods, not an individual task's process or workspace. Direct deletion, kubelet pressure eviction, node failure, and controllers that bypass the Eviction API can still terminate a task. + +For other node lifecycle tools, use the equivalent protection and verify which disruption paths bypass it. A replacement pod cannot resume an interrupted run. + +--- + +## Plan capacity and scheduling + +Task pods need capacity for their configured requests before the worker's unschedulable timeout expires. + +* Set `worker.maxConcurrentTasks` to a finite value that matches cluster capacity. The default, `0`, does not cap concurrency. +* Set task CPU and memory through a runner instance shape or the `task` container in `kubernetesBackend.podTemplate`. Reserve capacity for init containers, DaemonSets, and workload spikes. +* Set `kubernetesBackend.unschedulableTimeout` longer than the slowest expected node provisioning time. The default is `30s`; `0s` disables the check. +* Use `worker.nodeSelector`, `worker.tolerations`, and `worker.affinity` for the worker Deployment. Use the equivalent fields in `kubernetesBackend.podTemplate` for task pods. +* A toleration makes a pod eligible for a tainted node; it does not reserve capacity. Pair dedicated-node tolerations with matching selectors or affinity and autoscaler capacity. + +--- + ## Metrics The Helm chart includes built-in support for exporting OpenTelemetry metrics from the worker. Enable metrics by setting `metrics.enabled=true`: diff --git a/src/content/docs/factories/self-hosting/quickstart.mdx b/src/content/docs/factories/self-hosting/quickstart.mdx index dcca73853..4dc0035ba 100644 --- a/src/content/docs/factories/self-hosting/quickstart.mdx +++ b/src/content/docs/factories/self-hosting/quickstart.mdx @@ -80,16 +80,4 @@ Open the {VARS.DASHBOARD}, find the new task, and * [CLI reference](/agents/cli/oz-cli/) — Route standalone cloud agents to the worker with `--host`. * [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/) — Deploy workers into a Kubernetes cluster with Helm. * [Self-hosted worker reference](/factories/self-hosting/reference/) — All CLI flags and config file options. - -## Troubleshooting - -**Worker won't start**\ -Verify Docker is running (`docker info`) and that the daemon platform is `linux/amd64` or `linux/arm64`. Musl-based (Alpine) worker hosts are not supported. - -**Worker won't connect**\ -Verify you created a **Self-hosted worker** key and that it has not expired. Ensure the machine has outbound internet access to `oz.warp.dev:443`. Increase log verbosity with `--log-level debug` to see connection details. - -**Task stays queued and never runs**\ -Confirm the `--host` value you passed to `oz agent run-cloud` matches your `--worker-id` exactly (case-sensitive). Check that the worker's team matches the team creating the task. - -For more, see [self-hosting troubleshooting](/factories/self-hosting/troubleshooting/). +* [Self-hosting troubleshooting](/factories/self-hosting/troubleshooting/) — Fix worker startup, connection, routing, and task failures. diff --git a/src/content/docs/factories/self-hosting/troubleshooting.mdx b/src/content/docs/factories/self-hosting/troubleshooting.mdx index f0be07aa1..58d1cbe61 100644 --- a/src/content/docs/factories/self-hosting/troubleshooting.mdx +++ b/src/content/docs/factories/self-hosting/troubleshooting.mdx @@ -134,7 +134,7 @@ Replace `NAMESPACE` with the task namespace, `TASK_POD` with the task pod name, * **`ErrImagePull`, `ImagePullBackOff`, or `InvalidImageName`:** Follow [Image pull failures](#image-pull-failures). Preflight does not pull every task image. * **`CreateContainerConfigError` or `FailedMount`:** Events name the missing Secret, ConfigMap, service account, key, or volume. Verify that it exists in the task namespace. * **Init container failure:** Check each init container's status and logs. The Warp sidecar-loading init container runs as root unless native image volumes are enabled. Custom init containers must finish before the task starts. -* **`Evicted`, `DeadlineExceeded`, or exit code `143`:** Check node pressure, lifecycle-tool events, the Job deadline, and termination events. A replacement pod cannot recover the task's `emptyDir` workspace. See [protecting active task pods from voluntary disruption](/platform/self-hosting/managed-kubernetes/#protect-active-task-pods-from-disruption). +* **`Evicted`, `DeadlineExceeded`, or exit code `143`:** Check node pressure, lifecycle-tool events, the Job deadline, and termination events. A replacement pod cannot recover the task's `emptyDir` workspace. See [protecting active task pods from voluntary disruption](/factories/self-hosting/managed-kubernetes/#protect-active-task-pods-from-disruption). * **The task cannot reach a dependency:** Test DNS, TLS, and the destination from the task pod. Worker connectivity to Warp does not test the task's network policies, service mesh, proxy, or dependency egress. The worker API key authenticates the worker to Warp; it is not a task credential. Provide task credentials through your Secret integration and pod template. diff --git a/src/content/docs/platform/data-storage.mdx b/src/content/docs/platform/data-storage.mdx index 68e059393..5edf2f581 100644 --- a/src/content/docs/platform/data-storage.mdx +++ b/src/content/docs/platform/data-storage.mdx @@ -265,6 +265,6 @@ The bucket name or region is wrong, or the bucket doesn't exist. Confirm both ma ## Related pages * [Architecture](/platform/architecture/#data-security-and-boundaries) - How run data, control-plane data, and inference credentials flow through Warp's platform. -* [Self-hosting overview](/platform/self-hosting/) - Run agent compute on your own infrastructure instead of Warp-managed servers. +* [Self-hosting overview](/factories/self-hosting/) - Run agent compute on your own infrastructure instead of Warp-managed servers. * [Cloud agent secrets](/platform/secrets/) - Store credentials agents use during a run. * [Admin Panel for teams](/enterprise/team-management/admin-panel/) - The full reference for team settings, including the Platform section. diff --git a/src/content/docs/platform/integrations/azure-devops.mdx b/src/content/docs/platform/integrations/azure-devops.mdx index 99c2d0f9b..bd168298a 100644 --- a/src/content/docs/platform/integrations/azure-devops.mdx +++ b/src/content/docs/platform/integrations/azure-devops.mdx @@ -8,25 +8,23 @@ description: >- --- import { VARS } from '@data/vars'; -Cloud agents work with any Git repository, including those hosted on Azure DevOps. A native Azure DevOps integration is not yet available, but you can grant agents access to your repositories using a personal access token and Warp-managed secrets. Once configured, your environment works with any {VARS.WARP_AUTOMATION_PLATFORM} trigger—Slack, Linear, schedules, or the CLI. +Cloud agents work with any Git repository, including those hosted on Azure DevOps. For standalone cloud agents, connect a repository with a personal access token and Warp-managed secrets. Once configured, your environment works with any {VARS.WARP_AUTOMATION_PLATFORM} trigger—Slack, Linear, schedules, or the CLI. -This page explains how to generate an Azure DevOps personal access token, store it securely, and configure a cloud agent environment that clones your repository at runtime. +Warp Factories has a separate native Azure DevOps Services integration with repository selection, dedicated factory identities, and Azure DevOps triggers. See [connecting Azure DevOps to your factory](/factories/integrations/azure-devops/). + +Generate an Azure DevOps personal access token, store it as a Warp-managed secret, and use it to clone your repository when a cloud agent starts. :::note This approach works for both Azure DevOps Services (dev.azure.com) and Azure DevOps Server (self-hosted) instances. ::: ---- - ## Prerequisites * A Warp account (create an account at {VARS.WEB_APP_URL}) * A repository hosted on Azure DevOps (cloud or self-hosted) * The [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) installed and authenticated ---- - -## Step 1: Generate a personal access token +## Step 1: generate a personal access token 1. Sign in to your Azure DevOps organization at `dev.azure.com/{your-org}`. 2. Click the user settings icon (gear) in the top-right corner, then click **Personal access tokens**. @@ -40,13 +38,9 @@ This approach works for both Azure DevOps Services (dev.azure.com) and Azure Dev **Code (Read)** is the minimum required scope to clone a repository. If a future workflow requires the agent to push commits or open pull requests, you will also need **Code (Read & Write)**. ::: -:::note For Azure DevOps Server (self-hosted), sign in at `https://{server}/{collection}` instead of `dev.azure.com`. The token creation steps are the same. -::: - ---- -## Step 2: Store the token as a Warp-managed secret +## Step 2: store the token as a Warp-managed secret Warp injects managed secrets as environment variables at runtime and never exposes them in logs or configuration files. See the [Secrets](/platform/secrets/) documentation for full details on scoping and managing secrets. @@ -70,9 +64,7 @@ If you need to update a secret value, run: oz secret update --team --value AZURE_DEVOPS_TOKEN ``` ---- - -## Step 3: Create an environment with a clone setup command +## Step 3: create an environment with a clone setup command Create an environment that uses your token to clone the repository at the start of each agent run. Because the `--repo` flag in `oz environment create` is designed for GitHub repositories, you clone your Azure DevOps repo via a setup command instead. @@ -98,15 +90,11 @@ Use single quotes around setup commands that reference secrets. Double quotes ca * For Azure DevOps Server (self-hosted), replace `dev.azure.com` with your server's hostname. * The second `--setup-command` with any dependency install or build steps your project requires. For example, `npm ci` or `pip install -r requirements.txt`. -:::caution -Setup commands run on a fresh container for every agent run. Write them to be idempotent — commands that assume existing state (such as a partially cloned repo or a pre-built cache) can fail unpredictably. See [environment design and best practices](/platform/environments/configuring-environments/#environment-design-and-best-practices) for guidance. -::: +Setup commands run on a fresh container for every agent run. Write them to be idempotent — commands that assume existing state, such as a partially cloned repo or a pre-built cache, can fail unpredictably. See [environment design and best practices](/platform/environments/configuring-environments/#environment-design-and-best-practices) for guidance. 3. Note the environment ID returned. You will need it in the next step. ---- - -## Step 4: Test your environment +## Step 4: test your environment Before connecting to integrations, verify the environment works by running a one-off agent. @@ -125,7 +113,3 @@ With your environment configured, you can connect it to any Warp trigger exactly * **Slack** — Tag **@warp** in a message to start an agent run against your Azure DevOps repo. See [Slack](/platform/integrations/slack/). * **Linear** — Tag **@warp** on an issue to kick off a workflow. See [Linear](/platform/integrations/linear/). * **Scheduled agents** — Run agents on a recurring schedule. See [Scheduled Agents](/platform/triggers/scheduled-agents/). - -:::note -Native support for opening Azure DevOps pull requests from agent-generated changes is planned as a future enhancement. -::: diff --git a/src/sidebar.ts b/src/sidebar.ts index 1988d9af8..5d5ed0ff1 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -55,8 +55,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { label: 'Terminal', items: [ - 'terminal/input/universal-input', - 'terminal/input/classic-input', { label: 'Blocks', collapsed: true, @@ -284,7 +282,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'agents/local-agents/interacting-with-agents', label: 'Overview' }, 'agents/local-agents/interacting-with-agents/terminal-and-agent-modes', { slug: 'agents/local-agents/interacting-with-agents/prompt-queueing', label: 'Prompt queueing' }, - { slug: 'agents/local-agents/interacting-with-agents/agent-questions', label: 'Agent questions' }, + { slug: 'agents/local-agents/interacting-with-agents/agent-questions', label: 'Agent questions' }, { slug: 'agents/local-agents/interacting-with-agents/conversation-forking', label: 'Conversation forking' }, { slug: 'agents/local-agents/code-diffs', label: 'Code diffs' }, 'agents/local-agents/interacting-with-agents/voice', @@ -312,6 +310,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ 'agents/inference/bring-your-own-api-key', { slug: 'agents/inference/custom-inference-endpoint', label: 'Custom inference endpoint' }, { slug: 'agents/inference/grok-subscription', label: 'SuperGrok subscription' }, + { slug: 'agents/inference/chatgpt-subscription', label: 'ChatGPT subscription' }, ], }, { slug: 'agents/local-agents/interactive-code-review', label: 'Interactive code review' }, @@ -411,38 +410,38 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // and where it runs. label: 'Factory configuration', items: [ - { slug: 'factories/factory-agents', label: 'Factory agents' }, - { slug: 'factories/factory-skills', label: 'Factory skills' }, - // Moved from 'Integrations' (was 'Automation filters'): this page is - // now the Automations primitive's conceptual home, parallel to Factory - // agents and Factory skills, not just a filters reference. - { slug: 'factories/automations', label: 'Factory automations' }, - { slug: 'factories/factory-as-code', label: 'Definitions as code' }, - { - label: 'Infrastructure', - items: [ - { slug: 'factories/infrastructure-and-security', label: 'Overview' }, - { slug: 'factories/deployment-patterns', label: 'Deployment patterns' }, - { slug: 'factories/warp-hosting', label: 'Warp-hosted execution' }, - { slug: 'factories/runners', label: 'Runners' }, - { - label: 'Managed self-hosting', - collapsed: true, - items: [ - { slug: 'factories/self-hosting', label: 'Overview' }, - { slug: 'factories/self-hosting/quickstart', label: 'Quickstart' }, - { slug: 'factories/self-hosting/managed-docker', label: 'Docker backend' }, - { slug: 'factories/self-hosting/managed-kubernetes', label: 'Kubernetes backend' }, - { slug: 'factories/self-hosting/managed-direct', label: 'Direct backend' }, - 'factories/self-hosting/monitoring', - { slug: 'factories/self-hosting/reference', label: 'Worker reference' }, - 'factories/self-hosting/troubleshooting', + { slug: 'factories/factory-agents', label: 'Factory agents' }, + { slug: 'factories/factory-skills', label: 'Factory skills' }, + // Moved from 'Integrations' (was 'Automation filters'): this page is + // now the Automations primitive's conceptual home, parallel to Factory + // agents and Factory skills, not just a filters reference. + { slug: 'factories/automations', label: 'Factory automations' }, + { slug: 'factories/factory-as-code', label: 'Definitions as code' }, + { + label: 'Infrastructure', + items: [ + { slug: 'factories/infrastructure-and-security', label: 'Overview' }, + { slug: 'factories/deployment-patterns', label: 'Deployment patterns' }, + { slug: 'factories/warp-hosting', label: 'Warp-hosted execution' }, + { slug: 'factories/runners', label: 'Runners' }, + { + label: 'Managed self-hosting', + collapsed: true, + items: [ + { slug: 'factories/self-hosting', label: 'Overview' }, + { slug: 'factories/self-hosting/quickstart', label: 'Quickstart' }, + { slug: 'factories/self-hosting/managed-docker', label: 'Docker backend' }, + { slug: 'factories/self-hosting/managed-kubernetes', label: 'Kubernetes backend' }, + { slug: 'factories/self-hosting/managed-direct', label: 'Direct backend' }, + 'factories/self-hosting/monitoring', + { slug: 'factories/self-hosting/reference', label: 'Worker reference' }, + 'factories/self-hosting/troubleshooting', + ], + }, ], }, ], }, - ], - }, { label: 'Code forges', items: [ @@ -450,6 +449,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // separately from the services that route work into a factory. { slug: 'factories/integrations/github', label: 'GitHub' }, { slug: 'factories/integrations/gitlab', label: 'GitLab' }, + { slug: 'factories/integrations/azure-devops', label: 'Azure DevOps' }, { slug: 'factories/code-forges/other-code-forges', label: 'Other code forges' }, ], }, @@ -479,6 +479,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ items: [ { slug: 'factories/connect-your-factory', label: 'Connect your factory' }, { slug: 'factories/integrations/slack', label: 'Slack' }, + { slug: 'factories/integrations/teams', label: 'Microsoft Teams' }, { slug: 'factories/integrations/linear', label: 'Linear' }, { slug: 'factories/integrations/jira', label: 'Jira' }, ], @@ -612,6 +613,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'platform/faqs', label: 'Cloud agent FAQs' }, { slug: 'platform/unmanaged-execution', label: 'Unmanaged execution' }, { slug: 'platform/execution-security', label: 'Execution security' }, + { slug: 'platform/data-storage', label: 'Self-hosted agent data storage' }, ], }, { @@ -782,6 +784,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { label: 'Team management', items: [ + { slug: 'enterprise/team-management/workspaces', label: 'Workspaces' }, 'enterprise/team-management/teams', { slug: 'enterprise/team-management/admin-panel', label: 'Admin panel' }, { slug: 'enterprise/team-management/roles-and-permissions', label: 'Roles and permissions' }, diff --git a/vercel.json b/vercel.json index efe26789a..af3f1c725 100644 --- a/vercel.json +++ b/vercel.json @@ -219,7 +219,7 @@ }, { "source": "/agent-platform/getting-started/agents-in-warp/", - "destination": "/agents/getting-started/agents-in-warp/", + "destination": "/agents/", "statusCode": 308 }, { @@ -344,7 +344,7 @@ }, { "source": "/agent-platform/local-agents/overview/", - "destination": "/agents/local-agents/overview/", + "destination": "/agents/", "statusCode": 308 }, { @@ -374,7 +374,7 @@ }, { "source": "/agents/warp-ai/agent-mode", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { @@ -384,7 +384,7 @@ }, { "source": "/features/ai/warp-ai/external-ai-providers", - "destination": "/agent-platform/cli-agents/overview/", + "destination": "/agents/cli-agents/overview/", "statusCode": 308 }, { @@ -404,62 +404,62 @@ }, { "source": "/agent-platform/agent-concepts(/?)", - "destination": "/agent-platform/capabilities/", + "destination": "/agents/capabilities/", "statusCode": 308 }, { "source": "/agent-platform/agent-concepts/agent-profiles-permissions(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agent-concepts/codebase-context(/?)", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-concepts/full-terminal-use(/?)", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { "source": "/agent-platform/agent-concepts/mcp(/?)", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/agent-concepts/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agent-concepts/planning(/?)", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agent-platform/agent-concepts/rules(/?)", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/agent-platform/agent-concepts/skills(/?)", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/agent-concepts/slash-commands(/?)", - "destination": "/agent-platform/capabilities/slash-commands/", + "destination": "/agents/capabilities/slash-commands/", "statusCode": 308 }, { "source": "/agent-platform/agent-concepts/task-lists(/?)", - "destination": "/agent-platform/capabilities/task-lists/", + "destination": "/agents/capabilities/task-lists/", "statusCode": 308 }, { "source": "/agent-platform/agent-concepts/web-search(/?)", - "destination": "/agent-platform/capabilities/web-search/", + "destination": "/agents/capabilities/web-search/", "statusCode": 308 }, { @@ -469,37 +469,37 @@ }, { "source": "/agent-platform/agent-mode/active-ai(/?)", - "destination": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/local-agents/active-ai/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/agent-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/", + "destination": "/agents/local-agents/agent-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/agent-context/blocks-as-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", + "destination": "/agents/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/agent-context/images-as-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", + "destination": "/agents/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/agent-context/selection-as-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", + "destination": "/agents/local-agents/agent-context/selection-as-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/agent-context/urls-as-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", + "destination": "/agents/local-agents/agent-context/urls-as-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/agent-context/using-to-add-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", + "destination": "/agents/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { @@ -514,12 +514,12 @@ }, { "source": "/agent-platform/agent-mode/code-diffs-in-agent-conversations(/?)", - "destination": "/agent-platform/local-agents/code-diffs/", + "destination": "/agents/local-agents/code-diffs/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/full-terminal-use(/?)", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { @@ -529,67 +529,67 @@ }, { "source": "/agent-platform/agent-mode/interacting-with-agents(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "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/", + "destination": "/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/interacting-with-agents/conversation-forking(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", + "destination": "/agents/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/interacting-with-agents/voice(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/interactive-code-review(/?)", - "destination": "/agent-platform/local-agents/interactive-code-review/", + "destination": "/agents/local-agents/interactive-code-review/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/task-lists(/?)", - "destination": "/agent-platform/capabilities/task-lists/", + "destination": "/agents/capabilities/task-lists/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/third-party-cli-agents(/?)", - "destination": "/agent-platform/cli-agents/overview/", + "destination": "/agents/cli-agents/overview/", "statusCode": 308 }, { "source": "/agent-platform/agent-mode/web-search(/?)", - "destination": "/agent-platform/capabilities/web-search/", + "destination": "/agents/capabilities/web-search/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/active-ai(/?)", - "destination": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/local-agents/active-ai/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/active-ai#next-command", - "destination": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/local-agents/active-ai/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/active-ai#suggested-code-diffs", - "destination": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/local-agents/active-ai/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/agent-modality-beta(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", + "destination": "/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { @@ -599,7 +599,7 @@ }, { "source": "/agent-platform/agent-platform/agent/using-agents/agent-profiles-permissions(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { @@ -614,22 +614,22 @@ }, { "source": "/agent-platform/agent-platform/ai(/?)", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/ai-faqs(/?)", - "destination": "/agent-platform/getting-started/faqs/", + "destination": "/agents/getting-started/faqs/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/ai-faqs#gathering-ai-debugging-id", - "destination": "/agent-platform/getting-started/faqs/", + "destination": "/agents/getting-started/faqs/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/ai-model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { @@ -639,17 +639,17 @@ }, { "source": "/agent-platform/agent-platform/autonomy(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/autonomy/agent-permissions(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/autonomy/run-to-completion(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { @@ -664,17 +664,17 @@ }, { "source": "/agent-platform/agent-platform/conversation-forking(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", + "destination": "/agents/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/full-terminal-use(/?)", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/full-terminal-use#session-level-approvals", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { @@ -694,102 +694,102 @@ }, { "source": "/agent-platform/agent-platform/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/slash-commands(/?)", - "destination": "/agent-platform/capabilities/slash-commands/", + "destination": "/agents/capabilities/slash-commands/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents#codebase-context", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents#windows", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/", + "destination": "/agents/local-agents/agent-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-context#attaching-blocks-as-context", - "destination": "/agent-platform/local-agents/agent-context/", + "destination": "/agents/local-agents/agent-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-context/blocks-as-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", + "destination": "/agents/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-context/blocks-as-context#attaching-blocks-as-context", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", + "destination": "/agents/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-context/images-as-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", + "destination": "/agents/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-context/selection-as-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", + "destination": "/agents/local-agents/agent-context/selection-as-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-context/urls-as-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", + "destination": "/agents/local-agents/agent-context/urls-as-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/", + "destination": "/agents/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-conversations(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/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/", + "destination": "/agents/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-permissions(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-profiles-permissions(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-profiles-permissions#agent-permissions", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-profiles-permissions#agent-profiles", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/agent-tasklists(/?)", - "destination": "/agent-platform/capabilities/task-lists/", + "destination": "/agents/capabilities/task-lists/", "statusCode": 308 }, { @@ -804,42 +804,42 @@ }, { "source": "/agent-platform/agent-platform/using-agents/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/model-choice#available-models", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/model-choice#configuring-models-per-agent-profile", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/model-choice#how-to-change-models", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/planning(/?)", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/third-party-cli-agents(/?)", - "destination": "/agent-platform/cli-agents/overview/", + "destination": "/agents/cli-agents/overview/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/using-agents/web-search(/?)", - "destination": "/agent-platform/capabilities/web-search/", + "destination": "/agents/capabilities/web-search/", "statusCode": 308 }, { "source": "/agent-platform/agent-platform/voice(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { @@ -849,12 +849,12 @@ }, { "source": "/agent-platform/agents/active-ai(/?)", - "destination": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/local-agents/active-ai/", "statusCode": 308 }, { "source": "/agent-platform/agents/agent-modality-beta(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", + "destination": "/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { @@ -869,7 +869,7 @@ }, { "source": "/agent-platform/agents/ai(/?)", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { @@ -884,7 +884,7 @@ }, { "source": "/agent-platform/agents/ai-faqs(/?)", - "destination": "/agent-platform/getting-started/faqs/", + "destination": "/agents/getting-started/faqs/", "statusCode": 308 }, { @@ -894,22 +894,22 @@ }, { "source": "/agent-platform/agents/autonomy(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agents/autonomy/agent-permissions(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agents/autonomy/run-to-completion(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agents/full-terminal-use(/?)", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { @@ -919,67 +919,67 @@ }, { "source": "/agent-platform/agents/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agents/slash-commands(/?)", - "destination": "/agent-platform/capabilities/slash-commands/", + "destination": "/agents/capabilities/slash-commands/", "statusCode": 308 }, { "source": "/agent-platform/agents/using-agents(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agents/using-agents/agent-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agents/using-agents/agent-tasklists(/?)", - "destination": "/agent-platform/capabilities/task-lists/", + "destination": "/agents/capabilities/task-lists/", "statusCode": 308 }, { @@ -989,32 +989,32 @@ }, { "source": "/agent-platform/agents/using-agents/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agents/using-agents/planning(/?)", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agent-platform/agents/using-agents/profiles(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agents/using-agents/third-party-cli-agents(/?)", - "destination": "/agent-platform/cli-agents/overview/", + "destination": "/agents/cli-agents/overview/", "statusCode": 308 }, { "source": "/agent-platform/agents/using-agents/web-search(/?)", - "destination": "/agent-platform/capabilities/web-search/", + "destination": "/agents/capabilities/web-search/", "statusCode": 308 }, { "source": "/agent-platform/agents/voice(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { @@ -1024,12 +1024,12 @@ }, { "source": "/agent-platform/agents/warp-ai/agent-mode(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/ai(/?)", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { @@ -1039,7 +1039,7 @@ }, { "source": "/agent-platform/ai-features/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { @@ -1074,7 +1074,7 @@ }, { "source": "/agent-platform/cloud-agents/agent-session-sharing(/?)", - "destination": "/agent-platform/local-agents/session-sharing/", + "destination": "/agents/local-agents/session-sharing/", "statusCode": 308 }, { @@ -1139,22 +1139,22 @@ }, { "source": "/agent-platform/code/code-review/interactive-code-review(/?)", - "destination": "/agent-platform/local-agents/interactive-code-review/", + "destination": "/agents/local-agents/interactive-code-review/", "statusCode": 308 }, { "source": "/agent-platform/code/codebase-context(/?)", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { "source": "/agent-platform/code/reviewing-code(/?)", - "destination": "/agent-platform/local-agents/code-diffs/", + "destination": "/agents/local-agents/code-diffs/", "statusCode": 308 }, { "source": "/agent-platform/features/agent-mode(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { @@ -1164,17 +1164,17 @@ }, { "source": "/agent-platform/features/agents(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/features/ai(/?)", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { "source": "/agent-platform/features/ai-agents(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { @@ -1184,7 +1184,7 @@ }, { "source": "/agent-platform/features/ai-and-agents/agents(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { @@ -1204,7 +1204,7 @@ }, { "source": "/agent-platform/features/ai-and-stack-overflow/agent-mode(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { @@ -1229,7 +1229,7 @@ }, { "source": "/agent-platform/features/ai-command-search/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { @@ -1239,7 +1239,7 @@ }, { "source": "/agent-platform/features/ai-command/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { @@ -1259,22 +1259,22 @@ }, { "source": "/agent-platform/features/ai/agent(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/features/ai/agent-mode(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/features/ai/agents(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/features/ai/ai-models-and-providers(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { @@ -1299,17 +1299,17 @@ }, { "source": "/agent-platform/features/ai/commands/agent-mode(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/features/ai/commands/agents(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/features/ai/commands/ai-agent(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { @@ -1324,7 +1324,7 @@ }, { "source": "/agent-platform/features/ai/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { @@ -1344,17 +1344,17 @@ }, { "source": "/agent-platform/features/integrations/mcp(/?)", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/features/knowledge(/?)", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/agent-platform/features/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { @@ -1364,12 +1364,12 @@ }, { "source": "/agent-platform/features/terminal-ai/ai-models(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/features/voice(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { @@ -1379,22 +1379,22 @@ }, { "source": "/agent-platform/features/warp-ai/active-ai(/?)", - "destination": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/local-agents/active-ai/", "statusCode": 308 }, { "source": "/agent-platform/features/warp-ai/agent-mode(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/features/warp-ai/agent-mode#examples-of-coding-capabilities", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/features/warp-ai/agent-modea(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { @@ -1414,22 +1414,22 @@ }, { "source": "/agent-platform/features/warp-ai/knowledge(/?)", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/agent-platform/features/warp-ai/mcp(/?)", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/features/warp-ai/rules(/?)", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/agent-platform/features/warp-ai/voice(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { @@ -1484,17 +1484,17 @@ }, { "source": "/agent-platform/knowledge-and-collaboration/mcp(/?)", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/knowledge-and-collaboration/rules(/?)", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/agent-platform/knowledge-and-collaboration/session-sharing/agent-session-sharing(/?)", - "destination": "/agent-platform/local-agents/session-sharing/", + "destination": "/agents/local-agents/session-sharing/", "statusCode": 308 }, { @@ -1504,7 +1504,7 @@ }, { "source": "/agent-platform/knowledge-and-collaboration/warp-drive/model-context-protocol-mcp(/?)", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { @@ -1514,7 +1514,7 @@ }, { "source": "/agent-platform/local-agents/agent-notifications(/?)", - "destination": "/agent-platform/capabilities/agent-notifications/", + "destination": "/agents/capabilities/agent-notifications/", "statusCode": 308 }, { @@ -1529,7 +1529,7 @@ }, { "source": "/agent-platform/local-agents/code-diffs-in-agent-conversations(/?)", - "destination": "/agent-platform/local-agents/code-diffs/", + "destination": "/agents/local-agents/code-diffs/", "statusCode": 308 }, { @@ -1539,17 +1539,17 @@ }, { "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", + "destination": "/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/", "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/", + "destination": "/agents/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/", + "destination": "/agents/cli-agents/overview/", "statusCode": 308 }, { @@ -1584,7 +1584,7 @@ }, { "source": "/agent-platform/settings/ai-agents(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { @@ -1599,7 +1599,7 @@ }, { "source": "/agent-platform/terminal/ai/agent-mode(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { @@ -1609,32 +1609,32 @@ }, { "source": "/agent-platform/third-party-agents/claude-code(/?)", - "destination": "/agent-platform/cli-agents/claude-code/", + "destination": "/agents/cli-agents/claude-code/", "statusCode": 308 }, { "source": "/agent-platform/third-party-agents/codex(/?)", - "destination": "/agent-platform/cli-agents/codex/", + "destination": "/agents/cli-agents/codex/", "statusCode": 308 }, { "source": "/agent-platform/third-party-agents/opencode(/?)", - "destination": "/agent-platform/cli-agents/opencode/", + "destination": "/agents/cli-agents/opencode/", "statusCode": 308 }, { "source": "/agent-platform/third-party-agents/overview(/?)", - "destination": "/agent-platform/cli-agents/overview/", + "destination": "/agents/cli-agents/overview/", "statusCode": 308 }, { "source": "/agent-platform/third-party-agents/remote-control(/?)", - "destination": "/agent-platform/cli-agents/remote-control/", + "destination": "/agents/cli-agents/remote-control/", "statusCode": 308 }, { "source": "/agent-platform/third-party-agents/rich-input(/?)", - "destination": "/agent-platform/cli-agents/rich-input/", + "destination": "/agents/cli-agents/rich-input/", "statusCode": 308 }, { @@ -1644,62 +1644,62 @@ }, { "source": "/agent-platform/warp-agents/active-ai(/?)", - "destination": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/agent-notifications(/?)", - "destination": "/agent-platform/capabilities/agent-notifications/", + "destination": "/agents/capabilities/agent-notifications/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/agent-profiles-permissions(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview(/?)", - "destination": "/agent-platform/capabilities/", + "destination": "/agents/capabilities/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/cloud-conversations(/?)", - "destination": "/agent-platform/local-agents/cloud-conversations/", + "destination": "/agents/local-agents/cloud-conversations/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/code-diffs(/?)", - "destination": "/agent-platform/local-agents/code-diffs/", + "destination": "/agents/local-agents/code-diffs/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/codebase-context(/?)", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { @@ -1709,72 +1709,72 @@ }, { "source": "/agent-platform/warp-agents/full-terminal-use(/?)", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/interactive-code-review(/?)", - "destination": "/agent-platform/local-agents/interactive-code-review/", + "destination": "/agents/local-agents/interactive-code-review/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/mcp(/?)", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/planning(/?)", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/rules(/?)", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/session-sharing(/?)", - "destination": "/agent-platform/local-agents/session-sharing/", + "destination": "/agents/local-agents/session-sharing/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/skills(/?)", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/slash-commands(/?)", - "destination": "/agent-platform/capabilities/slash-commands/", + "destination": "/agents/capabilities/slash-commands/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/task-lists(/?)", - "destination": "/agent-platform/capabilities/task-lists/", + "destination": "/agents/capabilities/task-lists/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/web-search(/?)", - "destination": "/agent-platform/capabilities/web-search/", + "destination": "/agents/capabilities/web-search/", "statusCode": 308 }, { @@ -2199,7 +2199,7 @@ }, { "source": "/features/knowledge(/?)", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { @@ -2404,17 +2404,17 @@ }, { "source": "/features/warp-ai/knowledge(/?)", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/features/warp-ai/mcp(/?)", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/features/warp-ai/rules(/?)", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { @@ -3084,7 +3084,7 @@ }, { "source": "/support-and-community/help/ai-features/bring-your-own-llm(/?)", - "destination": "/agent-platform/inference/bring-your-own-api-key/", + "destination": "/agents/inference/bring-your-own-api-key/", "statusCode": 308 }, { @@ -3209,7 +3209,7 @@ }, { "source": "/support-and-community/plans-pricing-and-billing/bring-your-own-api-key(/?)", - "destination": "/agent-platform/inference/bring-your-own-api-key/", + "destination": "/agents/inference/bring-your-own-api-key/", "statusCode": 308 }, { @@ -3319,7 +3319,7 @@ }, { "source": "/support-and-community/support-and-billing/plans-and-billing/bring-your-own-api-key(/?)", - "destination": "/agent-platform/inference/bring-your-own-api-key/", + "destination": "/agents/inference/bring-your-own-api-key/", "statusCode": 308 }, { @@ -3354,22 +3354,22 @@ }, { "source": "/support-and-community/plans-and-billing/bring-your-own-api-key/:path*", - "destination": "/agent-platform/inference/bring-your-own-api-key/", + "destination": "/agents/inference/bring-your-own-api-key/", "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/", + "destination": "/agents/inference/bring-your-own-api-key/", "statusCode": 308 }, { "source": "/support-and-community/support-and-billing/plans-and-pricing/bring-your-own-api-key#enabling-byok", - "destination": "/agent-platform/inference/bring-your-own-api-key/", + "destination": "/agents/inference/bring-your-own-api-key/", "statusCode": 308 }, { "source": "/support-and-community/support-and-billing/plans-and-pricing/bring-your-own-api-key#how-does-byok-work", - "destination": "/agent-platform/inference/bring-your-own-api-key/", + "destination": "/agents/inference/bring-your-own-api-key/", "statusCode": 308 }, { @@ -3399,7 +3399,7 @@ }, { "source": "/support-and-community/support-and-billing/plans-and-prilling/bring-your-own-api-key(/?)", - "destination": "/agent-platform/inference/bring-your-own-api-key/", + "destination": "/agents/inference/bring-your-own-api-key/", "statusCode": 308 }, { @@ -3489,7 +3489,7 @@ }, { "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/", + "destination": "/agents/inference/bring-your-own-api-key/", "statusCode": 308 }, { @@ -4079,7 +4079,7 @@ }, { "source": "/university/how-warp-uses-warp/running-multiple-agents-at-once-with-warp", - "destination": "/guides/agent-workflows/running-multiple-agents-at-once-with-warp/", + "destination": "/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/", "statusCode": 308 }, { @@ -4349,32 +4349,32 @@ }, { "source": "/agent-platform/warp-agents/agent-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/", + "destination": "/agents/local-agents/agent-context/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/agent-context/mcp(/?)", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview/agent-notifications(/?)", - "destination": "/agent-platform/capabilities/agent-notifications/", + "destination": "/agents/capabilities/agent-notifications/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview/agent-profiles-permissions(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview/cloud-conversations(/?)", - "destination": "/agent-platform/local-agents/cloud-conversations/", + "destination": "/agents/local-agents/cloud-conversations/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview/codebase-context(/?)", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { @@ -4384,57 +4384,57 @@ }, { "source": "/agent-platform/warp-agents/capabilities-overview/full-terminal-use(/?)", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview/model-choice(/?)", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview/planning(/?)", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview/rules(/?)", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview/session-sharing(/?)", - "destination": "/agent-platform/local-agents/session-sharing/", + "destination": "/agents/local-agents/session-sharing/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview/skills(/?)", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview/slash-commands(/?)", - "destination": "/agent-platform/capabilities/slash-commands/", + "destination": "/agents/capabilities/slash-commands/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview/task-lists(/?)", - "destination": "/agent-platform/capabilities/task-lists/", + "destination": "/agents/capabilities/task-lists/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/capabilities-overview/web-search(/?)", - "destination": "/agent-platform/capabilities/web-search/", + "destination": "/agents/capabilities/web-search/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/interacting-with-agents(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents/interacting-with-agents/code-diffs(/?)", - "destination": "/agent-platform/local-agents/code-diffs/", + "destination": "/agents/local-agents/code-diffs/", "statusCode": 308 }, { @@ -4639,17 +4639,17 @@ }, { "source": "/agents/agents-overview(/?)", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { "source": "/agents/ai(/?)", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { "source": "/agents/ai-faqs(/?)", - "destination": "/agent-platform/getting-started/faqs/", + "destination": "/agents/getting-started/faqs/", "statusCode": 308 }, { @@ -4659,27 +4659,27 @@ }, { "source": "/agents/using-agents/agent-context/blocks-as-context(/?)", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/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/", + "destination": "/agents/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { @@ -4689,7 +4689,7 @@ }, { "source": "/agents/voice(/?)", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { @@ -4759,7 +4759,7 @@ }, { "source": "/support-and-billing/plans-and-pricing/bring-your-own-api-key(/?)", - "destination": "/agent-platform/inference/bring-your-own-api-key/", + "destination": "/agents/inference/bring-your-own-api-key/", "statusCode": 308 }, { @@ -4839,7 +4839,7 @@ }, { "source": "/knowledge-and-collaboration/mcp", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { @@ -4864,7 +4864,7 @@ }, { "source": "/code/codebase-context", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { @@ -4874,7 +4874,7 @@ }, { "source": "/agents/using-agents/model-choice", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { @@ -4889,17 +4889,17 @@ }, { "source": "/agents/using-agents/third-party-cli-agents", - "destination": "/agent-platform/cli-agents/overview/", + "destination": "/agents/cli-agents/overview/", "statusCode": 308 }, { "source": "/knowledge-and-collaboration/rules", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/agent-platform/agent/skills", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { @@ -4909,17 +4909,17 @@ }, { "source": "/agent-platform/agent/using-agents/model-choice", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agents/using-agents/planning", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { @@ -4929,7 +4929,7 @@ }, { "source": "/agent-platform/agent/using-agents/agent-conversations", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { @@ -4939,7 +4939,7 @@ }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { @@ -4949,12 +4949,12 @@ }, { "source": "/agents/using-agents/agent-conversations", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agents/using-agents/agent-profiles-permissions", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { @@ -4964,12 +4964,12 @@ }, { "source": "/agents/using-agents", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/model-choice", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { @@ -4984,37 +4984,37 @@ }, { "source": "/agent-platform/warps-agent/interacting-with-agents/terminal-and-agent-modes", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", + "destination": "/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { "source": "/agent-platform/third-party-agents", - "destination": "/agent-platform/cli-agents/overview/", + "destination": "/agents/cli-agents/overview/", "statusCode": 308 }, { "source": "/agents/full-terminal-use", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { "source": "/agent-platform/agent/ai-faqs", - "destination": "/agent-platform/getting-started/faqs/", + "destination": "/agents/getting-started/faqs/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/managing-agents", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/mcp", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agents/slash-commands", - "destination": "/agent-platform/capabilities/slash-commands/", + "destination": "/agents/capabilities/slash-commands/", "statusCode": 308 }, { @@ -5029,7 +5029,7 @@ }, { "source": "/agent-platform/agent/slash-commands", - "destination": "/agent-platform/capabilities/slash-commands/", + "destination": "/agents/capabilities/slash-commands/", "statusCode": 308 }, { @@ -5044,17 +5044,17 @@ }, { "source": "/agents/using-agents/agent-tasklists", - "destination": "/agent-platform/capabilities/task-lists/", + "destination": "/agents/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/", + "destination": "/agents/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { "source": "/agent-platform/getting-started", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { @@ -5064,37 +5064,37 @@ }, { "source": "/agent-platform/agent/using-agents/agent-conversations/conversation-forking", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", + "destination": "/agents/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/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/rules", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/session-sharing", - "destination": "/agent-platform/local-agents/session-sharing/", + "destination": "/agents/local-agents/session-sharing/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/interacting-with-agents/voice", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { "source": "/agents/active-ai", - "destination": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/local-agents/active-ai/", "statusCode": 308 }, { "source": "/agent-platform/local-agents/interacting-with-agents/code-diffs", - "destination": "/agent-platform/local-agents/code-diffs/", + "destination": "/agents/local-agents/code-diffs/", "statusCode": 308 }, { @@ -5114,17 +5114,17 @@ }, { "source": "/agent-platform/agent/using-agents/agent-context", - "destination": "/agent-platform/local-agents/agent-context/", + "destination": "/agents/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/", + "destination": "/agents/local-agents/code-diffs/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/interacting-with-agents", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { @@ -5139,22 +5139,22 @@ }, { "source": "/agent-platform/agent/voice", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/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/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/interacting-with-agents/code-diffs", - "destination": "/agent-platform/local-agents/code-diffs/", + "destination": "/agents/local-agents/code-diffs/", "statusCode": 308 }, { "source": "/agents/using-agents/agent-context", - "destination": "/agent-platform/local-agents/agent-context/", + "destination": "/agents/local-agents/agent-context/", "statusCode": 308 }, { @@ -5169,27 +5169,27 @@ }, { "source": "/agents/using-agents/web-search", - "destination": "/agent-platform/capabilities/web-search/", + "destination": "/agents/capabilities/web-search/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/images-as-context", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", + "destination": "/agents/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/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/slash-commands", - "destination": "/agent-platform/capabilities/slash-commands/", + "destination": "/agents/capabilities/slash-commands/", "statusCode": 308 }, { "source": "/agents", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { @@ -5214,7 +5214,7 @@ }, { "source": "/agent-platform/agent/agent-modality-beta", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { @@ -5224,7 +5224,7 @@ }, { "source": "/agent-platform/warps-agent/capabilities-overview/codebase-context", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { @@ -5234,17 +5234,17 @@ }, { "source": "/agents/using-agents/agent-context/selection-as-context", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/ambient-agents/managing-ambient-agents/scheduled-agents", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { "source": "/features/warp-ai", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { @@ -5259,7 +5259,7 @@ }, { "source": "/platform", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { @@ -5274,42 +5274,42 @@ }, { "source": "/agent-platform/agent/using-agents/planning", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agent-platform/capabilities/capabilities", - "destination": "/agent-platform/capabilities/", + "destination": "/agents/capabilities/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/active-ai", - "destination": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/local-agents/active-ai/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/selection-as-context", - "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", + "destination": "/agents/local-agents/agent-context/selection-as-context/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/computer-use", - "destination": "/agent-platform/capabilities/computer-use/", + "destination": "/agents/capabilities/computer-use/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/planning", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agents/using-agents/model-choice#available-models", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agents/using-agents/model-choice#how-to-change-models", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { @@ -5324,122 +5324,122 @@ }, { "source": "/agent-platform/agent/using-agents#agents-in-warp", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents#entering-agent-mode", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents#what-is-agent-mode", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/agent-conversations#conversations-with-warps-agent", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/agent-conversations#starting-a-new-conversation", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/agent-conversations#staying-in-a-conversation-follow-ups", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/agent-profiles-permissions#agent-permissions", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/agent-profiles-permissions#agent-profiles", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/agent-profiles-permissions#command-allowlist", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/agent-profiles-permissions#command-denylist", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/managing-agents#agent-management-panel", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/managing-agents#agent-status-indicators", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/managing-agents#in-app-agent-notifications", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/model-choice#auto-models", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/model-choice#available-models", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/model-choice#how-to-change-models", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/model-choice#model-fallback", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/planning#creating-a-plan", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/planning#executing-a-plan", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/planning#monitoring-progress", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agent-platform/agent/using-agents/planning#reviewing-and-editing", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agent-platform/agent/voice#initial-setup", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { "source": "/agent-platform/agent/voice#sample-use-cases", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { "source": "/agent-platform/agent/voice#using-voice", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { @@ -5449,392 +5449,392 @@ }, { "source": "/agent-platform/warps-agent/agent-context/blocks-as-context", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", + "destination": "/agents/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/mcp#adding-an-mcp-server", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/mcp#adding-multiple-mcp-servers", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/mcp#authentication-in-mcp-servers", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/mcp#debugging-mcp", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/mcp#file-based-mcp-servers", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/mcp#how-to-access-mcp-server-settings", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/mcp#sharing-mcp-servers", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/mcp#where-mcp-logs-are-stored", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/urls-as-context", - "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", + "destination": "/agents/local-agents/agent-context/urls-as-context/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/agent-context/using-to-add-context", - "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", + "destination": "/agents/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/agent-profiles-permissions#agent-permissions", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/agent-profiles-permissions#agent-profiles", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/agent-profiles-permissions#command-allowlist", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/agent-profiles-permissions#command-denylist", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/codebase-context#codebase-indexing-states", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/codebase-context#ignore-files", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/codebase-context#indexing-your-codebase", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/codebase-context#when-does-codebase-syncing-happen", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/full-terminal-use#configuring-agent-permissions-and-autonomy", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/full-terminal-use#how-full-terminal-use-works", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/full-terminal-use#overview", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/model-choice#auto-models", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/model-choice#how-to-change-models", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/model-choice#model-fallback", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/rules#how-to-access-rules", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/rules#project-rules", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/session-sharing#key-capabilities", - "destination": "/agent-platform/local-agents/session-sharing/", + "destination": "/agents/local-agents/session-sharing/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/session-sharing#sharing-a-session", - "destination": "/agent-platform/local-agents/session-sharing/", + "destination": "/agents/local-agents/session-sharing/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/session-sharing#viewing-shared-sessions", - "destination": "/agent-platform/local-agents/session-sharing/", + "destination": "/agents/local-agents/session-sharing/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#example-interactions", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#example-skill-file", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#example-skill-with-arguments", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#example-skill-without-arguments", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#how-argument-substitution-works", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#how-skills-work", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#key-features", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#project-skills", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#project-vs-root-directory-skills", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#root-directory-skills-global", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#skill-name-conflicts", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#step-1-choose-a-location", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/skills#step-4-add-content", - "destination": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/capabilities-overview/web-search", - "destination": "/agent-platform/capabilities/web-search/", + "destination": "/agents/capabilities/web-search/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/interacting-with-agents#conversations-with-warps-agent", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/interacting-with-agents#panel-layout", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/interacting-with-agents#starting-a-new-conversation", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/interacting-with-agents#staying-in-a-conversation-follow-ups", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/interacting-with-agents/conversation-forking", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", + "destination": "/agents/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/interacting-with-agents/voice#initial-setup", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/interacting-with-agents/voice#sample-use-cases", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/interacting-with-agents/voice#using-voice", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { "source": "/agent-platform/warps-agent/interactive-code-review", - "destination": "/agent-platform/local-agents/interactive-code-review/", + "destination": "/agents/local-agents/interactive-code-review/", "statusCode": 308 }, { "source": "/agents/active-ai#next-command", - "destination": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/local-agents/active-ai/", "statusCode": 308 }, { "source": "/agents/active-ai#prompt-suggestions", - "destination": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/local-agents/active-ai/", "statusCode": 308 }, { "source": "/agents/full-terminal-use#configuring-agent-permissions-and-autonomy", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { "source": "/agents/full-terminal-use#how-full-terminal-use-works", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { "source": "/agents/full-terminal-use#overview", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", "statusCode": 308 }, { "source": "/agents/using-agents#agents-in-warp", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agents/using-agents#entering-agent-mode", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agents/using-agents#what-is-agent-mode", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agents/using-agents/agent-conversations#conversations-with-warps-agent", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agents/using-agents/agent-conversations#starting-a-new-conversation", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agents/using-agents/agent-conversations#staying-in-a-conversation-follow-ups", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", "statusCode": 308 }, { "source": "/agents/using-agents/agent-profiles-permissions#agent-permissions", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agents/using-agents/agent-profiles-permissions#agent-profiles", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agents/using-agents/agent-profiles-permissions#command-allowlist", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agents/using-agents/agent-profiles-permissions#command-denylist", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agents/using-agents/agent-permissions(/?)", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { "source": "/agents/using-agents/model-choice#auto-models", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agents/using-agents/planning#creating-a-plan", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agents/using-agents/planning#executing-a-plan", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agents/using-agents/planning#reviewing-and-editing", - "destination": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", "statusCode": 308 }, { "source": "/agents/using-agents/web-search#how-web-search-works-in-warp", - "destination": "/agent-platform/capabilities/web-search/", + "destination": "/agents/capabilities/web-search/", "statusCode": 308 }, { "source": "/agents/using-agents/web-search#when-the-agent-uses-web-search", - "destination": "/agent-platform/capabilities/web-search/", + "destination": "/agents/capabilities/web-search/", "statusCode": 308 }, { "source": "/code/codebase-context#codebase-indexing-states", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { "source": "/code/codebase-context#indexing-your-codebase", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { "source": "/code/codebase-context#when-does-codebase-syncing-happen", - "destination": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", "statusCode": 308 }, { @@ -5884,12 +5884,12 @@ }, { "source": "/features/ai", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { "source": "/features/warp-ai/agent-mode", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { @@ -6014,52 +6014,52 @@ }, { "source": "/knowledge-and-collaboration/mcp#adding-an-mcp-server", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/knowledge-and-collaboration/mcp#adding-multiple-mcp-servers", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/knowledge-and-collaboration/mcp#authentication-in-mcp-servers", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/knowledge-and-collaboration/mcp#debugging-mcp", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/knowledge-and-collaboration/mcp#how-to-access-mcp-server-settings", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/knowledge-and-collaboration/mcp#model-context-protocol-mcp", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/knowledge-and-collaboration/mcp#sharing-mcp-servers", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/knowledge-and-collaboration/mcp#where-mcp-logs-are-stored", - "destination": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", "statusCode": 308 }, { "source": "/knowledge-and-collaboration/rules#how-to-access-rules", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { "source": "/knowledge-and-collaboration/rules#project-rules", - "destination": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", "statusCode": 308 }, { @@ -6199,7 +6199,7 @@ }, { "source": "/platform/team-access-billing-and-identity-permissions", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { @@ -6249,7 +6249,7 @@ }, { "source": "/features/warp-ai/ai-command-suggestions", - "destination": "/agent-platform/local-agents/generate/", + "destination": "/agents/local-agents/generate/", "statusCode": 308 }, { @@ -6269,7 +6269,7 @@ }, { "source": "/code/code-permissions", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { @@ -6289,7 +6289,7 @@ }, { "source": "/features/warp-ai/active-ai", - "destination": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/local-agents/active-ai/", "statusCode": 308 }, { @@ -6299,32 +6299,32 @@ }, { "source": "/agent-platform/capabilities/agent-memory", - "destination": "/agent-platform/agent-memory/", + "destination": "/agents/agent-memory/", "statusCode": 308 }, { "source": "/agent-platform/capabilities/model-choice", - "destination": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", "statusCode": 308 }, { "source": "/agent-platform/capabilities/computer-use-testing-and-recordings", - "destination": "/agent-platform/capabilities/computer-use/testing-and-recordings/", + "destination": "/agents/capabilities/computer-use/testing-and-recordings/", "statusCode": 308 }, { "source": "/support-and-community/plans-and-billing/bring-your-own-api-key(/?)", - "destination": "/agent-platform/inference/bring-your-own-api-key/", + "destination": "/agents/inference/bring-your-own-api-key/", "statusCode": 308 }, { "source": "/support-and-community/plans-and-billing/custom-inference-endpoint", - "destination": "/agent-platform/inference/custom-inference-endpoint/", + "destination": "/agents/inference/custom-inference-endpoint/", "statusCode": 308 }, { "source": "/agent-platform/warp-agents", - "destination": "/agent-platform/", + "destination": "/agents/", "statusCode": 308 }, { @@ -6464,7 +6464,7 @@ }, { "source": "/guides/how-warp-uses-warp/running-multiple-agents-at-once-with-warp", - "destination": "/guides/agent-workflows/running-multiple-agents-at-once-with-warp/", + "destination": "/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/", "statusCode": 308 }, { From c16ded92f82ecb5b45dd68f2b213c9761cafb7ae Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 01:06:08 +0000 Subject: [PATCH 55/63] docs: correct Azure DevOps factory defaults Co-Authored-By: Warp --- src/content/docs/factories/connect-your-factory.mdx | 7 +++---- src/content/docs/factories/integrations/azure-devops.mdx | 4 +--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/content/docs/factories/connect-your-factory.mdx b/src/content/docs/factories/connect-your-factory.mdx index 54be2aeea..282fc9525 100644 --- a/src/content/docs/factories/connect-your-factory.mdx +++ b/src/content/docs/factories/connect-your-factory.mdx @@ -25,7 +25,7 @@ Once a source is connected, here's the concrete action that hands it work — ea | [Microsoft Teams](/factories/integrations/teams/) | Chat in standard and shared channels | [Mentioning the Warp app in a configured channel](/factories/integrations/teams/#start-and-continue-work) | The Teams thread | | [GitHub](/factories/integrations/github/) | Issues, pull requests, reviews, and CI | [Adding the factory's label and mentioning **@warp**](/factories/integrations/github/#mention-the-factory) | The issue, pull request, or review thread | | [GitLab](/factories/integrations/gitlab/) | Merge request activity and bot mentions | [Mentioning the factory's bot in a merge request comment](/factories/integrations/gitlab/#mention-the-factory) | The merge request thread | -| [Azure DevOps](/factories/integrations/azure-devops/) | Work items and pull requests | [Creating an automation for an Azure DevOps event](/factories/integrations/azure-devops/#supported-events-and-filters) | The factory work item | +| [Azure DevOps](/factories/integrations/azure-devops/) | Work items and pull requests | [Mentioning the factory identity in a work item or pull request, or assigning it a work item](/factories/integrations/azure-devops/#configure-azure-devops-automations) | The factory work item | | [Linear](/factories/integrations/linear/) | Planned issues | [Assigning the issue to the factory, or mentioning the Warp app in a comment](/factories/integrations/linear/#route-agent-sessions) | The Linear issue and its agent session | | [Jira](/factories/integrations/jira/) | Work items assigned to Warp | [Assigning or mentioning **Warp** on a work item](/factories/integrations/jira/#connect-jira-and-add-an-automation) | The Jira agent session | | [Custom webhooks](/factories/webhooks/) | Any system that can POST JSON: CI, monitoring, alerting, and internal tools | [Posting JSON to the webhook's URL from the external system](/factories/webhooks/#configure-the-sender) | The factory work item | @@ -35,7 +35,7 @@ Once a source is connected, here's the concrete action that hands it work — ea ## Connect a source -Each integration guide walks through authorizing access — grant only what the factory needs. Most connections add default automations; Azure DevOps requires you to create the automations you need. Review the [automations](/factories/automations/) and adjust their filters and run settings to fit your workflow. +Each integration guide walks through authorizing access — grant only what the factory needs. Most connections add default [automations](/factories/automations/) that you can adjust or extend for your workflow. After connecting, send a test request, such as mentioning the factory in Slack or assigning it an issue, and confirm it picks up the work and replies at the source. @@ -63,6 +63,7 @@ When you create a factory through the setup wizard, Warp adds default automation * **GitHub** - Starts work from mentions and assignments, when the factory's label is applied to an issue or pull request, and when a review is submitted on a labeled pull request. It also follows up when labeled pull requests close or merge, completing a linked tracker issue when it can. See the [GitHub integration guide](/factories/integrations/github/). * **GitLab** - Starts work when someone mentions the factory's bot in a merge request comment. See the [GitLab integration guide](/factories/integrations/gitlab/). +* [Azure DevOps](/factories/integrations/azure-devops/) - Starts work when someone mentions the factory identity in a pull request or work item, or assigns it a work item. * **Jira** - Starts work when someone assigns or mentions Warp on a work item in one of the Jira projects you selected. See the [Jira integration guide](/factories/integrations/jira/). * **Linear** - Starts work when a new agent session arrives from one of the Linear teams you selected. See the [Linear integration guide](/factories/integrations/linear/). * **Slack** - Starts work from mentions and messages, as described in the [Slack integration guide](/factories/integrations/slack/). @@ -70,8 +71,6 @@ When you create a factory through the setup wizard, Warp adds default automation These defaults are starting points. Review each automation's filters, agent, and run settings, and adjust them to match your workflow. For automation files you can adapt, such as CI failure triage, a scheduled dependency audit, and Slack reaction intake, see [`06-common-automations`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/06-common-automations) in the [warp-factory-examples](https://github.com/warpdotdev/warp-factory-examples) repository. -Azure DevOps doesn't add a default automation. Create one for the work-item, pull-request, or repository events you want to route. See the [Azure DevOps integration guide](/factories/integrations/azure-devops/). - ## Custom webhooks A [custom webhook](/factories/webhooks/) gives the factory an authenticated URL that any system can POST JSON to, and an automation decides which deliveries start work by filtering on the payload. Use it for tools Warp doesn't connect to directly, such as your CI system, PagerDuty, Sentry, or Stripe, without writing any code on your side. diff --git a/src/content/docs/factories/integrations/azure-devops.mdx b/src/content/docs/factories/integrations/azure-devops.mdx index 65b2cdd39..17580df49 100644 --- a/src/content/docs/factories/integrations/azure-devops.mdx +++ b/src/content/docs/factories/integrations/azure-devops.mdx @@ -70,9 +70,7 @@ When setup confirms that the identity is ready, the factory uses that identity f ## Configure Azure DevOps automations -An Azure DevOps automation starts a factory run when a supported event matches its filters. Before starting a run, Warp checks the automation creator's Azure DevOps connection. - -Azure DevOps doesn't add a default automation. Create the automations your factory needs after setup. +An Azure DevOps automation starts a factory run when a supported event matches its filters. Before starting a run, Warp checks the automation creator's Azure DevOps connection. New Azure DevOps factories include a default automation for pull request mentions, work item mentions, and work item assignments. To configure an automation as code, ask the Warp Agent to update the factory definition or edit its `automations/` files directly. See [definitions as code](/factories/factory-as-code/). From 8114af95484f4dc7799be27373aebb38c87df2b2 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 01:07:32 +0000 Subject: [PATCH 56/63] docs: resolve Azure DevOps verification Co-Authored-By: Warp --- src/content/docs/factories/integrations/azure-devops.mdx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/content/docs/factories/integrations/azure-devops.mdx b/src/content/docs/factories/integrations/azure-devops.mdx index 17580df49..a61bb40c3 100644 --- a/src/content/docs/factories/integrations/azure-devops.mdx +++ b/src/content/docs/factories/integrations/azure-devops.mdx @@ -10,8 +10,6 @@ import { VARS } from '@data/vars'; Connect Azure DevOps Services to a factory so agents can work in selected repositories, open pull requests, and start runs from work item and pull request events. Warp creates a dedicated Microsoft Entra identity for each factory's Git and pull request operations. -{/* VERIFY: Confirm first-class Azure DevOps Services support is enabled in production before merging this documentation. */} - :::note Warp Factories is in Early Access and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. ::: From 0eacdc6a65c70de0ce03590570d772bb4422b4b8 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 01:16:42 +0000 Subject: [PATCH 57/63] docs: address launch audit review Co-Authored-By: Warp --- .agents/references/terminology.md | 6 +- .../references/consistency_seeds.json | 52 +++++++-------- AGENTS.md | 2 +- .../docs/platform/transitioning-from-oz.mdx | 39 ++++------- vercel.json | 65 +++++++++++++++++++ 5 files changed, 109 insertions(+), 55 deletions(-) diff --git a/.agents/references/terminology.md b/.agents/references/terminology.md index 203567a8c..bdf131310 100644 --- a/.agents/references/terminology.md +++ b/.agents/references/terminology.md @@ -275,7 +275,7 @@ Not every "Oz" in the docs is stale. These are deliberate and correct until - **Warp Platform API** — The HTTP API for sending work to factories and triggering and inspecting cloud agent runs programmatically. *Usage note:* Use `{VARS.WARP_PLATFORM_API}` in body prose and `{{WARP_PLATFORM_API}}` in frontmatter. -- **Artifacts** — Files an agent produces during a run and uploads to Warp: screenshots, generated reports, build outputs, logs, or any other file the agent saves alongside its conversation. Retrieved with `oz artifact` (see the [Artifacts CLI reference](/reference/cli/artifacts/)) and one of the three data categories in [self-hosted agent data storage](/platform/data-storage/). +- **Artifacts** — Files an agent produces during a run and uploads to Warp: screenshots, generated reports, build outputs, logs, or any other file the agent saves alongside its conversation. Retrieved with `oz artifact` (see the [Artifacts CLI reference](/agents/cli/oz-cli/artifacts/)) and one of the three data categories in [self-hosted agent data storage](/platform/data-storage/). *Usage note:* Capitalize as **Artifacts** when referring to the named category (a CLI reference page, an Admin Panel storage category); lowercase "artifacts" as the generic noun for the files themselves. - **Auth** — The agent settings field for choosing or creating the credential (a team-owned secret) a harness uses to authenticate with its provider, matched to that harness's supported credential types (Anthropic keys for Claude Code, an OpenAI key for Codex). @@ -297,7 +297,7 @@ Not every "Oz" in the docs is stale. These are deliberate and correct until - **Run** — The tracked unit of work for a run, including status and outputs. *Usage note:* Use when describing observability, history, and auditability. -- **SDK** — Official client libraries for the Agent API (for example, TypeScript SDK, Python SDK). +- **SDK** — Official client libraries for the Warp Platform API (for example, TypeScript SDK, Python SDK). *Usage note:* Spell out the language on first mention. - **Trigger** — The event that starts a run (Slack mention, schedule, CI event, API call). @@ -306,7 +306,7 @@ Not every "Oz" in the docs is stale. These are deliberate and correct until - **Warp CLI** — Ambiguous since the Warp Agent CLI launched; avoid the bare term. Use "Oz CLI" for the `oz` binary that runs and manages cloud agents (formerly called `warp-cli`), or "Warp Agent CLI" for the `warp` binary that runs the Warp Agent in any terminal. -- **Automation Platform** — Warp's cloud agent platform, covering environments, integrations, orchestration, self-hosting, and the Agent API/SDK. Renamed from "Oz" on 2026-08-18. +- **Automation Platform** — Warp's cloud agent platform, covering environments, integrations, orchestration, self-hosting, and the Warp Platform API and SDKs. Renamed from "Oz" on 2026-08-18. *Usage note:* See "Automation Platform terminology" above for the full entry and the article rule. Always write it as `{VARS.WARP_AUTOMATION_PLATFORM}` / `{{WARP_AUTOMATION_PLATFORM}}`, never as a literal string, so a future rename stays a one-line change. - **Direct backend** — The self-hosted worker backend that runs cloud agent tasks directly on the worker host, without Docker or Kubernetes. One of three self-hosting backends alongside the Docker and Kubernetes backends. diff --git a/.agents/skills/missing_docs/references/consistency_seeds.json b/.agents/skills/missing_docs/references/consistency_seeds.json index 46149acd6..781877105 100644 --- a/.agents/skills/missing_docs/references/consistency_seeds.json +++ b/.agents/skills/missing_docs/references/consistency_seeds.json @@ -27,13 +27,13 @@ "authoritative_sources": [], "affected_surfaces": [ "src/content/docs/platform/triggers/scheduled-agents.mdx", - "src/content/docs/reference/cli/api-keys.mdx", + "src/content/docs/agents/cli/oz-cli/api-keys.mdx", "src/content/docs/platform/team-access-billing-and-identity.mdx", "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx" ], "surface_dispositions": { "src/content/docs/platform/triggers/scheduled-agents.mdx": "blocked", - "src/content/docs/reference/cli/api-keys.mdx": "blocked", + "src/content/docs/agents/cli/oz-cli/api-keys.mdx": "blocked", "src/content/docs/platform/team-access-billing-and-identity.mdx": "blocked", "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx": "blocked" }, @@ -42,7 +42,7 @@ "recheck_condition": "Billing and Product approve a customer-facing charge statement for every plan.", "inconsistent_surfaces": [ "src/content/docs/platform/triggers/scheduled-agents.mdx", - "src/content/docs/reference/cli/api-keys.mdx", + "src/content/docs/agents/cli/oz-cli/api-keys.mdx", "src/content/docs/platform/team-access-billing-and-identity.mdx", "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx" ] @@ -54,12 +54,12 @@ "occurrence_queries": ["owner's personal Add-on Credits", "shared add-on credit pool", "API-key run"], "authoritative_sources": [], "affected_surfaces": [ - "src/content/docs/reference/cli/api-keys.mdx", + "src/content/docs/agents/cli/oz-cli/api-keys.mdx", "src/content/docs/platform/team-access-billing-and-identity.mdx", "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx" ], "surface_dispositions": { - "src/content/docs/reference/cli/api-keys.mdx": "blocked", + "src/content/docs/agents/cli/oz-cli/api-keys.mdx": "blocked", "src/content/docs/platform/team-access-billing-and-identity.mdx": "blocked", "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx": "blocked" }, @@ -67,7 +67,7 @@ "unresolved_question": "Which Add-on Credits balances can fund an API-key run, and is any depletion order a supported customer contract?", "recheck_condition": "Billing and Product approve the applicable balance categories and any guaranteed precedence.", "inconsistent_surfaces": [ - "src/content/docs/reference/cli/api-keys.mdx", + "src/content/docs/agents/cli/oz-cli/api-keys.mdx", "src/content/docs/platform/team-access-billing-and-identity.mdx", "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx" ] @@ -324,12 +324,12 @@ "../warp-server/router/handlers/public_api/agent_webhooks.go" ], "affected_surfaces": [ - "src/content/docs/reference/api-and-sdk/index.mdx", + "src/content/docs/factories/api-and-sdk/index.mdx", "src/content/docs/factories/factory-api.mdx", "src/content/docs/platform/orchestration/multi-agent-runs.mdx" ], "surface_dispositions": { - "src/content/docs/reference/api-and-sdk/index.mdx": "fixed", + "src/content/docs/factories/api-and-sdk/index.mdx": "fixed", "src/content/docs/factories/factory-api.mdx": "fixed", "src/content/docs/platform/orchestration/multi-agent-runs.mdx": "fixed" }, @@ -340,7 +340,7 @@ "type": "forbidden_regex", "patterns": ["POST /agent/run(?!s)"], "paths": [ - "src/content/docs/reference/api-and-sdk/index.mdx", + "src/content/docs/factories/api-and-sdk/index.mdx", "src/content/docs/factories/factory-api.mdx", "src/content/docs/platform/orchestration/multi-agent-runs.mdx" ] @@ -356,15 +356,15 @@ "developers/agent-api-openapi.yaml", "../warp-server/router/handlers/public_api/agent_webhooks.go" ], - "affected_surfaces": ["src/content/docs/reference/api-and-sdk/index.mdx"], - "surface_dispositions": {"src/content/docs/reference/api-and-sdk/index.mdx": "fixed"}, + "affected_surfaces": ["src/content/docs/factories/api-and-sdk/index.mdx"], + "surface_dispositions": {"src/content/docs/factories/api-and-sdk/index.mdx": "fixed"}, "recheck_condition": "The released list-runs query schema changes.", "deterministic_rules": [ { "id": "no-config-name-filter", "type": "forbidden_text", "patterns": ["config_name"], - "paths": ["src/content/docs/reference/api-and-sdk/index.mdx"] + "paths": ["src/content/docs/factories/api-and-sdk/index.mdx"] } ] }, @@ -380,12 +380,12 @@ "../warp/app/src/terminal/input.rs" ], "affected_surfaces": [ - "src/content/docs/reference/cli/index.mdx", + "src/content/docs/agents/cli/oz-cli/index.mdx", "src/content/docs/platform/faqs.mdx", "src/content/docs/agents/local-agents/agent-context/images-as-context.mdx" ], "surface_dispositions": { - "src/content/docs/reference/cli/index.mdx": "fixed", + "src/content/docs/agents/cli/oz-cli/index.mdx": "fixed", "src/content/docs/platform/faqs.mdx": "fixed", "src/content/docs/agents/local-agents/agent-context/images-as-context.mdx": "fixed" }, @@ -395,7 +395,7 @@ "id": "no-five-file-cli-limit", "type": "forbidden_regex", "patterns": ["maximum 5(?!\\d)"], - "paths": ["src/content/docs/reference/cli/index.mdx"] + "paths": ["src/content/docs/agents/cli/oz-cli/index.mdx"] }, { "id": "cloud-images-not-denied", @@ -418,14 +418,14 @@ "../warp/app/src/ai/agent_sdk/driver/mcp_startup.rs" ], "affected_surfaces": [ - "src/content/docs/reference/cli/quickstart.mdx", - "src/content/docs/reference/cli/agent-profiles.mdx", - "src/content/docs/reference/cli/mcp-servers.mdx" + "src/content/docs/agents/cli/oz-cli/quickstart.mdx", + "src/content/docs/agents/cli/oz-cli/agent-profiles.mdx", + "src/content/docs/agents/cli/oz-cli/mcp-servers.mdx" ], "surface_dispositions": { - "src/content/docs/reference/cli/quickstart.mdx": "fixed", - "src/content/docs/reference/cli/agent-profiles.mdx": "fixed", - "src/content/docs/reference/cli/mcp-servers.mdx": "fixed" + "src/content/docs/agents/cli/oz-cli/quickstart.mdx": "fixed", + "src/content/docs/agents/cli/oz-cli/agent-profiles.mdx": "fixed", + "src/content/docs/agents/cli/oz-cli/mcp-servers.mdx": "fixed" }, "recheck_condition": "Default profile permissions or MCP startup selection changes.", "deterministic_rules": [ @@ -433,13 +433,13 @@ "id": "no-load-all-mcp-copy", "type": "forbidden_text", "patterns": ["loads any available MCP servers"], - "paths": ["src/content/docs/reference/cli/quickstart.mdx"] + "paths": ["src/content/docs/agents/cli/oz-cli/quickstart.mdx"] }, { "id": "no-default-mcp-denial", "type": "forbidden_text", "patterns": ["does not have the ability to use MCP servers by default"], - "paths": ["src/content/docs/reference/cli/agent-profiles.mdx"] + "paths": ["src/content/docs/agents/cli/oz-cli/agent-profiles.mdx"] } ] }, @@ -473,12 +473,12 @@ "status": "owner_confirmation", "occurrence_queries": ["end of September 2026", "October 6, 2026", "oz commands remain supported"], "authoritative_sources": [], - "affected_surfaces": ["src/content/docs/reference/cli"], - "surface_dispositions": {"src/content/docs/reference/cli": "blocked"}, + "affected_surfaces": ["src/content/docs/agents/cli/oz-cli"], + "surface_dispositions": {"src/content/docs/agents/cli/oz-cli": "blocked"}, "owner": "Warp Agent CLI and Automation Platform", "unresolved_question": "Which legacy oz workflows have verified warp equivalents, which have no equivalent, and what are the final command-support and documentation-removal dates?", "recheck_condition": "CLI owners approve the complete parity inventory and separate transition milestones.", - "inconsistent_surfaces": ["src/content/docs/reference/cli"] + "inconsistent_surfaces": ["src/content/docs/agents/cli/oz-cli"] }, { "id": "windows-fish-support", diff --git a/AGENTS.md b/AGENTS.md index f803222ea..94c7cc937 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -817,7 +817,7 @@ This is the single most drifted term in the docs, so the rule is narrow on purpo - **Warp Agent** - Capitalized, singular, treated as a proper noun. Use it for Warp's built-in agent harness, especially when contrasting with third-party agents (Claude Code, Codex, and so on) or when referencing the Settings label (**Settings** > **Agents** > **Warp Agent**). - **In prose, it takes the definite article: "the Warp Agent".** The bare form is for headings, sidebar labels, page titles, and the Settings path. "Runs the Warp Agent" reads correctly; "runs Warp Agent" reads as a different product. - **agent** / **agents** - Lowercase everywhere else. This is the generic concept and covers any agent on any surface, including cloud agents and third-party CLI agents. -- **Proper nouns keep their capital A.** `Agent Mode`, `Agent Profiles`, `Agent Memory`, `Agent Management Panel`, `Agent API`, and `Warp Agent CLI` are feature names, not instances of the generic term. +- **Proper nouns keep their capital A.** `Agent Mode`, `Agent Profiles`, `Agent Memory`, `Agent Management Panel`, and `Warp Agent CLI` are feature names, not instances of the generic term. ❌ **Avoid "Warp's agent" and "Warp's agents".** This is the ambiguous middle ground and the main source of drift. It reads as neither the proper noun nor the generic term, so it blurs exactly the distinction that matters. Rewrite instead: diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx index 36c93b1dd..d0231ec87 100644 --- a/src/content/docs/platform/transitioning-from-oz.mdx +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -1,42 +1,31 @@ --- title: About the transition from the {{WEB_APP}} description: >- - Keep existing legacy web app, CLI, SDK, and API workflows while using Warp - Factories for new multi-stage software development workflows. + Find the current documentation for standalone cloud-agent workflows, CLI + tools, APIs, SDKs, and Warp Factories. sidebar: label: "About the transition from the {{WEB_APP}}" --- import { VARS } from '@data/vars'; -Warp Factories supports new multi-stage software development workflows. Existing users can continue using their current workflows without taking action. +Use the {VARS.WARP_AUTOMATION_PLATFORM} documentation for standalone cloud-agent workflows. Use the Warp Factories documentation to build and operate a standing software factory. -## Current status and future direction +## Choose the current documentation -| Surface | Current status | Future direction | -| --- | --- | --- | -| **{VARS.WEB_APP}** | Existing workflows continue to work. | Existing workflows remain supported. Migration guidance will be available over time. | -| **{VARS.WARP_AGENT_CLI} (`oz`)** | Existing commands continue to work. | Relevant functionality moves toward the {VARS.WARP_CLI}. Warp will publish migration guidance before support changes. | -| **{VARS.WARP_CLI} (`warp`)** | Available for its current supported functionality. | The preferred direction for CLI functionality. | -| **`oz-sdk-python` and `oz-sdk-typescript`** | Existing SDK packages continue to work. | Packages may be renamed or repackaged under Warp with migration guidance. | -| **{VARS.WARP_PLATFORM_API}** | Existing endpoints continue to work; no endpoint migration is required. | Documentation and naming may change while compatibility remains. | -| **New software factories** | Use Warp Factories for new multi-stage development workflows. | Warp Factories remains the primary product experience for software factories. | +| Workflow | Documentation | +| --- | --- | +| Configure standalone cloud agents, environments, schedules, integrations, and runs | [{VARS.WARP_AUTOMATION_PLATFORM} overview](/platform/overview/) | +| Run and manage cloud agents with `oz` | [{VARS.WARP_AGENT_CLI} reference](/agents/cli/oz-cli/) | +| Run the Warp Agent from a terminal with `warp` | [{VARS.WARP_CLI} reference](/agents/cli/) | +| Call cloud-agent and factory endpoints from code | [{VARS.WARP_PLATFORM_API} and SDKs](/factories/developer-tools/) | +| Build a standing software factory | [Warp Factories overview](/factories/) | -## Moving an existing workflow +## Evaluate a factory -### Existing web app workflows - -Continue using the {VARS.WEB_APP} for existing cloud agents, environments, schedules, integrations, and runs. Moving an existing workflow into a factory is optional. Contact your account team to evaluate the move for your workflow. - -### CLI functionality - -Continue using `oz` commands for existing workflows. Use the [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) for current command reference and the [{VARS.WARP_CLI}](/agents/cli/) for current `warp` functionality. - -### SDK packages and API - -The official SDK repositories retain their current package names: [Python](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript](https://github.com/warpdotdev/oz-sdk-typescript). Existing API integrations remain compatible as documentation moves to the [{VARS.WARP_PLATFORM_API}](/factories/developer-tools/). +A factory adds standing agent roles, connected work sources, work items, and automation stages around a shared set of repositories. See [how Warp Factories work](/factories/how-factories-work/) to decide whether that model fits your workflow, then use the [Warp Factories quickstart](/factories/quickstart/) to create one. ## Related pages * [{VARS.WARP_AUTOMATION_PLATFORM} overview](/platform/overview/) - Configure standalone cloud-agent workflows. * [Warp Factories overview](/factories/) - Build and operate a standing software factory. -* [{VARS.WARP_PLATFORM_API} & SDKs](/factories/developer-tools/) - Use factory endpoints, Agent & run endpoints, SDKs, and API errors. +* [{VARS.WARP_PLATFORM_API} and SDKs](/factories/developer-tools/) - Use factory endpoints, agent and run endpoints, SDKs, and API errors. diff --git a/vercel.json b/vercel.json index 6200d88d0..7371b7a09 100644 --- a/vercel.json +++ b/vercel.json @@ -6517,6 +6517,71 @@ "destination": "/platform/overview/", "statusCode": 308 }, + { + "source": "/agent-platform/cloud-agents/deployment-patterns(/?)", + "destination": "/factories/deployment-patterns/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cloud-agents/warp-hosting(/?)", + "destination": "/factories/warp-hosting/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cloud-agents/runners(/?)", + "destination": "/factories/runners/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cloud-agents/self-hosting(/?)", + "destination": "/factories/self-hosting/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cloud-agents/self-hosting/quickstart(/?)", + "destination": "/factories/self-hosting/quickstart/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cloud-agents/self-hosting/managed-docker(/?)", + "destination": "/factories/self-hosting/managed-docker/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cloud-agents/self-hosting/managed-kubernetes(/?)", + "destination": "/factories/self-hosting/managed-kubernetes/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cloud-agents/self-hosting/managed-direct(/?)", + "destination": "/factories/self-hosting/managed-direct/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cloud-agents/self-hosting/monitoring(/?)", + "destination": "/factories/self-hosting/monitoring/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cloud-agents/self-hosting/reference(/?)", + "destination": "/factories/self-hosting/reference/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cloud-agents/self-hosting/troubleshooting(/?)", + "destination": "/factories/self-hosting/troubleshooting/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cloud-agents/self-hosting/unmanaged(/?)", + "destination": "/platform/unmanaged-execution/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cloud-agents/self-hosting/security-and-networking(/?)", + "destination": "/platform/execution-security/", + "statusCode": 308 + }, { "source": "/agent-platform/cloud-agents(/?)", "destination": "/platform/", From 1a49ab44d8f22e6218e0d2a0aeea2e0d18e812aa Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 01:35:51 +0000 Subject: [PATCH 58/63] docs: narrow launch PR to Factory content Remove unrelated documentation-policy and review-workflow changes, tighten the Factory quickstart to the existing compression contract, and restore moved API pages to navigation.\n\nCo-Authored-By: Warp --- .agents/references/doc-quality-policy.md | 9 ++-- .../check_compression_contract.py | 41 ++++-------------- .../test_agent_docs_review_workflow.py | 14 ------ .../test_check_compression_contract.py | 12 ++---- .../test_verify_review_signal.py | 12 ------ .../verify_review_signal.py | 32 +++++++------- .agents/skills/draft_docs/SKILL.md | 2 +- .agents/skills/draft_guide/SKILL.md | 2 +- .agents/skills/draft_quickstart/SKILL.md | 6 +-- .agents/templates/guide-page.md | 2 +- .agents/templates/quickstart.md | 2 +- .github/workflows/agent-docs-review.yml | 43 +++++-------------- AGENTS.md | 4 +- .../docs/factories/connect-your-factory.mdx | 6 +-- src/content/docs/factories/index.mdx | 8 ++-- src/content/docs/factories/quickstart.mdx | 36 +++++++--------- .../docs/platform/transitioning-from-oz.mdx | 4 +- src/data/vars.ts | 4 +- src/sidebar.ts | 6 ++- 19 files changed, 80 insertions(+), 165 deletions(-) diff --git a/.agents/references/doc-quality-policy.md b/.agents/references/doc-quality-policy.md index 3e4425eb1..dc38b3094 100644 --- a/.agents/references/doc-quality-policy.md +++ b/.agents/references/doc-quality-policy.md @@ -145,17 +145,14 @@ All content-generating skills share one compression contract: - Lead with a one-to-three-sentence user-facing summary. - Follow the selected content-type template and its existing word budget - (600 words is the quickstart target; up to 800 words is acceptable with a - PR rationale; `<=1500` words for a combined feature page). + (`~600` words for a quickstart; `<=1500` words for a combined feature page). - Run the deletion-only "Cut again" pass (see `draft_docs/SKILL.md` step 6.5 / `AGENTS.md` → Voice & tone) before opening the PR. - Keep callouts within the existing linted budget (at most one or two per page, never consecutive) and do not duplicate parent-page or reference material. -- Treat a quickstart between 601 and 800 words as a documented exception, not - something to fix by mechanically splitting the page. For a quickstart above - 800 words or with more than two callouts, record the exception in the PR and - schedule a later cut pass or reclassify the page as a tutorial. +- Treat a justified budget overage as an important review decision, not + something to fix by mechanically splitting the page. Generated changelog, license, and telemetry data is exempt from the page-summary and word-budget rules, but not from duplicate-content, style, or diff --git a/.agents/skills/doc_quality_policy/check_compression_contract.py b/.agents/skills/doc_quality_policy/check_compression_contract.py index 8191106c2..415c88bc5 100644 --- a/.agents/skills/doc_quality_policy/check_compression_contract.py +++ b/.agents/skills/doc_quality_policy/check_compression_contract.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """Check the mechanically-checkable parts of the shared compression contract. -Word-target, maximum-length, and callout-count checks only — the rest of the contract (lead +Word-budget and callout-count checks only — the rest of the contract (lead summary, "Cut again" pass, no duplication) needs human/agent judgment and is covered by `draft_docs`'s checklist and `review-docs-pr`. Generated changelog/license/telemetry pages are exempt from the word budget (see @@ -12,9 +12,8 @@ python3 check_compression_contract.py FILE --content-type feature-doc Exit codes: - 0 within the hard maximum (may still print a documented-exception notice) - 1 over the hard maximum or callout budget (a reportable finding for - review-docs-pr, not a hard CI gate) + 0 within budget + 1 over budget (a reportable finding for review-docs-pr, not a hard CI gate) 2 usage / file error """ from __future__ import annotations @@ -25,14 +24,11 @@ from pathlib import Path from typing import List, Optional -# Quickstarts target 600 words and can extend to 800 with a PR rationale. +# ~600 words for a quickstart; <=1500 words for a combined feature page. # Other content types have no fixed budget here; the drafting skills' own # length guidance applies. -WORD_TARGETS = { - "quickstart": 600, -} WORD_BUDGETS = { - "quickstart": 800, + "quickstart": 600, "feature-doc": 1500, } @@ -83,7 +79,7 @@ def count_callouts(text: str) -> int: def check_compression_contract(text: str, content_type: str) -> List[str]: - """Return hard-limit findings; empty means within the mechanical maximum.""" + """Return a list of findings; empty means within the mechanical budget.""" findings: List[str] = [] budget = WORD_BUDGETS.get(content_type) @@ -91,8 +87,8 @@ def check_compression_contract(text: str, content_type: str) -> List[str]: words = count_words(text) if words > budget: findings.append( - f"word count {words} exceeds the {content_type} maximum of {budget} " - "(record the exception in the PR and schedule a later cut pass or reclassify the page)" + f"word count {words} exceeds the {content_type} budget of {budget} " + "(a justified overage is an important review decision, not an automatic split)" ) callouts = count_callouts(text) @@ -102,22 +98,6 @@ def check_compression_contract(text: str, content_type: str) -> List[str]: return findings -def check_compression_notices(text: str, content_type: str) -> List[str]: - """Return non-blocking notices that still require a PR rationale.""" - target = WORD_TARGETS.get(content_type) - maximum = WORD_BUDGETS.get(content_type) - if content_type in EXEMPT_CONTENT_TYPES or target is None or maximum is None: - return [] - - words = count_words(text) - if target < words <= maximum: - return [ - f"word count {words} exceeds the {content_type} target of {target} " - f"but is within the documented exception range of {maximum}; record the rationale in the PR" - ] - return [] - - def main(argv: Optional[List[str]] = None) -> int: parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument("file", help="path to the markdown/MDX file, or '-' for stdin") @@ -137,11 +117,6 @@ def main(argv: Optional[List[str]] = None) -> int: return 2 findings = check_compression_contract(text, args.content_type) - notices = check_compression_notices(text, args.content_type) - if notices: - print("Compression contract notices:", file=sys.stderr) - for notice in notices: - print(f" - {notice}", file=sys.stderr) if findings: print("Compression contract findings:", file=sys.stderr) for finding in findings: diff --git a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py index 483bb47cd..fec643842 100644 --- a/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py +++ b/.agents/skills/doc_quality_policy/test_agent_docs_review_workflow.py @@ -34,20 +34,6 @@ def test_all_review_findings_must_supply_actionable_details(self): self.assertIn("critical, important, suggestion, or nit", self.workflow) self.assertIn("file and line or quoted text", self.workflow) - def test_review_signal_is_passed_through_a_file(self): - self.assertIn('oz "${args[@]}" > /tmp/agent-output.txt', self.workflow) - self.assertIn("--agent-output /tmp/agent-output.txt", self.workflow) - self.assertNotIn(".agent-docs-review-signal.txt", self.workflow) - self.assertNotIn( - "AGENT_OUTPUT: ${{ steps.oz-review.outputs.agent_output }}", self.workflow - ) - - def test_review_uses_a_signed_oz_package(self): - self.assertIn("0913165C78D5B7A41B42AC657FF7AB39D60F803F", self.workflow) - self.assertIn("signed-by=/etc/apt/keyrings/warpdotdev.gpg", self.workflow) - self.assertIn("sudo apt-get install -y oz-stable", self.workflow) - self.assertIn("oz --version", self.workflow) - if __name__ == "__main__": unittest.main() diff --git a/.agents/skills/doc_quality_policy/test_check_compression_contract.py b/.agents/skills/doc_quality_policy/test_check_compression_contract.py index a28825385..60356fa52 100644 --- a/.agents/skills/doc_quality_policy/test_check_compression_contract.py +++ b/.agents/skills/doc_quality_policy/test_check_compression_contract.py @@ -54,21 +54,15 @@ def test_quickstart_within_budget_passes(self): text = _page(500) self.assertEqual(ccc.check_compression_contract(text, "quickstart"), []) - def test_quickstart_within_exception_range_passes(self): + def test_quickstart_over_budget_fails(self): text = _page(700) - self.assertEqual(ccc.check_compression_contract(text, "quickstart"), []) - notices = ccc.check_compression_notices(text, "quickstart") - self.assertTrue(any("record the rationale" in f for f in notices)) - - def test_quickstart_over_maximum_fails(self): - text = _page(801) findings = ccc.check_compression_contract(text, "quickstart") - self.assertTrue(any("exceeds the quickstart maximum" in f for f in findings)) + self.assertTrue(any("exceeds the quickstart budget" in f for f in findings)) def test_feature_doc_over_budget_fails(self): text = _page(1600) findings = ccc.check_compression_contract(text, "feature-doc") - self.assertTrue(any("exceeds the feature-doc maximum" in f for f in findings)) + self.assertTrue(any("exceeds the feature-doc budget" in f for f in findings)) def test_generated_changelog_is_exempt_from_word_budget(self): text = _page(5000) diff --git a/.agents/skills/doc_quality_policy/test_verify_review_signal.py b/.agents/skills/doc_quality_policy/test_verify_review_signal.py index be53282cc..9d02c1063 100644 --- a/.agents/skills/doc_quality_policy/test_verify_review_signal.py +++ b/.agents/skills/doc_quality_policy/test_verify_review_signal.py @@ -78,18 +78,6 @@ def test_escaped_action_output_signal_passes(self): problems = vrs.check_review_signal("o/r", "1", "sha1", output) self.assertEqual(problems, []) - def test_signal_with_braces_in_an_actionable_finding_passes(self): - output = ( - '[SIGNAL:pr-review] {"pr":"1","head_sha":"sha1",' - '"reviewer_login":"github-actions[bot]","verdict":"Approve with nits",' - '"critical":0,"important":0,"suggestions":1,"nits":0,' - '"actionable_findings":["`factory-api.mdx:20` — Check ' - '`POST /factory/{uid}/runs`."]}' - ) - with mock.patch.object(vrs.cpc, "_fetch_reviews", return_value=[{**GOOD_REVIEW, "body": output}]): - problems = vrs.check_review_signal("o/r", "1", "sha1", output) - self.assertEqual(problems, []) - def test_distinct_signals_fail(self): different_signal = GOOD_OUTPUT.replace('"Approve"', '"Approve with nits"') output = f"{GOOD_OUTPUT}\n\n{different_signal}" diff --git a/.agents/skills/doc_quality_policy/verify_review_signal.py b/.agents/skills/doc_quality_policy/verify_review_signal.py index 626664aec..f38866f18 100644 --- a/.agents/skills/doc_quality_policy/verify_review_signal.py +++ b/.agents/skills/doc_quality_policy/verify_review_signal.py @@ -5,6 +5,7 @@ import argparse import importlib.util import json +import re import sys from pathlib import Path from typing import Dict, List, Optional, Tuple @@ -15,7 +16,7 @@ sys.modules[_spec.name] = cpc _spec.loader.exec_module(cpc) -_SIGNAL_PREFIX = "[SIGNAL:pr-review]" +_SIGNAL_RE = re.compile(r"\[SIGNAL:pr-review\]\s*(\{.*?\})", re.DOTALL) _PASSING_VERDICTS = {"approve", "approve with nits", "approve_with_nits"} @@ -24,24 +25,25 @@ def _parse_signal( pr_number: Optional[str] = None, head_sha: Optional[str] = None, ) -> Tuple[Optional[Dict[str, object]], List[str]]: - occurrences = text.count(_SIGNAL_PREFIX) - if not occurrences: + matches = _SIGNAL_RE.findall(text) + if not matches: return None, ["expected exactly one [SIGNAL:pr-review] record, found 0"] unique_signals = {} - offset = 0 - while True: - marker = text.find(_SIGNAL_PREFIX, offset) - if marker == -1: - break - offset = marker + len(_SIGNAL_PREFIX) - candidate = text[offset:].lstrip() - signal = None - for payload in (candidate, candidate.replace('\\"', '"')): + for match in matches: + try: + signal = json.loads(match) + except json.JSONDecodeError as original_error: try: - signal, _ = json.JSONDecoder().raw_decode(payload) - break + # The GitHub Action can serialize its text output once more, + # leaving an otherwise valid object in the form + # {\"key\":\"value\"}. Decode that wrapper only after direct + # JSON parsing has failed. + signal = json.loads(match.replace('\\"', '"')) except json.JSONDecodeError: + # Agent output includes the skill's marker examples and prior + # review transcripts. Ignore malformed candidates and require + # a valid, current-head record below. continue if not isinstance(signal, dict): continue @@ -55,7 +57,7 @@ def _parse_signal( if len(signals) != 1: return None, [ "expected one valid [SIGNAL:pr-review] record for the current PR head, " - f"found {len(signals)} across {occurrences} occurrences" + f"found {len(signals)} across {len(matches)} occurrences" ] return signals[0], [] diff --git a/.agents/skills/draft_docs/SKILL.md b/.agents/skills/draft_docs/SKILL.md index d2bf3e808..ef06d2f6c 100644 --- a/.agents/skills/draft_docs/SKILL.md +++ b/.agents/skills/draft_docs/SKILL.md @@ -104,7 +104,7 @@ Record the content type chosen in the design plan, and pick its template and typ Two of these carry admission rules rather than just structure, and both are checked in review: - **FAQ** defaults to "not an FAQ." All three admission rules in `AGENTS.md` must hold before you create or extend one. Most FAQ-shaped content belongs on the page that owns the topic. -- **Quickstart vs. tutorial** is a scope decision, not a location one. A quickstart is ~5 minutes with a 600-word target; up to 800 words is acceptable with a PR rationale. A tutorial walks a full workflow and requires that a quickstart already exists. "Guides" is the section name and holds both. +- **Quickstart vs. tutorial** is a scope decision, not a location one. A quickstart is ~5 minutes and ~600 words for someone who already knows the product; a tutorial walks a full workflow and requires that a quickstart already exists. "Guides" is the section name and holds both. Once the content type is identified: - Use the corresponding **template** as the starting scaffold for the page. diff --git a/.agents/skills/draft_guide/SKILL.md b/.agents/skills/draft_guide/SKILL.md index e681c3b20..9001f7eec 100644 --- a/.agents/skills/draft_guide/SKILL.md +++ b/.agents/skills/draft_guide/SKILL.md @@ -11,7 +11,7 @@ Draft a tutorial that walks a developer through an entire workflow, start to fin "Guides" is the name of the section, not a content type. It holds both, and the choice is about scope: -- **Quickstart** — about five minutes, with 600 words as the target and up to 800 words allowed with a PR rationale, for someone who already knows the product. Use `draft_quickstart`. +- **Quickstart** — about five minutes, ~600 words, essential steps only, for someone who already knows the product. Use `draft_quickstart`. - **Tutorial** — a full workflow with context at the decision points, for someone extending a basic understanding to solve a real problem. This skill. **A tutorial requires that a quickstart already exists** for the product area. Check before drafting. If there is no quickstart, write that first — otherwise the tutorial absorbs setup content that belongs in a shorter page, and readers who only wanted to get started have to wade through the whole workflow. diff --git a/.agents/skills/draft_quickstart/SKILL.md b/.agents/skills/draft_quickstart/SKILL.md index 4a1964f27..1f59d5167 100644 --- a/.agents/skills/draft_quickstart/SKILL.md +++ b/.agents/skills/draft_quickstart/SKILL.md @@ -1,6 +1,6 @@ --- name: draft_quickstart -description: Draft a new quickstart documentation page or update an existing one. Use when the reader already understands the product and wants the fastest path to a working result - about five minutes and 600 words, with up to 800 words allowed when documented in the PR. If the task needs explanation along the way, it is a tutorial, not a quickstart. +description: Draft a new quickstart documentation page or update an existing one. Use when the reader already understands the product and wants the fastest path to a working result - about five minutes and 600 words, essential steps only. If the task needs explanation along the way or exceeds that budget, it is a tutorial, not a quickstart. --- # Draft quickstart page @@ -9,7 +9,7 @@ Draft a quickstart that gets the reader to a working result in about five minute ## Scope is the defining constraint -**About five minutes and 600 words is the target.** Up to 800 words is acceptable when visual confirmation or a complete first-use path needs the room; record the rationale in the PR. Above 800 words, record the exception and schedule a later cut pass or reclassify the page as a tutorial. +**About five minutes and roughly 600 words.** This is a budget, not a target. A quickstart that outgrows it has become a tutorial and should be reworked as one rather than allowed to sprawl. Quickstarts are for readers who **already understand the feature or product** and are ready to try it. Deliberately omit how it works and why they would want it — if the reader needs that, they need conceptual content. If the task needs context at its decision points, they need a tutorial. @@ -41,7 +41,7 @@ These rules are specific to quickstart pages (from the "Drafting by content type - **Troubleshooting is optional and link-only.** Point at existing troubleshooting content; do not write new troubleshooting into a quickstart. - End with a one-line recap, then 2-3 actionable next steps. Always include a link to the conceptual page for the feature. - Title convention: "[Feature] quickstart" or "Quickstart for [product]" -- **Length is the constraint, not just the tone.** A quickstart targets 600 words. Up to 800 words is acceptable with a PR rationale; above 800 words, record the exception and schedule a later cut pass or reclassify the page as a tutorial. Cut every section that isn't on the critical path (AGENTS.md → Voice & tone → Cut again) before adding new content. Also apply the general tone rules: no marketing buzzwords, no meta-openers. +- **Length is the constraint, not just the tone.** A quickstart has a hard ~600-word budget — tighter than any other content type, because speed to a working result is the entire point. Cut every section that isn't on the critical path (AGENTS.md → Voice & tone → Cut again) before adding a word of new content. Also apply the general tone rules: no marketing buzzwords, no meta-openers. ## Heading case diff --git a/.agents/templates/guide-page.md b/.agents/templates/guide-page.md index 934f94b6b..ad7e2dcaf 100644 --- a/.agents/templates/guide-page.md +++ b/.agents/templates/guide-page.md @@ -9,7 +9,7 @@ description: >- [VARS: If this page names a product from src/data/vars.ts, add `import { VARS } from '@data/vars';` below, then use {VARS.KEY} in prose and {{TOKEN}} in frontmatter. See AGENTS.md → Content variables.] [AEO: If this page is driven by Peec, search-query, or answer-engine data, run `.agents/skills/aeo_brief/SKILL.md` first.] -[SCOPE: This is a tutorial — a full workflow, start to finish, with context at the decision points. If the task fits in about five minutes with 600 words as the target (up to 800 with a PR rationale), it is a quickstart instead; use `.agents/templates/quickstart.md`. A tutorial also requires that a quickstart already exists for this product area. If none does, write that first.] +[SCOPE: This is a tutorial — a full workflow, start to finish, with context at the decision points. If the task fits in about five minutes and 600 words of essential steps, it is a quickstart instead; use `.agents/templates/quickstart.md`. A tutorial also requires that a quickstart already exists for this product area. If none does, write that first.] [Introduction: who this is for, what prior knowledge it assumes, and what the reader will build. Do NOT state an expected completion time — it varies too much by experience level. (Quickstarts do state one; tutorials do not.)] diff --git a/.agents/templates/quickstart.md b/.agents/templates/quickstart.md index 55d5103e5..2a562d6bd 100644 --- a/.agents/templates/quickstart.md +++ b/.agents/templates/quickstart.md @@ -9,7 +9,7 @@ description: >- [BEFORE PUBLISHING: Delete every bracketed instruction in this file, including this one. They are guidance for the author, not page content.] [VARS: If this page names a product from src/data/vars.ts, add `import { VARS } from '@data/vars';` on the line directly below the frontmatter, then use {VARS.KEY} in prose. See AGENTS.md → Content variables.] -[SCOPE — the defining constraint: about five minutes and 600 words is the target. Up to 800 words is acceptable when visual confirmation or a complete first-use path needs the room; record why in the PR. Above 800 words, record the exception and schedule a later cut pass or reclassify it as a tutorial. Written for someone who already understands the product and is ready to try it, so leave out how it works and why they would want it. If the task needs context at its decision points, it is a tutorial.] +[SCOPE — the defining constraint: about five minutes and roughly 600 words. This is a budget, not a target. A quickstart that outgrows it has become a tutorial and should be reworked as one. Written for someone who already understands the product and is ready to try it, so leave out how it works and why they would want it. If the task needs context at its decision points, it is a tutorial.] [Opening paragraph: who this is for, what prior knowledge it assumes, what the reader will end up with, and the time budget. 2-3 sentences.] diff --git a/.github/workflows/agent-docs-review.yml b/.github/workflows/agent-docs-review.yml index fa6946366..6b7b267c7 100644 --- a/.github/workflows/agent-docs-review.yml +++ b/.github/workflows/agent-docs-review.yml @@ -37,30 +37,12 @@ jobs: uses: actions/checkout@v4 - name: Run independent review-docs-pr agent - env: - WARP_API_KEY: ${{ secrets.WARP_API_KEY }} - WARP_AGENT_PROFILE: ${{ vars.WARP_AGENT_PROFILE || '' }} - run: | - sudo apt-get update - sudo apt-get install -y gpg - curl --fail --location https://releases.warp.dev/linux/keys/warp.asc \ - --output /tmp/warpdotdev.asc - # Verified against releases.warp.dev/linux/keys/warp.asc on 2026-09-18. - # Reverify this fingerprint before updating the Warp signing key. - test "$( - gpg --show-keys --with-colons /tmp/warpdotdev.asc | - awk -F: '/^fpr:/ { print $10; exit }' - )" = "0913165C78D5B7A41B42AC657FF7AB39D60F803F" - gpg --dearmor --output /tmp/warpdotdev.gpg /tmp/warpdotdev.asc - sudo install -D -o root -g root -m 644 /tmp/warpdotdev.gpg \ - /etc/apt/keyrings/warpdotdev.gpg - sudo tee /etc/apt/sources.list.d/warpdotdev.list > /dev/null <<'EOF' - deb [arch=amd64 signed-by=/etc/apt/keyrings/warpdotdev.gpg] https://releases.warp.dev/linux/deb stable main - EOF - sudo apt-get update - sudo apt-get install -y oz-stable - oz --version - PROMPT="$(cat <<'EOF' + id: oz-review + uses: warpdotdev/oz-agent-action@main + with: + warp_api_key: ${{ secrets.WARP_API_KEY }} + profile: ${{ vars.WARP_AGENT_PROFILE || '' }} + prompt: | Run the review-docs-pr skill against warpdotdev/docs PR #${{ github.event.pull_request.number }} at head SHA ${{ github.event.pull_request.head.sha }}. This PR carries the warpy-factory agent marker, so it requires the independent v1 agent-doc quality review pass (see @@ -78,15 +60,6 @@ jobs: changed file and line or quoted text, explain the problem, and state the requested resolution. Set reviewer_login to `github-actions[bot]`, the runner account that will publish the review. - 5. Your final response must contain only the single [SIGNAL:pr-review] JSON record. - Do not repeat the diff, review rationale, or findings outside that record. - EOF - )" - args=(agent run --output-format text --prompt "$PROMPT") - if [ -n "$WARP_AGENT_PROFILE" ]; then - args+=(--profile "$WARP_AGENT_PROFILE") - fi - oz "${args[@]}" > /tmp/agent-output.txt - name: Dismiss stale automated change requests env: GH_TOKEN: ${{ github.token }} @@ -105,7 +78,9 @@ jobs: - name: Publish the independent review env: GH_TOKEN: ${{ github.token }} + AGENT_OUTPUT: ${{ steps.oz-review.outputs.agent_output }} run: | + printf '%s' "$AGENT_OUTPUT" > /tmp/agent-output.txt python3 .agents/skills/doc_quality_policy/publish_review_signal.py \ --agent-output /tmp/agent-output.txt \ --pr "${{ github.event.pull_request.number }}" \ @@ -121,7 +96,9 @@ jobs: - name: Verify the current review signal and GitHub review env: GH_TOKEN: ${{ github.token }} + AGENT_OUTPUT: ${{ steps.oz-review.outputs.agent_output }} run: | + printf '%s' "$AGENT_OUTPUT" > /tmp/agent-output.txt python3 .agents/skills/doc_quality_policy/verify_review_signal.py \ --repo "${{ github.repository }}" \ --pr "${{ github.event.pull_request.number }}" \ diff --git a/AGENTS.md b/AGENTS.md index 94c7cc937..b2eb155ab 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -588,7 +588,7 @@ These rules apply regardless of content type: **When to use**: When the reader already understands the feature or product and is ready to try it. A quickstart deliberately omits explanation of how something works or why they would want it — if the reader needs that, they need conceptual content, and if the task is complex enough to need context along the way, they need a tutorial. -**Scope**: About five minutes and 600 words is the target. A quickstart can run up to 800 words when visual confirmation or a complete first-use path needs the room; record the rationale in the PR. Above 800 words, record the exception and schedule a later cut pass or reclassify the page as a tutorial. +**Scope**: About five minutes and roughly 600 words. That budget is the defining constraint, not a suggestion. A quickstart that no longer fits it has become a tutorial and should be reworked as one. **Structure**: 1. Opening paragraph: who it is for, the prerequisites and prior knowledge assumed, what the reader will end up with, and the time budget ("in about five minutes") @@ -703,7 +703,7 @@ Direct answer with actionable information. Include links to relevant documentati "Guides" is the name of the section, not a content type. It holds both **tutorials** and **quickstarts**; pick between them by scope before drafting: -- **Quickstart** — about five minutes, with 600 words as the target and up to 800 words allowed with a PR rationale, for someone who already understands the product. +- **Quickstart** — about five minutes, ~600 words, essential steps only, for someone who already understands the product. - **Tutorial** — a full workflow with context at the decision points, for someone extending a basic understanding to solve a real problem. **A tutorial requires that a quickstart already exists** for the product area. If there is no quickstart, write that first — otherwise the tutorial absorbs setup content that belongs in a shorter page, and readers who only wanted to get started have to wade through the whole workflow. diff --git a/src/content/docs/factories/connect-your-factory.mdx b/src/content/docs/factories/connect-your-factory.mdx index 282fc9525..29a56f447 100644 --- a/src/content/docs/factories/connect-your-factory.mdx +++ b/src/content/docs/factories/connect-your-factory.mdx @@ -29,7 +29,7 @@ Once a source is connected, here's the concrete action that hands it work — ea | [Linear](/factories/integrations/linear/) | Planned issues | [Assigning the issue to the factory, or mentioning the Warp app in a comment](/factories/integrations/linear/#route-agent-sessions) | The Linear issue and its agent session | | [Jira](/factories/integrations/jira/) | Work items assigned to Warp | [Assigning or mentioning **Warp** on a work item](/factories/integrations/jira/#connect-jira-and-add-an-automation) | The Jira agent session | | [Custom webhooks](/factories/webhooks/) | Any system that can POST JSON: CI, monitoring, alerting, and internal tools | [Posting JSON to the webhook's URL from the external system](/factories/webhooks/#configure-the-sender) | The factory work item | -| [factory endpoints](/factories/factory-api/) | Custom integrations and scripts that dispatch by factory UID | [Calling `POST /factory/{uid}/runs` with a prompt](/factories/factory-api/#dispatch-a-run-to-a-factory) | The factory work item | +| [Factory endpoints](/factories/factory-api/) | Custom integrations and scripts that dispatch by factory UID | [Calling `POST /factory/{uid}/runs` with a prompt](/factories/factory-api/#dispatch-a-run-to-a-factory) | The factory work item | | [Factory MCP](/factories/factory-mcp/) | Exchanging work with a local coding agent, in both directions | [Calling `send_task` from a connected coding agent](/factories/factory-mcp/#send-new-work-to-a-factory) | The factory work item | | Direct runs and schedules | One-off or recurring work | [Clicking **New** on the factory's Runs page, or adding a schedule trigger](#direct-runs-and-schedules) | The factory work item | @@ -75,9 +75,9 @@ These defaults are starting points. Review each automation's filters, agent, and A [custom webhook](/factories/webhooks/) gives the factory an authenticated URL that any system can POST JSON to, and an automation decides which deliveries start work by filtering on the payload. Use it for tools Warp doesn't connect to directly, such as your CI system, PagerDuty, Sentry, or Stripe, without writing any code on your side. -## factory endpoints +## Factory endpoints -[factory endpoints](/factories/factory-api/) let your own code discover a factory and dispatch a task to it by UID, without knowing which agent handles the work. Use them to build a custom integration for a tool Warp doesn't connect to directly - see [Build a Mattermost bot for Warp Factories](/guides/external-tools/build-a-mattermost-bot-for-warp-factories/) for a worked example. +[Factory endpoints](/factories/factory-api/) let your own code discover a factory and dispatch a task to it by UID, without knowing which agent handles the work. Use them to build a custom integration for a tool Warp doesn't connect to directly - see [Build a Mattermost bot for Warp Factories](/guides/external-tools/build-a-mattermost-bot-for-warp-factories/) for a worked example. ## Factory MCP diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index 39685584c..08733d347 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -13,13 +13,13 @@ import VideoEmbed from '@components/VideoEmbed.astro'; Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. If your team already has access, sign in to the {VARS.FACTORY_WEB_APP}. ::: -A factory is a cloud automation loop around your software development lifecycle. It combines repositories, tools, agents, and execution infrastructure to move requests through triage, specification, implementation, review, and verification, while people stay in control of key decisions. +A factory is a group of agents that shares repositories and delivery policy. Its foreman accepts work from connected tools, dispatches the right agents, and returns the result to the source. ## What is a software factory? -In practice, that means tracking each request as a work item, such as an issue, ticket, or triggered task, and moving it through specialized agents that triage it, write a specification when one is needed, implement the change, and review the result. +Each request becomes a work item, such as an issue, ticket, or triggered task. Specialized agents can triage it, write a specification, implement the change, and review the result. Each factory applies a single policy across its work sources, so deploy separate factories for repository groups that need different policies. @@ -40,7 +40,7 @@ Don't split those same repositories across multiple factories by team or task (f ## Who benefits from Warp Factories -Warp Factories is designed for engineering teams with repeatable work that extends beyond one coding session. Here's where it helps most: +Warp Factories is for engineering teams with repeatable work that extends beyond one coding session: * Process a backlog of issues with a consistent triage and delivery policy. * Fix defects reported through support channels. @@ -69,7 +69,7 @@ Warp Factories builds on the same agent infrastructure used across Warp. Every f Setup gives a factory and its foreman the same name by default, so it's easy to mistake one for the other. Here's how the terms differ: -* **factory** - A cloud automation loop around your software development lifecycle. It combines repositories, tools, agents, and execution infrastructure to move requests through the factory workflow. Distinct from Warp Factories, the product, and from the foreman, its coordinating agent. +* **factory** - The repositories, delivery policy, agents, and connected tools that handle a related set of work. It is distinct from Warp Factories, the product, and from the foreman, its coordinating agent. * **foreman** - The coordinating agent inside a factory, and the only one you talk to. It dispatches the other [factory agents](/factories/factory-agents/) and reports back. Every factory has exactly one. * **Foreman name** - The handle your team @-mentions in Slack and Linear to reach the foreman. Setup copies it from the factory's name, so the two usually match even though they're different things. See [Foreman name](/factories/factory-agents/#foreman-name). diff --git a/src/content/docs/factories/quickstart.mdx b/src/content/docs/factories/quickstart.mdx index 261ee3c8c..a26486473 100644 --- a/src/content/docs/factories/quickstart.mdx +++ b/src/content/docs/factories/quickstart.mdx @@ -2,7 +2,7 @@ title: Warp Factories quickstart description: >- Set up a factory, connect your repositories, and take your first work item - from prompt to pull request in less than 10 minutes. + from prompt to pull request in about 10 minutes. sidebar: label: "Quickstart" --- @@ -12,32 +12,29 @@ import { VARS } from '@data/vars'; Warp Factories is in **Early Access** and available to a limited set of teams. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. ::: -A factory is a fleet of agents wired to your software development lifecycle. It connects your repositories and tools to move requests through triage, specification, implementation, review, and verification, while people stay in control of key decisions. You talk to one agent, the **foreman**. It picks up the request from wherever it starts, such as Slack, an issue tracker, or a code host, then dispatches the factory's other agents. - -In this quickstart, you will create a factory and take one small work item from prompt to pull request in less than 10 minutes. +Create a factory and take one small work item from prompt to pull request in about 10 minutes. This quickstart is for teams that already have Warp Factories access and know which repositories they want the factory to use. ## Prerequisites * **Warp Factories access** - [Request Early Access](https://www.warp.dev/factories/request-access) for your team. * **A Warp team with credits** - The team's [credits](/support-and-community/plans-and-billing/platform-credits/) are consumed by factory agents. -* **Repository access** - Authorize GitHub, GitLab, or Azure DevOps during setup. If your organization restricts app installations, ask an owner to approve the connection. Azure DevOps also requires [one-time administrator approval](/factories/integrations/azure-devops/#requirements). +* **Repository access** - Authorize GitHub, GitLab, or Azure DevOps during setup. Restricted organizations need owner approval. Azure DevOps also requires [one-time administrator approval](/factories/integrations/azure-devops/#requirements). ## Set up your factory -_~5 minutes_ +_About 5 minutes_ :::note For GitHub and GitLab repositories, an agent connected to [Factory MCP](/factories/factory-mcp/#set-up-with-your-coding-agent) can run this whole setup. Use the web setup wizard for Azure DevOps. If the wizard is still open when the agent finishes, refresh the page to see the new factory. ::: -Warp walks you through a setup wizard: 1. Sign in to the {VARS.FACTORY_WEB_APP}. Next to **Factories**, click **+**.
![The Factories section of the sidebar, with the + button used to start a new factory highlighted.](../../../assets/factories/quickstart-open-setup-wizard.png) -
Click + next to Factories to open the setup wizard.
+
The factory setup control in the sidebar.
2. Under **Connect your code hosts**, connect GitHub, GitLab, or Azure DevOps. Choose the GitHub organization, GitLab group, or Azure DevOps organization and project to connect. @@ -46,37 +43,37 @@ Warp walks you through a setup wizard:
![The Connect a GitHub organization screen, with an already-connected organization shown as an option.](../../../assets/factories/quickstart-connect-organization.png) -
Choose the organization whose repositories the factory will use.
+
Connected GitHub organizations available during setup.
-3. On **Select your repos**, select the repositories the factory works in, then click **Add repos**. Start with one or two repositories that ship together, and add more later. See [sizing a factory](/factories/#sizing-a-factory) before adding a repository already covered by another factory. +3. On **Select your repos**, select one or two repositories that ship together, then click **Add repos**. See [sizing a factory](/factories/#sizing-a-factory) before adding a repository already covered by another factory.
![The Select your repos screen, searching for repositories by name.](../../../assets/factories/quickstart-select-repos.png) -
Search for and select the repositories the factory works in.
+
The repository selector for factory setup.
-4. Name the factory. This also sets its [**Foreman name**](/factories/factory-agents/#foreman-name), the handle your team @-mentions in Slack and Linear. The factory and foreman names match by default, but the foreman is the agent that coordinates its work. +4. Name the factory. This also sets its [**Foreman name**](/factories/factory-agents/#foreman-name), the handle your team @-mentions in Slack and Linear.
![The Give your factory some personality screen, with Factory name and Foreman name fields filled in.](../../../assets/factories/quickstart-name-factory.png) -
Name the factory and, optionally, add a description and avatar.
+
Identity settings for the factory and foreman.
-5. Toggle the agents the foreman can dispatch: **Triage**, **Spec**, **Implement**, and **Review**. All four start enabled. Leave **Implement** on so this quickstart can end in a pull request. See [factory agents](/factories/factory-agents/) for details. +5. Choose which agents the foreman can dispatch. Leave **Implement** enabled so this quickstart ends in a pull request. See [factory agents](/factories/factory-agents/) for details.
![The Pick your factory agents screen, with the Foreman and all four default agents shown as enabled.](../../../assets/factories/quickstart-pick-agents.png) -
Toggle which default agents the foreman can dispatch.
+
Default factory agents enabled during setup.
-6. Optionally, connect Slack and an issue tracker so teammates can hand work to the factory from the tools they already use. You can add either later from [connect your factory](/factories/connect-your-factory/). +6. Optionally, connect Slack and an issue tracker. You can add either later from [connect your factory](/factories/connect-your-factory/). Warp creates the factory and opens its [dashboard](/factories/factory-dashboard/). ## Send your first work item -_~5 minutes_ +_About 5 minutes_ Send work from Slack or an issue tracker. If you skipped integrations, start a run from the **Runs** page of the factory's [dashboard](/factories/factory-dashboard/). @@ -88,7 +85,6 @@ Send work from Slack or an issue tracker. If you skipped integrations, start a r repo's lint check, and open a pull request. ``` - Name the file, expected change, and verification command. 2. The foreman dispatches the agents needed for the request and posts progress where it started. Follow the foreman and child runs on the factory's [Runs page](/factories/factory-dashboard/#inspect-runs). Requests for input also appear in your [inbox](/factories/factory-inbox/). @@ -96,7 +92,7 @@ Send work from Slack or an issue tracker. If you skipped integrations, start a r
![A Slack thread where the Warp Factories app replies with tracking and triage progress updates, including links to open the session and view it in the factory.](../../../assets/factories/slack-factory-thread-reply.png) -
The factory's Slack app posting progress updates back in the thread where you sent the request.
+
A factory Slack thread with live progress.
3. When the Implement agent finishes, review and merge the linked pull request as you would any other. @@ -104,7 +100,5 @@ Send work from Slack or an issue tracker. If you skipped integrations, start a r ## Next steps * [**Connect your factory**](/factories/connect-your-factory/) - Configure intake sources. -* [**Factory MCP**](/factories/factory-mcp/) - Send work from a coding agent or MCP client. * [**How Warp Factories work**](/factories/how-factories-work/) - Understand the work-item lifecycle. -* [**warp-factory-examples**](https://github.com/warpdotdev/warp-factory-examples) - Complete working definitions to copy, from a single-repo quickstart to the full issue-to-PR lifecycle. * [**Troubleshooting Warp Factories**](/factories/troubleshooting/) - Fix common setup and run issues. diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/transitioning-from-oz.mdx index d0231ec87..dc601b04b 100644 --- a/src/content/docs/platform/transitioning-from-oz.mdx +++ b/src/content/docs/platform/transitioning-from-oz.mdx @@ -1,10 +1,10 @@ --- -title: About the transition from the {{WEB_APP}} +title: Cloud agent documentation map description: >- Find the current documentation for standalone cloud-agent workflows, CLI tools, APIs, SDKs, and Warp Factories. sidebar: - label: "About the transition from the {{WEB_APP}}" + label: "Documentation map" --- import { VARS } from '@data/vars'; diff --git a/src/data/vars.ts b/src/data/vars.ts index c7c1086cc..1fbc605e3 100644 --- a/src/data/vars.ts +++ b/src/data/vars.ts @@ -7,8 +7,8 @@ // Use the future/conceptual name as the key; the value holds the current string. export const VARS = { - // The `oz` binary and Oz web app are supported legacy surfaces. Their names - // remain in place while Warp publishes transition guidance for each surface. + // The `oz` binary and Oz web app keep their legacy names during the + // documented transition. See .agents/references/terminology.md for timing. // // IMPORTANT: "Automation Platform" is a common-noun phrase, not a proper // noun like "Oz" was. Referential uses need a definite article in the prose diff --git a/src/sidebar.ts b/src/sidebar.ts index 12d0431f1..6ac237451 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -494,6 +494,8 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'factories/developer-tools', label: 'Overview' }, { slug: 'factories/factory-api', label: 'Factory endpoints' }, { slug: 'factories/api-and-sdk', label: 'Agent & run endpoints' }, + { slug: 'factories/api-and-sdk/quickstart', label: 'Quickstart' }, + { slug: 'factories/api-and-sdk/demo-sentry-monitoring-with-sdk', label: 'Sentry monitoring demo' }, { label: 'API reference', link: '/api' }, { label: 'Python SDK', link: 'https://github.com/warpdotdev/oz-sdk-python' }, { label: 'TypeScript SDK', link: 'https://github.com/warpdotdev/oz-sdk-typescript' }, @@ -523,7 +525,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ // Keep troubleshooting and legacy transition guidance as direct trailing // items rather than creating singleton groups. { slug: 'factories/troubleshooting', label: 'Troubleshooting' }, - { label: `About the transition from the ${VARS.WEB_APP}`, link: '/platform/transitioning-from-oz/' }, + { label: 'Cloud agent documentation map', link: '/platform/transitioning-from-oz/' }, ], }, { @@ -551,7 +553,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ items: [ { slug: 'platform', label: 'Overview' }, { slug: 'platform/quickstart', label: 'Quickstart' }, - { slug: 'platform/transitioning-from-oz', label: `About the transition from the ${VARS.WEB_APP}` }, + { slug: 'platform/transitioning-from-oz', label: 'Documentation map' }, { // Runtime (which agent executes the run) is kept separate from // configuration (how any run is set up) -- HYC review, 8/14. From 438ce924f964284b077a347886a5f8bafb923a06 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 02:23:57 +0000 Subject: [PATCH 59/63] docs: correct factory API and webhook triggers Co-Authored-By: Oz --- src/content/docs/factories/api-and-sdk/quickstart.mdx | 2 +- src/content/docs/factories/automations.mdx | 2 +- src/content/docs/factories/factory-as-code.mdx | 2 +- src/content/docs/factories/webhooks.mdx | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/content/docs/factories/api-and-sdk/quickstart.mdx b/src/content/docs/factories/api-and-sdk/quickstart.mdx index a210f5a07..61ffdfdee 100644 --- a/src/content/docs/factories/api-and-sdk/quickstart.mdx +++ b/src/content/docs/factories/api-and-sdk/quickstart.mdx @@ -41,7 +41,7 @@ Replace `wk-...` with the key you created earlier. Submit a prompt to start an agent run: ```bash -curl -X POST https://app.warp.dev/api/v1/agent/run \ +curl -X POST https://app.warp.dev/api/v1/agent/runs \ -H "Authorization: Bearer $WARP_API_KEY" \ -H "Content-Type: application/json" \ -d '{ diff --git a/src/content/docs/factories/automations.mdx b/src/content/docs/factories/automations.mdx index 3a3d308ce..15ac6b495 100644 --- a/src/content/docs/factories/automations.mdx +++ b/src/content/docs/factories/automations.mdx @@ -97,7 +97,7 @@ For more automations that use these filters, including branches, paths, workflow ## Payload filters for webhook triggers -A [custom webhook](/factories/webhooks/) trigger (`provider: webhook`, `event: received`) binds an automation to one or more webhooks with `webhook_ids`, which takes webhook UIDs and supports only `in`. Its optional `payload` filter is a pattern that mirrors the shape of the delivery's JSON body, so you can route on the payload without running an agent to decide: +A [custom webhook](/factories/webhooks/) trigger (`provider: webhook`, `event: received`) binds an automation to exactly one webhook. `webhook_ids` is required, takes a one-item list containing that webhook's UID, and supports only `in`. To listen to multiple webhooks, add one trigger with provider `webhook` and event `received` per UID. The optional `payload` filter is a pattern that mirrors the shape of the delivery's JSON body, so you can route on the payload without running an agent to decide: * Payload filters match against the webhook's JSON body. * Fields are ANDed together: every key in the pattern must match. diff --git a/src/content/docs/factories/factory-as-code.mdx b/src/content/docs/factories/factory-as-code.mdx index f98516eff..3fe938df1 100644 --- a/src/content/docs/factories/factory-as-code.mdx +++ b/src/content/docs/factories/factory-as-code.mdx @@ -418,7 +418,7 @@ Slack, Linear, and Jira triggers require the matching [integration](/platform/in Optional. Narrows which events start runs. The keys a filter accepts depend on the provider and event: for example `repos`, `labels`, and `authors` for GitHub events, or `channels`, `users`, and `keywords` for Slack messages. Filter keys combine with AND, an omitted key matches everything, and each key takes a list that matches any of its values (or an `in`/`not_in` object to include or exclude). Slack and Linear filters take names (channels, users, teams, projects, states), and Warp resolves them to IDs when it applies the change. -A `webhook` trigger with the `received` event requires `webhook_ids` in its filter, a list of webhook UIDs (`in` only; the file name isn't accepted), and takes an optional `payload` pattern that mirrors the delivery's JSON body. See [payload filters for webhook triggers](/factories/automations/#payload-filters-for-webhook-triggers) for the pattern grammar. +A `webhook` trigger with the `received` event requires `webhook_ids` in its filter. This field is a one-item list containing exactly one webhook UID (`in` only; the file name isn't accepted). To listen to multiple webhooks, add a separate trigger with provider `webhook` and event `received` for each UID. The trigger also takes an optional `payload` pattern that mirrors the delivery's JSON body. See [payload filters for webhook triggers](/factories/automations/#payload-filters-for-webhook-triggers) for the pattern grammar. The published trigger catalog currently uses these filter keys across its provider and event combinations: diff --git a/src/content/docs/factories/webhooks.mdx b/src/content/docs/factories/webhooks.mdx index 577fc65c7..151c5d31a 100644 --- a/src/content/docs/factories/webhooks.mdx +++ b/src/content/docs/factories/webhooks.mdx @@ -83,7 +83,7 @@ A webhook starts nothing on its own; an automation has to subscribe to it. 1. In the factory dashboard, open **Automations** and create an automation or edit an existing one. 2. Click **Add trigger**, then click **Webhook**. -3. In the "Webhook received from" picker, select one or more webhooks. +3. In the "Webhook received from" picker, select one webhook. To listen to multiple webhooks, add a separate **Webhook** trigger for each. 4. Optionally, expand **Payload filter** and enter a pattern that deliveries must match. See [Filter deliveries by payload](#filter-deliveries-by-payload). 5. Click **Test filter** to evaluate the filter against a stored delivery. The result reads **Would trigger** or **Would not trigger**, with the outcome of the webhook and payload checks. 6. Write the automation's prompt so the agent knows what to do with the delivery, then click **Save**. @@ -97,7 +97,7 @@ Send another test delivery and confirm a run starts on the factory's **Runs** pa ## Filter deliveries by payload -Without a payload filter, an automation starts a run for every delivery from its selected webhooks. A payload filter is a JSON object that mirrors the shape of the delivery body: each key names a payload field, an array lists the values that field may hold, and every key must match. +Without a payload filter, an automation starts a run for every delivery from its selected webhook. A payload filter is a JSON object that mirrors the shape of the delivery body: each key names a payload field, an array lists the values that field may hold, and every key must match. ```json { @@ -122,7 +122,7 @@ Open a webhook on the **Webhooks** tab inside **Automations** to inspect and cha * **Recent deliveries** - The latest deliveries, newest first, each labeled **Accepted**, **Duplicate**, **Rejected (auth)**, **Rejected (invalid JSON)**, or **Rejected (too large)**, with the delivery ID, size, and time. Expand an accepted delivery to read its stored payload. Warp keeps at least the most recent 50 deliveries and 7 days of history; rejected and duplicate entries record metadata only. * **Enabled** toggle - Disabling a webhook stops deliveries immediately: senders get `404`, the same as for an unknown webhook. Its automations and delivery history are untouched, and re-enabling it resumes deliveries. * **Rotate secret** - Generates a new secret, or takes the provider's new signing secret for a provider signature webhook, and shows it once. The old secret stops working immediately, with no overlap window. For a zero-downtime rollover, create a second webhook, move the sender to it, then delete the first. -* **Delete** - Senders get `404` immediately. Automations that select the deleted webhook stay visible but stop firing; point their triggers at another webhook or remove the trigger. +* **Delete** - Senders get `404` immediately. Automations with a trigger that selects the deleted webhook stay visible but stop firing; point the trigger at another webhook or remove it. On a Warp-managed factory, the dashboard writes each webhook to a definition file, so two actions work differently: rename isn't supported, and instead of **Rotate secret** you give the managed secret the webhook references a new value, with `oz secret update --team --value SECRET_NAME` on the {VARS.WARP_AGENT_CLI}. The webhook picks up the new value the next time its definition applies, such as when you toggle **Enabled** off and on. @@ -166,7 +166,7 @@ A new fatal issue was created in Sentry. Read the attached event payload, find the failing code path, and open a pull request with a fix and a test. ``` -`webhook_ids` takes UIDs, not file names, and Warp assigns the UID when the webhook file first applies. Add the webhook, let the definition sync, then copy the UID from the webhook's detail pane on the **Webhooks** tab. See [`webhooks/.yaml`](/factories/factory-as-code/#webhooksnameyaml) for every key and its rules. +`webhook_ids` takes a one-item list containing exactly one UID, not a file name. Warp assigns the UID when the webhook file first applies. Add the webhook, let the definition sync, then copy the UID from the webhook's detail pane on the **Webhooks** tab. To listen to multiple webhooks, add a separate trigger for each UID. See [`webhooks/.yaml`](/factories/factory-as-code/#webhooksnameyaml) for every key and its rules. ## Troubleshooting From 13cbc2596c2a8c0a8293ae7a2c5e2313f111d96f Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 03:55:42 +0000 Subject: [PATCH 60/63] docs: remove benchmark baseline roles Sync benchmark schema and UI guidance with warp-server develop at 3b4638b5.\n\nCo-Authored-By: Oz --- src/assets/factories/benchmark-run-launch.png | Bin 179671 -> 0 bytes src/content/docs/factories/benchmarks.mdx | 7 +------ src/content/docs/factories/factory-as-code.mdx | 4 +--- 3 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 src/assets/factories/benchmark-run-launch.png diff --git a/src/assets/factories/benchmark-run-launch.png b/src/assets/factories/benchmark-run-launch.png deleted file mode 100644 index 939bad260f9909b4a259bfc71c34a44553b1690c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179671 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 Y~(scKM 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 m@Yl{uKvG)1`l|o6{Qm$G(K42V%#E}F0000A}tb diff --git a/src/content/docs/factories/benchmarks.mdx b/src/content/docs/factories/benchmarks.mdx index b2bdac21c..7f21eddcb 100644 --- a/src/content/docs/factories/benchmarks.mdx +++ b/src/content/docs/factories/benchmarks.mdx @@ -67,13 +67,8 @@ This video shows how to turn your team's coding tasks into a reusable benchmark ![The task editor with fields for a title, prompt, correctness criteria, and pinned repositories.](../../../assets/factories/benchmark-task-editor.png)

The task editor for a benchmark suite.
-6. Click **Run**. In the launch dialog, choose the model or an authorized custom factory router and the runner for each configuration. Optionally mark one configuration as the baseline. Third-party harness comparisons are not available yet. +6. Click **Run**. In the launch dialog, choose the model or an authorized custom factory router and the runner for each configuration. Third-party harness comparisons are not available yet. 7. Add configurations, select Scorers, and set "Repetitions." The dialog shows the number of trials created. More trials and Scorers increase the run's cost. - -
- ![The New benchmark run dialog with model and runner configurations, a baseline option, selected Scorers, a repetition count, and projected trial count.](../../../assets/factories/benchmark-run-launch.png) -
The launch configuration for a benchmark run.
-
8. Click **Run benchmark**. The benchmark page shows its status and scored trials. You can cancel a running or scoring benchmark. ## Review benchmark results diff --git a/src/content/docs/factories/factory-as-code.mdx b/src/content/docs/factories/factory-as-code.mdx index f0683a7b3..d24967802 100644 --- a/src/content/docs/factories/factory-as-code.mdx +++ b/src/content/docs/factories/factory-as-code.mdx @@ -528,12 +528,10 @@ description: Compare configurations for the review agent. agent: reviewer configurations: - name: Baseline - role: baseline agents: - agent: reviewer model: auto - name: Candidate - role: candidate agents: - agent: reviewer model: auto-efficient @@ -555,7 +553,7 @@ Required. The name of an agent declared by the factory. Every task in the suite ### `configurations` -Optional. One to six reusable configurations for benchmark runs. When a run doesn't supply its own configurations, Warp uses these presets. Each configuration requires a unique `name` and a `role` of `baseline` or `candidate`; a suite can have at most one baseline. +Optional. One to six reusable configurations for benchmark runs. When a run doesn't supply its own configurations, Warp uses these presets. Each configuration requires a unique `name`. The optional `agents` list pins named factory agents to the models and harnesses they use during that configuration's trials. Each entry requires `agent` and exactly one of `model` or `harness`. A `harness` override requires `type` and `model` and optionally accepts `auth`. List an agent at most once per configuration. Agents omitted from the list use their configuration at launch time. From dfbe805065a0c2a8dea47c7187c67a319bcd6315 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 04:24:04 +0000 Subject: [PATCH 61/63] docs: restore current Factory launch content Restore current self-hosting, federation, and workspace guidance while preserving the Factory information architecture. Align plan eligibility, harness support, canonical links, and redirects with the launch sources. Co-Authored-By: Oz --- .../docs/agents/getting-started/faqs.mdx | 2 +- .../inference/bring-your-own-api-key.mdx | 2 +- .../inference/custom-inference-endpoint.mdx | 2 +- .../docs/agents/inference/custom-routers.mdx | 4 +- .../bring-your-own-llm.mdx | 2 +- .../byollm-aws-bedrock.mdx | 4 +- .../team-managed-keys-and-endpoints.mdx | 2 +- .../team-management/admin-panel.mdx | 8 +- .../docs/factories/deployment-patterns.mdx | 22 +-- .../docs/factories/factory-as-code.mdx | 2 +- .../self-hosting/external-orchestrators.mdx | 2 +- .../docs/factories/self-hosting/index.mdx | 125 ++++++++++++------ .../factories/self-hosting/managed-direct.mdx | 10 +- .../factories/self-hosting/managed-docker.mdx | 7 +- .../self-hosting/managed-kubernetes.mdx | 49 +++---- .../factories/self-hosting/quickstart.mdx | 14 +- .../docs/factories/self-hosting/reference.mdx | 26 ++-- ...ning-from-oz.mdx => documentation-map.mdx} | 0 .../docs/platform/execution-security.mdx | 24 ++-- src/content/docs/platform/faqs.mdx | 6 +- src/content/docs/platform/index.mdx | 2 +- .../platform/integrations/cloud-providers.mdx | 60 ++++++--- .../docs/platform/unmanaged-execution.mdx | 4 +- .../plans-and-billing/platform-credits.mdx | 2 +- src/sidebar.ts | 7 +- vercel.json | 10 ++ 26 files changed, 218 insertions(+), 180 deletions(-) rename src/content/docs/platform/{transitioning-from-oz.mdx => documentation-map.mdx} (100%) diff --git a/src/content/docs/agents/getting-started/faqs.mdx b/src/content/docs/agents/getting-started/faqs.mdx index 887b80d79..1b06a3228 100644 --- a/src/content/docs/agents/getting-started/faqs.mdx +++ b/src/content/docs/agents/getting-started/faqs.mdx @@ -31,7 +31,7 @@ Warp supports a curated list of LLMs from providers like OpenAI, Anthropic, and Yes. Warp supports [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/) on the Free plan and all eligible paid plans, so you can connect your own Anthropic, OpenAI, or Google API keys to route requests directly through your account. Because the Free plan doesn't include bundled AI usage for the Warp Agent, BYOK is one way to keep using the Warp Agent on the Free plan. BYOK and [custom inference endpoints](/agents/inference/custom-inference-endpoint/) are available for individual users and organizations with 10 or fewer employees, subject to Warp's Terms of Service. -Larger organizations need a Warp Business or Enterprise plan. On the Enterprise plan, admins can additionally enable managed [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/) configurations to meet strict security or compliance requirements, or centrally manage BYOK and custom endpoints for the whole team with [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/), which also work for cloud agents. +Larger organizations need a Warp Business or Enterprise plan. Business and Enterprise admins can centrally manage BYOK and custom endpoints for the whole team with [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/), which also work for cloud agents. Enterprise admins can additionally enable managed [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/) configurations for cloud-provider routing. ### Can I use a ChatGPT or Claude subscription with Warp? diff --git a/src/content/docs/agents/inference/bring-your-own-api-key.mdx b/src/content/docs/agents/inference/bring-your-own-api-key.mdx index 790a37449..2c6718a65 100644 --- a/src/content/docs/agents/inference/bring-your-own-api-key.mdx +++ b/src/content/docs/agents/inference/bring-your-own-api-key.mdx @@ -153,7 +153,7 @@ Warp itself never stores your LLM API keys. The BYOK described on this page is configured at the **user level** on every plan, including Business and Enterprise. Each team member adds and manages their own API keys locally on their device, and those keys work only for interactive requests, not [cloud agents](/platform/). -Enterprise teams can also configure **team-managed API keys** centrally: an admin sets shared keys in the [Admin Panel](/enterprise/team-management/admin-panel/), and they work for both interactive requests and cloud agents. See [Team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) for details, or [contact sales](https://www.warp.dev/contact-sales). +Business and Enterprise teams can also configure **team-managed API keys** centrally: an admin sets shared keys in the [Admin Panel](/enterprise/team-management/admin-panel/), and they work for both interactive requests and cloud agents. See [Team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) for details, or [contact sales](https://www.warp.dev/contact-sales). ## Related resources diff --git a/src/content/docs/agents/inference/custom-inference-endpoint.mdx b/src/content/docs/agents/inference/custom-inference-endpoint.mdx index fea4e1939..5e0c3a73a 100644 --- a/src/content/docs/agents/inference/custom-inference-endpoint.mdx +++ b/src/content/docs/agents/inference/custom-inference-endpoint.mdx @@ -119,7 +119,7 @@ Warp itself never stores your endpoint API key. Review your endpoint provider's The custom inference endpoints described on this page are configured at the **user level** on every plan. Each user adds their own endpoint locally, and it works only for interactive requests, not [cloud agents](/platform/). -Enterprise teams can also configure **team-managed custom endpoints** centrally: an admin sets shared endpoints in the [Admin Panel](/enterprise/team-management/admin-panel/), and they work for both interactive requests and cloud agents. See [Team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/), or [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) for AWS Bedrock or Gemini Enterprise (Vertex AI) routing. +Business and Enterprise teams can also configure **team-managed custom endpoints** centrally: an admin sets shared endpoints in the [Admin Panel](/enterprise/team-management/admin-panel/), and they work for both interactive requests and cloud agents. See [Team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/), or [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) for Enterprise AWS Bedrock or Gemini Enterprise (Vertex AI) routing. ## How custom inference endpoints differ from BYOK and BYOLLM diff --git a/src/content/docs/agents/inference/custom-routers.mdx b/src/content/docs/agents/inference/custom-routers.mdx index 935d60c88..df9f7218d 100644 --- a/src/content/docs/agents/inference/custom-routers.mdx +++ b/src/content/docs/agents/inference/custom-routers.mdx @@ -124,7 +124,7 @@ Custom routers work with [Bring Your Own API Key (BYOK)](/agents/inference/bring This is different from Warp's built-in Auto models, which always consume Warp credits even when BYOK is configured. * **Running a router entirely on your own keys** - To use a router with no Warp credits available, your keys must cover every model the router references. If only some models are covered, you still need Warp credits for the requests that resolve to the uncovered models. -* **Team-managed keys (Enterprise)** - [Team-managed API keys](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) apply to custom routers the same way; a member's own key for a provider takes precedence over the team's. +* **Team-managed keys (Business and Enterprise)** - [Team-managed API keys](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) apply to custom routers the same way; a member's own key for a provider takes precedence over the team's. * **No custom inference endpoints** - Routing targets must be Warp-supported models, so a router can't resolve to a model from a [custom inference endpoint](/agents/inference/custom-inference-endpoint/) and never draws on your endpoint. ### Model availability and fallback @@ -136,5 +136,5 @@ If a router targets a model you don't have access to or that's disabled for your * [Model choice](/agents/inference/model-choice/) — Supported models and `model_id` values, including Warp's built-in Auto models. * [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) — Use your own OpenAI, Anthropic, or Google API keys. * [Custom inference endpoint](/agents/inference/custom-inference-endpoint/) — Route Warp through any OpenAI-compatible endpoint. -* [Team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) — Enterprise admins configure shared provider keys and custom endpoints from the same Admin Panel Models page. +* [Team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) — Business and Enterprise admins configure shared provider keys and custom endpoints from the same Admin Panel Models page. * [Admin Panel for teams](/enterprise/team-management/admin-panel/) — Manage team-wide settings, including team-synced routers. diff --git a/src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx b/src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx index 6e1460079..80f11e612 100644 --- a/src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx +++ b/src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx @@ -59,7 +59,7 @@ See each provider's page for provider-specific routing and fallback behavior: [A **BYOLLM (Bring Your Own LLM)** routes inference through your organization's cloud infrastructure (AWS Bedrock or Google Cloud via Gemini Enterprise) using cloud-native IAM. Admins configure it at the admin level and it applies to the entire team. -Enterprise admins can also centrally manage BYOK itself: [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) let an admin configure shared provider keys and OpenAI-compatible endpoints that are stored server-side and work for both interactive requests and cloud agents. For a side-by-side comparison across all of Warp's bring-your-own-infrastructure options, see [How team-managed providers differ from self-serve BYOK and BYOLLM](/enterprise/enterprise-features/team-managed-keys-and-endpoints/#how-team-managed-providers-differ-from-self-serve-byok-and-byollm). +Business and Enterprise admins can also centrally manage BYOK itself: [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) let an admin configure shared provider keys and OpenAI-compatible endpoints that are stored server-side and work for both interactive requests and cloud agents. For a side-by-side comparison across all of Warp's bring-your-own-infrastructure options, see [How team-managed providers differ from self-serve BYOK and BYOLLM](/enterprise/enterprise-features/team-managed-keys-and-endpoints/#how-team-managed-providers-differ-from-self-serve-byok-and-byollm). | Feature | BYOK | BYOLLM | | --- | --- | --- | diff --git a/src/content/docs/enterprise/enterprise-features/byollm-aws-bedrock.mdx b/src/content/docs/enterprise/enterprise-features/byollm-aws-bedrock.mdx index b285f4b23..55f9af162 100644 --- a/src/content/docs/enterprise/enterprise-features/byollm-aws-bedrock.mdx +++ b/src/content/docs/enterprise/enterprise-features/byollm-aws-bedrock.mdx @@ -344,7 +344,7 @@ However, when using BYOLLM: **BYOLLM (Bring Your Own LLM)** routes inference through your organization's cloud infrastructure (AWS Bedrock or Google Cloud via Gemini Enterprise) using cloud-native IAM. Admins configure it at the admin level and it applies to the entire team. -Enterprise admins can also centrally manage BYOK itself: [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) let an admin configure shared provider keys and OpenAI-compatible endpoints that are stored server-side and work for both interactive requests and cloud agents. The table below compares BYOLLM with the self-serve, user-level form of BYOK. For a side-by-side comparison that also includes team-managed keys and endpoints, see [How team-managed providers differ from self-serve BYOK and BYOLLM](/enterprise/enterprise-features/team-managed-keys-and-endpoints/#how-team-managed-providers-differ-from-self-serve-byok-and-byollm). +Business and Enterprise admins can also centrally manage BYOK itself: [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) let an admin configure shared provider keys and OpenAI-compatible endpoints that are stored server-side and work for both interactive requests and cloud agents. The table below compares BYOLLM with the self-serve, user-level form of BYOK. For a side-by-side comparison that also includes team-managed keys and endpoints, see [How team-managed providers differ from self-serve BYOK and BYOLLM](/enterprise/enterprise-features/team-managed-keys-and-endpoints/#how-team-managed-providers-differ-from-self-serve-byok-and-byollm). | Feature | BYOK | BYOLLM | | --- | --- | --- | @@ -369,7 +369,7 @@ Yes. Admins can configure routing policies to require specific models to use BYO * [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) — BYOLLM overview and provider comparison * [BYOLLM: Gemini Enterprise (Vertex AI)](/enterprise/enterprise-features/byollm-gemini-enterprise/) — Route inference through your Google Cloud project * [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) -* [Team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) — Enterprise admins configure shared provider keys and custom endpoints for the team +* [Team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) — Business and Enterprise admins configure shared provider keys and custom endpoints for the team * [Model Choice](/agents/inference/model-choice/) — Full list of supported models * [Admin Panel](/enterprise/team-management/admin-panel/) — Configure team settings * [Contact Sales](https://www.warp.dev/contact-sales) — Get help with enterprise setup diff --git a/src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx b/src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx index 9b0d11bf6..2ce885995 100644 --- a/src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx +++ b/src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx @@ -108,7 +108,7 @@ If the admin allows members to add their own keys and endpoints, members can sti * **No AI credits for team-routed inference** - When a request routes through a team key or team endpoint, Warp doesn't consume your [AI credits](/support-and-community/plans-and-billing/credits/). Inference is billed directly by your provider or endpoint. * **Auto still uses Warp credits** - Warp's **Auto** models route across providers using Warp's infrastructure, so Auto always consumes Warp credits. To use a team provider, select a specific model or endpoint from the picker. [Custom routers](/agents/inference/custom-routers/) are the exception: after a router resolves a task to a concrete model, the request routes through the first-party key for that model's provider (the member's own key first, then the team key). Routers can't target team endpoint models. -* **Platform and compute credits still apply** - On Enterprise, local agent runs still consume [platform credits](/support-and-community/plans-and-billing/platform-credits/) for Warp's platform infrastructure (run lifecycle, orchestration, and observability). Cloud agent runs consume platform credits too, plus [compute credits](/support-and-community/plans-and-billing/credits/#compute-credits) when they use Warp-hosted compute. +* **Platform and compute credits still apply** - On Business and Enterprise, local agent runs still consume [platform credits](/support-and-community/plans-and-billing/platform-credits/) for Warp's platform infrastructure (run lifecycle, orchestration, and observability). Cloud agent runs consume platform credits too, plus [compute credits](/support-and-community/plans-and-billing/credits/#compute-credits) when they use Warp-hosted compute. See [The three credit buckets](/support-and-community/plans-and-billing/platform-credits/#the-three-credit-buckets) for more on credit types. diff --git a/src/content/docs/enterprise/team-management/admin-panel.mdx b/src/content/docs/enterprise/team-management/admin-panel.mdx index c225b9f8c..a9317f46e 100644 --- a/src/content/docs/enterprise/team-management/admin-panel.mdx +++ b/src/content/docs/enterprise/team-management/admin-panel.mdx @@ -53,6 +53,8 @@ Team members see organization-enforced settings in their personal Settings panel The Admin Panel uses a three-tier enforcement model that keeps administrators in control while allowing appropriate flexibility. +In multi-team workspaces, workspace admins can enforce supported settings across all teams or let each team decide. See [Workspace settings and team settings](/enterprise/team-management/workspaces/#workspace-settings-and-team-settings). + ### Setting enforcement levels **Organization enforced** @@ -240,7 +242,7 @@ For Enterprise plans with negotiated credit pools: * Monitor usage by team * Set per-team spending limits -Contact your account manager to configure advanced credit allocation. +Contact your account manager to configure advanced credit allocation. Multi-team workspaces can also use [workspace spend limits](/enterprise/team-management/workspaces/#workspace-spend-limits). ### Sharing settings @@ -269,7 +271,7 @@ Controls how screenshots and video recordings captured with [Computer Use](/agen **Enabled GitHub Orgs** -The **Enabled GitHub Orgs** setting associates your Warp team with one or more GitHub App installations. That association does two things: it lets cloud agents initiated with an [agent API key](/agents/cli/oz-cli/api-keys/) clone repositories and open pull requests using the Warp Factories GitHub App, and it tells Warp which team owns runs started from the [GitHub integration](/platform/integrations/github/) when someone mentions `@warp-agent` in those repositories. +The **Enabled GitHub Orgs** setting associates your Warp team with one or more GitHub App installations. That association does two things: it lets cloud agents initiated with an [agent API key](/agents/cli/oz-cli/api-keys/) clone repositories and open pull requests using the [Warp Factories](/factories/) GitHub App, and it tells Warp which team owns runs started from the [GitHub integration](/platform/integrations/github/) when someone mentions `@warp-agent` in those repositories. To configure: @@ -319,7 +321,7 @@ After purchasing a Warp enterprise plan: 5. **Configure BYOLLM** (optional) - Route inference through your cloud accounts. 6. **Create shared resources** - Populate team Warp Drive with Workflows, Rules, and Prompts. -See [Roles and permissions](/enterprise/team-management/roles-and-permissions/) for details on user roles and access controls. +See [Roles and permissions](/enterprise/team-management/roles-and-permissions/) for user roles and access controls. For accounts that manage multiple teams, see [Workspaces](/enterprise/team-management/workspaces/). ### Adjusting policies for different teams diff --git a/src/content/docs/factories/deployment-patterns.mdx b/src/content/docs/factories/deployment-patterns.mdx index df0560b03..9aede1878 100644 --- a/src/content/docs/factories/deployment-patterns.mdx +++ b/src/content/docs/factories/deployment-patterns.mdx @@ -22,7 +22,6 @@ Choose an execution model for your factory based on where its code must run and Both factory options use the same [factory definition](/factories/factory-as-code/), [runners](/factories/runners/), and [factory dashboard](/factories/factory-dashboard/). The execution host changes the location of checkout, command execution, and the sandbox filesystem. - ## Warp-hosted execution Use this when your factory can reach its repositories and services over the public internet. The {VARS.WARP_AUTOMATION_PLATFORM} runs the work on Warp-managed infrastructure while your factory definition selects the agents, runner, workspace, and credentials. @@ -54,26 +53,9 @@ For standalone cloud-agent triggers, see [cloud agents](/platform/). ## Managed self-hosting -Use this when a factory must run checkout and execution on your infrastructure while the {VARS.WARP_AUTOMATION_PLATFORM} coordinates the work and records its results. Repositories are cloned and stored only on your infrastructure. Orchestration metadata and session transcripts route through Warp's backend; cloud conversations require Warp to store conversation data according to Warp's retention terms. LLM inference requests and responses route through Warp to contracted model providers under [ZDR](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr), except for provider-specific models that are not covered by ZDR and follow the provider's retention requirements. - -Think of managed self-hosting as **customer-hosted execution with Warp-hosted orchestration**, not as a fully offline agent stack. Code repositories, build artifacts, runtime secrets, and execution workspaces stay on your infrastructure. Code context can still appear in session transcripts and LLM prompts as the agent works. - -:::note -**Enterprise feature**: Self-hosted execution is available exclusively to teams on an Enterprise plan. -::: - -Self-hosting has two architectures that differ on **who orchestrates agent runs** (both keep code and execution on your infrastructure): - -* **[Managed](/factories/self-hosting/#managed-architecture)** — The {VARS.WARP_AUTOMATION_PLATFORM} orchestrates. A worker runs tasks with the Docker, Kubernetes, or Direct backend, or hands them to an external runtime with the Command backend. An external scheduler can also start one Direct worker per job in one-shot mode. -* **[Unmanaged](/platform/unmanaged-execution/)** — You orchestrate. Invoke `oz agent run` directly from your CI, Kubernetes, or dev environment for standalone-agent work. To route factory work to a worker instead, use the managed architecture above. - -Why teams choose self-hosted execution: - -* Code and execution must stay within your network boundary for compliance or security requirements. -* Agents need to access services behind a VPN or self-hosted SCMs like GitLab or Bitbucket. Warp-hosted agents can also access GitLab and Bitbucket over the public internet — see the [GitLab](/platform/integrations/gitlab/) and [Bitbucket](/platform/integrations/bitbucket/) setup guides. -* Your environments (multi-service stacks, heavy resource requirements) don't fit in a single Docker container. +Use this when a factory must run checkout and execution on your infrastructure while the {VARS.WARP_AUTOMATION_PLATFORM} coordinates the work and records its results. Managed workers support Docker, Kubernetes, Direct, and external command backends. See [managed self-hosting](/factories/self-hosting/) for requirements and setup. -For factory worker setup and a quickstart, start with [Managed self-hosting](/factories/self-hosting/). For security and network boundaries that apply to both managed and unmanaged execution, see [Execution security](/platform/execution-security/). +For standalone agents that you orchestrate directly from CI, Kubernetes, or developer infrastructure, use [unmanaged execution](/platform/unmanaged-execution/). See [execution security](/platform/execution-security/) for the data and network boundaries shared by both architectures. ## Related pages diff --git a/src/content/docs/factories/factory-as-code.mdx b/src/content/docs/factories/factory-as-code.mdx index d24967802..276f38545 100644 --- a/src/content/docs/factories/factory-as-code.mdx +++ b/src/content/docs/factories/factory-as-code.mdx @@ -274,7 +274,7 @@ harness: ### `agentDefaults.harness` -The harness and model that runs execute with. Use the `harness` form to run a third-party harness or to set advanced options. `type` accepts `oz`, `claude`, `codex`, or `gemini` — the values the definition schema validates. `claude-code` is also accepted as an alias for `claude`; prefer `claude`, the canonical [harness identifier](/platform/harnesses/#harness-identifiers) that the CLI and the {VARS.WARP_PLATFORM_API} use for the same harness. For what each harness does and which ones your team can run, see [supported harnesses](/platform/harnesses/). +The harness and model that runs execute with. Use the `harness` form to run a third-party harness or to set advanced options. Supported values are `oz`, `claude`, and `codex`. `claude-code` is also accepted as an alias for `claude`; prefer `claude`, the canonical [harness identifier](/platform/harnesses/#harness-identifiers) that the CLI and the {VARS.WARP_PLATFORM_API} use for the same harness. For what each harness does and which ones your team can run, see [supported harnesses](/platform/harnesses/). ```yaml harness: diff --git a/src/content/docs/factories/self-hosting/external-orchestrators.mdx b/src/content/docs/factories/self-hosting/external-orchestrators.mdx index 92cab590a..57fea82a8 100644 --- a/src/content/docs/factories/self-hosting/external-orchestrators.mdx +++ b/src/content/docs/factories/self-hosting/external-orchestrators.mdx @@ -114,6 +114,6 @@ The worker does not wait for the remote agent to finish. Stopping or restarting * [Self-hosting overview](/factories/self-hosting/) - Compare managed and unmanaged architectures and review shared prerequisites. * [Managed: Direct backend](/factories/self-hosting/managed-direct/) - Configure host execution, workspaces, and setup commands. -* [Unmanaged execution](/platform/unmanaged-execution/) - Invoke `oz agent run` when your orchestrator should own the complete run lifecycle. +* [Unmanaged architecture](/platform/unmanaged-execution/) - Invoke `oz agent run` when your orchestrator should own the complete run lifecycle. * [Self-hosted worker reference](/factories/self-hosting/reference/) - Look up one-shot, timeout, and Command backend configuration fields. * [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) - Route runs from supported triggers to a worker ID. diff --git a/src/content/docs/factories/self-hosting/index.mdx b/src/content/docs/factories/self-hosting/index.mdx index 4d5b06026..25facef4e 100644 --- a/src/content/docs/factories/self-hosting/index.mdx +++ b/src/content/docs/factories/self-hosting/index.mdx @@ -1,77 +1,124 @@ --- -title: Managed self-hosting for Warp Factories +title: Self-hosting overview description: >- - Run Warp Factories on your own infrastructure with a managed worker for - Docker, Kubernetes, or direct-host execution. -sidebar: - label: "Managed self-hosting" + Run cloud agents on your infrastructure with a managed worker or invoke the + CLI from an orchestrator you control. --- import { VARS } from '@data/vars'; -Managed self-hosting runs factory work on infrastructure you control. A worker connects to Warp, receives work from your factory, and executes it in Docker containers, Kubernetes Jobs, or directly on the worker host. Repository clones, build artifacts, and execution workspaces stay on your infrastructure. +Self-hosting runs cloud agent workloads on your infrastructure. You control the compute, network access, runtime secrets, and execution workspaces while Warp tracks each run. :::note -Managed self-hosting is available to Enterprise teams. [Contact sales](https://www.warp.dev/contact-sales) to enable it for your team. +Self-hosting requires an Enterprise plan. To enable it for your team, [contact sales](https://www.warp.dev/contact-sales). ::: -Managed workers run only on Linux `amd64` or `arm64` hosts. To run agents on macOS or Windows, use [unmanaged execution](/platform/unmanaged-execution/). +## Managed and unmanaged architectures - +Choose an architecture based on which system starts each run. With the [managed architecture](#managed-architecture), the {VARS.WARP_AUTOMATION_PLATFORM} routes work to `oz-agent-worker`. Use it for runs started from Slack, Linear, schedules, the API, the {VARS.WEB_APP}, or `oz agent run-cloud`. -## How managed self-hosting works +With the [unmanaged architecture](/platform/unmanaged-execution/), your CI system, scheduler, or script invokes `oz agent run` directly. Warp tracks the session but does not start or stop the process. -Run the `oz-agent-worker` daemon on infrastructure that can reach your repositories and internal services. The worker connects outbound to the {VARS.WARP_AUTOMATION_PLATFORM}, waits for factory work, and runs each task using the backend you configure. +| Aspect | Managed | Unmanaged | +| --- | --- | --- | +| Run lifecycle | The {VARS.WARP_AUTOMATION_PLATFORM} routes each run to a worker | Your system starts and stops each CLI process | +| Host support | Linux | Linux, macOS, and Windows | +| Execution | Docker container, Kubernetes Job, direct host process, or external runtime | The host environment you provide | +| Triggers | Integrations, schedules, API, web app, and CLI | CI, cron, scripts, and internal schedulers | -A managed worker is the self-hosted execution option for a factory. [Unmanaged execution](/platform/unmanaged-execution/) runs standalone agents directly from your own CI or infrastructure. Route factory work to a managed worker through the [factory definition](/factories/factory-as-code/#agentdefaultsworkerhost). +Use managed and unmanaged runs together when different workflows need different ownership. For example, route Slack-triggered work to a managed worker and invoke unmanaged agents from CI. - +## Choosing an architecture -## Choose a backend +Use the [unmanaged architecture](/platform/unmanaged-execution/) when any of these conditions apply: -* **Docker** - Run each factory task in an isolated container. Start with the [Docker quickstart](/factories/self-hosting/quickstart/) or see the [Docker backend](/factories/self-hosting/managed-docker/) for registries, volumes, and runtime configuration. -* **Kubernetes** - Run each task as a Kubernetes Job in your cluster. See the [Kubernetes backend](/factories/self-hosting/managed-kubernetes/) for Helm installation, RBAC, and pod configuration. -* **Direct** - Run tasks directly on the worker host when a container runtime is not available. See the [Direct backend](/factories/self-hosting/managed-direct/) for isolation and workspace requirements. -* **Command** - Keep a worker connected and dispatch each task to an external job API, queue, or runtime. See [external orchestrators](/factories/self-hosting/external-orchestrators/#using-the-command-backend). -* **One-shot Direct** - Let an external scheduler allocate a host and start one Direct worker for one task. See [external orchestrators](/factories/self-hosting/external-orchestrators/#using-one-shot-direct). +* Agents must run on macOS or Windows. +* Your system should own both the trigger and process lifecycle. +* You want to add `oz agent run` to an existing CI job or script. + +### Choosing a managed backend + +Use the managed architecture when the {VARS.WARP_AUTOMATION_PLATFORM} should accept the trigger and route the run. Then choose a backend: + +* **[Docker backend](/factories/self-hosting/managed-docker/)** - Use the default backend when Docker is available. Each task runs in a container. +* **[Kubernetes backend](/factories/self-hosting/managed-kubernetes/)** - Use an existing cluster to run each task as a Kubernetes Job. +* **[Direct backend](/factories/self-hosting/managed-direct/)** - Run tasks on the worker host when a container runtime is unavailable or host access is required. +* **[Command backend](/factories/self-hosting/external-orchestrators/#using-the-command-backend)** - Keep a worker connected and dispatch each task to an external job API, queue, or runtime. +* **[One-shot Direct](/factories/self-hosting/external-orchestrators/#using-one-shot-direct)** - Let an external scheduler allocate a host and start one Direct worker for one task. ## Managed prerequisites All managed deployments require: -* **Outbound network access** - The worker and agent runtime must reach Warp. You do not need to open inbound ports. See [execution security](/platform/execution-security/) for endpoints and data boundaries. +* **Outbound network access** - The worker and agent runtime must reach Warp. You do not need to open inbound ports. See [Security and networking](/platform/execution-security/) for endpoints and data boundaries. * **A worker ID** - Choose the value used to route runs with `--host`. Multiple long-lived workers can share an ID for load balancing. Use a unique ID for each one-shot Direct job. * **Worker credentials** - Docker, Kubernetes, Direct, and Command workers can use a [self-hosted worker API key](/agents/cli/oz-cli/api-keys/#creating-a-self-hosted-worker-api-key). Store it in your secret manager and provide it as `WARP_API_KEY` or `--api-key`. -An external orchestrator that creates runs through `oz agent run-cloud` or the API also needs an **Agent API key associated with the Default Service Account**. In the {VARS.FACTORY_WEB_APP} settings, create an Agent key and choose **Default Service Account**. The same agent key can authenticate the worker when one job both starts the worker and creates the run. Otherwise, give the worker a self-hosted worker key and the run creator an agent key. See [API keys for the {VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/api-keys/) for the key types and creation flow. +An external orchestrator that creates runs through `oz agent run-cloud` or the API also needs an **agent API key associated with the Default Service Account**. In the {VARS.WEB_APP} settings, create an Agent key and choose **Default Service Account**. The same agent key can authenticate the worker when one job both starts the worker and creates the run. Otherwise, give the worker a self-hosted worker key and the run creator an agent key. See [API keys for the {VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/api-keys/) for the key types and creation flow. + +Backend pages list the remaining runtime-specific requirements, such as Docker, Kubernetes, or the {VARS.WARP_AGENT_CLI} binary. + +## Managed architecture + +`oz-agent-worker` connects to the {VARS.WARP_AUTOMATION_PLATFORM}, waits for tasks addressed to its worker ID, and handles each task with the configured backend. Docker, Kubernetes, and Direct run the agent on worker infrastructure. Command hands the task to an external runtime. + +Start with the [self-hosting quickstart](/factories/self-hosting/quickstart/) for a Docker worker. For exact flags and YAML fields, use the [self-hosted worker reference](/factories/self-hosting/reference/). + +### Routing runs to self-hosted workers + +Set the run's host to the connected worker's ID. From the {VARS.WARP_AGENT_CLI}: + +```bash +oz agent run-cloud \ + --host "my-worker" \ + --prompt "Refactor the authentication module" +``` + +Combine `--host` with other `run-cloud` flags when the run also needs an environment, model, or other configuration. + +Use the same worker ID when you create or update schedules and integrations: + +```bash +oz schedule create \ + --name "daily-cleanup" \ + --cron "0 9 * * *" \ + --prompt "Remove unused code and open a pull request." \ + --host "my-worker" +oz schedule update SCHEDULE_ID --host "my-worker" + +oz integration create slack --host "my-worker" +oz integration update linear --host "my-worker" +``` -## Data and network boundaries +API requests set the same worker ID in `config.worker_host`: -Managed self-hosting moves execution to your infrastructure. Warp still provides the service that coordinates runs, stores session data, and routes inference requests. Review [execution security](/platform/execution-security/) before connecting a worker to internal repositories or services. +```json +{ + "prompt": "Refactor the authentication module", + "config": { "worker_host": "my-worker" } +} +``` -The worker requires outbound HTTPS access to Warp and any repositories, registries, and services that its tasks use. It does not require inbound firewall access. +In the {VARS.WEB_APP}, select the worker from the host options when you create a run, schedule, or integration. See the relevant [trigger](/platform/triggers/) or [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) documentation for other creation options. - -## Route runs to a worker +Host selection is independent of the [environment](/platform/environments/). A managed run can use the same environment with Warp-hosted or self-hosted execution; the selected backend determines how the worker applies its image and setup configuration. -For a factory, define the worker host and a compatible runner in the [factory definition](/factories/factory-as-code/#agentdefaultsworkerhost). The factory dashboard shows each configured runner and the worker that executes its work. +## Unmanaged architecture -For standalone cloud agents, choose the worker ID with `--host`: +With [unmanaged execution](/platform/unmanaged-execution/), your system invokes `oz agent run` where the work should happen. The agent uses the tools, credentials, and network access available on that host. Warp records the session and lets authorized teammates view or steer it. -* `oz agent run-cloud --host WORKER_ID` - Start an ad hoc cloud agent on the worker. See the [CLI reference](/agents/cli/oz-cli/#running-agents-remotely-oz-agent-run-cloud). -* `oz schedule create --host WORKER_ID` - Route future scheduled runs to the worker. See [scheduled agents](/platform/triggers/scheduled-agents/). -* `oz integration create slack --host WORKER_ID` or `oz integration create linear --host WORKER_ID` - Route runs triggered by that integration to the worker. See [integration setup](/agents/cli/oz-cli/integration-setup/). +Use unmanaged execution for an existing CI pipeline, Kubernetes Job, VM, or developer machine when Warp does not need to route the task. -Use the [worker reference](/factories/self-hosting/reference/) to configure the worker process and the [factory dashboard](/factories/factory-dashboard/) to inspect factory runs. +## Security and observability -## Monitor and troubleshoot workers +Repository clones and execution workspaces stay on your infrastructure. Agent context and model requests still travel through Warp's services. See the [self-hosted execution flow](/platform/architecture/#self-hosted-execution-flow) for the architecture and [Security and networking](/platform/execution-security/) for data boundaries, ZDR, and BYOLLM. -[Worker monitoring](/factories/self-hosting/monitoring/) exports OpenTelemetry metrics for worker health, capacity, and task throughput. If a worker cannot connect or tasks remain queued, use [self-hosting troubleshooting](/factories/self-hosting/troubleshooting/). +View managed and unmanaged runs in the {VARS.DASHBOARD}. Managed workers can also export OpenTelemetry metrics; see [Monitoring](/factories/self-hosting/monitoring/). ## Related pages -* [Docker quickstart](/factories/self-hosting/quickstart/) - Start a managed worker with Docker. +* [Self-hosting quickstart](/factories/self-hosting/quickstart/) - Start a managed Docker worker and route a test run. * [External orchestrators](/factories/self-hosting/external-orchestrators/) - Choose and deploy the Command backend or one-shot Direct. -* [Factory runners](/factories/runners/) - Choose the compute configuration for factory work. -* [Infrastructure and security](/factories/infrastructure-and-security/) - Configure execution, inference, storage, and credentials. -* [Worker reference](/factories/self-hosting/reference/) - Look up worker flags and configuration fields. -* [Execution security](/platform/execution-security/) - Review data boundaries and network requirements. +* [Unmanaged architecture](/platform/unmanaged-execution/) - Invoke `oz agent run` from your own scheduler or CI system. +* [Self-hosted worker reference](/factories/self-hosting/reference/) - Look up worker flags and backend configuration fields. +* [Deployment patterns](/factories/deployment-patterns/) - Compare Warp-hosted, self-hosted, and CLI-only execution. +* [Troubleshooting](/factories/self-hosting/troubleshooting/) - Diagnose worker startup, routing, and task failures. diff --git a/src/content/docs/factories/self-hosting/managed-direct.mdx b/src/content/docs/factories/self-hosting/managed-direct.mdx index aab462eb0..91b9e42cd 100644 --- a/src/content/docs/factories/self-hosting/managed-direct.mdx +++ b/src/content/docs/factories/self-hosting/managed-direct.mdx @@ -10,9 +10,6 @@ import { VARS } from '@data/vars'; Run the `oz-agent-worker` daemon with the **Direct backend** — tasks execute directly on the worker host without Docker or Kubernetes. The {VARS.WARP_AUTOMATION_PLATFORM} still orchestrates runs end to end (Slack, Linear, schedules, API, `oz agent run-cloud`); the worker just runs the agent in a per-task workspace on its own filesystem. -:::note -The Direct backend uses the [managed architecture](/factories/self-hosting/#managed-architecture). For container-based task isolation, see [Managed: Docker](/factories/self-hosting/managed-docker/) or [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/). For invocation-driven use cases, see [Unmanaged](/platform/unmanaged-execution/). -::: ## When to use the Direct backend * Neither Docker nor Kubernetes is available on the worker host. @@ -48,10 +45,10 @@ Complete the shared [managed prerequisites](/factories/self-hosting/#managed-pre ### 1. Set your API key -Export the API key so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}: +Export the self-hosted worker API key so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}: ```bash -export WARP_API_KEY="YOUR_SELF_HOSTED_WORKER_API_KEY" +export WARP_API_KEY="YOUR_API_KEY" ``` ### 2. Start the worker with the Direct backend @@ -132,7 +129,6 @@ backend: * [External orchestrators](/factories/self-hosting/external-orchestrators/) — Start one Direct worker per external job or delegate runs through the Command backend. * [Direct backend monorepo worktrees](/factories/self-hosting/direct-monorepo-worktrees/) — Create and remove one Git worktree per task with setup and teardown hooks. * [Self-hosting overview](/factories/self-hosting/) — Managed vs unmanaged and the backend decision guide. -* [Factory definition](/factories/factory-as-code/#agentdefaultsworkerhost) — Route factory work to a compatible worker and runner. -* [CLI reference](/agents/cli/oz-cli/) — Route standalone cloud agents to the worker with `--host`. +* [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) — How to send tasks to your connected worker from the CLI, schedules, integrations, the API, and the web UI. * [Security and networking](/platform/execution-security/) — Data boundaries and security considerations for the Direct backend. * [Troubleshooting](/factories/self-hosting/troubleshooting/#direct-backend) — Common Direct-backend issues. diff --git a/src/content/docs/factories/self-hosting/managed-docker.mdx b/src/content/docs/factories/self-hosting/managed-docker.mdx index 733fb007a..d28cc4b6c 100644 --- a/src/content/docs/factories/self-hosting/managed-docker.mdx +++ b/src/content/docs/factories/self-hosting/managed-docker.mdx @@ -10,9 +10,6 @@ import { VARS } from '@data/vars'; Run the `oz-agent-worker` daemon with the **Docker backend** — the default managed path. Each agent task runs in an isolated Docker container spawned from the worker, with full orchestration by the {VARS.WARP_AUTOMATION_PLATFORM} (Slack, Linear, schedules, API, `oz agent run-cloud`). -:::note -The Docker backend uses the [managed architecture](/factories/self-hosting/#managed-architecture). For the Kubernetes backend, see [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/). For host execution without a container runtime, see [Managed: Direct](/factories/self-hosting/managed-direct/). If you'd rather invoke agents yourself, see [Unmanaged](/platform/unmanaged-execution/). -::: ## When to use the Docker backend * You want the simplest managed setup and have Docker available on the worker host. @@ -46,7 +43,7 @@ docker info Export your self-hosted worker API key so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}: ```bash -export WARP_API_KEY="YOUR_SELF_HOSTED_WORKER_API_KEY" +export WARP_API_KEY="YOUR_API_KEY" ``` ## Install and run the worker @@ -200,7 +197,7 @@ docker run \ ## Routing runs to this worker -Once your Docker worker is connected, route factory work to it with `workerHost` in the [factory definition](/factories/factory-as-code/#agentdefaultsworkerhost). To route a standalone cloud agent with `--host ""`, see the [CLI reference](/agents/cli/oz-cli/). +Once your Docker worker is connected, route tasks to it with `--host ""`. Routing is the same across all managed backends — see [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) for CLI, scheduled, integration, API, and web UI examples. --- diff --git a/src/content/docs/factories/self-hosting/managed-kubernetes.mdx b/src/content/docs/factories/self-hosting/managed-kubernetes.mdx index 90f84ceec..e79ef9077 100644 --- a/src/content/docs/factories/self-hosting/managed-kubernetes.mdx +++ b/src/content/docs/factories/self-hosting/managed-kubernetes.mdx @@ -8,11 +8,7 @@ sidebar: --- import { VARS } from '@data/vars'; -Deploy the `oz-agent-worker` daemon into a Kubernetes cluster using the included Helm chart. Each agent task runs as a **Kubernetes Job** in your cluster. The {VARS.WARP_AUTOMATION_PLATFORM} orchestrates runs end to end (Slack, Linear, schedules, API, `oz agent run-cloud`); your cluster provides the compute, scheduling, and policy enforcement. - -:::note -The Kubernetes backend uses the [managed architecture](/factories/self-hosting/#managed-architecture). For the default Docker backend, see [Managed: Docker](/factories/self-hosting/managed-docker/). For host execution without a container runtime, see [Managed: Direct](/factories/self-hosting/managed-direct/). To route runs to a connected worker, see [Routing runs to this worker](/factories/self-hosting/managed-docker/#routing-runs-to-this-worker). -::: +Deploy the `oz-agent-worker` daemon into a Kubernetes cluster with the included Helm chart. Each agent task runs as a Kubernetes Job. The {VARS.WARP_AUTOMATION_PLATFORM} orchestrates runs; your cluster handles compute, scheduling, and policy enforcement. ## When to use the Kubernetes backend @@ -25,10 +21,10 @@ The Kubernetes backend uses the [managed architecture](/factories/self-hosting/# ## How it works 1. The worker connects to the Kubernetes API server (using in-cluster auth by default, or an explicit kubeconfig). -2. On startup, the worker runs a short-lived **preflight Job** to verify that cluster permissions, admission policies, and Pod Security Standards are compatible. If the preflight fails, the worker exits with a diagnostic error before accepting any tasks. -3. For each assigned task, the worker creates a Kubernetes Job in the configured namespace. -4. The worker monitors the Job and Pod status via Kubernetes Watch (with a 30-second safety-net poll for watch disconnects). -5. After the task completes, the Job is cleaned up (unless `--no-cleanup` is set). +2. On startup, the worker runs a preflight Job using the worker's `pod_template`. +3. For each assigned task, the worker creates a Kubernetes Job from `pod_template` in the configured namespace. The task's runner supplies the image and, when configured, the instance shape. +4. The worker monitors the Job and Pod status. +5. After the task completes, the worker removes successful Jobs. Failed Jobs remain available for diagnosis for 24 hours by default. --- @@ -61,7 +57,7 @@ The chart does not create CRDs or cluster-scoped RBAC resources. ### 1. Set your API key and namespace ```bash -export WARP_API_KEY="YOUR_SELF_HOSTED_WORKER_API_KEY" +export WARP_API_KEY="YOUR_API_KEY" ``` Create the namespace if it doesn't exist: @@ -99,7 +95,7 @@ helm install oz-agent-worker ./oz-agent-worker/charts/oz-agent-worker \ Set `image.tag` explicitly to pin the worker image. Check the [oz-agent-worker releases](https://github.com/warpdotdev/oz-agent-worker/releases) for the latest version. Do not rely on `latest`. ::: -**Expected outcome:** `kubectl get pods -n warp-oz` shows the worker Deployment pod as `Running`, and the worker logs show `Connected to Oz` / `Listening for tasks`. +**Expected outcome:** `kubectl get pods -n warp-oz` shows the worker Deployment pod as `Running`, and the worker logs include `Successfully connected to server`. To scale horizontally, deploy multiple Helm releases with distinct worker IDs rather than increasing replicas on a single release. @@ -120,6 +116,7 @@ To scale horizontally, deploy multiple Helm releases with distinct worker IDs ra * `worker.idleOnComplete` — Duration to keep the oz process alive after task completion. * `worker.resources` — Resource requests/limits for the worker Deployment. Defaults to `100m` CPU and `128Mi` memory. * `worker.livenessProbe` — Liveness probe for the worker Deployment. Defaults to an `exec` probe (`kill -0 1`). Override with a custom probe or set to `null` to disable. +* `worker.terminationGracePeriodSeconds` — Grace period for worker Deployment shutdown. Defaults to `30`. * `worker.nodeSelector`, `worker.tolerations`, `worker.affinity` — Scheduling constraints for the worker Deployment pod. **Kubernetes backend:** @@ -127,13 +124,17 @@ To scale horizontally, deploy multiple Helm releases with distinct worker IDs ra * `kubernetesBackend.namespace` — Namespace for task Jobs. Defaults to the release namespace. * `kubernetesBackend.defaultImage` — Default Docker image for task pods when no [Warp environment](/platform/environments/) has been supplied. Set it when all tasks use the same base image and you don't need a Warp environment. Leave empty (default) to fall back to `ubuntu:22.04`. * `kubernetesBackend.imagePullPolicy` — Image pull policy for task pods. Defaults to `IfNotPresent`. +* `kubernetesBackend.useImageVolumes` — Use native Kubernetes image volumes instead of root init containers to materialize sidecars. Defaults to `false`. * `kubernetesBackend.preflightImage` — Image for the startup preflight Job. Set this if your cluster restricts allowed registries. +* `kubernetesBackend.preflightResources` — CPU and memory requests and limits for preflight containers. +* `kubernetesBackend.sidecarImage` — Internal-registry override for the Warp agent sidecar image. * `kubernetesBackend.unschedulableTimeout` — How long a pod may remain unschedulable before failing. Defaults to `30s`. * `kubernetesBackend.setupCommand` — Shell command to run before each task. * `kubernetesBackend.teardownCommand` — Shell command to run after each task. * `kubernetesBackend.extraLabels` — Additional labels for task Jobs and Pods. * `kubernetesBackend.extraAnnotations` — Additional annotations for task Jobs and Pods. -* `kubernetesBackend.activeDeadlineSeconds` — Maximum task Job lifetime. +* `kubernetesBackend.activeDeadlineSeconds` — Maximum task Job lifetime. Defaults to eight hours. +* `kubernetesBackend.ttlSecondsAfterFinished` — Retention period for failed Jobs and Jobs orphaned by worker disruption. Defaults to 24 hours when cleanup is enabled. * `kubernetesBackend.workspaceSizeLimit` — Size limit for workspace `emptyDir` volume. * `kubernetesBackend.podTemplate` — Raw PodSpec YAML for task Jobs (same as `backend.kubernetes.pod_template` in the [config file](/factories/self-hosting/reference/#config-file)). @@ -194,23 +195,17 @@ pod_template: effect: "NoSchedule" ``` -:::note -The worker Deployment's ServiceAccount is separate from the task Job `serviceAccountName` you configure in `pod_template`. The Deployment ServiceAccount needs RBAC to manage Jobs and Pods. The task ServiceAccount (if any) controls what the agent process can access at runtime. -::: +The worker Deployment ServiceAccount needs RBAC to manage Jobs and Pods. The task Job `serviceAccountName` in `pod_template` controls the agent process's runtime access. + +A run's instance shape overrides the `task` container's CPU and memory values in `pod_template`. --- ## Preflight check -On startup, the worker creates a short-lived preflight Job to verify that: +On startup, the worker runs a preflight Job with the configured task PodSpec. It catches insufficient RBAC, admission-policy failures, and sidecar-loading problems. If preflight fails, the worker exits before accepting tasks. A successful preflight does not validate task-specific images, Secrets, setup commands, or network access. -* The worker has sufficient RBAC permissions in the target namespace. -* Cluster admission policies (Pod Security Standards, OPA Gatekeeper, Kyverno, etc.) allow the worker's task pod shape. -* The preflight image can be pulled. - -If the preflight fails, the worker logs a diagnostic error and exits before accepting any tasks. This surfaces policy and configuration issues at deploy time rather than at task execution time. - -The preflight image defaults to `busybox:1.36`. If your cluster restricts allowed registries or images, set `preflight_image` to an allowlisted image. When `imagePullSecrets` is configured in `pod_template`, those secrets apply to the preflight Job as well, so you can point `preflight_image` at an image in your private registry. +The preflight image defaults to `busybox:1.36`. For an allowlisted or private image, set `kubernetesBackend.preflightImage`. The `imagePullSecrets` in `kubernetesBackend.podTemplate` also apply to preflight. --- @@ -223,9 +218,7 @@ There are two ways to pass environment variables to Kubernetes task containers: When configuring the Kubernetes backend via YAML or Helm, declarative task-container env belongs in `pod_template` rather than a separate top-level list. -:::note -If your organization uses an external secrets manager (HashiCorp Vault, AWS Secrets Manager, GCP Secret Manager, etc.), you can inject secrets into task pods via the CSI Secrets Store Driver or a similar operator. Configure the required `volumes`, `volumeMounts`, and annotations in `pod_template` just as you would for any other Kubernetes workload. See your secrets provider's documentation for details. -::: +For an external secrets manager, inject task secrets through a CSI driver or operator. Add the provider's `volumes`, `volumeMounts`, and annotations to `pod_template`. --- @@ -293,7 +286,6 @@ See [Monitoring](/factories/self-hosting/monitoring/) for the full list of Helm * **Security context** — The Deployment defaults to a non-root security context (`runAsUser: 10001`) with `allowPrivilegeEscalation: false` and all capabilities dropped. * **Liveness probe** — The Deployment includes a default `exec` liveness probe (`kill -0 1`). Override `worker.livenessProbe` for a custom probe, or set it to `null` to disable. * **In-cluster auth** — The chart assumes the worker runs inside the target cluster and uses in-cluster Kubernetes auth by default. -* **Root init containers** — The worker Deployment itself is non-root, but task Jobs require a root init container for sidecar materialization. Ensure the task namespace's Pod Security Standards allow this. --- @@ -301,8 +293,7 @@ See [Monitoring](/factories/self-hosting/monitoring/) for the full list of Helm * [Self-hosted worker reference](/factories/self-hosting/reference/) — Full CLI flag and config file schema, including every Kubernetes backend field. * [Self-hosting overview](/factories/self-hosting/) — Managed vs unmanaged and the backend decision guide. -* [Factory definition](/factories/factory-as-code/#agentdefaultsworkerhost) — Route factory work to a compatible worker and runner. -* [CLI reference](/agents/cli/oz-cli/) — Route standalone cloud agents to the worker with `--host`. +* [Routing runs to this worker](/factories/self-hosting/#routing-runs-to-self-hosted-workers) — How to send tasks to your connected worker from the CLI, schedules, integrations, the API, and the web UI. * [Environments](/platform/environments/) — Define the task image, repos, and setup commands. * [Monitoring](/factories/self-hosting/monitoring/) — OpenTelemetry metrics, including Helm chart metrics values. * [Security and networking](/platform/execution-security/) — RBAC, admission policies, and data boundaries. diff --git a/src/content/docs/factories/self-hosting/quickstart.mdx b/src/content/docs/factories/self-hosting/quickstart.mdx index 7af6905be..a8fbe450e 100644 --- a/src/content/docs/factories/self-hosting/quickstart.mdx +++ b/src/content/docs/factories/self-hosting/quickstart.mdx @@ -8,7 +8,7 @@ sidebar: --- import { VARS } from '@data/vars'; -Run your first managed worker on your own infrastructure in ~10 minutes using the Docker backend. After you verify the worker, configure a factory to route its work to that worker. +Run your first cloud agent on your own infrastructure in ~10 minutes using the managed architecture with the Docker backend — the default and fastest path to self-hosting. :::note This quickstart sets up the [managed architecture](/factories/self-hosting/#managed-architecture), where the {VARS.WARP_AUTOMATION_PLATFORM} orchestrates the agent and your worker provides the compute. **Prefer a CLI-only path with no Docker requirement?** Jump to the [Unmanaged quickstart](/platform/unmanaged-execution/#unmanaged-quickstart) to run `oz agent run` directly on any host. @@ -33,7 +33,7 @@ _~10 minutes_ Export the Agent API key so the worker container and the {VARS.WARP_AGENT_CLI} can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}: ```bash -export WARP_API_KEY="YOUR_SELF_HOSTED_WORKER_API_KEY" +export WARP_API_KEY="YOUR_AGENT_API_KEY" ``` ### 2. Start the worker @@ -62,8 +62,6 @@ oz agent run-cloud --prompt "List the files in the current directory" --host "my **Expected outcome:** The {VARS.WARP_AUTOMATION_PLATFORM} accepts the task, routes it to your worker, and the worker spawns a Docker container to execute the agent. You'll see the run appear in the {VARS.DASHBOARD} with status moving from `QUEUED` → `INPROGRESS` → `SUCCEEDED`. -This test verifies that the worker is connected. To route factory work to it, set `workerHost` and a platform-matched runner in the [factory definition](/factories/factory-as-code/#routing-to-a-self-hosted-worker). - ### 4. Verify the run Open the {VARS.DASHBOARD}, find the new task, and confirm the session transcript shows the agent running against your worker. You can attach to the session at any time via [Agent Session Sharing](/agents/local-agents/session-sharing/) to monitor or steer it. @@ -81,10 +79,10 @@ Verify you created an **Agent** key associated with the Default Service Account **Task stays queued and never runs**\ Confirm the `--host` value you passed to `oz agent run-cloud` matches your `--worker-id` exactly (case-sensitive). Check that the worker's team matches the team creating the task. -For more, see [self-hosting troubleshooting](/factories/self-hosting/troubleshooting/). +For more, see [Troubleshooting](/factories/self-hosting/troubleshooting/). ## Next steps -* [Managed self-hosting](/factories/self-hosting/) — Compare backends and route factory work to a worker. -* [Managed: Docker](/factories/self-hosting/managed-docker/) — Configure private registries, volume mounts, and runtime settings. -* [External orchestrators](/factories/self-hosting/external-orchestrators/) — Allocate compute with one-shot Direct or the Command backend. +* [Self-hosting overview](/factories/self-hosting/) — Compare managed and unmanaged architectures and choose a backend. +* [Managed: Docker](/factories/self-hosting/managed-docker/) — Full Docker backend setup, including private registries, volume mounts, and runtime configuration. +* [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) — How to route tasks from schedules, integrations (Slack, Linear), the API, and the {VARS.WEB_APP}. diff --git a/src/content/docs/factories/self-hosting/reference.mdx b/src/content/docs/factories/self-hosting/reference.mdx index fa61af694..8b7c63631 100644 --- a/src/content/docs/factories/self-hosting/reference.mdx +++ b/src/content/docs/factories/self-hosting/reference.mdx @@ -5,11 +5,7 @@ description: >- file schema for the Docker, Kubernetes, Direct, and Command backends. --- -Reference for the `oz-agent-worker` daemon: CLI flags and the full YAML config-file schema for all four [managed backends](/factories/self-hosting/#managed-architecture) — Docker, Kubernetes, Direct, and Command. For installation instructions, see [Install and run the worker](/factories/self-hosting/managed-docker/#install-and-run-the-worker). - -:::note -This page documents every flag and config option. For installation and backend-specific setup walkthroughs, see [Managed: Docker](/factories/self-hosting/managed-docker/), [Managed: Kubernetes](/factories/self-hosting/managed-kubernetes/), or [Managed: Direct](/factories/self-hosting/managed-direct/). This reference applies to the managed architecture only; the [unmanaged architecture](/platform/unmanaged-execution/) uses `oz agent run` instead. -::: +Look up CLI flags and YAML config fields for the `oz-agent-worker` daemon's [managed backends](/factories/self-hosting/#managed-architecture). For installation, see [Install and run the worker](/factories/self-hosting/managed-docker/#install-and-run-the-worker). --- @@ -20,7 +16,7 @@ The following flags are available when starting the worker. ### Required * `--worker-id` — A string identifying this worker. This is the value you pass to `--host` when routing tasks. Choose something meaningful for your team (e.g., `prod-runner-1` or `ci-worker`). Multiple workers can share the same ID for load balancing. -* `--api-key` or `WARP_API_KEY` env var — Your agent API key for authentication. You can bind the key to any cloud agent — that choice doesn't restrict which agents can run on the worker. When running via Docker, pass it as `-e WARP_API_KEY="..."`. When running the binary directly, use `--api-key` or the environment variable. +* `--api-key` or `WARP_API_KEY` env var — Your [self-hosted worker API key](/agents/cli/oz-cli/api-keys/#creating-a-self-hosted-worker-api-key) for team authentication. When running via Docker, pass it as `-e WARP_API_KEY="..."`. When running the binary directly, use `--api-key` or the environment variable. ### Optional @@ -35,9 +31,7 @@ The following flags are available when starting the worker. * `--one-shot` — Exit after one accepted task succeeds, fails, or is cancelled. Supported only by the Direct backend and forces `max_concurrent_tasks` to `1`. * `--idle-on-complete` — How long to keep the `oz` process alive after a task's conversation finishes, allowing follow-up interactions via session sharing. Uses duration format (e.g. `45m`, `10m`, `0s`). Defaults to `45m` when the task has no `config.idle_timeout_minutes` value. A task-level value takes precedence; runs created directly through the Agent API default to 10 minutes. See [Configure the completion timeout](/factories/self-hosting/external-orchestrators/#configure-the-completion-timeout). -:::note Worker IDs starting with `warp` are reserved and cannot be used. The worker refuses to start if `--worker-id` begins with `warp`. -::: ### Example with all flags @@ -171,12 +165,16 @@ backend: * `kubeconfig` — Path to an explicit kubeconfig file. If omitted, the worker uses in-cluster config when running inside Kubernetes, or falls back to the default kubeconfig loading rules. * `default_image` — Default Docker image for task Jobs when the run has no Warp environment image. Precedence: Warp environment image > `default_image` > `ubuntu:22.04`. Set this to skip creating a Warp environment when all your tasks use the same base image. * `image_pull_policy` — One of `Always`, `Never`, or `IfNotPresent`. Defaults to `IfNotPresent`. -* `preflight_image` — Image used for the startup preflight Job. Defaults to `busybox:1.36`. Override this if your cluster only allows pulling from an internal or allowlisted registry. +* `use_image_volumes` — Use native image volumes instead of root init containers. Defaults to `false` and requires cluster and runtime support. +* `preflight_image` — Startup preflight Job image. Defaults to `busybox:1.36`. +* `preflight_resources` — CPU and memory requests and limits for startup preflight containers. +* `sidecar_image` — Registry override for the Warp agent sidecar image. * `setup_command` — Shell command to run before each task. * `teardown_command` — Shell command to run after each task completes. * `extra_labels` — Map of additional labels to add to task Jobs and Pods. * `extra_annotations` — Map of additional annotations to add to task Jobs and Pods. -* `active_deadline_seconds` — Maximum lifetime for a task Job (Kubernetes `activeDeadlineSeconds`). +* `active_deadline_seconds` — Maximum task Job lifetime (Kubernetes `activeDeadlineSeconds`). The worker has no default; the Helm chart defaults `kubernetesBackend.activeDeadlineSeconds` to eight hours. +* `ttl_seconds_after_finished` — Retention period for failed or orphaned Jobs. Defaults to 24 hours when cleanup is enabled. * `workspace_size_limit` — Size limit for the workspace `emptyDir` volume (e.g., `10Gi`). * `unschedulable_timeout` — How long a pod may remain unschedulable before the task is failed early. Defaults to `30s`. Set to `0s` to disable the fail-fast behavior. * `pod_template` — Raw Kubernetes PodSpec YAML merged with the worker's required fields at runtime. Use this to configure task pod scheduling, `serviceAccountName`, `imagePullSecrets`, `nodeSelector`, `tolerations`, resources, and environment variables (including `valueFrom.secretKeyRef` for Kubernetes Secrets). Define a container named `task` to customize the main task container directly; otherwise the worker appends its own. @@ -203,9 +201,9 @@ Only one backend can be configured at a time. Specifying more than one of `docke ## Metrics configuration -The worker exports metrics over OpenTelemetry when configured. Exporter selection is controlled by standard environment variables, not CLI flags or config file fields. Set these variables on the worker process (or the worker container via Docker `-e` / Kubernetes `env`). +Configure OpenTelemetry metrics with environment variables on the worker process or container: -* `OTEL_METRICS_EXPORTER` — Exporter to use: `prometheus`, `otlp`, or `console`. Unset, empty, whitespace-only, and `none` values disable metrics initialization. +* `OTEL_METRICS_EXPORTER` — Exporter to use: `prometheus`, `otlp`, `console`, or `none`. When unset, the worker uses the OpenTelemetry autoexport default, OTLP. Set it to `none` to disable metrics initialization. * `OTEL_EXPORTER_PROMETHEUS_HOST` — Bind address for the Prometheus exporter. Defaults to `localhost`. Set to `0.0.0.0` when running in Docker or Kubernetes. * `OTEL_EXPORTER_PROMETHEUS_PORT` — Port for the Prometheus exporter. Defaults to `9464`. * `OTEL_EXPORTER_OTLP_ENDPOINT` — OTLP collector endpoint (e.g., `http://otel-collector.observability.svc:4318`). @@ -215,9 +213,9 @@ When deploying with the Helm chart, use the `metrics.*` values instead of settin --- -## Routing work to self-hosted workers +## Routing runs to self-hosted workers -To route factory work to a worker, set `workerHost` and a compatible runner in the [factory definition](/factories/factory-as-code/#agentdefaultsworkerhost). To route a standalone cloud agent to the worker with `--host`, see the [CLI reference](/agents/cli/oz-cli/). +Once a worker is running, route cloud agent runs to it with the `--host` flag or its equivalents. See [Routing runs to self-hosted workers](/factories/self-hosting/#routing-runs-to-self-hosted-workers) for examples across the CLI, schedules, integrations, the API, and the web UI. --- diff --git a/src/content/docs/platform/transitioning-from-oz.mdx b/src/content/docs/platform/documentation-map.mdx similarity index 100% rename from src/content/docs/platform/transitioning-from-oz.mdx rename to src/content/docs/platform/documentation-map.mdx diff --git a/src/content/docs/platform/execution-security.mdx b/src/content/docs/platform/execution-security.mdx index df635054c..efab9f07e 100644 --- a/src/content/docs/platform/execution-security.mdx +++ b/src/content/docs/platform/execution-security.mdx @@ -5,11 +5,7 @@ description: >- cloud agents — including per-backend considerations and BYOLLM. --- -Self-hosting uses a split-plane architecture. Understanding which data stays on your infrastructure and which data routes through Warp is critical for security evaluation. This page summarizes the data model, network egress requirements, and backend-specific security considerations for self-hosted workers. - -:::note -This page applies to both the [managed](/factories/self-hosting/#managed-architecture) and [unmanaged](/platform/unmanaged-execution/) architectures. Backend-specific notes call out Docker-, Kubernetes-, and Direct-only considerations. -::: +Repository clones and agent workloads stay on your infrastructure, while orchestration and inference route through Warp. These boundaries apply to [managed](/factories/self-hosting/#managed-architecture) and [unmanaged](/platform/unmanaged-execution/) deployments. ## Data boundaries @@ -47,7 +43,7 @@ Self-hosted agents **do not require any network ingress**. They require outbound * `sessions.app.warp.dev` — port 443 * `oz.warp.dev` — port 443 (managed architecture only) -**Docker Hub** — for pulling task images with the Docker and Kubernetes backends. +Docker Hub — for pulling task images with the Docker and Kubernetes backends. Tasks use the following Docker images: * [`warpdotdev/warp-agent:latest`](https://hub.docker.com/r/warpdotdev/warp-agent) @@ -62,11 +58,9 @@ Tasks use the following Docker images: **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. -:::note All traffic uses HTTPS (port 443). No inbound ports need to be opened. -::: -The exception runs the other way. [Team-managed inference endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) and URL-backed MCP servers that you host must be reachable from Warp's servers. +[Team-managed inference endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) and URL-backed MCP servers that you host must be reachable from Warp's servers. --- @@ -80,10 +74,10 @@ The exception runs the other way. [Team-managed inference endpoints](/enterprise ### Kubernetes backend -* **Kubernetes RBAC** — The worker needs namespaced permissions to create, get, list, watch, and delete Jobs and Pods. The Helm chart creates a minimal Role/RoleBinding scoped to a single namespace. The task namespace must allow creating Jobs with a root init container, as sidecar materialization currently depends on that pattern. Review your Pod Security Standards and admission policies accordingly. -* **Kubernetes service accounts** — The worker Deployment's ServiceAccount (used by the long-lived worker process) is separate from the optional task Job `serviceAccountName` you may configure in `pod_template`. Scope each appropriately. -* **API key management** — Store `WARP_API_KEY` in a Kubernetes Secret. Avoid hardcoding it in scripts or config files. If your organization uses an external secrets manager (HashiCorp Vault, AWS Secrets Manager, GCP Secret Manager, etc.), you can inject secrets into task pods via the CSI Secrets Store Driver or a similar operator — configure the required `volumes`, `volumeMounts`, and annotations in `pod_template`. -* **Task isolation** — Each task runs as a separate Kubernetes Job/Pod. Jobs are removed after execution by default (disable with `--no-cleanup` for debugging). +* **Kubernetes RBAC** — The worker uses namespace-scoped permissions to manage Jobs and read Pods, logs, and events. The task namespace must allow a root init container unless native image volumes are enabled. +* **Kubernetes service accounts** — The worker Deployment ServiceAccount is separate from the task Job `serviceAccountName` in `pod_template`. Scope each to its workload. +* **API key management** — Store `WARP_API_KEY` in a Kubernetes Secret and inject it only into the worker. Add task credentials through `pod_template` or an external secrets operator. +* **Task isolation** — Each task runs as a Kubernetes Job and Pod. Successful Jobs are removed. With cleanup enabled, failed or orphaned Jobs remain for 24 hours; `--no-cleanup` keeps them without a TTL. ### Direct backend @@ -105,7 +99,7 @@ The exception runs the other way. [Team-managed inference endpoints](/enterprise ## VPN and on-premises access -Since self-hosted agents run on your infrastructure, they inherit your network access. Self-hosted agents can reach services behind VPNs, self-hosted GitLab/Bitbucket instances, databases, and any other internal resources your host can reach. This is one of the primary reasons teams choose self-hosting. +Self-hosted agents inherit the host's network access, including VPN services, private source control, and databases. See [GitLab](/platform/integrations/gitlab/) and [Bitbucket](/platform/integrations/bitbucket/) setup guides for SCM integration details. @@ -119,7 +113,7 @@ LLM inference routes through Warp's backend. With Warp-managed inference, reques ## Related pages -* [Managed self-hosting](/factories/self-hosting/) — Install and operate a managed worker for a factory. +* [Self-hosting overview](/factories/self-hosting/) — Managed vs unmanaged and architecture decision guide. * [Data security and boundaries](/platform/architecture/#data-security-and-boundaries) — Diagrams of where each class of data lives and travels. * [Security overview](/enterprise/security-and-compliance/security-overview/) — Warp's broader security model, including ZDR. * [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/) — Route inference through your own cloud provider accounts. diff --git a/src/content/docs/platform/faqs.mdx b/src/content/docs/platform/faqs.mdx index 81608fa6a..afe51932a 100644 --- a/src/content/docs/platform/faqs.mdx +++ b/src/content/docs/platform/faqs.mdx @@ -66,7 +66,7 @@ Self-hosted execution is available on **Enterprise** plans. See [Self-hosting](/ :::note Self-serve [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/) does not apply to cloud agents. Keys you add yourself are stored locally on your device and can't be passed to cloud-hosted or self-hosted agent runs, so those runs consume [Warp credits](/support-and-community/plans-and-billing/credits/). -Enterprise teams are the exception: an admin can configure [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) that are stored server-side by Warp and used by cloud agents. Those runs still consume [platform credits](/support-and-community/plans-and-billing/platform-credits/) for orchestration. +Business and Enterprise teams are the exception: an admin can configure [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) that are stored server-side by Warp and used by cloud agents. Those runs still consume [platform credits](/support-and-community/plans-and-billing/platform-credits/) for orchestration. ::: ## Models @@ -88,7 +88,7 @@ Yes. Cloud agents support the same set of models available in Warp. Model select No. A [connected ChatGPT subscription](/agents/inference/chatgpt-subscription/) applies to Warp Agent conversations in the Warp app, not cloud agent runs. Warp also doesn't support connecting a Claude consumer subscription. -Enterprise admins can configure [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) for cloud agents. +Business and Enterprise admins can configure [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) for cloud agents. ### Do you support local or private LLMs for compliance or air-gapped environments? @@ -234,7 +234,7 @@ Yes. LLM inference routes through Warp's backend, which has [Zero Data Retention The [unmanaged architecture](/platform/unmanaged-execution/) is well-suited for large monorepos because agents run directly in your pre-provisioned environment — there is no Docker image build or repo cloning step. For the [managed architecture](/factories/self-hosting/#managed-architecture), the Docker backend supports volume mounts (`-v` flag) to mount a pre-existing repo checkout from the host into task containers. With the Kubernetes backend, use `pod_template` to configure persistent volume claims or pre-populated storage for the same purpose. :::note -The managed architecture supports four backends: Docker (default), Kubernetes, Direct, and Command. Use one-shot Direct when an external scheduler starts a worker for each job, or Command when a connected worker dispatches tasks to an external runtime. See [choosing a managed backend](/factories/self-hosting/#choose-a-backend). +The managed architecture supports four backends: Docker (default), Kubernetes, Direct, and Command. Use one-shot Direct when an external scheduler starts a worker for each job, or Command when a connected worker dispatches tasks to an external runtime. See [choosing a managed backend](/factories/self-hosting/#choosing-a-managed-backend). ::: ### Do Kubernetes pods provide enough sandboxing for self-hosted agents? diff --git a/src/content/docs/platform/index.mdx b/src/content/docs/platform/index.mdx index ee9dd3402..8a472d856 100644 --- a/src/content/docs/platform/index.mdx +++ b/src/content/docs/platform/index.mdx @@ -10,7 +10,7 @@ import { VARS } from '@data/vars'; import VideoEmbed from '@components/VideoEmbed.astro'; :::note -**The [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) is the current name.** Existing cloud agents, integrations, API keys, and schedules continue to work. The `oz` CLI and the {VARS.WEB_APP} retain their legacy names during the transition. See [Transitioning](/platform/transitioning-from-oz/) for the current guidance. +The `oz` CLI and the {VARS.WEB_APP} keep their current names. Use the [cloud agent documentation map](/platform/documentation-map/) to find standalone workflows, CLI tools, APIs, SDKs, and Warp Factories. ::: Cloud agents are autonomous, background agents that run on Warp's cloud infrastructure or your own, triggered by system events, schedules, or integrations like Slack and GitHub. They execute tasks with full observability — every run is tracked, inspectable, and shareable across your team. diff --git a/src/content/docs/platform/integrations/cloud-providers.mdx b/src/content/docs/platform/integrations/cloud-providers.mdx index 16320d869..4b945ff4a 100644 --- a/src/content/docs/platform/integrations/cloud-providers.mdx +++ b/src/content/docs/platform/integrations/cloud-providers.mdx @@ -1,5 +1,5 @@ --- -title: Cloud Providers (Preview) +title: Cloud providers description: >- Connect cloud agents to your AWS and GCP services. sidebar: @@ -253,19 +253,30 @@ Within the agent environment, use the `oz federate issue-token` command to produ with your provider as the audience: ```bash -oz federate issue-token --run-id --audience your-provider.com --output-format json +oz federate issue-token --run-id "$OZ_RUN_ID" --audience AUDIENCE --output-format json ``` -Replace `` with the current agent run's ID. +Cloud agent runs set `OZ_RUN_ID` to the current run's ID. Replace `AUDIENCE` with the identifier +expected by your provider. -Optionally, add `--duration ` to customize the token validity. Tokens are valid for -between 5 minutes and 3 hours. +See the [`oz federate issue-token` reference](/agents/cli/oz-cli/federate/#oz-federate-issue-token) for +token lifetime and subject customization options. You can then exchange this token for provider-specific credentials. ## OIDC token claims -All {VARS.WARP_AUTOMATION_PLATFORM} OIDC tokens include standard claims like `iss` (issuer) and `iat` (issued at). +All {VARS.WARP_AUTOMATION_PLATFORM} OIDC tokens include the following standard claims: + +| Claim | Value | +| --- | --- | +| `iss` | The issuer, `https://app.warp.dev`. | +| `aud` | The intended recipient of the token. | +| `sub` | The subject, built from the selected subject template. | +| `iat` | The time the token was issued. | +| `nbf` | The time before which the token isn't valid. | +| `exp` | The token expiration time. | +| `jti` | The unique token identifier. | ### Audience @@ -275,20 +286,23 @@ such as `https://iam.googleapis.com/projects//locations/global/w ### Subject (`sub`) -The `sub` claim is set to the identity that an agent is executing as. This will either be a -Warp user ID or an autogenerated account ID for team-scoped agent runs. +The `sub` claim identifies the principal that an agent is executing as: a Warp user or a dedicated +agent. By default, the `sub` claim uses the format `:`: * `user:abc123def456`: Identifies a user with ID `abc123def456` * `service_account:abc123def456`: Identifies your autogenerated team account -When authenticating to AWS, the {VARS.WARP_AUTOMATION_PLATFORM} will use a different `sub` claim format, because AWS trust policies cannot -match on custom OIDC claims. The format above will be prefixed with your team UID: +Use [`--subject-template`](/agents/cli/oz-cli/federate/#subject-template-components) to include other +available claims in `sub`. + +When authenticating to AWS, the {VARS.WARP_AUTOMATION_PLATFORM} uses a different `sub` claim format because AWS trust policies can't +match on custom OIDC claims. The format above is prefixed with your team UID: * `scoped_principal:xyz789/user:abc123def456`: Identifies the user `abc123def456`, who is a member of team `xyz789`. * `scoped_principal:user:abc123def456`: Identifies the user `abc123def456`, who is not on any team. * `scoped_principal:xyz789/service_account:abc123def456`: Identifies the autogenerated account for team `xyz789`. -In addition, user OIDC tokens include an `email` claim with the user's email address. +The `scoped_principal` component isn't available for users who belong to multiple teams. To get possible user ID values, use the `oz whoami` command: @@ -319,22 +333,30 @@ curl https://app.warp.dev/api/v1/agent/runs -H "Authorization: Bearer $WARP_API_ } ``` -### Team +### Principal claims -Tokens for principals on a team include a `teams` claim listing the UIDs of the teams the -principal belongs to. Users on multiple teams get multiple values, and users on no team get no -`teams` claim. +Tokens include claims that describe the user or agent: -### Run +* `user`: the user's UID. Included only for user tokens. +* `service_account`: the service account UID. Included only for agent tokens. +* `email`: the user's email address. Included only for user tokens with an email address. +* `teams`: the UIDs of the teams the principal belongs to. Users on multiple teams get multiple + values, and users on no team don't get this claim. +* `factory_uid`: the factory UID. Included only for service agents belonging to a factory. +* `agent_type`: the configured factory agent type. Included only for agent tokens with a configured + agent type. + +### Run claims The following claims are derived from an agent run: * `run_id`: the unique identifier for the individual run. This is not suitable for configuring access, but is useful to log for debugging. * `environment`: the unique identifier for the agent's [Environment](/platform/environments/). -* `agent_name`: the name of the [Skill](/platform/skills-as-agents/) that the agent was invoked with. +* `agent_name`: the configured agent name. * `skill_spec`: the canonical identifier for the skill, such as `github-org/github-repo:.warp/skills/skill-name/SKILL.md`. -* `host`: the execution host. This will either be `warp`, for Warp-hosted agents, or the worker ID if [self-hosting](/factories/self-hosting/). +* `host`: the execution host. This is `warp` for Warp-hosted agents or the configured worker host + for [self-hosted agents](/factories/self-hosting/). ### Example token @@ -351,6 +373,7 @@ The following OIDC token references an agent running as a specific Warp user: { "aud": ["sts.amazonaws.com"], "sub": "user:", + "user": "", "email": "user@warp.dev", "teams": [""], "run_id": "", @@ -364,3 +387,4 @@ The following OIDC token references an agent running as a specific Warp user: "iat": 1775206575, "nbf": 1775206575 } +``` diff --git a/src/content/docs/platform/unmanaged-execution.mdx b/src/content/docs/platform/unmanaged-execution.mdx index e9db24bf1..992255a24 100644 --- a/src/content/docs/platform/unmanaged-execution.mdx +++ b/src/content/docs/platform/unmanaged-execution.mdx @@ -121,7 +121,7 @@ Unmanaged agents are tracked on Warp's backend. Each run creates a persistent se * **View** in the {VARS.DASHBOARD}. * **Attach to** via [Agent Session Sharing](/agents/local-agents/session-sharing/) to monitor or steer. -* **Query** through the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) for custom dashboards or monitoring. +* **API and SDK** — Query run data through the [{VARS.WARP_PLATFORM_API}](/factories/api-and-sdk/) for custom dashboards or monitoring. Unmanaged sessions benefit from the same shared configuration as other cloud agent runs — [MCP servers](/platform/mcp/), [secrets](/platform/secrets/), Warp Drive context, and saved prompts all apply. @@ -134,6 +134,6 @@ Unmanaged runs don't ship with the bundled declarations script, so end-of-run wo * [Self-hosting overview](/factories/self-hosting/) — Compare managed and unmanaged, plus the architecture decision guide. * [External orchestrators](/factories/self-hosting/external-orchestrators/) — Compare one-shot Direct with the Command backend for externally allocated compute. * [GitHub Actions integration](/platform/integrations/github-actions/) — Run agents in CI with the official action. -* [Deployment patterns](/factories/deployment-patterns/) — Compare Warp-hosted and managed self-hosted factory execution; the model-choice table links here for unmanaged execution. +* [Deployment patterns](/factories/deployment-patterns/) — Pattern 1 (CLI-only) explains the unmanaged model conceptually. * [{VARS.WARP_AGENT_CLI}](/agents/cli/oz-cli/) — Full CLI reference for `oz agent run` and related commands. * [Agent Session Sharing](/agents/local-agents/session-sharing/) — Attach to running sessions to monitor or steer them. diff --git a/src/content/docs/support-and-community/plans-and-billing/platform-credits.mdx b/src/content/docs/support-and-community/plans-and-billing/platform-credits.mdx index 4a6095cda..7ada82402 100644 --- a/src/content/docs/support-and-community/plans-and-billing/platform-credits.mdx +++ b/src/content/docs/support-and-community/plans-and-billing/platform-credits.mdx @@ -7,7 +7,7 @@ description: >- Platform credits cover Warp's platform layer: run lifecycle, integrations, dashboard, APIs, and observability. They're billed by the agent hour, the time an agent spends working on a task. Platform credits apply to every cloud agent run, including [Warp Factories](/factories/) runs, plus local agent runs on Business and Enterprise plans that use customer-supplied inference. -Customer-supplied inference is any setup where Warp isn't paying for the model call: [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/), a [ChatGPT subscription](/agents/inference/chatgpt-subscription/) for local Warp Agent conversations, [custom inference endpoints](/agents/inference/custom-inference-endpoint/), [BYOLLM](/enterprise/enterprise-features/bring-your-own-llm/), or Enterprise [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/). +Customer-supplied inference is any setup where Warp isn't paying for the model call: [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/), a [ChatGPT subscription](/agents/inference/chatgpt-subscription/) for local Warp Agent conversations, [custom inference endpoints](/agents/inference/custom-inference-endpoint/), [BYOLLM](/enterprise/enterprise-features/bring-your-own-llm/), or [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) on Business and Enterprise plans. :::caution BYOK and custom inference endpoint support are available for individual users and organizations with 10 or fewer employees, subject to Warp's [Terms of Service](https://www.warp.dev/legal/terms-of-service). Companies or organizations with more than 10 employees need a Warp Business or Enterprise plan to use these features. diff --git a/src/sidebar.ts b/src/sidebar.ts index 79045e9fd..68b781cc3 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -523,10 +523,9 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'factories/factory-dashboard', label: 'Factory dashboard' }, ], }, - // Keep troubleshooting and legacy transition guidance as direct trailing - // items rather than creating singleton groups. + // Keep troubleshooting as a direct trailing item rather than creating a + // singleton group. { slug: 'factories/troubleshooting', label: 'Troubleshooting' }, - { label: 'Cloud agent documentation map', link: '/platform/transitioning-from-oz/' }, ], }, { @@ -554,7 +553,7 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ items: [ { slug: 'platform', label: 'Overview' }, { slug: 'platform/quickstart', label: 'Quickstart' }, - { slug: 'platform/transitioning-from-oz', label: 'Documentation map' }, + { slug: 'platform/documentation-map', label: 'Documentation map' }, { // Runtime (which agent executes the run) is kept separate from // configuration (how any run is set up) -- HYC review, 8/14. diff --git a/vercel.json b/vercel.json index fff280a00..720c61e7c 100644 --- a/vercel.json +++ b/vercel.json @@ -6677,6 +6677,11 @@ "destination": "/factories/self-hosting/direct-monorepo-worktrees/", "statusCode": 308 }, + { + "source": "/platform/self-hosting/external-orchestrators(/?)", + "destination": "/factories/self-hosting/external-orchestrators/", + "statusCode": 308 + }, { "source": "/platform/self-hosting/monitoring(/?)", "destination": "/factories/self-hosting/monitoring/", @@ -6737,6 +6742,11 @@ "destination": "/agents/cli/oz-cli/:path*", "statusCode": 308 }, + { + "source": "/platform/transitioning-from-oz(/?)", + "destination": "/platform/documentation-map/", + "statusCode": 308 + }, { "source": "/agents/cli-agents(/?)", "destination": "/agents/cli-agents/overview/", From 6e125a6071e630b44b8570167c0aa2b3cfc1cff1 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 04:47:03 +0000 Subject: [PATCH 62/63] docs: address Factory launch review findings Co-Authored-By: Oz --- .agents/references/terminology.md | 2 +- .../references/known-exceptions.md | 2 +- .agents/skills/docs-seo-audit/SKILL.md | 2 +- .agents/skills/draft_guide/SKILL.md | 2 +- .agents/skills/draft_procedural/SKILL.md | 4 +- .agents/skills/draft_reference/SKILL.md | 4 +- .agents/skills/draft_troubleshooting/SKILL.md | 4 +- .../references/feature_surface_map.md | 62 +++++++++---------- .agents/skills/sync-error-docs/SKILL.md | 28 ++++----- .../references/error-page-template.md | 4 +- .../references/redirect-patterns.md | 30 ++++----- .../references/sync-policy.md | 8 +++ .../sync-openapi-spec/scripts/sync_openapi.py | 34 +++++++++- AGENTS.md | 29 ++++----- developers/agent-api-openapi.yaml | 2 +- .../inference/bring-your-own-api-key.mdx | 2 +- src/content/docs/enterprise/index.mdx | 4 +- .../docs/factories/deployment-patterns.mdx | 12 +--- src/content/docs/factories/index.mdx | 2 +- .../factories/infrastructure-and-security.mdx | 2 - .../docs/platform/documentation-map.mdx | 4 +- 21 files changed, 137 insertions(+), 106 deletions(-) diff --git a/.agents/references/terminology.md b/.agents/references/terminology.md index bdf131310..a6321cd06 100644 --- a/.agents/references/terminology.md +++ b/.agents/references/terminology.md @@ -375,7 +375,7 @@ Docs match the screen; the fix belongs in the app. *Usage note:* Lowercase common noun. Distinct from the **Automation Platform**, the product; and from a **trigger**, the event that fires an automation. - **runner** — A factory resource, defined by a `runners/.yaml` file, that defines the compute a run executes on: operating system, architecture, sandbox image, and instance shape. Agents and automations select a runner by name, or inherit the factory's default. - *Usage note:* Lowercase common noun. Scoped to a factory's definition; distinct from the general [cloud agent runner](/platform/runners/) reference, which covers the same concept for standalone cloud agents outside a factory. + *Usage note:* Lowercase common noun. Scoped to a factory's definition; distinct from the general [cloud agent runner](/factories/runners/) reference, which covers the same concept for standalone cloud agents outside a factory. - **Scorer** — A configured LLM judge, scoped per factory to chosen agents and sampled at a set rate, that classifies completed runs against criteria you write, such as "did the agent run the tests before opening a PR?" A Scorer assigns a label (a classification with a score), not a freeform numeric grade. Feeds the **Dashboard** page's Scorer cards, benchmarks, and Self-improvement. *Usage note:* Capitalize "Scorer"/"Scorers" when referring to the feature or a configured instance ("create a Scorer," "Scorer cards"); lowercase only for a generic instance count or file listing ("two scorers," alongside "skills" in an example tree). Say "classify," never "grade" — the docs draw this distinction deliberately. The unit a Scorer evaluates is a **run** (a single agent execution), not a "conversation" or "completed work." `measure-and-improve/scorers.mdx` is the canonical page for what a Scorer is and how to configure one; other pages link there rather than repeating the definition. diff --git a/.agents/skills/afdocs-audit/references/known-exceptions.md b/.agents/skills/afdocs-audit/references/known-exceptions.md index a233305e0..d0be0c725 100644 --- a/.agents/skills/afdocs-audit/references/known-exceptions.md +++ b/.agents/skills/afdocs-audit/references/known-exceptions.md @@ -28,7 +28,7 @@ This file lists checks from the afdocs-audit skill that may flag as warnings or - `/platform/triggers/scheduled-agents-quickstart/` — step headings - `/platform/integrations/github-actions/` — numbered use case headings - `/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/` — URLs with special chars -- `/reference/cli/quickstart/` — optional step headings +- `/agents/cli/oz-cli/quickstart/` — optional step headings - `/guides/getting-started/welcome-to-warp/` — numbered section headings - `/terminal/editor/vim/` — "See Vim docs:" link text - `/guides/getting-started/10-coding-features-you-should-know/` — numbered feature headings diff --git a/.agents/skills/docs-seo-audit/SKILL.md b/.agents/skills/docs-seo-audit/SKILL.md index 4b5143fb4..d9984794b 100644 --- a/.agents/skills/docs-seo-audit/SKILL.md +++ b/.agents/skills/docs-seo-audit/SKILL.md @@ -154,7 +154,7 @@ Some page titles are intentionally short or specific and must **not** be changed - **`src/content/docs/terminal/windows/split-panes.mdx`** (`Split panes`) — Same rationale: the section header disambiguates the terminal context. The `title_too_short` warning is intentionally suppressed. Do not rename to "Terminal split panes". - **`src/content/docs/terminal/windows/tab-configs.mdx`** (`Tab Configs`) — Same rationale: the section header disambiguates the terminal context. Additionally, "Tab Configs" is a proper feature name and should not be prefixed. The `title_too_short` warning is intentionally suppressed. Do not rename to "Terminal Tab Configs". - **`src/content/docs/terminal/sessions/index.mdx`** (`Sessions`) — The sidebar section header ("Sessions") already provides terminal context. The `title_too_short` warning is intentionally suppressed. Do not rename to "Terminal sessions". -- **`src/content/docs/reference/cli/artifacts.mdx`** (`Artifacts`) — The Reference > CLI section provides context, and "Artifacts" matches the `oz artifact` resource that the page documents. The `title_too_short` warning is intentionally suppressed. +- **`src/content/docs/agents/cli/oz-cli/artifacts.mdx`** (`Artifacts`) — The Agents > CLI section provides context, and "Artifacts" matches the `oz artifact` resource that the page documents. The `title_too_short` warning is intentionally suppressed. When the audit flags these pages for `title_too_short`, exclude them from your fix list and include a note in your report explaining they are intentional exceptions. diff --git a/.agents/skills/draft_guide/SKILL.md b/.agents/skills/draft_guide/SKILL.md index 9001f7eec..10587582b 100644 --- a/.agents/skills/draft_guide/SKILL.md +++ b/.agents/skills/draft_guide/SKILL.md @@ -76,7 +76,7 @@ When drafting a guide, check for relevant SEO and AEO data: When a guide includes Oz CLI commands or GitHub Actions workflows using `warpdotdev/oz-agent-action`: -- **Verify Oz CLI commands against `/reference/cli/`.** Do not infer flag names or argument formats. Use only flags documented in the CLI reference. When in doubt, link to the reference page instead of showing a command. +- **Verify Oz CLI commands against `/agents/cli/oz-cli/`.** Do not infer flag names or argument formats. Use only flags documented in the CLI reference. When in doubt, link to the reference page instead of showing a command. - **`oz-agent-action` input format**: `warp_api_key` is a `with:` input to the action, not an `env:` variable. `GITHUB_TOKEN` goes in `env:`. The correct pattern is: ```yaml - uses: warpdotdev/oz-agent-action@v1 diff --git a/.agents/skills/draft_procedural/SKILL.md b/.agents/skills/draft_procedural/SKILL.md index b25871787..c8459773e 100644 --- a/.agents/skills/draft_procedural/SKILL.md +++ b/.agents/skills/draft_procedural/SKILL.md @@ -62,5 +62,5 @@ All headings (H1–H4) must use **sentence case**: capitalize only the first wor ## Existing examples Read 2-3 of these strong examples to match the existing pattern: -- `src/content/docs/reference/cli/api-keys.md` -- `src/content/docs/platform/integrations/slack.md` +- `src/content/docs/agents/cli/oz-cli/api-keys.mdx` +- `src/content/docs/platform/integrations/slack.mdx` diff --git a/.agents/skills/draft_reference/SKILL.md b/.agents/skills/draft_reference/SKILL.md index f4e4bd676..b446690ef 100644 --- a/.agents/skills/draft_reference/SKILL.md +++ b/.agents/skills/draft_reference/SKILL.md @@ -45,5 +45,5 @@ All headings (H1–H4) must use **sentence case**: capitalize only the first wor ## Existing examples Read 2-3 of these strong examples to match the existing pattern: -- `reference/cli/index.mdx` -- `reference/api-and-sdk/index.mdx` +- `agents/cli/oz-cli/index.mdx` +- `factories/api-and-sdk/index.mdx` diff --git a/.agents/skills/draft_troubleshooting/SKILL.md b/.agents/skills/draft_troubleshooting/SKILL.md index b853ba55b..39e245910 100644 --- a/.agents/skills/draft_troubleshooting/SKILL.md +++ b/.agents/skills/draft_troubleshooting/SKILL.md @@ -44,5 +44,5 @@ All headings (H1–H4) must use **sentence case**: capitalize only the first wor ## Existing examples Read 2-3 of these strong examples to match the existing pattern: -- `src/content/docs/support-and-community/troubleshooting-and-support/known-issues.md` -- `src/content/docs/reference/cli/troubleshooting.md` +- `src/content/docs/support-and-community/troubleshooting-and-support/known-issues.mdx` +- `src/content/docs/agents/cli/oz-cli/troubleshooting.mdx` diff --git a/.agents/skills/missing_docs/references/feature_surface_map.md b/.agents/skills/missing_docs/references/feature_surface_map.md index 32f7eceda..46fa5dd2a 100644 --- a/.agents/skills/missing_docs/references/feature_surface_map.md +++ b/.agents/skills/missing_docs/references/feature_surface_map.md @@ -60,16 +60,16 @@ CloudMode -> src/content/docs/platform/index.mdx AmbientAgentsCommandLine -> src/content/docs/platform/index.mdx ScheduledAmbientAgents -> src/content/docs/platform/triggers/scheduled-agents.md WarpManagedSecrets -> src/content/docs/platform/secrets.md -IntegrationCommand -> src/content/docs/reference/cli/integration-setup.md +IntegrationCommand -> src/content/docs/agents/cli/oz-cli/integration-setup.md CommandPaletteFileSearch -> src/content/docs/terminal/command-palette.md Ligatures -> src/content/docs/terminal/appearance/text-fonts-cursor.md UIZoom -> src/content/docs/terminal/appearance/size-opacity-blurring.md UsageBasedPricing -> src/content/docs/support-and-community/plans-and-billing/credits.md # The APIKeyAuthentication flag was removed after the public API key auth feature # stabilized (GA / flag cleanup). API key auth remains documented at -# reference/cli/api-keys.mdx via APIKeyManagement / TeamApiKeys, so no separate +# agents/cli/oz-cli/api-keys.mdx via APIKeyManagement / TeamApiKeys, so no separate # entry is needed. -APIKeyManagement -> src/content/docs/reference/cli/api-keys.md +APIKeyManagement -> src/content/docs/agents/cli/oz-cli/api-keys.md CreatingSharedSessions -> src/content/docs/knowledge-and-collaboration/session-sharing/index.mdx AgentSharedSessions -> src/content/docs/agents/local-agents/session-sharing.mdx ProfilesDesignRevamp -> src/content/docs/agents/capabilities/agent-profiles-permissions.mdx @@ -113,7 +113,7 @@ AgentView -> src/content/docs/agents/local-agents/interacting-with-agents/termin AgentViewBlockContext -> src/content/docs/agents/local-agents/agent-context/blocks-as-context.mdx CloudConversations -> src/content/docs/agents/local-agents/cloud-conversations.mdx CloudModeFromLocalSession -> src/content/docs/platform/index.mdx -TeamApiKeys -> src/content/docs/reference/cli/api-keys.md +TeamApiKeys -> src/content/docs/agents/cli/oz-cli/api-keys.md # The PRCommentsSlashCommand flag was removed: the /pr-comments slash command was # replaced by the bundled PR Comments skill (invoked via /skills), so the slash # command was dropped from the docs. @@ -187,8 +187,8 @@ SessionSharingAcls -> src/content/docs/knowledge-and-collaboration/session-shari SharedSessionWriteToLongRunningCommands -> src/content/docs/knowledge-and-collaboration/session-sharing/index.mdx # CLI-gated features documented in the CLI reference -ArtifactCommand -> src/content/docs/reference/cli/artifacts.mdx -OzIdentityFederation -> src/content/docs/reference/cli/federate.mdx +ArtifactCommand -> src/content/docs/agents/cli/oz-cli/artifacts.mdx +OzIdentityFederation -> src/content/docs/agents/cli/oz-cli/federate.mdx # Third-party harness support AgentHarness -> src/content/docs/platform/harnesses/index.mdx @@ -238,8 +238,8 @@ BillingAndUsagePageV2 -> src/content/docs/support-and-community/plans-and-billin # `--runner` flag on `run-cloud`; CloudAgentRunners gates the `oz runner` CRUD # commands and the runner dropdown in the orchestration card. Both are GA # (default cargo features). -CloudRunners -> src/content/docs/platform/runners.mdx -CloudAgentRunners -> src/content/docs/platform/runners.mdx +CloudRunners -> src/content/docs/factories/runners.mdx +CloudAgentRunners -> src/content/docs/factories/runners.mdx # Per-segment context window usage breakdown (system prompt, tool definitions, # conversation history, latest input, images, other) in the conversation usage @@ -259,7 +259,7 @@ OscHyperlinks -> src/content/docs/terminal/more-features/files-and-links.mdx # jira) wherever a Warp MCP server UUID is accepted — bare `--mcp` arguments and # `warp_id` values in MCP configs. Promoted dogfood -> GA; documented in the CLI # MCP reference (and the cloud agent MCP schema page). -WellKnownMcpIds -> src/content/docs/reference/cli/mcp-servers.mdx +WellKnownMcpIds -> src/content/docs/agents/cli/oz-cli/mcp-servers.mdx # When the shell rebinds Ctrl+R / Ctrl+T / Alt-C to fzf, atuin, or fzf.fish, hand # those keypresses off to the shell widget instead of Warp's Command Search. @@ -271,20 +271,20 @@ ShellWidgetHandoff -> src/content/docs/terminal/entry/command-search.mdx ## CLI commands -> doc pages # Top-level Oz CLI commands -oz agent -> src/content/docs/reference/cli/index.mdx -oz environment -> src/content/docs/reference/cli/integration-setup.mdx -oz mcp -> src/content/docs/reference/cli/mcp-servers.mdx -oz run -> src/content/docs/reference/cli/index.mdx -oz model -> src/content/docs/reference/cli/index.mdx -oz login -> src/content/docs/reference/cli/index.mdx -oz logout -> src/content/docs/reference/cli/index.mdx -oz whoami -> src/content/docs/reference/cli/index.mdx -oz integration -> src/content/docs/reference/cli/integration-setup.mdx -oz schedule -> src/content/docs/reference/cli/index.mdx -oz secret -> src/content/docs/reference/cli/index.mdx -oz federate -> src/content/docs/reference/cli/federate.mdx -oz artifact -> src/content/docs/reference/cli/artifacts.mdx -oz api-key -> src/content/docs/reference/cli/api-keys.mdx +oz agent -> src/content/docs/agents/cli/oz-cli/index.mdx +oz environment -> src/content/docs/agents/cli/oz-cli/integration-setup.mdx +oz mcp -> src/content/docs/agents/cli/oz-cli/mcp-servers.mdx +oz run -> src/content/docs/agents/cli/oz-cli/index.mdx +oz model -> src/content/docs/agents/cli/oz-cli/index.mdx +oz login -> src/content/docs/agents/cli/oz-cli/index.mdx +oz logout -> src/content/docs/agents/cli/oz-cli/index.mdx +oz whoami -> src/content/docs/agents/cli/oz-cli/index.mdx +oz integration -> src/content/docs/agents/cli/oz-cli/integration-setup.mdx +oz schedule -> src/content/docs/agents/cli/oz-cli/index.mdx +oz secret -> src/content/docs/agents/cli/oz-cli/index.mdx +oz federate -> src/content/docs/agents/cli/oz-cli/federate.mdx +oz artifact -> src/content/docs/agents/cli/oz-cli/artifacts.mdx +oz api-key -> src/content/docs/agents/cli/oz-cli/api-keys.mdx # Scheduled-agent CLI subcommands are fully documented in the scheduled-agents feature page. oz schedule create -> src/content/docs/platform/triggers/scheduled-agents.mdx @@ -327,11 +327,11 @@ oz provider list -> gated:ProviderCommand # `oz runner` (manage cloud agent runners) is GA (gated by CloudAgentRunners, a # default cargo feature) and documented on the runners page. The old gating flag # CloudAgentRunnerCLICommands was removed after the feature stabilized. -oz runner -> src/content/docs/platform/runners.mdx -oz runner list -> src/content/docs/platform/runners.mdx -oz runner create -> src/content/docs/platform/runners.mdx -oz runner update -> src/content/docs/platform/runners.mdx -oz runner delete -> src/content/docs/platform/runners.mdx +oz runner -> src/content/docs/factories/runners.mdx +oz runner list -> src/content/docs/factories/runners.mdx +oz runner create -> src/content/docs/factories/runners.mdx +oz runner update -> src/content/docs/factories/runners.mdx +oz runner delete -> src/content/docs/factories/runners.mdx # Internal/hidden command — not a user-facing surface, so no public docs. oz harness-support -> internal @@ -347,9 +347,9 @@ oz harness-support -> internal # route released ones through the sync-openapi-spec skill, or mark `-> internal` # (unreleased/internal). Never document an unreleased endpoint. See SKILL.md # "Public vs. private surfaces". -POST /agent/run -> src/content/docs/reference/api-and-sdk/index.mdx -GET /agent/runs -> src/content/docs/reference/api-and-sdk/index.mdx -GET /agent/runs/{runId} -> src/content/docs/reference/api-and-sdk/index.mdx +POST /agent/run -> src/content/docs/factories/api-and-sdk/index.mdx +GET /agent/runs -> src/content/docs/factories/api-and-sdk/index.mdx +GET /agent/runs/{runId} -> src/content/docs/factories/api-and-sdk/index.mdx # OAuth device-flow / OIDC plumbing used by `oz login` — not a public REST surface. GET /oauth/authorize -> internal diff --git a/.agents/skills/sync-error-docs/SKILL.md b/.agents/skills/sync-error-docs/SKILL.md index 57f5698b4..9374b5107 100644 --- a/.agents/skills/sync-error-docs/SKILL.md +++ b/.agents/skills/sync-error-docs/SKILL.md @@ -45,7 +45,7 @@ Each match yields a line like `InsufficientCredits ErrorCode = "insufficient_cre List the markdown files in the errors directory: ```bash -ls src/content/docs/reference/api-and-sdk/troubleshooting/errors/*.mdx +ls src/content/docs/factories/api-and-sdk/troubleshooting/errors/*.mdx ``` Each file is named `{hyphen-code}.mdx` (e.g., `insufficient-credits.mdx`). Ignore `index.mdx`. @@ -70,7 +70,7 @@ To fill in the template accurately: Place the new file at: ``` -src/content/docs/reference/api-and-sdk/troubleshooting/errors/{hyphen-code}.mdx +src/content/docs/factories/api-and-sdk/troubleshooting/errors/{hyphen-code}.mdx ``` ### Step 5: Add to the sidebar @@ -80,15 +80,15 @@ The sidebar lives in `src/sidebar.ts`. (`astro.config.mjs` only imports it via ` Find the `Errors` group inside the `API Troubleshooting` group, under the `Reference` topic. Its `items` array begins with the index entry: ```ts -{ slug: 'reference/api-and-sdk/troubleshooting/errors', label: 'Errors' }, -'reference/api-and-sdk/troubleshooting/errors/insufficient-credits', -'reference/api-and-sdk/troubleshooting/errors/feature-not-available', +{ slug: 'factories/api-and-sdk/troubleshooting/errors', label: 'Errors' }, +'factories/api-and-sdk/troubleshooting/errors/insufficient-credits', +'factories/api-and-sdk/troubleshooting/errors/feature-not-available', ``` Add the new page as a bare slug string using the **hyphenated** code: ```ts -'reference/api-and-sdk/troubleshooting/errors/{hyphen-code}', +'factories/api-and-sdk/troubleshooting/errors/{hyphen-code}', ``` Rules: @@ -108,21 +108,21 @@ Error codes are underscored (`insufficient_credits`) but page slugs are hyphenat Check for existing entries first, to stay idempotent across re-runs: ```bash -grep -F '"/reference/api-and-sdk/troubleshooting/errors/{underscore_code}"' vercel.json -grep -F '"/reference/api-and-sdk/troubleshooting/errors/{underscore_code}/"' vercel.json +grep -F '"/factories/api-and-sdk/troubleshooting/errors/{underscore_code}"' vercel.json +grep -F '"/factories/api-and-sdk/troubleshooting/errors/{underscore_code}/"' vercel.json ``` Add whichever variant is missing to the `redirects` array, alongside the other error-code redirects: ```json { - "source": "/reference/api-and-sdk/troubleshooting/errors/{underscore_code}", - "destination": "/reference/api-and-sdk/troubleshooting/errors/{hyphen-code}/", + "source": "/factories/api-and-sdk/troubleshooting/errors/{underscore_code}", + "destination": "/factories/api-and-sdk/troubleshooting/errors/{hyphen-code}/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/{underscore_code}/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/{hyphen-code}/", + "source": "/factories/api-and-sdk/troubleshooting/errors/{underscore_code}/", + "destination": "/factories/api-and-sdk/troubleshooting/errors/{hyphen-code}/", "statusCode": 308 } ``` @@ -136,12 +136,12 @@ The API's `type` URI uses `https://docs.warp.dev/errors/{underscore_code}`. **Ca ```json { "source": "/errors/:code", - "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", + "destination": "/factories/api-and-sdk/troubleshooting/errors/:code/", "statusCode": 308 }, { "source": "/errors/:code/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", + "destination": "/factories/api-and-sdk/troubleshooting/errors/:code/", "statusCode": 308 } ``` diff --git a/.agents/skills/sync-error-docs/references/error-page-template.md b/.agents/skills/sync-error-docs/references/error-page-template.md index 532738830..dd36ca8c7 100644 --- a/.agents/skills/sync-error-docs/references/error-page-template.md +++ b/.agents/skills/sync-error-docs/references/error-page-template.md @@ -38,7 +38,7 @@ This error is returned when: \```json { - "type": "https://docs.warp.dev/reference/api-and-sdk/troubleshooting/errors/{hyphen-code}", + "type": "https://docs.warp.dev/factories/api-and-sdk/troubleshooting/errors/{hyphen-code}", "title": "{USER_FACING_MESSAGE}", "status": {STATUS_CODE_INT}, "instance": "/api/v1/agent/tasks", @@ -60,7 +60,7 @@ This error is returned when: ## Related -* [Agent API & SDK](https://docs.warp.dev/reference/api-and-sdk/agent) — API reference +* [Agent API & SDK](https://docs.warp.dev/factories/api-and-sdk/agent) — API reference ``` ## Placeholder reference diff --git a/.agents/skills/sync-error-docs/references/redirect-patterns.md b/.agents/skills/sync-error-docs/references/redirect-patterns.md index cf0f5e0e3..8d51c1fc0 100644 --- a/.agents/skills/sync-error-docs/references/redirect-patterns.md +++ b/.agents/skills/sync-error-docs/references/redirect-patterns.md @@ -13,12 +13,12 @@ https://docs.warp.dev/errors/insufficient_credits The documentation page lives at: ``` -https://docs.warp.dev/reference/api-and-sdk/troubleshooting/errors/insufficient-credits +https://docs.warp.dev/factories/api-and-sdk/troubleshooting/errors/insufficient-credits ``` Two gaps separate them: -1. **Path prefix** — `/errors/{code}` versus the full `/reference/api-and-sdk/troubleshooting/errors/{code}` path. +1. **Path prefix** — `/errors/{code}` versus the full `/factories/api-and-sdk/troubleshooting/errors/{code}` path. 2. **Separator** — error codes are underscored (`insufficient_credits`); page slugs are hyphenated (`insufficient-credits`). A single-word code such as `conflict` has no separator to convert, so this gap does not exist for it. Both are handled by entries in `vercel.json` at the repo root. All redirects for the site live in that one file. @@ -30,12 +30,12 @@ Catch-alls already cover every error code, current and future, in both slash for ```json { "source": "/errors/:code", - "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", + "destination": "/factories/api-and-sdk/troubleshooting/errors/:code/", "statusCode": 308 }, { "source": "/errors/:code/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", + "destination": "/factories/api-and-sdk/troubleshooting/errors/:code/", "statusCode": 308 } ``` @@ -63,13 +63,13 @@ For a code that does differ, map the underscored form to the hyphenated page slu ```json { - "source": "/reference/api-and-sdk/troubleshooting/errors/{underscore_code}", - "destination": "/reference/api-and-sdk/troubleshooting/errors/{hyphen-code}/", + "source": "/factories/api-and-sdk/troubleshooting/errors/{underscore_code}", + "destination": "/factories/api-and-sdk/troubleshooting/errors/{hyphen-code}/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/{underscore_code}/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/{hyphen-code}/", + "source": "/factories/api-and-sdk/troubleshooting/errors/{underscore_code}/", + "destination": "/factories/api-and-sdk/troubleshooting/errors/{hyphen-code}/", "statusCode": 308 } ``` @@ -78,13 +78,13 @@ Example for `insufficient_credits`, whose forms differ: ```json { - "source": "/reference/api-and-sdk/troubleshooting/errors/insufficient_credits", - "destination": "/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/", + "source": "/factories/api-and-sdk/troubleshooting/errors/insufficient_credits", + "destination": "/factories/api-and-sdk/troubleshooting/errors/insufficient-credits/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/insufficient_credits/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/", + "source": "/factories/api-and-sdk/troubleshooting/errors/insufficient_credits/", + "destination": "/factories/api-and-sdk/troubleshooting/errors/insufficient-credits/", "statusCode": 308 } ``` @@ -96,12 +96,12 @@ Rules: - `source` has a **leading slash** and no file extension. - `destination` has a **trailing slash** in both entries. Every existing error redirect does. - Always set `"statusCode": 308`. -- Add the entries near the other `/reference/api-and-sdk/troubleshooting/errors/` redirects so they stay grouped. +- Add the entries near the other `/factories/api-and-sdk/troubleshooting/errors/` redirects so they stay grouped. - Check for existing entries before adding, so re-runs stay idempotent: ```bash - grep -F '"/reference/api-and-sdk/troubleshooting/errors/{underscore_code}"' vercel.json - grep -F '"/reference/api-and-sdk/troubleshooting/errors/{underscore_code}/"' vercel.json + grep -F '"/factories/api-and-sdk/troubleshooting/errors/{underscore_code}"' vercel.json + grep -F '"/factories/api-and-sdk/troubleshooting/errors/{underscore_code}/"' vercel.json ``` ## Note on the former GitBook flow diff --git a/.agents/skills/sync-openapi-spec/references/sync-policy.md b/.agents/skills/sync-openapi-spec/references/sync-policy.md index f80565e44..9805dda7f 100644 --- a/.agents/skills/sync-openapi-spec/references/sync-policy.md +++ b/.agents/skills/sync-openapi-spec/references/sync-policy.md @@ -24,6 +24,8 @@ This skill is the manual fallback for the same job, so its output has to match t 7. Recursively strip every key in `STRIP_FLAGS` from whatever survives steps 1-6, wherever it appears in the tree (operations, schemas, individual properties, parameters). +8. Rewrite the legacy Agent API error-documentation URL prefix to its canonical + path under `/factories/api-and-sdk/`. Rule 1 mirrors warp-server's own filter, so a surface the server team marks private stays private here without anyone having to maintain a matching allowlist entry. @@ -38,6 +40,12 @@ configuration from `warp-server/public_api/openapi.yaml`. It overrides only Keep this override when syncing the docs subset. Update the source spec when its endpoint behavior or non-product metadata changes. +The source spec still emits the pre-move error-documentation prefix, +`/reference/api-and-sdk/troubleshooting/errors/`. The docs transform rewrites +that prefix to `/factories/api-and-sdk/troubleshooting/errors/` so generated +problem-type URLs resolve directly to the canonical page rather than through a +redirect. + ## `x-internal` deletes the whole marked object, not just the flag (`_prune_internal`) `x-internal: true` mirrors openapi-format's `flagValues` semantics in diff --git a/.agents/skills/sync-openapi-spec/scripts/sync_openapi.py b/.agents/skills/sync-openapi-spec/scripts/sync_openapi.py index 1fb7c31d2..7f3700241 100644 --- a/.agents/skills/sync-openapi-spec/scripts/sync_openapi.py +++ b/.agents/skills/sync-openapi-spec/scripts/sync_openapi.py @@ -122,6 +122,13 @@ ), } +LEGACY_ERROR_DOC_URL_PREFIX = ( + "https://docs.warp.dev/reference/api-and-sdk/troubleshooting/errors/" +) +CANONICAL_ERROR_DOC_URL_PREFIX = ( + "https://docs.warp.dev/factories/api-and-sdk/troubleshooting/errors/" +) + # Default checkout layout: docs/ and warp-server/ as siblings. DEFAULT_SOURCE = Path("../warp-server/public_api/openapi.yaml") DEFAULT_TARGET = Path("developers/agent-api-openapi.yaml") @@ -280,6 +287,20 @@ def _strip_flags(node: Any) -> Any: return node +def _rewrite_docs_urls(node: Any) -> Any: + """Rewrite moved docs URLs to their canonical public destinations.""" + if isinstance(node, dict): + return {key: _rewrite_docs_urls(value) for key, value in node.items()} + if isinstance(node, list): + return [_rewrite_docs_urls(item) for item in node] + if isinstance(node, str): + return node.replace( + LEGACY_ERROR_DOC_URL_PREFIX, + CANONICAL_ERROR_DOC_URL_PREFIX, + ) + return node + + def _collect_refs(node: Any, refs: set[str]) -> None: """Recursively collect every component schema name referenced from ``node``. @@ -476,7 +497,7 @@ def transform(source: dict[str, Any]) -> dict[str, Any]: if out_components: out["components"] = out_components - return _strip_flags(out) + return _rewrite_docs_urls(_strip_flags(out)) # --------------------------------------------------------------------------- @@ -694,7 +715,13 @@ def _self_test() -> int: "x-stainless-naming": {"typescript": {"type": "Mode"}}, }, "RunResp": {"type": "object"}, - "Error": {"type": "object"}, + "Error": { + "type": "object", + "description": ( + f"Format: `{LEGACY_ERROR_DOC_URL_PREFIX}" + "{error_code}`" + ), + }, "MSItem": {"type": "object"}, # only referenced by dropped path "Followup": {"type": "object"}, "RunSourceType": { @@ -760,6 +787,9 @@ def _self_test() -> int: assert out["components"].get("securitySchemes"), "securitySchemes should be preserved" assert out["info"]["title"] == "Warp Platform API" assert out["info"]["description"] == DOCS_INFO_OVERRIDES["description"] + error_description = out["components"]["schemas"]["Error"]["description"] + assert LEGACY_ERROR_DOC_URL_PREFIX not in error_description + assert CANONICAL_ERROR_DOC_URL_PREFIX in error_description ref_errors = _validate_output(out) assert not ref_errors, f"unexpected unresolved refs: {ref_errors}" diff --git a/AGENTS.md b/AGENTS.md index b2eb155ab..e4409935a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -543,7 +543,7 @@ These rules apply regardless of content type: - Do NOT include step-by-step procedures — link to a procedural or quickstart page instead - Show real-world scenarios, not just abstract descriptions -**Existing examples**: `platform/deployment-patterns.mdx`, `platform/index.mdx` +**Existing examples**: `factories/deployment-patterns.mdx`, `platform/index.mdx` **Template**: `.agents/templates/conceptual.md` @@ -578,7 +578,7 @@ These rules apply regardless of content type: - Provide troubleshooting for common failure points. - **Explain the default before the override.** When documenting configurable infrastructure or advanced settings, state the default behavior and the common case first, then cover manual overrides. Don't lead with the full matrix of options before establishing what "just works" out of the box. -**Existing examples**: `reference/cli/api-keys.mdx`, `platform/integrations/slack.mdx` +**Existing examples**: `agents/cli/oz-cli/api-keys.mdx`, `platform/integrations/slack.mdx` **Template**: `.agents/templates/procedural.md` @@ -631,7 +631,7 @@ These rules apply regardless of content type: - Keep descriptions factual and concise — this is for lookup, not learning. - Include at least one practical example for each command or endpoint. -**Existing examples**: `reference/cli/index.mdx`, `reference/api-and-sdk/index.mdx` +**Existing examples**: `agents/cli/oz-cli/index.mdx`, `factories/api-and-sdk/index.mdx` **Template**: `.agents/templates/reference.md` @@ -653,7 +653,7 @@ These rules apply regardless of content type: - Provide workarounds when a fix isn't available. - Link to related troubleshooting pages and support channels. -**Existing examples**: `support-and-community/troubleshooting-and-support/known-issues.mdx`, `reference/cli/troubleshooting.mdx` +**Existing examples**: `support-and-community/troubleshooting-and-support/known-issues.mdx`, `agents/cli/oz-cli/troubleshooting.mdx` **Template**: `.agents/templates/troubleshooting.md` @@ -695,7 +695,7 @@ Direct answer with actionable information. Include links to relevant documentati **Template**: `.agents/templates/faq.md` -**Existing examples**: `agent-platform/getting-started/faqs.mdx`, `support-and-community/plans-and-billing/pricing-faqs.mdx` +**Existing examples**: `agents/getting-started/faqs.mdx`, `support-and-community/plans-and-billing/pricing-faqs.mdx` ### Tutorial (Guides section) @@ -758,7 +758,7 @@ This is the most common page type in Warp's docs (~75+ pages). A feature documen This is the type most prone to sprawl, precisely because it accepts the most kinds of content. If the page is growing past roughly 1500 words, split the procedures onto their own pages rather than adding another section. -**Existing examples**: `agent-platform/capabilities/skills.mdx`, `platform/environments.mdx` +**Existing examples**: `agents/capabilities/skills.mdx`, `platform/environments.mdx` **Template**: `.agents/templates/feature-doc.md` @@ -1086,8 +1086,9 @@ Content lives in `src/content/docs/`, organized by topic: - **code/** — Code editor, code review, git worktrees - **getting-started/** — Installation, quickstart, migration - **knowledge-and-collaboration/** — Warp Drive, teams, admin panel -- **agent-platform/** — Agent Platform (capabilities, local agents, cli agents, cloud agents) -- **reference/** — CLI and API/SDK reference +- **agents/** — Agent capabilities, local agents, CLI agents, and inference +- **platform/** — Standalone cloud-agent workflows, environments, triggers, integrations, and orchestration +- **factories/** — Warp Factories, including its API and SDK reference - **support-and-community/** — Troubleshooting, billing, privacy - **enterprise/** — Enterprise features, SSO, team management - **changelog/** — Release changelog @@ -1095,9 +1096,9 @@ Content lives in `src/content/docs/`, organized by topic: ### Content model The docs site has multiple levels of hierarchy: -- **Top-level section** (e.g., `src/content/docs/agent-platform/`) - - **Subsections** (e.g., `src/content/docs/agent-platform/capabilities/`) - - **Articles** (e.g., `src/content/docs/agent-platform/capabilities/skills.mdx`) +- **Top-level section** (e.g., `src/content/docs/agents/`) + - **Subsections** (e.g., `src/content/docs/agents/capabilities/`) + - **Articles** (e.g., `src/content/docs/agents/capabilities/skills.mdx`) We organize content in logical groupings that help people find what they are searching for. We aim to limit the layers of hierarchy, with few nested subcategories, which can make it difficult to find help. @@ -1128,8 +1129,8 @@ Pages use MDX with Starlight components: ### Sample doc URLs Documentation pages are published at `docs.warp.dev/`. For example: - `docs.warp.dev/terminal/blocks/block-basics` -- `docs.warp.dev/agent-platform/capabilities/skills` -- `docs.warp.dev/reference/cli` +- `docs.warp.dev/agents/capabilities/skills` +- `docs.warp.dev/agents/cli/oz-cli` ### OpenAPI spec -`developers/agent-api-openapi.yaml` is the OpenAPI spec for the Warp Agent API. +`developers/agent-api-openapi.yaml` is the OpenAPI spec for the Warp Platform API. diff --git a/developers/agent-api-openapi.yaml b/developers/agent-api-openapi.yaml index 15cacc01e..64bf2e25e 100644 --- a/developers/agent-api-openapi.yaml +++ b/developers/agent-api-openapi.yaml @@ -3080,7 +3080,7 @@ components: format: uri description: | A URI reference that identifies the problem type (RFC 7807). - Format: `https://docs.warp.dev/reference/api-and-sdk/troubleshooting/errors/{error_code}` + Format: `https://docs.warp.dev/factories/api-and-sdk/troubleshooting/errors/{error_code}` See PlatformErrorCode for the list of possible error codes. title: type: string diff --git a/src/content/docs/agents/inference/bring-your-own-api-key.mdx b/src/content/docs/agents/inference/bring-your-own-api-key.mdx index 2c6718a65..9e3e2418c 100644 --- a/src/content/docs/agents/inference/bring-your-own-api-key.mdx +++ b/src/content/docs/agents/inference/bring-your-own-api-key.mdx @@ -56,7 +56,7 @@ Your API key passes through Warp's servers each time you send a request, but War ::: :::caution -BYOK does not apply to [Cloud Agents](/platform/). Because your API keys are stored locally on your device, they are not available to cloud-hosted agent runs, which consume [Warp credits](/support-and-community/plans-and-billing/credits/). Enterprise teams that need their own keys to work with cloud agents can use [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/), which Warp stores server-side. +BYOK does not apply to [Cloud Agents](/platform/). Because your API keys are stored locally on your device, they are not available to cloud-hosted agent runs, which consume [Warp credits](/support-and-community/plans-and-billing/credits/). Business and Enterprise teams that need their own keys to work with cloud agents can use [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/), which Warp stores server-side. ::: When a model is selected using your own key: diff --git a/src/content/docs/enterprise/index.mdx b/src/content/docs/enterprise/index.mdx index c2945eebf..72f428ed5 100644 --- a/src/content/docs/enterprise/index.mdx +++ b/src/content/docs/enterprise/index.mdx @@ -35,7 +35,7 @@ Warp Enterprise serves three primary audiences: * **Zero Data Retention (ZDR)** - No customer data is retained, stored, or used for training by contracted LLM providers * **Open source client** - Warp's client code is published under [AGPL v3](https://github.com/warpdotdev/warp/blob/master/LICENSE-AGPL) at [`warpdotdev/warp`](https://github.com/warpdotdev/warp) for security review and audit * **Bring Your Own LLM (BYOLLM)** - Route inference through your own cloud infrastructure (AWS Bedrock or Google Cloud via Gemini Enterprise) -* **Team-managed API keys and endpoints** - Share provider API keys and custom endpoints across your team for both interactive sessions and cloud agents +* **Team-managed API keys and endpoints** - Share provider API keys and custom endpoints across your Business or Enterprise team for both interactive sessions and cloud agents * **Flexible deployment** - Choose Warp-hosted or hybrid deployment models * **Telemetry controls** - Configure what data is collected at the team level @@ -59,7 +59,7 @@ This section organizes Enterprise documentation to help you deploy, secure, and * **Getting started** - Installation, SSO setup, and onboarding for admins and developers * **Security and compliance** - Security overview and SSO configuration -* **Enterprise features** - Bring Your Own LLM (BYOLLM), team-managed API keys and endpoints, and the Analytics API +* **Enterprise features** - Bring Your Own LLM (BYOLLM), team-managed API keys and endpoints for Business and Enterprise plans, and the Analytics API * **Team management** - Admin panel, roles and permissions, and access controls ## Getting started diff --git a/src/content/docs/factories/deployment-patterns.mdx b/src/content/docs/factories/deployment-patterns.mdx index 9aede1878..1fbd9908b 100644 --- a/src/content/docs/factories/deployment-patterns.mdx +++ b/src/content/docs/factories/deployment-patterns.mdx @@ -32,15 +32,9 @@ See the [cloud agent run lifecycle](/platform/architecture/#cloud-agent-run-life ### What it looks like -* **Work intake**: Factory automations, configured integrations, Factory MCP, or factory endpoints -* **Execution**: {VARS.WARP_AUTOMATION_PLATFORM}-hosted environments (Docker-based) -* **Visibility**: Factory dashboard, session sharing, and APIs - -### Why teams choose it - -* You want the simplest path to reproducible, scalable cloud execution. -* You want to run many tasks in parallel without building your own sandboxing and scaling layer. -* You want a consistent "production" setup with standardized environments and centralized configuration. +* **Work intake** - factory automations, configured integrations, Factory MCP, or factory endpoints +* **Execution** - {VARS.WARP_AUTOMATION_PLATFORM}-hosted environments (Docker-based) +* **Visibility** - factory dashboard, session sharing, and APIs ### Send work to a factory diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx index 08733d347..d36427bf6 100644 --- a/src/content/docs/factories/index.mdx +++ b/src/content/docs/factories/index.mdx @@ -53,7 +53,7 @@ Warp Factories is for engineering teams with repeatable work that extends beyond * **Code forges and work sources** - Connect [GitHub](/factories/integrations/github/), [GitLab](/factories/integrations/gitlab/), [Azure DevOps](/factories/integrations/azure-devops/), or [another code forge](/factories/code-forges/other-code-forges/) to the repository your factory works in. Route work from [Slack](/factories/integrations/slack/), [Linear](/factories/integrations/linear/), [Jira](/factories/integrations/jira/), [custom webhooks](/factories/webhooks/), direct runs, or schedules. The [Factory MCP](/factories/factory-mcp/) connects coding agents and other MCP clients. * **Model and harness choice** - Each agent can use a different model and [supported harness](/platform/harnesses/), including the Warp Agent, Claude Code, and Codex. * **Measurement and self-improvement** - The [factory dashboard](/factories/factory-dashboard/) shows work-item status, runs, automations, costs, and benchmarks. [Scorers](/factories/measure-and-improve/scorers/) classify completed runs, [Benchmarks](/factories/benchmarks/) compare fixed tasks across configurations, and [Self-improvement](/factories/measure-and-improve/self-improvement/) turns repeated failures into follow-up work the factory proposes for review. -* **Infrastructure control** - Choose Warp-hosted or managed self-hosted execution on an eligible Enterprise plan. The [infrastructure and security](/factories/infrastructure-and-security/) page compares execution models and links to the self-hosting setup path, as well as available inference and credential controls. +* **Infrastructure control** - Choose Warp-hosted execution, or use managed self-hosted execution on an eligible Enterprise plan. The [infrastructure and security](/factories/infrastructure-and-security/) page compares execution models and links to the self-hosting setup path, as well as available inference and credential controls. ## How Warp Factories fits into Warp diff --git a/src/content/docs/factories/infrastructure-and-security.mdx b/src/content/docs/factories/infrastructure-and-security.mdx index f4b97ebe2..64660a837 100644 --- a/src/content/docs/factories/infrastructure-and-security.mdx +++ b/src/content/docs/factories/infrastructure-and-security.mdx @@ -58,7 +58,6 @@ A factory runs its work on one of two execution hosts: Warp-hosted compute or a | --- | --- | --- | | **Compute** | Warp provisions the sandbox | Your team provisions the worker | | **Checkout and commands** | Run on Warp-managed compute | Run on your infrastructure | -| **Control plane** | Runs through Warp | Runs through Warp | | **Network** | Warp manages sandbox connectivity | The worker connects outbound to Warp; no inbound firewall port | | **Private services** | Must be reachable from the hosted sandbox | Reachable through the worker's network access | | **Operations** | Warp manages capacity and lifecycle | Your team manages capacity, isolation, updates, and availability | @@ -83,7 +82,6 @@ Factories use managed self-hosting, so Warp still orchestrates their runs. The w | **[Kubernetes](/factories/self-hosting/managed-kubernetes/)** | As a Kubernetes Job in the worker's namespace | The worker deployment, cluster, namespace RBAC, scheduling, admission policy, and capacity | Your team already operates Kubernetes or needs cluster-native policy and scheduling | | **[Direct](/factories/self-hosting/managed-direct/)** | In a separate workspace directly on the worker host, sharing its OS and kernel | The worker daemon, host security, dependencies, capacity, and cleanup | A container runtime isn't available or runs need direct access to host resources | -All three structures keep execution on your infrastructure while Warp operates the control plane. ## Choose inference independently diff --git a/src/content/docs/platform/documentation-map.mdx b/src/content/docs/platform/documentation-map.mdx index dc601b04b..4b60deba3 100644 --- a/src/content/docs/platform/documentation-map.mdx +++ b/src/content/docs/platform/documentation-map.mdx @@ -1,5 +1,5 @@ --- -title: Cloud agent documentation map +title: Cloud agent and factory documentation description: >- Find the current documentation for standalone cloud-agent workflows, CLI tools, APIs, SDKs, and Warp Factories. @@ -8,7 +8,7 @@ sidebar: --- import { VARS } from '@data/vars'; -Use the {VARS.WARP_AUTOMATION_PLATFORM} documentation for standalone cloud-agent workflows. Use the Warp Factories documentation to build and operate a standing software factory. +Cloud-agent features and Warp Factories share APIs and execution infrastructure, but their setup paths differ. Use the {VARS.WARP_AUTOMATION_PLATFORM} documentation for standalone cloud-agent workflows. Use the Warp Factories documentation to build and operate a standing software factory. ## Choose the current documentation From 3826de732815d9cf967f6563ec155d4837efd298 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 04:53:58 +0000 Subject: [PATCH 63/63] docs: fix remaining guide paths Co-Authored-By: Oz --- .agents/skills/draft_guide/SKILL.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.agents/skills/draft_guide/SKILL.md b/.agents/skills/draft_guide/SKILL.md index 10587582b..a66d4b5c2 100644 --- a/.agents/skills/draft_guide/SKILL.md +++ b/.agents/skills/draft_guide/SKILL.md @@ -112,14 +112,14 @@ Before adding any internal documentation link: - **Verify the target page exists.** Check `src/sidebar.ts` for sidebar entries and the corresponding file under `src/content/docs/` to confirm the page exists. Do NOT generate plausible-looking URLs to pages that don't exist. - **If a target page is planned but not yet published**, link to the closest existing page and add a TODO comment with the intended future path: `` -- **For third-party CLI agent pages**, the current paths are under `src/content/docs/agent-platform/cli-agents/` (e.g., `claude-code.mdx`, `codex.mdx`, `opencode.mdx`). +- **For third-party CLI agent pages**, the current paths are under `src/content/docs/agents/cli-agents/` (e.g., `claude-code.mdx`, `codex.mdx`, `opencode.mdx`). ## Cross-linking Every guide should link to: - At least one other guide in the Guides section -- Relevant feature documentation in the main docs (`src/content/docs/` or `src/content/docs/agent-platform/`) -- If applicable, pages in the Third-Party CLI Agents section (`src/content/docs/agent-platform/cli-agents/`) +- Relevant feature documentation in the main docs (`src/content/docs/` or `src/content/docs/agents/`) +- If applicable, pages in the Third-Party CLI Agents section (`src/content/docs/agents/cli-agents/`) ## Pre-handoff self-review