diff --git a/.agents/logs/aeo_crosslink_audit_runs.md b/.agents/logs/aeo_crosslink_audit_runs.md index 90f884a2e..23c000ff6 100644 --- a/.agents/logs/aeo_crosslink_audit_runs.md +++ b/.agents/logs/aeo_crosslink_audit_runs.md @@ -7,3 +7,106 @@ This log tracks every run of the `aeo_crosslink_audit` skill — both runs that **Format**: see the `## Run log format` section in `.agents/skills/aeo_crosslink_audit/SKILL.md`. --- + +## 2026-08-31 — PR opened + +- **Run**: https://oz.warp.dev/runs/01a05855-a305-72b3-a85f-ce45a8ad7840 +- **Source signals**: Peec available, GSC available +- **PR**: https://github.com/warpdotdev/docs/pull/662 +- **Links proposed / added**: 11 proposed, 11 added +- **Pages touched**: src/content/docs/platform/harnesses/claude-code.mdx, src/content/docs/platform/harnesses/codex.mdx, src/content/docs/platform/self-hosting/index.mdx, src/content/docs/platform/handoff/index.mdx, src/content/docs/platform/orchestration/multi-agent-runs.mdx +- **Themes**: Claude Code/Codex cloud harnesses → schedules/Slack/orchestration; self-host observability and trigger routing; handoff/multi-agent launch paths to schedules, integrations, self-hosting +- **No-change reason**: N/A + +## 2026-08-24 — PR opened + +- **Run**: https://oz.warp.dev/runs/01a03449-1e89-737d-8dd1-825950d10c8c +- **Source signals**: Peec available, GSC available +- **PR**: https://github.com/warpdotdev/docs/pull/612 +- **Links proposed / added**: 5 proposed, 5 added +- **Pages touched**: src/content/docs/agents/cli-agents/codex.mdx, src/content/docs/agents/cli-agents/opencode.mdx, src/content/docs/factories/index.mdx, src/content/docs/factories/factory-agents.mdx, src/content/docs/platform/harnesses/index.mdx +- **Themes**: Remote Control parity for CLI agents; factories/harnesses → multi-agent orchestration; factory automations → schedules +- **No-change reason**: N/A + + +## 2026-08-17 — PR opened + +- **Run**: https://app.warp.dev/conversation/79e45390-6945-43b4-aa11-70e9ecd3061c +- **Source signals**: Peec available, GSC available +- **PR**: https://github.com/warpdotdev/docs/pull/546 +- **Links proposed / added**: 11 proposed, 11 added +- **Pages touched**: src/content/docs/platform/environments.mdx, src/content/docs/agents/cli-agents/remote-control.mdx, src/content/docs/agents/getting-started/agents-in-warp.mdx, src/content/docs/platform/viewing-cloud-agent-runs.mdx, src/content/docs/platform/handoff/local-to-cloud.mdx +- **Themes**: overnight cloud runs, session steering/Remote Control, multi-agent orchestration, environments as trigger runtime +- **No-change reason**: N/A + +## 2026-08-10 — PR opened + +- **Run**: https://oz.warp.dev/runs/019fec30-13d2-7203-99ec-82a84f84c908 +- **Source signals**: Peec available, GSC available +- **PR**: https://github.com/warpdotdev/docs/pull/497 +- **Links proposed / added**: 13 proposed, 13 added +- **Pages touched**: agents/cli-agents/overview.mdx, agents/cli-agents/claude-code.mdx, agents/getting-started/agents-in-warp.mdx, platform/triggers/scheduled-agents.mdx, platform/deployment-patterns.mdx, platform/software-factory.mdx +- **Themes**: schedules/background agents, remote control/observability, multi-agent orchestration journeys +- **No-change reason**: N/A + + +## 2026-08-03 — PR opened + +- **Run**: https://oz.warp.dev/runs/019fc823-8da1-7c1f-8fea-5be83c7ea3d5 +- **Source signals**: Peec available, GSC available +- **PR**: https://github.com/warpdotdev/docs/pull/453 +- **Links proposed / added**: 7 proposed, 7 added +- **Pages touched**: src/content/docs/platform/faqs.mdx, src/content/docs/agent-platform/capabilities/slash-commands.mdx, src/content/docs/platform/software-factory.mdx, src/content/docs/platform/agents.mdx, src/content/docs/platform/quickstart.mdx +- **Themes**: multi-agent orchestration discovery from FAQs, slash commands, software factory, agents, and cloud quickstart +- **No-change reason**: N/A + +## 2026-07-28 — No change + +- **Run**: https://app.warp.dev/conversation/356a1693-1140-4ac8-9de2-ef0995c04c60 +- **Source signals**: Peec available, GSC available +- **PR**: N/A +- **Links proposed / added**: 2 proposed, 0 added +- **Pages touched**: N/A +- **Themes**: heavy demand to run and manage multiple agents in parallel and to run Claude Code + Codex together; the CLI-agents overview and Harnesses in Oz pages omit links to the multi-agent guide and orchestration model +- **No-change reason**: existing open AEO cross-link PR #396 — skipped per dedupe rule + +## 2026-07-28 — No change + +- **Run**: https://oz.warp.dev/runs/019fa9e8-cff8-710d-b615-18d88edad918 +- **Source signals**: Peec unavailable, GSC unavailable +- **PR**: N/A +- **Links proposed / added**: N/A +- **Pages touched**: N/A +- **Themes**: none observed +- **No-change reason**: existing open PR #396 — skipped to avoid duplicate + +## 2026-07-28 — PR opened + +- **Run**: https://oz.warp.dev/runs/019fa9e8-cff8-710d-b615-18d88edad918 +- **Source signals**: Peec unavailable, GSC unavailable +- **PR**: https://github.com/warpdotdev/docs/pull/396 +- **Links proposed / added**: 3 proposed, 3 added +- **Pages touched**: src/content/docs/agent-platform/capabilities/slash-commands.mdx, src/content/docs/platform/faqs.mdx, src/content/docs/platform/software-factory.mdx +- **Themes**: agent/cloud-agent pages describe multi-agent coordination but omit links to the orchestration docs +- **No-change reason**: N/A + +## 2026-07-28 — Snapshot stale + +- **Run**: https://app.warp.dev/conversation/d77679e0-e39a-4e60-9e71-f08a6e3acfed +- **Source signals**: Peec unavailable, GSC unavailable +- **PR**: N/A +- **Links proposed / added**: N/A +- **Pages touched**: N/A +- **Themes**: none observed +- **No-change reason**: snapshot stale — 34 days old + +## 2026-07-27 — Snapshot stale + +- **Run**: https://app.warp.dev/conversation/b61aca9e-3f9b-40f4-ae5d-e1448b99160e +- **Source signals**: Peec unavailable, GSC unavailable +- **PR**: N/A +- **Links proposed / added**: N/A +- **Pages touched**: N/A +- **Themes**: none observed +- **No-change reason**: snapshot stale — 33 days old + diff --git a/.agents/logs/aeo_new_guide_recommendation_runs.md b/.agents/logs/aeo_new_guide_recommendation_runs.md index 6d74e665a..d72d58784 100644 --- a/.agents/logs/aeo_new_guide_recommendation_runs.md +++ b/.agents/logs/aeo_new_guide_recommendation_runs.md @@ -2,8 +2,26 @@ New entries are prepended by each scheduled agent run. Most recent entry first. -This log tracks every bi-weekly run of the `aeo_new_guide_recommendations` skill — both runs that produced briefs and runs that wrote a no-brief or stale-snapshot report — so the team can detect recurring topic gaps and answer questions like "has this topic been flagged before?" without replaying individual Oz runs. +This log tracks every monthly run of the `aeo_new_guide_recommendations` skill — both runs that produced briefs and runs that wrote a no-brief report — so the team can detect recurring topic gaps and answer questions like "has this topic been flagged before?" without replaying individual Oz runs. **Format**: see the `## Run log format` section in `.agents/skills/aeo_new_guide_recommendations/SKILL.md`. --- +## 2026-08-04 — Briefs produced + +- **Run**: https://app.warp.dev/conversation/32f89c4b-fdf9-4951-b2ae-3349b4fff171 +- **Source signals**: Peec available +- **Briefs produced**: 5 +- **Topics**: ssh-remote-coding-agents, self-hosted-code-boundary, professional-mac-agent-setup, agentic-dev-env-vs-ai-ide, multi-harness-cloud-orchestration +- **Repeat topics**: none +- **No-run reason**: N/A + +## 2026-08-04 — Briefs produced + +- **Run**: https://app.warp.dev/conversation/698c7f9d-a670-4a80-9a18-0f5b6c9fb506 +- **Source signals**: Peec available +- **Briefs produced**: 4 +- **Topics**: agent-pr-conversation-artifacts, multi-cli-agent-workspace, cloud-agent-realtime-observability, overnight-unattended-cloud-agents +- **Repeat topics**: none +- **No-run reason**: N/A + diff --git a/.agents/logs/afdocs_audit_runs.md b/.agents/logs/afdocs_audit_runs.md new file mode 100644 index 000000000..dfbc75354 --- /dev/null +++ b/.agents/logs/afdocs_audit_runs.md @@ -0,0 +1,26 @@ +# AFDocs audit run log + +Written by the `afdocs-audit` skill on every scheduled run — clean, regressed, or blocked. + +This log serves two purposes: + +1. **Regression baseline.** The skill compares each run's score and failing-check set against the most recent entry marked `valid`. Entries marked `blocked` are skipped for comparison: a Vercel Firewall challenge makes every check a false positive, so its score is an artifact rather than a measurement. +2. **Proof a quiet run happened.** The skill only posts to Slack on a regression or a blocked audit, so a clean run is silent. This log is what distinguishes "ran, nothing to report" from "did not run." + +Newest entries first. Prepend, do not append. + +Entry format: + +```markdown +## YYYY-MM-DD — [valid | blocked] +- **Score**: N/100 (grade) +- **Checks**: N total — N pass, N fail, N warn +- **Failing check ids**: comma-separated list, or "none" +- **Allowlisted**: N +- **Oz run**: [URL] +- **Notes**: [anything unusual] +``` + +For a `blocked` run, omit the score line rather than recording the meaningless value. + +--- diff --git a/.agents/logs/human_review_feedback.jsonl b/.agents/logs/human_review_feedback.jsonl index c7e4b1c60..8ea449783 100644 --- a/.agents/logs/human_review_feedback.jsonl +++ b/.agents/logs/human_review_feedback.jsonl @@ -1,9 +1,925 @@ +{"date": "2026-08-01", "pr": "447", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the broken-link checker to deduplicate and concurrently resolve external URLs, use browser-like request headers, retry transient network failures, classify 401/403/429 responses separately as bot-blocked unless `--strict` is used, and correct the skill documentation paths.\n\n## Concerns\nNo blocking correctness, security, or error-handling concerns found in the annotated diff.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-08-01", "pr": "447", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "", "tag": "", "pattern_category": "missing_media", "resolved_by": "human_edit"} +{"date": "2026-08-01", "pr": "447", "skill_used": "unknown", "file": "src/content/docs/knowledge-and-collaboration/teams.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-08-01", "pr": "447", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +17 -12 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "437", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the Pricing FAQs to document app and web entry points for Manage billing, consolidates cancellation guidance, and redirects the Teams billing link to the new FAQ anchor.\n\n## Concerns\n- The updated past-due payment guidance contradicts itself by saying paying the most recent invoice fully re-enables paid features while the next paragraph says multiple unpaid invoices keep the account past-due.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "437", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates billing FAQ copy to add web and app paths for Manage billing, consolidates cancellation guidance, and updates the Teams page to point at the new FAQ anchor. I found one non-blocking consistency issue in the Manage billing overview.\n\n## Concerns\n- The new overview says the billing portal can switch between monthly and annual billing, while the later monthly-to-annual FAQ directs that action to the Warp upgrade page.\n\n## Verdict\nFound: 0 critical, 0 important, 1 suggestions\n\n**Approve with nits**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "437", "skill_used": "unknown", "file": "src/content/docs/knowledge-and-collaboration/teams.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "437", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +17 -12 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "427", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds the 2026-07-31 weekly changelog entry and refreshes generated open-source license and telemetry reference content. The generated data updates look scoped to the release update workflow, with no security findings and no approved spec context to validate against.\n\n## Concerns\n- One changelog bullet exposes an internal icon symbol and reads like an implementation note rather than user-facing release copy; this is non-blocking.\n\n## Verdict\nFound: 0 critical, 0 important, 1 suggestions\n\n**Approve with nits**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "427", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +40 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "427", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +58 -38 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "427", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +11 -13 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "draft_guide", "file": "src/content/docs/enterprise/team-management/admin-panel.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "nice ty!", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-31", "pr": "426", "skill_used": "draft_guide", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +40 -0 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "draft_guide", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +58 -38 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "draft_guide", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +11 -13 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a first-class GitHub integration page and updates related docs to distinguish the native GitHub App integration from GitHub Actions and GitHub authorization. The added coverage is broad, but a few plan/scope summaries still conflict with the new GitHub integration content and would leave readers with incorrect eligibility or availability guidance.\n\n## Concerns\n- ⚠️ [IMPORTANT] `src/content/docs/platform/oz-web-app.mdx` still has an unchanged Quick reference row for `/integrations` that says the page lets users \"Connect Slack and Linear to trigger agents from external tools.\" Since this PR updates the Integrations section to include GitHub, that top-level row should also include GitHub so the page does not contradict itself.\n- ⚠️ [IMPORTANT] `src/content/docs/platform/team-access-billing-and-identity.mdx` still has unchanged Team access copy that lists integrations as Slack and Linear only, including the team capabilities and \"What requires a team\" sections. Upd", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "nice ty!", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +40 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "src/content/docs/enterprise/team-management/admin-panel.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-run-unattended-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +15 -3 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/github-actions.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +9 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/github.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +215 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "src/content/docs/platform/oz-web-app.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -5 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "src/content/docs/platform/team-access-billing-and-identity.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -8 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "src/content/docs/platform/triggers/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "src/content/docs/reference/cli/integration-setup.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +5 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "426", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +58 -38 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "425", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR removes the orphaned `cli/troubleshooting.mdx` stub and removes the matching sidebar entry so the `/cli/` section no longer links to an in-progress placeholder page. I did not find residual issues in the attached diff, and the spec context contains no approved commitments to compare against.\n\n## Concerns\n- None.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "425", "skill_used": "unknown", "file": "src/content/docs/cli/cloud-and-orchestration.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "425", "skill_used": "unknown", "file": "src/content/docs/cli/conversations.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -31 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "425", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "425", "skill_used": "unknown", "file": "src/content/docs/cli/troubleshooting.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -27 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "draft_docs", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +40 -0 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/team-management/admin-panel.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "draft_docs", "file": "src/content/docs/guides/agent-workflows/how-to-run-unattended-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +15 -3 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "draft_docs", "file": "src/content/docs/platform/integrations/github-actions.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +9 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "draft_docs", "file": "src/content/docs/platform/integrations/github.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +215 -0 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "draft_docs", "file": "src/content/docs/platform/integrations/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "draft_docs", "file": "src/content/docs/platform/oz-web-app.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -5 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "draft_docs", "file": "src/content/docs/platform/team-access-billing-and-identity.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -8 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "draft_docs", "file": "src/content/docs/platform/triggers/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "draft_docs", "file": "src/content/docs/reference/cli/integration-setup.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +5 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +58 -38 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +11 -13 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis docs-only PR updates Agent permissions copy to clarify how Run until completion interacts with the command denylist.\n\n## Concerns\n- The updated top caution still says Run until completion can bypass \"the denylist\" without qualifying that only the user's command denylist is bypassed and only when the bypass setting is enabled. That conflicts with the later caution and can keep the page misleading.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/agent-profiles-permissions.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +6 -4 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +40 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "unknown", "file": "src/content/docs/enterprise/team-management/admin-panel.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-run-unattended-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +15 -3 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/github.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +215 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "unknown", "file": "src/content/docs/platform/oz-web-app.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -5 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "unknown", "file": "src/content/docs/platform/team-access-billing-and-identity.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -8 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "424", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +58 -38 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "423", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR removes the unpublished `/cli/conversations/` stub page, drops its sidebar entry, and repoints the existing inbound CLI docs links to the consolidated agent conversations page anchors.\n\n## Concerns\n- No blocking concerns found. The attached spec context contains no approved or repository spec requirements to compare against, and the diff does not introduce security-relevant code or configuration changes.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "423", "skill_used": "unknown", "file": "src/content/docs/cli/cloud-and-orchestration.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "423", "skill_used": "unknown", "file": "src/content/docs/cli/conversations.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -31 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "423", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR establishes a dedicated Gemini Enterprise BYOLLM page, places it correctly beside the existing BYOLLM overview, and adds useful cross-links across Enterprise, inference, and billing content. The WIF, IAM, model-routing, and credential-lifecycle descriptions align with the shipped client and server implementation; publication still needs release-state, billing, cloud-agent-support, and verified-UI-surface corrections.\n\n## Concerns\n**Messaging and accuracy** — Clarify whether the public launch is intentional while the current production feature flag remains disabled, reconcile AI-credit and platform-credit language, and remove or verify the model-details UI claim.\n\n**Information architecture** — The new page and sidebar placement are appropriate, and the AWS/Gemini pages now cross-link bidirectionally. Update the provider comparison table so its cloud-agent column does not imply that Gemini Enterprise supports cloud agents.\n\n**Tone and style** — The new content follow", "tag": "", "pattern_category": "list_format", "resolved_by": "human_review"} +{"date": "2026-07-31", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Final re-review — accepted\n\nThe rework at `b6f32547def468d63663964c242c6e2e67e8cc95` resolves the four prior review items. I found no must-fix issues or follow-up polish.\n\nVerified:\n\n* **Credits** - No `80%` claim remains in `src/content/docs/`. The billing, BYOLLM overview, and Gemini Enterprise pages consistently state that customer-routed inference consumes no AI credits, provider inference is billed to the customer cloud account, and local runs still consume platform credits.\n* **Cloud agents** - The comparison table now distinguishes AWS Bedrock BYOLLM (**Yes**) from Gemini Enterprise BYOLLM (**No, interactive sessions only**). Related copy consistently scopes Gemini Enterprise to interactive requests and AWS Bedrock to current cloud-agent BYOLLM support.\n* **Model picker** - The unverified model-details label was removed. The remaining references describe only the Gemini Enterprise badge without asserting an unverified UI string.\n* **Regression checks** - The MDX table renders", "tag": "", "pattern_category": "list_format", "resolved_by": "human_review"} +{"date": "2026-07-31", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "Looks great, thank you for starting the first copy!! There are quite a few changes I'm going to make to the bulk of this. But left some comments on the non-meat part of this.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR establishes a dedicated Gemini Enterprise BYOLLM page, places it correctly beside the existing BYOLLM overview, and adds useful cross-links across Enterprise, inference, and billing content. The WIF, IAM, model-routing, and credential-lifecycle descriptions align with the shipped client and server implementation; publication still needs release-state, billing, cloud-agent-support, and verified-UI-surface corrections.\n\n## Concerns\n**Messaging and accuracy** — Clarify whether the public launch is intentional while the current production feature flag remains disabled, reconcile AI-credit and platform-credit language, and remove or verify the model-details UI claim.\n\n**Information architecture** — The new page and sidebar placement are appropriate, and the AWS/Gemini pages now cross-link bidirectionally. Update the provider comparison table so its cloud-agent column does not imply that Gemini Enterprise supports cloud agents.\n\n**Tone and style** — The new content follow", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Final re-review — accepted\n\nThe rework at `b6f32547def468d63663964c242c6e2e67e8cc95` resolves the four prior review items. I found no must-fix issues or follow-up polish.\n\nVerified:\n\n* **Credits** - No `80%` claim remains in `src/content/docs/`. The billing, BYOLLM overview, and Gemini Enterprise pages consistently state that customer-routed inference consumes no AI credits, provider inference is billed to the customer cloud account, and local runs still consume platform credits.\n* **Cloud agents** - The comparison table now distinguishes AWS Bedrock BYOLLM (**Yes**) from Gemini Enterprise BYOLLM (**No, interactive sessions only**). Related copy consistently scopes Gemini Enterprise to interactive requests and AWS Bedrock to current cloud-agent BYOLLM support.\n* **Model picker** - The unverified model-details label was removed. The remaining references describe only the Gemini Enterprise badge without asserting an unverified UI string.\n* **Regression checks** - The MDX table renders", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a new Gemini Enterprise (Vertex AI) BYOLLM page and updates related Enterprise, billing, inference, and sidebar references to treat Gemini Enterprise as a supported BYOLLM provider. The structure and link placement are generally consistent with the docs, and no approved spec context was provided for a spec-drift pass.\n\n## Concerns\n- The billing copy introduces `AI credits`, which conflicts with the docs terminology standard to use `credits` for the AI usage bucket.\n- The credential-security section says nothing sensitive leaves the customer's boundary, but the documented flow still sends request content and short-lived access tokens through Warp's backend; the claim needs to be narrowed to long-lived Google credentials.\n\n## Security\n- Narrow the boundary claim so customers do not infer that prompts, responses, or access tokens never pass through Warp during Gemini Enterprise routing.\n\n## Verdict\nFound: 0 critical, 3 important, 0 suggestions\n\n**Request changes**", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "Looks great, thank you for starting the first copy!! There are quite a few changes I'm going to make to the bulk of this. But left some comments on the non-meat part of this. ", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/agent-profiles-permissions.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +6 -4 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +40 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +41 -328 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/byollm-aws-bedrock.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +375 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +425 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -3 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/getting-started/getting-started-enterprise.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/security-and-compliance/security-overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/support-and-resources/billing.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/team-management/admin-panel.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -3 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-run-unattended-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +15 -3 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/platform/faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/github-actions.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +9 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/github.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +215 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/platform/oz-web-app.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -5 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/platform/team-access-billing-and-identity.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -8 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/platform/triggers/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/reference/cli/integration-setup.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +5 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +58 -38 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +11 -13 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "401", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR expands `src/content/docs/cli/configuration.mdx` from a placeholder into a full CLI configuration page covering the TOML settings file, agent-assisted edits, themes, statusline customization, and related pages.\n\n## Concerns\n- The page over-promises settings-file hot reload for theme changes made by editing the file or by asking the agent to edit the file; the current TUI applies rendered themes through `/theme` and startup, not generic settings-file reload.\n- The Windows settings path currently renders with doubled backslash separators.\n\n## Verdict\nFound: 0 critical, 2 important, 1 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "nit: why did we switch from using the handlebar variable here? it might be easier to keep it in case we swap out the name", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "same thing here about the variable", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "we've removed this", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "this is now default (i recently merged a PR that changes some of this so maybe worth having the agent rebase and compare again)", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Keeping the literal string here (declining the revert). The {{WARP_CLI}} handlebar token is not substituted in MDX frontmatter: Astro's content layer parses frontmatter outside Vite, so the vars-transform plugin never runs on it — we verified the built tags contained the literal \"{{WARP_CLI}}\" before switching to the literal name. Body prose still uses {VARS.WARP_CLI}, which does work, so a future rename is a one-line vars.ts change plus a frontmatter find/replace.", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Same as the title comment: keeping the literal name in the description. {{WARP_CLI}} isn't substituted in frontmatter (parsed outside Vite, so the vars-transform plugin doesn't run), which is why the description used the raw token before this change. Body prose keeps {VARS.WARP_CLI}, so a rename stays a one-line vars.ts change plus a frontmatter find/replace.", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in 678fd0b6. Confirmed against latest master (TuiStatuslineItem) that the auto-queue item was removed, so I dropped the \"Auto-queue next prompt indicator\" bullet.", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in 678fd0b6. Re-verified the whole statusline section against latest master (#14257/#14458): auto-approve and Vim mode indicator are now default-enabled (updated the intro's default list), added the new Vim mode indicator and GitHub pull request items, dropped the removed auto-queue item, and updated the auto-approve description (clickable toggle) and git diff description (now leads with files changed). The /statusline config flow, themes, and settings-file paths were re-checked and are unchanged.", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "sorry just chiming in on behalf of my agent - it's because the variable doesn't render in the title, but does in the rest of the page", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-31", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +115 -12 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "422", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a troubleshooting entry for MCP OAuth 2.0/2.1 interoperability issues and documents `mcp-remote` as a CLI server workaround. I reviewed the changed documentation, the linked MCP setup guidance, the command/config examples, and the available spec/security context; no blocking issues were found.\n\n## Concerns\n- None.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "422", "skill_used": "unknown", "file": "src/content/docs/support-and-community/troubleshooting-and-support/known-issues.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +48 -0 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "nit: this can be \"and Gemini Enterprise Agent Platform\". i dont think \"on vertex\" makes sense (though i think its fine if we add vertex in brackets like in `custom-inference-endpoint.mdx` since ppl prob still think of it as vertex).", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "i think its a little confusing that the bring your own llm page explains the aws bedrock config - but its a separate page for just BYOLLM: Gemini Enterprise? Maybe they can both be their own pages?", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/support-and-resources/billing.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "not related to gemini enterprise stuff specifically but wanted to callout here that it was intentional to remove this 80% callout to this new text instead?", "tag": "", "pattern_category": "callout", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "i think it's fine to remove the \"requires Warp `v0.2026.06.17`. not really important here.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "I'd prefer if we changed this to be something like \n\n**Session-based federated authentication** — Warp uses the member’s signed-in Warp session to issue a short-lived OIDC identity token, then exchanges it through Google Workload Identity Federation for temporary Google Cloud credentials.\n\nrather than focusing on what members **dont** run.", "tag": "", "pattern_category": "list_format", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "maybe the text instead can be \"Warp never stores service account keys, refresh tokens, or credential files. The client keeps only a short-lived Google Cloud access token in memory and automatically replaces it as it approaches expiration.\"\n\nAnd the title instead can be \"No long-lived credentials\"", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "i think we can remove this.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "\"and WIF provider audience string\" might be better here.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Not sure if this is actually the case, that gemini models are available by default for enterprise. Maybe instead just some generic copy like - ensure models you want to use in warp are enabled in your vertex.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "I'm going to manually update the rest of this file with a commit from this line onwards in this PR. Figured its easier than going back and forth.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Done — updated to \"Gemini Enterprise Agent Platform (Vertex AI)\" here, and applied the same fix to the identical phrasing in `custom-inference-endpoint.mdx` and `pricing-faqs.mdx` for consistency.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Done — removed the `v0.2026.06.17` requirement from the note.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Done — used your suggested wording verbatim: \"Session-based federated authentication — Warp uses the member's signed-in Warp session to issue a short-lived OIDC identity token, then exchanges it through Google Workload Identity Federation for temporary Google Cloud credentials.\"", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Done — retitled the bullet to \"No long-lived credentials\" and used your suggested copy.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Done — removed.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Done — updated to end with \"...and WIF provider audience string.\"", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Agreed, and done — split AWS Bedrock out into its own page: `src/content/docs/enterprise/enterprise-features/byollm-aws-bedrock.mdx`, mirroring the Gemini Enterprise page's structure (key features, how it works, enabling BYOLLM + cloud agents, routing/fallback, billing, security, troubleshooting, FAQ). `bring-your-own-llm.mdx` is now a short BYOLLM overview/hub page: what BYOLLM is, a provider comparison table, and a general FAQ, linking out to both dedicated setup guides. Updated the sidebar and the AWS-specific cross-references in `team-managed-keys-and-endpoints.mdx` and `byollm-gemini-enterprise.mdx` accordingly.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/support-and-resources/billing.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Yes, intentional — the flat 80% figure wasn't accurate (flagged in the first review round on this PR), so it was replaced with the correct model: customer-routed BYOLLM inference consumes no credits, and local agent runs still consume platform credits. While I was in there I also fixed \"AI credits\" → \"credits\" on this line (and added a link for AWS Bedrock) to match the terminology glossary — that lines up with the oz-for-oss suggestion on this same line too.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Understood — left everything from `### Prerequisites` onward untouched for your rewrite, including the model-availability wording from your comment above. The only edits I made further down the file are two mechanical link-path updates (the `#enabling-byollm-for-cloud-agents` references at what are now lines ~20 and ~265), since that section now lives on the new `byollm-aws-bedrock.mdx` page after the AWS Bedrock split — no wording or content changes in your section.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/support-and-resources/billing.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Addressed — updated to \"consumes no credits\" / \"does not charge credits\" on this line.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "maybe link aws bedrock page here as well (if we are linking gemini page)", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-30", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "i think its a little confusing that the bring your own llm page explains the aws bedrock config - but its a separate page for just BYOLLM: Gemini Enterprise? Maybe they can both be their own pages? ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/support-and-resources/billing.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "not related to gemini enterprise stuff specifically but wanted to callout here that it was intentional to remove this 80% callout to this new text instead? ", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "i think it's fine to remove the \"requires Warp `v0.2026.06.17`. not really important here. ", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "I'd prefer if we changed this to be something like \n\n**Session-based federated authentication** — Warp uses the member’s signed-in Warp session to issue a short-lived OIDC identity token, then exchanges it through Google Workload Identity Federation for temporary Google Cloud credentials.\n\nrather than focusing on what members **dont** run. ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "i think we can remove this. ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "\"and WIF provider audience string\" might be better here. ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "I'm going to manually update the rest of this file with a commit from this line onwards in this PR. Figured its easier than going back and forth. ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Done — removed the `v0.2026.06.17` requirement from the note.", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Understood — left everything from `### Prerequisites` onward untouched for your rewrite, including the model-availability wording from your comment above. The only edits I made further down the file are two mechanical link-path updates (the `#enabling-byollm-for-cloud-agents` references at what are now lines ~20 and ~265), since that section now lives on the new `byollm-aws-bedrock.mdx` page after the AWS Bedrock split — no wording or content changes in your section.", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/support-and-resources/billing.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Addressed — updated to \"consumes no credits\" / \"does not charge credits\" on this line.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "maybe link aws bedrock page here as well (if we are linking gemini page)", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR replaces placeholder CLI documentation with reference, model/usage, and troubleshooting content. The general structure is solid, but the API-key examples need safer secret-handling guidance before merge.\n\n## Concerns\n- The `--api-key` example encourages putting a Warp API key directly in the command line, where it can be captured in shell history or process listings.\n- The provider-key stdin example uses a plaintext `key.txt` file without warning users to avoid persistent or checked-in secret files.\n\n## Security\n- Update the API-key examples to prefer `WARP_API_KEY` or clearly warn about command-line exposure.\n- Add a caveat for stdin-based provider keys so users use a secure temporary file or secret-manager output rather than a long-lived plaintext file.\n\n## Verdict\nFound: 0 critical, 1 important, 1 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz", "tag": "", "pattern_category": "content_structure", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "approving to unblock but worth a rewrite of the api keys section because I just merged a change that significantly changes that flow", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/models-and-usage.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "was keeping `{VARS.WARP_CLI}` here intentional?", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/models-and-usage.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Could you ask an agent to rewrite this section? I just merged [this PR](https://github.com/warpdotdev/warp/pull/14472) which updates the api key flow and makes it a lot better/clearer in-app", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "probably merged after these docs were written, but there's now also a `--fast-forward` flag that auto-enables fast forward for TUI conversations (just for the session where that flag was ran)", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "this is now just `/api-keys` (per the comment above)", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "This no longer exists (per the comment above)", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/models-and-usage.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Yes, intentional. `{VARS.WARP_CLI}` works in body prose (real MDX import), but the `{{WARP_CLI}}` tokens in frontmatter weren't being substituted at build time (Astro's content layer parses frontmatter outside Vite), so built page titles showed the raw token — hence hardcoding just the frontmatter title/description (commits 68bd887/4bed38a) while body prose keeps the variable. Other cli/ pages still using `{{WARP_CLI}}` frontmatter are base-branch stubs that will need the same treatment at integration.", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/models-and-usage.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Rewrote in be16142 against the merged /api-keys flow (warpdotdev/warp#14472 + CODE-1930 spec). The section now covers the `/api-keys` menu: masked set/replace/clear for OpenAI/Anthropic/Google (saving an empty field or `Ctrl+X` clears), X Premium/SuperGrok connection via browser sign-in, and the Warp credit fallback toggle. Kept `--set-provider-api-key`/`--clear-provider-api-key` documented for scripting since the spec explicitly preserves them, with a note that X Premium/SuperGrok is managed only through `/api-keys`.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Added in be16142 — one naming note: the flag landed as `--auto-approve` (warpdotdev/warp#14483), matching the TUI's `/auto-approve` naming; there's no `--fast-forward` in TuiArgs on master. Documented with the session-scoped behavior: new conversations in that launch start with auto-approve on, still toggleable per conversation, saved settings unchanged.", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in be16142: the table now lists `/api-keys` (no argument) in place of `/add-api-key`, and the BYOK section in models-and-usage documents the new menu.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Removed in be16142. The `--clear-provider-api-key` command-line flag stays documented since it remains supported (the CODE-1930 spec lists removing the flags as a non-goal) — only the slash command is gone.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/models-and-usage.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +40 -10 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +266 -10 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "404", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR replaces the CLI permissions stub with a full page covering permission cards, auto-approve, and settings-file execution profiles. The overall structure is appropriate, and no approved spec context was available to compare against.\n\n## Concerns\n- The execution profile TOML example can weaken command-approval protections if copied because it replaces the built-in command denylist with only two entries.\n\n## Security\n- The sample `command_denylist` should not imply that `rm` and `curl` are sufficient denylist coverage; users need to preserve or intentionally extend the default denylist.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "404", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "nice! Just had a few additions for functionality that was merged recently (last night lol)", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "I feel like this isn't quite the right summary of our permissions model, and makes it sound more unsafe than it is. Like you can set the permissions to `agent_decides` so that the agent will decide on how safe an action is, but you could also require every single action to get approval or make it so no actions need approval", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "this probably wasn't merged when you wrote these docs (I merged last night), but you can also now run the TUI w/ the `--fast-forward` flag (so like `warp --fast-forward`) to auto-enable fast forward for all new conversations. This is like the claude code `--dangerously-skip-permissions` flag", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "The \"commands matching your command denylist still require approval\" actually isn't true anymore. There's a new setting that you can flip to change it so that denylisted commands _do_ require approval even when fast forward is on (`auto_approve_bypasses_command_denylist`), but this setting defaults to on (i.e. fast forward bypasses the command denylist). The one exception is that workspace level denylisted commands still require approval no matter what", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in fe8e58d. Reframed the intro and \"How permissions work\" around per-action-type configuration rather than implying the agent always self-judges safety: each action type is set independently to `always_ask`, `always_allow`, or `agent_decides`, and the section now explicitly calls out that you can set everything to `always_ask` to review every action or `always_allow` for an agent that never stops to ask. The CLI-specific defaults (`agent_decides` for commands/edits/reads/MCP, `always_ask` for `write_to_pty` and `run_agents`, verified against `AIExecutionProfile::default_profile_for_tui`) are now described as defaults rather than as the model itself.", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Added in fe8e58d. One naming note: the flag as merged is `--auto-approve`, not `--fast-forward` — warpdotdev/warp#14483 (\"Add --auto-approve to Warp Agent CLI\"), `TuiArgs::auto_approve` in `crates/warp_tui/src/session.rs`. So the page documents `warp --auto-approve`, which also keeps it consistent with `/auto-approve` and `Ctrl+Shift+I` on the same page.\n\nThe Auto-approve section now reads: toggle with `/auto-approve` or `Ctrl+Shift+I`, or launch with `warp --auto-approve` to start every new conversation in that session with it already on. I also corrected the follow-on sentence — new conversations start with auto-approve off *unless* you launched with the flag, since `TuiConversationSelection` applies the launch default to each new conversation even after you toggle one off.\n\nHeads up that `--auto-approve` also needs to land in the flags table on `cli/reference.mdx`; that page is a stub owned by a separate PR on this stack, so I left it alone here.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in fe8e58d. Confirmed against `can_autoexecute_command` in `app/src/ai/blocklist/permissions.rs` and the setting definition in `app/src/settings/ai.rs` (`auto_approve_bypasses_command_denylist`, `default: true`, surfaced on all surfaces): with auto-approve on, the user denylist is bypassed and only `get_org_execute_commands_denylist` is enforced.\n\nThe caution is now a `:::danger` and says auto-approve runs denylisted commands by default, shows how to turn the bypass off:\n\n```toml\n[agents.warp_agent.other]\nauto_approve_bypasses_command_denylist = false\n```\n\n...and notes that team-enforced denylist rules from the Admin Panel always require approval regardless of the setting. I also updated the `command_denylist` bullet in the profile-fields list, which previously claimed the denylist applies \"regardless of other settings.\"\n\nOne downstream thing this surfaces: the GUI page at `agent-platform/capabilities/agent-profiles-permissions.mdx` still has two statements that are now stale — l", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/models-and-usage.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +40 -10 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +77 -14 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +266 -10 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "402", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR replaces the stub CLI cloud-and-orchestration page with full documentation for handoff, resuming cloud conversations, orchestration approval, and child-agent management. The content is broadly scoped to the intended page, and the provided artifacts do not surface security or spec-context concerns.\n\n## Concerns\n- The new page hardcodes rename-sensitive Oz web app terminology and URL text instead of using the docs variable system. Apply the inline fix and update the other new `Oz web app` references on this page the same way.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "402", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "nice! Just a few thoughts and clarifications ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "402", "skill_used": "unknown", "file": "src/content/docs/cli/cloud-and-orchestration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "idk if this is a flow we want to encourage too heavily until we have a better cloud to local story for the TUI. Like resuming is possible in the TUI, but it's not super intuitive. Might be better to suggest that folks view the conversation in the web app as a first step if they want to see the work the agent did?", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "402", "skill_used": "unknown", "file": "src/content/docs/cli/cloud-and-orchestration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Could also mention that cloud child agents can also use the claude and codex harnesses", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "402", "skill_used": "unknown", "file": "src/content/docs/cli/cloud-and-orchestration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "could be good to mention that you can also ask the agent to use specific models for orchestration allowing for more token efficient use (like you can use open source models to do research with an opus parent or something)", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "402", "skill_used": "unknown", "file": "src/content/docs/cli/cloud-and-orchestration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Also the \"No child agents launch until you approve\" isn't _quite_ right. There's a setting that you can change to let orchestration run without approval", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "402", "skill_used": "unknown", "file": "src/content/docs/cli/cloud-and-orchestration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "It's possible I merged this change after you generated the docs, but you can now also ctrl + c to kill a child agent (and remove its tab) when the toolbar is focused and you're viewing a child agent. You can also double ctrl + c to close a child agent when the child agent's input is focused (like how you can ctrl c from the parent agent to close the entire TUI)", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "402", "skill_used": "unknown", "file": "src/content/docs/cli/cloud-and-orchestration.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +95 -10 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "402", "skill_used": "unknown", "file": "src/content/docs/cli/models-and-usage.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +40 -10 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "402", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +77 -14 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "402", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +266 -10 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR replaces the stub `src/content/docs/cli/agent-conversations.mdx` page with a complete feature doc for agent conversation behavior in the Warp CLI, including transcript streaming, tool calls, diffs, questions, task lists, planning, and copying/exporting output. The content is scoped to the changed page, uses the repository's variable conventions already present in the stub, and links to related agent capabilities.\n\n## Concerns\n- No blocking correctness, security, or documentation-structure concerns found in the attached diff.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "nice! approving to unblock but had a few small thoughts", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "nit, but I feel like this is a little overly detailed? not sure how our other docs look/read but I feel like this UI info isn't as necessary and might become inaccurate as we make small styling changes", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "idk if this is possible, but could we make this in progress dot yellow?", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "same question here around a green checkmark", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "I think this section should also cover the conversations menu which I think is the main way folks will resume conversations in the TUI. Attaching a demo below:\nhttps://www.loom.com/share/dc054b8fca374155981f58c9a7c3aaef", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Agreed — trimmed in 819d3a8. Dropped the prompt-row marker and the elapsed-time progress indicator, since both are pure styling that would drift. Kept the two durable bits: the response streams in, and `Ctrl+C` stops one that's in progress.\n\n> The agent's response streams into the transcript below your prompt as it's generated. Press `Ctrl+C` once to stop a response that's still in progress.\n\nOn \"how our other docs read\": the house style is to describe UI by name and function rather than by appearance, so this is the right call for the rest of the CLI pages too.\n", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Done in 819d3a8 — and it's accurate to what ships. In `crates/warp_tui/src/agent_block_sections.rs`, `todo_status_glyph` maps `TodoStatus::InProgress` to `attention_glyph_style()`, which resolves to the active terminal theme's ANSI yellow.\n\nImplemented as a small `.glyph-attention` utility (`src/styles/warp-components.css` §20) rather than an inline style, using Starlight's mode-aware `--sl-color-orange-high` token instead of a fixed hex — Starlight's orange hue is amber, so it reads as terminal yellow while staying legible when the page flips to light mode.\n", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Done in 819d3a8 — same mechanism, `.glyph-success` → `--sl-color-green-high`, matching `success_glyph_style()` (theme ANSI green) for `TodoStatus::Completed`.\n\nLeft the `◌` pending glyph uncolored, since it renders in normal foreground text. Every glyph keeps its text label, so meaning never depends on color alone.\n", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Good call — done in 819d3a8. **Resuming conversations** now leads with the menu instead of the exit command:\n\n> There are two ways to pick a past conversation back up:\n> * **The conversation menu** - The quickest route, and the one to reach for most of the time. From a running session, open the [conversation menu](#conversation-history) with `/conversations` or `←`, filter to the conversation you want, and open it.\n> * **`warp --resume`** - Reopens a specific conversation from your shell as the CLI starts, without going through the menu.\n\nThe `--resume` printout still follows, so the exit path is covered without being framed as the primary one.\n\nTwo related notes from the demo:\n- The menu is searchable (`query_conversation_entries` in `conversation_menu.rs`), which the page never said. Added \"Start typing to filter the list by title\" to **Conversation history**.\n- I didn't embed the Loom — it's a share link, and docs video embeds go through `<VideoEmbed>`. Happy to add a short GIF of t", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +117 -14 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/cloud-and-orchestration.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +95 -10 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/models-and-usage.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +40 -10 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +77 -14 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +266 -10 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "394", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the `weekly-404-monitor` skill to match the Docs Agent environment: it switches the Slack token reference to `BUZZ_SLACK_TOKEN`, documents the hardcoded `#growth-docs` channel ID, requires draft PRs for redirect automation, and adds the one-time schedule creation command.\n\n## Concerns\n- No blocking concerns found in the annotated diff.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "394", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -143 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "394", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/artifacts-in-prs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +60 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "394", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/browser-use.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +55 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "394", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +137 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "394", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/testing-and-recordings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +129 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "394", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/mcp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -3 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "394", "skill_used": "unknown", "file": "src/content/docs/enterprise/team-management/admin-panel.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-30", "pr": "394", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/linear-mcp-retrieve-issue-data.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "421", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR refreshes `package-lock.json` so it is consistent with `package.json` for Vercel's `npm ci` install path, adding the missing optional `@emnapi` transitive entries and updating lockfile peer metadata.\n\n## Concerns\n- No blocking correctness, security, or spec-alignment concerns found in the annotated diff. `spec_context.md` reports no approved or repository spec context for this PR.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "421", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/mcp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -3 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "421", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/linear-mcp-retrieve-issue-data.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "419", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the Linear MCP examples in the docs from the retired `/sse` endpoint to the current `/mcp` endpoint and renames the direct URL example to reflect Streamable HTTP.\n\n## Concerns\n- None found.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "419", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/mcp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -3 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "419", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/linear-mcp-retrieve-issue-data.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "418", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the missing_docs drift-watch surface map and refreshed snapshot bookkeeping for internal/TUI-only surfaces, moved computer-use docs paths, removed flags, and newly detected Factory API routes. I found one material bookkeeping issue in the new Factory API mapping.\n\n## Concerns\n- The Factory routes are tied to the non-GA `FactoryMcp` flag in the refreshed snapshot, but the map marks them as permanently `internal`; this bypasses the existing `gated:<Flag>` mechanism that would re-surface the API docs/spec decision when the flag promotes.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "413", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates `brace-expansion` from 5.0.7 to 5.0.8 in `package-lock.json` and adds a package override to remediate CVE-2026-14257. The lockfile pins the patched tarball and the new package engine range remains compatible with this repository's Node 20.19+/22.12+/24 requirement.\n\n## Concerns\n- The new override uses a broad lower-bound range rather than pinning the patched dependency version, which makes future non-`npm ci` installs less deterministic.\n\n## Security\n- Supply-chain remediation should be reproducible; pinning the override to `5.0.8` avoids accidental future major-version resolution while still fixing the vulnerability.\n\n## Verdict\nFound: 0 critical, 0 important, 1 suggestions\n\n**Approve with nits**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "412", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use/index.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Good catch — the settings reference is correct: runs started from the Warp app always carry an explicit value from the app's `cloud_agent_computer_use_enabled` setting (default off on stable), so the server-side unset default never applies to them. Narrowed the wording here and called out the Warp-app exception in the Warp app settings section.", "tag": "", "pattern_category": "scannability", "resolved_by": "human_review"} +{"date": "2026-07-29", "pr": "412", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use/index.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Fixed — the example now nests `computer_use_enabled` and `environment_id` under `config`, and the prose references `config.computer_use_enabled`.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-29", "pr": "412", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the Computer Use docs and OpenAPI schema copy to describe Computer Use as enabled by default when the run configuration omits the setting. I found two documentation correctness issues that would leave readers with conflicting or non-working guidance.\n\n## Concerns\n- The Oz API example still shows `computer_use_enabled` and `environment_id` as top-level request fields even though the OpenAPI schema exposes them under `config`, so users may send a request that does not apply the intended setting.\n- The new default-on wording conflicts with the existing settings reference for `cloud_agent_computer_use_enabled`, which still documents the default as `false`.\n\n## Verdict\nFound: 0 critical, 2 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "412", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/index.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Good catch — the settings reference is correct: runs started from the Warp app always carry an explicit value from the app's `cloud_agent_computer_use_enabled` setting (default off on stable), so the server-side unset default never applies to them. Narrowed the wording here and called out the Warp-app exception in the Warp app settings section.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "412", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/artifacts-in-prs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "412", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/browser-use.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "412", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -5 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "412", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/testing-and-recordings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "410", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "Structure here is great! Thanks for the improvements @danielpeng2 :smiley_cat:", "tag": "", "pattern_category": "content_structure", "resolved_by": "human_review"} +{"date": "2026-07-29", "pr": "410", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use/index.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "TBH this is probably something I should've added, but can we include something about videos here? Maybe with a link to the \"testing and recordings\" subpage?", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-29", "pr": "410", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use/index.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "done", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-29", "pr": "410", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR restructures the Computer Use documentation into a nested section, adds browser-use and pull-request artifact pages, updates the sidebar, and adds a redirect for the moved recordings page. The navigation shape and moved-page redirect are coherent, but several changed docs bypass the product-name variable system for rebrandable Oz names.\n\n## Concerns\n- New Computer Use pages hardcode `Oz CLI`, `Oz web app`, and `https://oz.warp.dev` instead of using `VARS`, which the docs style guide requires for new files.\n- The existing recordings page also adds a hardcoded `Oz CLI` reference despite already importing `VARS`.\n\n## Verdict\nFound: 0 critical, 2 important, 1 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "410", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "Structure here is great! Thanks for the improvements @danielpeng2 :smiley_cat:", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "410", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/index.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "TBH this is probably something I should've added, but can we include something about videos here? Maybe with a link to the \"testing and recordings\" subpage?", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "410", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -153 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "410", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/artifacts-in-prs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +60 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "410", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/browser-use.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +55 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "410", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +135 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "410", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use/testing-and-recordings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -12 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "410", "skill_used": "unknown", "file": "src/content/docs/enterprise/team-management/admin-panel.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "this will be just interactive for now, not cloud agents", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-29", "pr": "407", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "we're going to launch this on thurs july 30", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-29", "pr": "407", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "this will be just interactive for now, not cloud agents", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in 1c6b6aea: WARP_API_KEY=[REDACTED] warp is now the primary non-interactive auth example; --api-key stays documented secondarily with a caution that command-line arguments can be captured in shell history and process listings. The troubleshooting sign-in section now also lists the environment variable first.", "tag": "", "pattern_category": "content_structure", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "405", "skill_used": "unknown", "file": "src/content/docs/cli/reference.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in 1c6b6aea: the stdin example now pipes from a secret manager (tool-agnostic placeholder) instead of a persistent key.txt, with a note to avoid plaintext key files and delete any temporary file immediately afterward.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in 15572666. Removed `command_denylist` from the minimal example and added a caution: omitting the field keeps the built-in default denylist, while setting it replaces the defaults entirely (verified against the settings deserialization on master: omitted fields fall back to the built-in profile defaults, and a set list is used as-is with no merging), so readers are told to extend the generated list in settings.toml instead of writing a short list from scratch.", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "this does not feel necessary to include to an end user", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "this feels like too much to explain to a user, you're basically just describing the UI in plain words at this point", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "this also feels like describing UI rather than anything novel to the user, can we simplify or combine with another section?", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in d6bd6e12. Cut the card-anatomy walkthrough; the section now leads with one sentence and lists only the non-obvious actions (Other, E shortcuts, Esc-while-editing).", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in d6bd6e12. Merged Reviewing commands (and Reviewing file edits) into Approving agent actions; each is now a single bullet keeping only the E shortcut and the Esc-while-editing gotcha. No other pages linked to the removed anchors.", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "404", "skill_used": "unknown", "file": "src/content/docs/cli/permissions-and-profiles.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in d6bd6e12. Deleted the progress-row control bullet and folded the remaining toggles into one sentence (/auto-approve or Ctrl+Shift+I).", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "402", "skill_used": "unknown", "file": "src/content/docs/cli/cloud-and-orchestration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed page-wide in a2d88827: all \"Oz web app\" mentions now use {VARS.WEB_APP} and the environments link is built from VARS.WEB_APP_URL. Verified the built page still renders the name and https://oz.warp.dev/environments correctly; npm run build green.", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "402", "skill_used": "unknown", "file": "src/content/docs/cli/cloud-and-orchestration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "let's add in some screenshot here", "tag": "", "pattern_category": "missing_media", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in 6167a16a: the settings-file section now says most edits apply without a restart, with the color theme called out as the exception (applied by /theme or at the next startup).", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in 6167a16a: aligned with the settings-file wording — most agent edits apply immediately, but theme changes take effect when you run /theme or restart the CLI. Also scoped the Themes section's immediate-apply claim to /theme.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "401", "skill_used": "unknown", "file": "src/content/docs/cli/configuration.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Verified byte-for-byte: the MDX source and the built HTML both contain single backslashes (%LOCALAPPDATA%\\warp\\Warp\\config\\cli\\settings.toml renders as <code>%LOCALAPPDATA%\\warp\\Warp\\config\\cli\\settings.toml</code> with one backslash per separator). The doubled backslashes appear to be a diff-view escaping artifact; no source change needed.", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "i don't think it's worth mentioning this markdown rendering stuff, not that useful to an end user", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "i don't think the scrolling stuff is necessary, can we simplify that? feels self-explanatory", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "again, this also feels unnecessary for a user to know, you can mention this high level, but i don't think you need to be super detail oriented here", "tag": "", "pattern_category": "missing_context", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Done in 05fdfdd9 — cut the scroll-up/scroll-down and pinned-to-newest narration. The section now covers only the prompt row, the progress indicator, and Ctrl+C to stop the response.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Done in 05fdfdd9 — collapsed the bulleted list (and the Markdown rendering H3; nothing links to its anchor) into two sentences that keep only the non-obvious caveats: Mermaid renders as source, images show alt text, very long code blocks truncate.", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-29", "pr": "399", "skill_used": "unknown", "file": "src/content/docs/cli/agent-conversations.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Done in 05fdfdd9 — kept the high-level statement (inline status row with glyph + label) and the four navigation bullets, dropped the pending/running/finished/failed glyph state detail. Also swept the rest of the page with the same lens (menu how-tos, click-to-collapse, and double/triple-click narration removed).", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "392", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the AEO cross-link audit skill to use live Peec MCP access with `PEEC_PAT` instead of committed Peec snapshots, and adjusts the monthly improvement skill's Peec-unavailability remediation guidance.\n\n## Concerns\n- The monthly improvement skill's Peec-unavailability pattern still looks for `Peec: unavailable`, but the run log format records availability as `Peec unavailable` under `Source signals`; this can prevent the outer-loop skill from detecting repeated `PEEC_PAT` or MCP outages.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "392", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the AEO cross-link audit skills to use Peec MCP through a PAT instead of committed snapshots, and adds a monthly improvement step that merges the standing audit-log PR before analysis.\n\n## Concerns\n- The new monthly skill workflow automatically merges the standing log PR using write credentials without first verifying that the PR is log-only and safe to merge.\n- The same workflow refreshes the checkout with `git reset --hard`, which can discard uncommitted workspace changes.\n\n## Security\n- The automated `gh pr merge` step should validate the PR contents/status or avoid merging entirely by reading the log from the branch; otherwise an unexpected change on the standing branch could be merged into `main` by the agent.\n\n## Verdict\nFound: 0 critical, 2 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "385", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds permanent redirects for `/agents/using-agents/agent-permissions` with and without a trailing slash to the existing agent profiles permissions documentation page.\n\n## Concerns\n- No blocking concerns found in the annotated diff.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_verdict", "severity": "important", "comment": "## Overview\nAdds a dedicated `Testing with Computer Use and video recordings` page, trims the `Recording sessions` section on `computer-use.mdx` to a teaser that links out, and wires the new page into the sidebar. The structure matches the approved outline, the PR-attachment wording is accurate and correctly scoped, and the troubleshooting section's failure modes all trace to real error strings in the client. Two areas need work before merge: the recording-feature descriptions are stated as unconditional when they are Linux-only, and the example section ships reader-facing links that point at internal/authoring surfaces.\n\n## Concerns\n**Platform scope of the recording features is missing and makes the page factually wrong on macOS.** `What's in a recording` presents the smart cut, action overlays, and click ripples/drag trails as properties of every recording. In the client they are produced only by the Linux post-processing pass: `post_process_recording` in `crates/computer_use/src/lib", "tag": "", "pattern_category": "content_structure", "resolved_by": "human_review"} +{"date": "2026-07-28", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nRe-review of head `7ee0590` against my prior pass. All four blocking findings are genuinely fixed, not just claimed: the `Platform support` bullet now scopes the smart cut, overlays, and pointer annotations to the Linux post-processing pass and correctly describes the macOS 4x uniform speedup, matching `post_process_recording`'s `cfg` gate and the `mac/recording.rs` `setpts` filter; the staging conversation link and all three `:::note` callouts pointing at PR #374 are gone; the internal-voice sentence is rewritten; the tracking claim is scoped to successful interactive calls; and the two missing troubleshooting causes (feature flag not enabled, platform not supported) are both accurate against `create_recorder` and the `VideoRecording` flag checks. Gates re-verified independently on this head: CI 8/8 green, `npm run build` clean at 349 pages, style lint clean on the changed files, 0 broken links across 3168 internal links.\n\n## Concerns\n**One residual scoping gap, non-blocki", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_review"} +{"date": "2026-07-28", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_verdict", "severity": "important", "comment": "This mostly LGTM, few things we should address though!", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-28", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_verdict", "severity": "important", "comment": "## Overview\nRe-review at head `daa3850`. The human review's direction was followed well: the invocation paragraph is in, internal tool-call names are gone from every section, the Cloud-mode wording and the two link targets are corrected (`/platform/oz-web-app/#runs` resolves to a real `## Runs` heading), the example prompt is rewritten, and the troubleshooting section is cut back hard. I independently confirmed the new limit figures against `warp-server`: `config/base.yaml` sets `computer_use_recording.max_duration: 10m` and `max_size_bytes: 1073741824`, so 10 minutes / 1 GiB are correct, with no environment override. I also confirmed the deletions left nothing dangling — no references anywhere in `src/` to the removed subsections, no orphaned anchors, and 0 broken links across the site. I treat the two reversals of my earlier findings (PR-attachment scoping, the Linux/macOS caveat) as settled and am not relitigating either. One blocking issue remains, and it is a single sentence.\n\n## ", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_review"} +{"date": "2026-07-28", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nFinal pass at head `644216a`, scoped to the two-item delta over `daa3850`. Both are correctly applied. The `computer-use.mdx` teaser now reads \"are attached to the pull request description when a cloud agent run produces them\", which matches the new page's statement that attachment is automatic once the recording artifact is associated with the run — the two pages no longer contradict each other and the disavowed wording is gone from the PR entirely. The `Recording failed to start` subsection was removed cleanly: no dangling anchor, no in-page or cross-page reference to it anywhere in `src/`, no sidebar impact, code fences still balanced, and `Retry guidance` still covers the failure path end to end (\"if a recording fails or produces an unexpected result\" → check the error, retry, file an issue if it repeats), so the intro's promise to explain \"how to handle common recording failures\" is still met. Regression sweep is clean: build 349 pages, style lint clean on the changed ", "tag": "", "pattern_category": "code_fence", "resolved_by": "human_review"} +{"date": "2026-07-28", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_verdict", "severity": "important", "comment": "## Overview\nRe-review at head `5d759c3`, focused on independently verifying that every change @vkodithala requested is actually reflected in the current file content rather than just marked resolved. Eleven of his twelve inline requests check out against the shipped text; one is only partially applied and publishes a link whose label names a different, already-documented feature. Gates re-verified on this head: CI 8/8 green, `npm run build` clean, 0 broken links across 3179 internal links, style lint clean on the lines this PR touches (the three style-lint hits in `computer-use.mdx` are on pre-existing lines 28/65/69, untouched here). I also loaded the Vercel preview and walked the rendered page: sidebar entry lands directly under \"Computer use\", `{VARS.WEB_APP}` resolves to \"Oz web app\" with no raw tokens, and `/platform/oz-web-app/#runs` jumps to a real \"Runs\" heading.\n\n## Concerns\n**The \"In Warp\" link labels the session-sharing page with a different feature's name (blocking).** The ", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_review"} +{"date": "2026-07-28", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nRe-review at head `02c10cbd`. The new commit replaces both \"example video is pending\" placeholders with three real, self-hosted demo clips, adds a Loom walkthrough, sharpens all three example prompts, and strips the em dashes from the bullets and Related list. I checked the rendered preview: all three `DemoVideo` clips load, play, and loop, showing the Warp tab-group setting, the Oz web app New run flow, and the #13480 Ctrl+C repro respectively; posters follow the component's `<basename>.poster.jpg` convention and resolve. Gates re-verified on this head: CI 8/8 green, `npm run build` clean, 0 broken links across 3179 internal links. My prior CHANGES_REQUESTED was pinning `reviewDecision` on a stale head; this approval supersedes it. Nothing here blocks merge.\n\n## Concerns\n**Carried forward, now non-blocking: the \"In Warp\" link text.** The anchor still reads \"cloud-synced conversation\" while resolving to `/platform/viewing-cloud-agent-runs/` (\"Cloud agent session sharing\"). ", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_review"} +{"date": "2026-07-28", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "@vkodithala do you have a sample recording handy that we could show as a demo here? or better yet, do you have a public loom demo that we could share?", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-28", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "otherwise i think this PR is good for you to take a final pass", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-28", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Yeah, generally the copy here lgtm after the agent's second pass. Working on adding video embeds for the three examples under \"Example recordings\", and then I'll push these docs up. Also working on a Loom that'll be top-level in this page.", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_review"} +{"date": "2026-07-28", "pr": "374", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a focused `Recording sessions` section to the Computer Use capability page, documenting screenshots, video recording, run outputs, and sandbox-local capture boundaries. I found no blocking docs, security, link, structure, or spec-alignment issues; `spec_context.md` reports no approved repository spec context for this PR.\n\n## Concerns\n- No blocking concerns.\n\n## Verdict\nFound: 0 critical, 0 important, 1 suggestion\n\n**Approve with nits**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "374", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "important", "comment": "## Overview\nAdds a dedicated `Testing with Computer Use and video recordings` page, trims the `Recording sessions` section on `computer-use.mdx` to a teaser that links out, and wires the new page into the sidebar. The structure matches the approved outline, the PR-attachment wording is accurate and correctly scoped, and the troubleshooting section's failure modes all trace to real error strings in the client. Two areas need work before merge: the recording-feature descriptions are stated as unconditional when they are Linux-only, and the example section ships reader-facing links that point at internal/authoring surfaces.\n\n## Concerns\n**Platform scope of the recording features is missing and makes the page factually wrong on macOS.** `What's in a recording` presents the smart cut, action overlays, and click ripples/drag trails as properties of every recording. In the client they are produced only by the Linux post-processing pass: `post_process_recording` in `crates/computer_use/src/lib", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "374", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nRe-review of head `7ee0590` against my prior pass. All four blocking findings are genuinely fixed, not just claimed: the `Platform support` bullet now scopes the smart cut, overlays, and pointer annotations to the Linux post-processing pass and correctly describes the macOS 4x uniform speedup, matching `post_process_recording`'s `cfg` gate and the `mac/recording.rs` `setpts` filter; the staging conversation link and all three `:::note` callouts pointing at PR #374 are gone; the internal-voice sentence is rewritten; the tracking claim is scoped to successful interactive calls; and the two missing troubleshooting causes (feature flag not enabled, platform not supported) are both accurate against `create_recorder` and the `VideoRecording` flag checks. Gates re-verified independently on this head: CI 8/8 green, `npm run build` clean at 349 pages, style lint clean on the changed files, 0 broken links across 3168 internal links.\n\n## Concerns\n**One residual scoping gap, non-blocki", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "374", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "important", "comment": "This mostly LGTM, few things we should address though!", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "374", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "important", "comment": "## Overview\nRe-review at head `daa3850`. The human review's direction was followed well: the invocation paragraph is in, internal tool-call names are gone from every section, the Cloud-mode wording and the two link targets are corrected (`/platform/oz-web-app/#runs` resolves to a real `## Runs` heading), the example prompt is rewritten, and the troubleshooting section is cut back hard. I independently confirmed the new limit figures against `warp-server`: `config/base.yaml` sets `computer_use_recording.max_duration: 10m` and `max_size_bytes: 1073741824`, so 10 minutes / 1 GiB are correct, with no environment override. I also confirmed the deletions left nothing dangling — no references anywhere in `src/` to the removed subsections, no orphaned anchors, and 0 broken links across the site. I treat the two reversals of my earlier findings (PR-attachment scoping, the Linux/macOS caveat) as settled and am not relitigating either. One blocking issue remains, and it is a single sentence.\n\n## ", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "374", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nFinal pass at head `644216a`, scoped to the two-item delta over `daa3850`. Both are correctly applied. The `computer-use.mdx` teaser now reads \"are attached to the pull request description when a cloud agent run produces them\", which matches the new page's statement that attachment is automatic once the recording artifact is associated with the run — the two pages no longer contradict each other and the disavowed wording is gone from the PR entirely. The `Recording failed to start` subsection was removed cleanly: no dangling anchor, no in-page or cross-page reference to it anywhere in `src/`, no sidebar impact, code fences still balanced, and `Retry guidance` still covers the failure path end to end (\"if a recording fails or produces an unexpected result\" → check the error, retry, file an issue if it repeats), so the intro's promise to explain \"how to handle common recording failures\" is still met. Regression sweep is clean: build 349 pages, style lint clean on the changed ", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "374", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "important", "comment": "## Overview\nRe-review at head `5d759c3`, focused on independently verifying that every change @vkodithala requested is actually reflected in the current file content rather than just marked resolved. Eleven of his twelve inline requests check out against the shipped text; one is only partially applied and publishes a link whose label names a different, already-documented feature. Gates re-verified on this head: CI 8/8 green, `npm run build` clean, 0 broken links across 3179 internal links, style lint clean on the lines this PR touches (the three style-lint hits in `computer-use.mdx` are on pre-existing lines 28/65/69, untouched here). I also loaded the Vercel preview and walked the rendered page: sidebar entry lands directly under \"Computer use\", `{VARS.WEB_APP}` resolves to \"Oz web app\" with no raw tokens, and `/platform/oz-web-app/#runs` jumps to a real \"Runs\" heading.\n\n## Concerns\n**The \"In Warp\" link labels the session-sharing page with a different feature's name (blocking).** The ", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "374", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nRe-review at head `02c10cbd`. The new commit replaces both \"example video is pending\" placeholders with three real, self-hosted demo clips, adds a Loom walkthrough, sharpens all three example prompts, and strips the em dashes from the bullets and Related list. I checked the rendered preview: all three `DemoVideo` clips load, play, and loop, showing the Warp tab-group setting, the Oz web app New run flow, and the #13480 Ctrl+C repro respectively; posters follow the component's `<basename>.poster.jpg` convention and resolve. Gates re-verified on this head: CI 8/8 green, `npm run build` clean, 0 broken links across 3179 internal links. My prior CHANGES_REQUESTED was pinning `reviewDecision` on a stale head; this approval supersedes it. Nothing here blocks merge.\n\n## Concerns\n**Carried forward, now non-blocking: the \"In Warp\" link text.** The anchor still reads \"cloud-synced conversation\" while resolving to `/platform/viewing-cloud-agent-runs/` (\"Cloud agent session sharing\"). ", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "374", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Yeah, generally the copy here lgtm after the agent's second pass. Working on adding video embeds for the three examples under \"Example recordings\", and then I'll push these docs up. Also working on a Loom that'll be top-level in this page.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "374", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +129 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-28", "pr": "374", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +10 -0 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-27", "pr": "391", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds the `kimi-k3-fireworks` hosted Fireworks AI model to the model choice documentation table.\n\n## Concerns\n- No blocking concerns found. The change is a single docs table-row addition, has no security-relevant behavior, and there is no approved spec context for implementation drift checks.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-27", "pr": "391", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-27", "pr": "388", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates missing-docs audit bookkeeping only: it maps the Warp Agent CLI-only `/theme` slash command and `appearance.theme` setting as internal exceptions, and refreshes the surface snapshot for newly observed feature flags, CLI flags, API routes, slash commands, settings, and Oz web routes.\n\n## Concerns\n- No blocking concerns found. The changed files are reference data only, the added surface-map entries match the audit parser's expected `key -> target` format, and the security pass found no security-relevant changes.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-27", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "nit: \"If you started the session from Terminal view\" probably isn't correct. What we're referring to here is cloud conversations that are opened in the local Warp agent UI, as transcripts. Internally we refer to this as \"Cloud Mode\", but we should call this whatever we do in other areas of the docs.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-27", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "I believe this link maps to the wrong page. This maps to \"cloud agent session sharing\", which is actually the right link for my comment above around \"Terminal view\"/Cloud mode. For this link, we should link to a section (if one exists) of the Oz web app documentation around individual agent runs.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-27", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "There are a few issues here:\n1. We shouldn't be referencing agent internals here, like the names of specific tool calls configured.\n2. I don't actually think this is correct. From grokking `warp-server`, I'm pretty sure that we attach reported videos and screenshots deterministically to PRs when they're attached to a run in our artifacts DB.", "tag": "", "pattern_category": "image_alt", "resolved_by": "human_review"} +{"date": "2026-07-27", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Do we have docs around macOS runners anywhere else? I believe this is a feature we're launching soon but may not already be out? Check through `warp-agent-docker` to confirm, and if it's not already released, we can safely omit.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-27", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Drive-by: we should explicitly reference how recordings can be _invoked_. A user shouldn't need to explicitly ask for a recording, though they can if desired. Asking for an agent to \"test a change\" or \"produce evidence\" should work all the same.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-27", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "The prompt here should be something like: `could you add a new feature to tab groups where new tab groups get a random color by default (that's different from already-used colors)? Chrome has this feature and i quite like it, i.e. i open up a new tab group that's Red, and then the next tab group i open is Yellow, etc. this should be disabled by default and exposed as a Setting users can toggle on. test these changes thoroughly`, but make it much more elegant and formal. I will post the recording directly later.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-27", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "We shouldn't include this. Recordings are enabled for all surfaces (prod, staging, local). There is no surface where the agent cannot record.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-27", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "This is also never reached. `ffmpeg` is available on all dev boxes.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-27", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Actually, this entire section \"Recording failed to start\" doesn't need to exist. It can be collapsed into something like \"if a recording fails to start, simply retry it\" with a very, very brief explanation that these errors are typically transient with our recording substrate and should be filed as issues with our open-source client repo if seen sefveral times.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-27", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Remove all of this. Way too granular and unnecessary for users.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-27", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Mention what this time and size limit is! It's server-configured, so just refer to `warp-server` for the source of truth.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-27", "pr": "374", "skill_used": "draft_feature_doc", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "This is great, and can replace all of the sections from earlier.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-27", "pr": "374", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "I believe this link maps to the wrong page. This maps to \"cloud agent session sharing\", which is actually the right link for my comment above around \"Terminal view\"/Cloud mode. For this link, we should link to a section (if one exists) of the Oz web app documentation around individual agent runs.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-27", "pr": "374", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "There are a few issues here:\n1. We shouldn't be referencing agent internals here, like the names of specific tool calls configured.\n2. I don't actually think this is correct. From grokking `warp-server`, I'm pretty sure that we attach reported videos and screenshots deterministically to PRs when they're attached to a run in our artifacts DB.", "tag": "", "pattern_category": "missing_media", "resolved_by": "human_edit"} +{"date": "2026-07-27", "pr": "374", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "The prompt here should be something like: `could you add a new feature to tab groups where new tab groups get a random color by default (that's different from already-used colors)? Chrome has this feature and i quite like it, i.e. i open up a new tab group that's Red, and then the next tab group i open is Yellow, etc. this should be disabled by default and exposed as a Setting users can toggle on. test these changes thoroughly`, but make it much more elegant and formal. I will post the recording directly later.", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "377", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR correctly updates the Anthropic model-choice table with all five selectable Claude Opus 5 variants and backfills the selectable low/medium variants for Fable 5, Sonnet 5, and Opus 4.8. The model IDs, effort labels, default mappings, and scope match the ticket and the authoritative picker sources; Astro content/type validation and internal-link checks pass, and the failing SSR/Vite build step reproduces identically on clean main.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\n**Approve**\n\n## Review run\nhttps://oz.staging.warp.dev/runs/019f9565-f753-78f4-9699-74f5f6260e18", "tag": "", "pattern_category": "scannability", "resolved_by": "human_review"} +{"date": "2026-07-24", "pr": "377", "skill_used": "draft_docs", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +102 -59 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "377", "skill_used": "draft_docs", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +182 -43 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "377", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the Agent model choice documentation by adding Claude Opus 5 variants and filling in missing low/medium rows for current Anthropic model families. The change is limited to the Anthropic model table and follows the page's existing table format.\n\n## Concerns\n- No blocking concerns found in the annotated diff.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "377", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR correctly updates the Anthropic model-choice table with all five selectable Claude Opus 5 variants and backfills the selectable low/medium variants for Fable 5, Sonnet 5, and Opus 4.8. The model IDs, effort labels, default mappings, and scope match the ticket and the authoritative picker sources; Astro content/type validation and internal-link checks pass, and the failing SSR/Vite build step reproduces identically on clean main.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\n**Approve**\n\n## Review run\nhttps://oz.staging.warp.dev/runs/019f9565-f753-78f4-9699-74f5f6260e18\n", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "377", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +11 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "377", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +102 -59 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "377", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +182 -43 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "375", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates missing_docs audit bookkeeping by adding surface-map decisions for newly documented computer-use flags, TUI-only slash commands and settings, and an internal onboarding flag, then refreshes the generated surface snapshot to the latest extracted surfaces and changelog baseline.\n\n## Concerns\n- No blocking correctness, security, or spec-alignment concerns found in the attached diff.\n- `spec_context.md` states no approved or repository spec context was found for this PR.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "375", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +11 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "375", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +102 -59 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "375", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +182 -43 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "373", "skill_used": "draft_docs", "file": "src/content/docs/platform/runners.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "macOS isn't live yet - this is a very limited preview (reviewer flagged that the draft presented a limited-preview capability as generally available).", "tag": "", "pattern_category": "feature_status_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "373", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/runners.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "macOS isn't live yet - this is a _very_ limited preview", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-24", "pr": "373", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/runners.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Good catch — updated so macOS isn't presented as generally available. The key-features bullet now reads \"macOS runners are in limited preview,\" and I added the same note to the `--os macos` caution. Left the CLI flags documented since they exist, just flagged the status.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-24", "pr": "373", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a new Cloud agent runners documentation page and adds it to the Platform sidebar under Managing agents. The runner concepts and CLI flags match the available CLI source, and the internal links point to existing docs pages.\n\n## Concerns\n- The new page hardcodes the rename-sensitive `Oz CLI` product string instead of using the docs variable system. Because this is a new file, it should use `{{WARP_AGENT_CLI}}` in frontmatter and `{VARS.WARP_AGENT_CLI}` in body prose/links so future product renames apply automatically.\n- No security findings: the changes are documentation/sidebar only and do not introduce executable code, configuration that changes runtime behavior, or secrets handling.\n- No spec-drift findings: `spec_context.md` says no approved or repository spec context was found for this PR.\n\n## Verdict\nFound: 0 critical, 1 important, 1 suggestions\n\nRequest changes\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "373", "skill_used": "unknown", "file": "src/content/docs/platform/runners.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +121 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "372", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds the 2026.07.23 weekly changelog entry to `src/content/docs/changelog/2026.mdx`. I reviewed the attached diff, PR description, security considerations, and spec context; the change is docs-only, has no approved spec context to compare against, and does not introduce security-relevant code or configuration.\n\n## Concerns\n- One added settings path should follow the docs style guide's per-segment bold menu-path formatting.\n\n## Verdict\nFound: 0 critical, 0 important, 1 suggestions\n\n**Approve with nits**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "372", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +97 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "370", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the transitive `js-yaml` dependency resolution to 4.3.0 via an npm override and refreshes the lockfile entry accordingly.\n\n## Concerns\n- No blocking correctness or security concerns found in the attached diff.\n- `spec_context.md` reports no approved or repository spec context, so there is no spec drift to evaluate.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "370", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "Resolved merge conflicts in package.json/package-lock.json (kept both the js-yaml ^4.3.0 override and the vite ^8.0.13 override from #378). js-yaml resolves to 4.3.0 across the tree, and the docs site builds cleanly (348 pages, Vercel output produced). LGTM.", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "370", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +11 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "370", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +97 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "370", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +102 -59 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "370", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +182 -43 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "lg, ty!", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-24", "pr": "315", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR expands two guides with written, step-by-step procedures for PR review and Ollama setup. The structure is useful, but the Ollama benchmarking section documents a command that will not produce the timing stats it tells readers to compare.\n\n## Concerns\n- The `ollama run` benchmark example needs `--verbose` before it can show token timing stats.\n- The runnable GitHub CLI examples use angle-bracket placeholders instead of the docs style's ALL_CAPS placeholder values.\n\n## Verdict\nFound: 1 critical, 0 important, 1 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "315", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "lg, ty!", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "315", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +97 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "315", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +102 -59 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "315", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +182 -43 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-24", "pr": "315", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/add-on-credits.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "367", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR attempts to auto-fix two UI reference formatting issues and refreshes the `validate_ui_refs` snapshot.\n\n## Concerns\n- The snapshot refresh appears to over-expand nested settings subsections for Agents leaf pages and duplicates Code subsections, which would reduce validator precision.\n- The MDX auto-fixes introduce a field-formatting regression and a missing space in image alt text.\n- `spec_context.md` reports no approved or repository spec context, so there is no material spec drift to review.\n\n## Verdict\nFound: 0 critical, 4 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "image_alt", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "367", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the UI reference validation skill, refreshes the valid paths snapshot for settings sections, and applies one generated documentation formatting fix.\n\n## Concerns\n- The fallback path for updating an existing `fix/ui-refs-*` PR does not clean up an unmerged working tree after `git stash pop` conflicts, so the subsequent new-PR fallback can run from a conflicted checkout.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "367", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/add-on-credits.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "365", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis dependency-only PR updates Astro/Starlight/Vercel-related packages, sharp, and lockfile transitive dependencies. The attached spec context contains no approved or repository spec commitments for this PR, and the security pass found no new application-code security concerns.\n\n## Concerns\n- None.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "365", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/add-on-credits.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "362", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the all-settings reference to remove the stale `agents.model` entry and document `agents.voice.voice_input_language` plus execution profiles. The voice language entry and stale-model removal line up with the local source context, and the supplied spec context contains no approved repository spec commitments to enforce.\n\n## Concerns\n- The execution profiles entry documents the setting as if `execution_profiles` lives inside `[agents.execution_profiles]`, which points users at `agents.execution_profiles.execution_profiles` instead of the actual `agents.execution_profiles` setting.\n- The same entry uses the deprecated **Settings** > **AI** > **Profiles** path instead of the current **Settings** > **Agents** > **Profiles** path.\n\n## Verdict\nFound: 0 critical, 2 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "362", "skill_used": "unknown", "file": "src/content/docs/terminal/more-features/markdown-viewer.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +22 -2 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "362", "skill_used": "unknown", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "356", "skill_used": "draft_docs", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "approving but left one comment, thanks for putting this together!", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-23", "pr": "356", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a new “Copy agent prompt” action to the existing docs page Copy dropdown, stores the generated prompt in a template element, and wires the button to copy it with the existing toast feedback.\n\n## Concerns\n- No blocking correctness, security, or spec-alignment concerns found in the annotated diff.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "356", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a Copy agent prompt item to the existing CopyPageButton dropdown and generates page-type-specific prompt text from the page URL at build time. The implementation reuses the existing hidden-template and clipboard-copy pattern, and the supplemental security pass did not identify security-sensitive changes.\n\n## Concerns\n- No blocking concerns found.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "356", "skill_used": "unknown", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Should `Enter` be formatted? Let's check the style guide.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-23", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\nOllama exposes an OpenAI-compatible REST API at `http://localhost:11434/v1/`. You can drop it in wherever you're currently using the OpenAI API by updating these three values:\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-23", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Rewrite without em dash.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-23", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Should we give the following Python and Node.js examples an introduction??", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-23", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Use which agent, the Warp agent? Also, update to remove the em dash. Too much em dash in this guide.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-23", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Too much em dash.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-23", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\nTo benchmark models side-by-side, Warp makes it easy to run prompts in parallel tabs and compare results. Pass a prompt and the `--verbose` flag to get timing stats alongside the response:\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-23", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Let's move this up to line 214. \"Next, explore related guides and features:\"", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-23", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\nWith context attached, give the agent a clear, goal-oriented prompt. Keep it direct. Focused prompts produce more actionable output than heavy templates. For example:\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-23", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Too much em dash.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-23", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "i think what we have right now is fine!", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-23", "pr": "315", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Should `Enter` be formatted? Let's check the style guide.", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "315", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Let's move this up to line 214. \"Next, explore related guides and features:\"", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-23", "pr": "315", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "```suggestion\nWith context attached, give the agent a clear, goal-oriented prompt. Keep it direct. Focused prompts produce more actionable output than heavy templates. For example:\n```", "tag": "", "pattern_category": "missing_context", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "363", "skill_used": "draft_docs", "file": ".agents/skills/missing_docs/references/feature_surface_map.md", "feedback_type": "review_comment", "severity": "suggestion", "comment": "can we take a pass to make sure we say `Warp Agent CLI` (or whatever the product name is from this Slack thread depending on what Kevin says https://warpdev.slack.com/archives/C0BA99TSDB2/p1784736111233409)", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-22", "pr": "363", "skill_used": "draft_docs", "file": ".agents/skills/missing_docs/references/feature_surface_map.md", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Good call — done in e256274. Renamed the internal `TUI`/`warp-tui` references in the slash-command and settings surface-map comments to the `Warp Agent CLI` product name (keeping the `crates/warp_tui` code reference for engineers). Happy to switch to a different name if Kevin lands on something else in that Slack thread.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-22", "pr": "363", "skill_used": "draft_docs", "file": ".agents/skills/missing_docs/references/feature_surface_map.md", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Addressed in e256274 — both the slash-command and settings comment blocks now refer to the **Warp Agent CLI** product name instead of \"TUI\"/`warp-tui`, keeping `crates/warp_tui` only as an internal code pointer. Confirmed against the Slack thread that `Warp Agent CLI` is the finalized product name (Kevin + Olivia).", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-22", "pr": "363", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the missing_docs audit bookkeeping references: it maps several Warp Agent CLI-only slash commands as internal exceptions, records `OscHyperlinks` as a preview feature to ignore until promotion, and refreshes the surface snapshot for current flags, slash commands, settings, and server tools. I did not find correctness, docs-structure, security, or spec-alignment issues in the attached diff.\n\n## Concerns\n- No blocking concerns found.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "363", "skill_used": "unknown", "file": "src/content/docs/terminal/more-features/markdown-viewer.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +22 -2 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "363", "skill_used": "unknown", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "362", "skill_used": "draft_docs", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Fixed in b12c068. Moved `execution_profiles` to be a key under the `[agents]` section, since the source `toml_path` is `agents.execution_profiles` (a single object setting). Removed the `[agents.execution_profiles]` subsection that implied `agents.execution_profiles.execution_profiles`.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-22", "pr": "362", "skill_used": "draft_docs", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Fixed in b12c068. Updated the path to **Settings** > **Agents** > **Profiles** to match the current terminology and the profiles page.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-22", "pr": "362", "skill_used": "unknown", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed in b12c068. Updated the path to **Settings** > **Agents** > **Profiles** to match the current terminology and the profiles page.", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "360", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a caution note to the Tab Configs documentation explaining that `commands` entries run sequentially and that long-running or interactive commands such as `ssh` block any later commands in the same pane.\n\n## Concerns\nNo blocking correctness, security, or spec-alignment concerns found. The provided spec context states that no approved or repository spec context was found for this PR.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "360", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tab-configs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates UI reference paths across several docs pages and refreshes `.agents/skills/validate_ui_refs/valid_paths.json`. The individual docs edits are mostly narrow, but the regenerated validation metadata now includes non-UI tokens and duplicated subsection data, which would make future UI reference validation unreliable.\n\n## Concerns\n- `.agents/skills/validate_ui_refs/valid_paths.json` appears polluted with source-code/comment words as settings pages and duplicated subsection entries, so invalid settings paths could pass validation while real pages may be represented incorrectly.\n- Two docs edits have formatting regressions: image alt text lost spacing/uses Markdown emphasis, and an API response field was changed from code formatting to bold UI-style formatting.\n- No security-specific findings; the diff only changes documentation and generated validation metadata.\n- No spec-drift findings; `spec_context.md` reports no approved or repository spec context for this PR.", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates UI reference wording across several docs pages and regenerates `.agents/skills/validate_ui_refs/valid_paths.json`. The page-level wording fixes are mostly mechanical, but the generated reference data appears corrupted and a couple of doc-formatting changes regress existing content.\n\n## Concerns\n- `.agents/skills/validate_ui_refs/valid_paths.json` now includes non-page prose tokens and overly broad sub-section lists, which can make the UI reference validator accept invalid Settings paths.\n- The regenerated command list now includes internal/debug commands as valid docs references.\n- Two markdown formatting changes convert existing plain/code text into less accurate output.\n\n## Verdict\nFound: 0 critical, 3 important, 2 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR refreshes UI reference validation data and updates documentation paths from the old AI settings location to the Agents umbrella. The direction is right, but the regenerated reference data is internally inconsistent around `Oz` versus `Warp Agent`, and a couple of auto-fixes introduced documentation formatting regressions.\n\n## Concerns\n- The refreshed `valid_paths.json` now extracts a `Warp Agent` settings section while the preserved umbrella/deprecated mappings and the changed docs still route users through `Oz`; this weakens validation for all `Settings > Agents > Oz > ...` paths and risks documenting the wrong visible UI label.\n- One image alt text now contains markdown emphasis with a missing space, which harms accessibility.\n- One API response field was changed from code formatting to UI-style bold formatting.\n\n## Verdict\nFound: 0 critical, 2 important, 1 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 t", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the UI reference validator snapshot, adds guidance for verifying shared-source Settings subpages, and changes stale Settings paths across the docs.\n\n## Concerns\n- One updated guide now sends readers looking for autonomy/permission controls to the Oz subpage even though those controls live under Profiles.\n- The refreshed `valid_paths.json` still includes incorrect duplicated sub-sections for the Code umbrella subpages, which can make invalid Settings paths pass validation.\n\n## Verdict\nFound: 0 critical, 2 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-edit-agent-code-in-warp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/warp-vs-claude-code.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "src/content/docs/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-railway.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "src/content/docs/guides/configuration/trigger-reusable-actions-with-saved-prompts.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "src/content/docs/guides/getting-started/how-to-customize-warps-appearance.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/contributing.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "358", "skill_used": "unknown", "file": "src/content/docs/terminal/input/universal-input.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -3 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "356", "skill_used": "draft_docs", "file": "src/components/CopyPageButton.astro", "feedback_type": "review_comment", "severity": "suggestion", "comment": "I'm not sure if `Walk me through setting this up` will always apply either - e.g. if I'm on some terminal page that walks through a feature like Windows or Tabs, there is nothing for the user to 'set up'\n\nIt may be more of `Explain this feature to me...`", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-22", "pr": "356", "skill_used": "draft_docs", "file": "src/components/CopyPageButton.astro", "feedback_type": "review_comment", "severity": "suggestion", "comment": "I think both could still be useful. /reference covers the Oz CLI, API, and SDKs, so a prompt like “Help me use this API reference to ...” could help users apply the documentation\n\nFor changelog pages, we could use something like “Explain this update and whether I need to take any action or any new features I should know about : {{link}}.”", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-22", "pr": "356", "skill_used": "unknown", "file": "src/components/CopyPageButton.astro", "feedback_type": "review_comment", "severity": "important", "comment": "I think both could still be useful. /reference covers the Oz CLI, API, and SDKs, so a prompt like “Help me use this API reference to ...” could help users apply the documentation\n\nFor changelog pages, we could use something like “Explain this update and whether I need to take any action or any new features I should know about : {{link}}.”", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates `@astrojs/rss` from `4.0.18` to `4.0.19` in `package.json` and `package-lock.json`. The attached release notes describe a patch release that hardens RSS feed generation by escaping additional item fields.\n\n## Concerns\n- No blocking correctness, security, or spec-alignment concerns found in the attached diff.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-edit-agent-code-in-warp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/warp-vs-claude-code.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-railway.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/guides/configuration/trigger-reusable-actions-with-saved-prompts.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/guides/getting-started/how-to-customize-warps-appearance.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +42 -16 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/contributing.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/terminal/input/universal-input.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -3 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/terminal/more-features/markdown-viewer.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +22 -2 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "349", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tab-configs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds the first phase of a product-name variable system for the docs site, including a `VARS` data module, a Vite transform for frontmatter tokens, path alias support, and authoring guidance/templates. I found two correctness issues that should be fixed before merge: the transform rewrites body content while claiming body token examples are safe, and the style-lint guidance documents enforcement that the diff does not implement.\n\n## Concerns\n- The Vite transform performs replacement across the entire `.mdx` source, so known-token examples in body prose or code fences can be silently changed instead of only frontmatter being transformed.\n- The style-lint skill now says hardcoded product-name strings are reported, but no corresponding `style_lint.py` check is added in this PR.\n\n## Verdict\nFound: 0 critical, 2 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/slash-commands.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-routers.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-edit-agent-code-in-warp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/warp-vs-claude-code.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-railway.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/guides/configuration/trigger-reusable-actions-with-saved-prompts.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/guides/getting-started/how-to-customize-warps-appearance.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +42 -16 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/reference/cli/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +17 -0 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/contributing.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/terminal/input/universal-input.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -3 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/terminal/more-features/markdown-viewer.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +22 -2 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "347", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tab-configs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds the missing `code.editor.auto_save` entry to the all-settings reference. The documented path, behavior summary, type, and default align with the source registration, and the attached spec context contains no approved or repository spec commitments to validate against.\n\n## Concerns\n- No blocking concerns found.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/slash-commands.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-routers.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-edit-agent-code-in-warp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/warp-vs-claude-code.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-railway.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/guides/configuration/trigger-reusable-actions-with-saved-prompts.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/guides/getting-started/how-to-customize-warps-appearance.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +42 -16 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/reference/cli/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +17 -0 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/contributing.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/terminal/input/universal-input.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -3 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/terminal/more-features/markdown-viewer.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +22 -2 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "344", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tab-configs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/404.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +21 -0 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/capabilities/slash-commands.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/custom-routers.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -5 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/local-agents/active-ai.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +86 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/guides/agent-workflows/how-to-run-multiple-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/guides/agent-workflows/running-multiple-agents-at-once-with-warp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -99 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +111 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/platform/integrations/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +99 -0 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/reference/cli/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +31 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +373 -8 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +10 -10 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +37 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the Markdown Viewer documentation to describe Mermaid diagram rendering, including raw/rendered switching and failure behavior. The content is mostly scoped to the documented feature, but the page currently adds a visible reviewer TODO placeholder that would publish directly to users.\n\n## Concerns\n- The Mermaid section includes an unresolved screenshot placeholder that must be replaced with final content or removed before merge.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "missing_media", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/slash-commands.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -5 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +13 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/agent-platform/local-agents/active-ai.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +86 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-edit-agent-code-in-warp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-run-multiple-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -0 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/warp-vs-claude-code.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-railway.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/guides/configuration/trigger-reusable-actions-with-saved-prompts.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/guides/getting-started/how-to-customize-warps-appearance.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +99 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/reference/cli/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +31 -0 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/contributing.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +373 -8 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +6 -4 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +10 -10 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/terminal/input/universal-input.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -3 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/terminal/more-features/markdown-viewer.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +22 -2 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tab-configs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-22", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +37 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "355", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR clarifies the Oz workflow prompt for locating `warp-internal` and adds `BUZZ_SLACK_TOKEN` as a Slack token fallback for `validate_ui_refs`.\n\n## Concerns\n- The fallback `git clone` should be non-interactive so missing private-repo credentials fail fast instead of stalling the cloud run.\n- The manual Slack token example should avoid encouraging token paste into shell history.\n\n## Security\n- The only security finding is documentation-level: the manual Slack token example should steer users toward a secret manager or otherwise secure token loading.\n\n## Verdict\nFound: 0 critical, 0 important, 2 suggestions\n\nApprove with nits\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "355", "skill_used": "unknown", "file": ".github/workflows/refresh-ui-paths.yml", "feedback_type": "review_comment", "severity": "important", "comment": "ah it should be `warpdotdev/warp` instead of `warpdotdev/warp-internal`!", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "354", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the UI reference validation Slack notification path to recognize `BUZZ_SLACK_TOKEN`, and updates the workflow prompt and skill documentation to describe the new token.\n\n## Concerns\n- The fallback order still prefers `DOCS_SLACK_BOT_TOKEN` over `BUZZ_SLACK_TOKEN`, so an environment that still has the old token set can continue using the bot that is not in `#growth-docs` and never reach the new Buzz token.\n- No approved or repository spec context was available for this PR.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "352", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR lowers the weekly 404 monitor automation threshold, adds a durable run log, and introduces a monthly outer-loop skill for improving the monitor from accumulated run data. The threshold and run-log additions are generally coherent, but the new outer-loop skill needs an explicit untrusted-input boundary before it is safe to run automatically.\n\n## Concerns\n- The new `improve-404-monitor-skill` reads externally influenced run-log fields and GitHub PR history, then uses that text to propose edits to another skill without prompt-injection filtering or a data-only processing rule.\n\n## Security\n- Add a security boundary requiring the agent to treat run-log notes, broken URL paths, PR descriptions, review text, commit messages, and any other GitHub-derived content as untrusted data only.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\nRequest changes\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powere", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "350", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds eight Vercel redirects for recurring 404 gaps. Most redirects point to existing docs pages, but one malformed-source redirect needs correction before merge.\n\n## Concerns\n- The `/):` redirect source leaves a literal colon unescaped in a Vercel route pattern, so it can be parsed as a parameter prefix instead of matching that malformed URL.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\nRequest changes\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "346", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the `validate_ui_refs` skill, adds a scheduled/manual refresh workflow for the UI path snapshot, and refreshes `valid_paths.json` for the new umbrella-based Settings structure.\n\n## Concerns\n- The validator now stores umbrella subpages in `settings_sections` for sub-section lookup, but the legacy top-level section fallback still accepts those subpages directly. That means stale paths such as `Settings > Oz` and `Settings > Profiles` validate successfully even though the intended canonical paths are under their umbrellas.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "draft_docs", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "might be worth linking them out to the jira platform somewhere here, just for ease of access", "tag": "", "pattern_category": "link_quality", "resolved_by": "author_reply"} +{"date": "2026-07-21", "pr": "338", "skill_used": "draft_docs", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "could be helpful to include a screenshot here!", "tag": "", "pattern_category": "missing_media", "resolved_by": "deferred"} +{"date": "2026-07-21", "pr": "338", "skill_used": "draft_docs", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "worth mentioning a bit about how this affects your jira team - once you install this, does everyone immediately have access? does everyone else have to auth into warp / oz?", "tag": "", "pattern_category": "missing_context", "resolved_by": "author_reply"} +{"date": "2026-07-21", "pr": "338", "skill_used": "draft_docs", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "is there anything an admin needs to do on the jira side? can anyone install warp / oz onto jira, without admin permissions?", "tag": "", "pattern_category": "missing_context", "resolved_by": "author_reply"} +{"date": "2026-07-21", "pr": "338", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/index.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "added a couple of questions that we can expand on, but generally looks good - ty!", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-21", "pr": "338", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "added some clarification, thanks", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-21", "pr": "338", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "i'm leaning towards landing this without screenshots today, but adding in looms once this is deployed in production later to walk through the flows clearly", "tag": "", "pattern_category": "image_alt", "resolved_by": "human_review"} +{"date": "2026-07-21", "pr": "338", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "this is for each user to link their own account for proper run attribution. I added some clarification, thanks", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR publishes the Jira integration page, updates the setup flow for self-serve installation, and links Jira from the integrations overview and sidebar. I found one clarity issue around the Jira URL placeholder, but no blocking correctness, security, or spec-alignment concerns.\n\n## Concerns\n- The Jira URL placeholder uses \"site ID\" language even though readers need the Atlassian site subdomain.\n\n## Verdict\nFound: 0 critical, 0 important, 1 suggestion\n\n**Approve with nits**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "added a couple of questions that we can expand on, but generally looks good - ty!", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "i'm leaning towards landing this without screenshots today, but adding in looms once this is deployed in production later to walk through the flows clearly", "tag": "", "pattern_category": "missing_media", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "this is for each user to link their own account for proper run attribution. I added some clarification, thanks", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/slash-commands.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-routers.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +42 -16 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/reference/cli/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +17 -0 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-21", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +37 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "345", "skill_used": "draft_docs", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "approving from the TUI side", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-20", "pr": "345", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "approving from the TUI side", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "345", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis bookkeeping PR updates the missing-docs surface map and regenerated surface snapshot for runner-related surfaces, TUI-only slash commands, and newly detected platform/API surfaces.\n\n## Concerns\n- The new runner mappings point at `src/content/docs/platform/runners.mdx`, but that page is not added by this PR and is absent from the checked-out docs repo/base context, so merging this branch before the runners page lands leaves the surface map with missing target findings.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "340", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR removes the stale `/pr-comments` entry from the built-in Slash Commands reference. The attached spec context contains no approved repository spec for comparison, and the supplemental security pass found no security concerns in this docs-only deletion.\n\n## Concerns\n- No blocking concerns found.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "340", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/slash-commands.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "340", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +37 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/capabilities/slash-commands.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "draft_docs", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +50 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -9 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "draft_docs", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +37 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the BYOK, custom router, custom inference endpoint, and Enterprise team-managed key documentation to reflect that custom routers can apply provider API keys after resolving to concrete Warp-supported models while still excluding custom inference endpoints. I found no blocking correctness, documentation-structure, link-target, security, or spec-alignment issues in the attached diff.\n\n## Concerns\n- None.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/slash-commands.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-routers.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +50 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -9 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "336", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +37 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/capabilities/slash-commands.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/custom-routers.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -5 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +50 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +111 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +73 -0 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/reference/cli/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -9 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "draft_docs", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +37 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR documents the `oz agent run-cloud` harness selection and auth-secret flags in the CLI reference.\n\n## Concerns\n- The key-flags list now repeats the `--claude-auth-secret` and `--codex-auth-secret` entries that already exist immediately above the added lines.\n- The new \"Choosing an execution harness\" subsection duplicates the third-party harness setup paragraph and example that already appear right after the key-flags list.\n\n## Verdict\nFound: 0 critical, 2 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "src/content/docs/agent-platform/capabilities/slash-commands.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -5 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +50 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +73 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "src/content/docs/reference/cli/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +31 -0 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -9 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-20", "pr": "322", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +37 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-17", "pr": "342", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds tab and tab-group pinning guidance to the Tabs documentation and updates the page description to mention groups and pinning. I did not find correctness, security, or spec-alignment blockers; the only feedback is minor docs-style punctuation in the new numbered procedures.\n\n## Concerns\n- Minor: the newly added numbered procedure steps should end with periods for style-guide consistency.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove with nits\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-17", "pr": "342", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Lol this diff looks identical to before?", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-17", "pr": "342", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Same as above\r\n", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-17", "pr": "342", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +50 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-17", "pr": "342", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-17", "pr": "342", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -9 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-17", "pr": "342", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +37 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-17", "pr": "338", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "might be worth linking them out to the jira platform somewhere here, just for ease of access", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-17", "pr": "338", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "could be helpful to include a screenshot here!", "tag": "", "pattern_category": "image_alt", "resolved_by": "human_review"} +{"date": "2026-07-17", "pr": "338", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "also, i think worth mentioning a bit about how this affects your jira team - once you install this on jira, does everyone immediately have access to it? does everyone else have to auth into warp / oz?", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-17", "pr": "338", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "is there anything an admin needs to do on the jira side? can anyone install warp / oz onto jira, without admin permissions?", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-17", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "might be worth linking them out to the jira platform somewhere here, just for ease of access", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-17", "pr": "338", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "could be helpful to include a screenshot here!", "tag": "", "pattern_category": "missing_media", "resolved_by": "human_edit"} +{"date": "2026-07-16", "pr": "337", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "based on the Warp preview version so this telemetry will be removed in future stable builds", "tag": "", "pattern_category": "scannability", "resolved_by": "human_review"} +{"date": "2026-07-16", "pr": "337", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds the weekly changelog entry, updates the open-source license inventory, and refreshes the privacy telemetry event list.\n\n## Concerns\n- The privacy telemetry list removes an event that still appears to be emitted by the Warp telemetry source, which would make the public telemetry disclosure incomplete.\n\n## Security\n- The telemetry disclosure omission is a privacy/data-transparency concern and should be fixed before merge.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-16", "pr": "337", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "based on the Warp preview version so this telemetry will be removed in future stable builds", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-16", "pr": "337", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +50 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-16", "pr": "337", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-16", "pr": "337", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -9 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "334", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the pricing FAQ downgrade answer to state that downgrades take effect immediately and to explain prorated account balance behavior and current-cycle AI credit usage.\n\n## Concerns\n- The new lower-plan credit sentence says used credits \"carry over,\" which can sound like credits remain available; it should say usage counts against the lower plan's limit.\n\n## Verdict\nFound: 0 critical, 0 important, 1 suggestions\n\nApprove with nits\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "334", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "332", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR refreshes the missing_docs audit bookkeeping by adding two unlisted-page allowlist entries and updating the generated surface snapshot for recently detected flags, CLI flags, API routes, settings, and changelog baseline.\n\n## Concerns\n- The Jira draft page is added to the permanent unlisted-page allowlist, but the audit snapshot does not track docs frontmatter or sidebar promotion, so the structure audit can keep suppressing the page after `draft: true` is removed.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "332", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -5 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "332", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "331", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -5 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "331", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "331", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nDocuments the `oz agent run-cloud` harness selection and harness-specific auth-secret flags, adds a worked Claude Code example, and links to the existing harness authentication and secrets documentation.\n\n## Concerns\n- No blocking correctness, security, or spec-alignment concerns found. `spec_context.md` reports no approved or repository spec context for this PR.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "331", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -5 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "331", "skill_used": "unknown", "file": "src/content/docs/reference/cli/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -0 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "331", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "331", "skill_used": "unknown", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "323", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -5 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "323", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "323", "skill_used": "draft_docs", "file": "src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +111 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "323", "skill_used": "draft_docs", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +73 -0 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "323", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "323", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -5 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "323", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +73 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "323", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "323", "skill_used": "unknown", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "318", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the release_updates skill Slack notification snippet to capture the just-created PR URL before composing the Slack message, and refreshes the release docs workflow comment to reference the Slack bot token requirement.\n\n## Concerns\n- No blocking correctness, security, or spec-alignment concerns found in the annotated diff.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "318", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -5 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "318", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +36 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "318", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "318", "skill_used": "unknown", "file": "src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +111 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "318", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +73 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "318", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +371 -6 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "318", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-15", "pr": "318", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +10 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-14", "pr": "328", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a GitHub Actions workflow to refresh `valid_paths.json`, updates the validate-ui-refs skill documentation, and refreshes the UI path snapshot.\n\n## Concerns\n- The automated workflow currently has several correctness blockers: it will treat every refresh as changed because `generated_at` is volatile, the refresh generator does not preserve the new metadata fields added to `valid_paths.json`, unfixed validation issues stop the PR creation path, Slack notifications are missing the required channel configuration, and the generated PR can accidentally stage the nested `warp-internal` checkout.\n- No approved spec context was available for implementation drift validation.\n- The supplemental security pass did not find security-specific issues.\n\n## Verdict\nFound: 0 critical, 5 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-14", "pr": "328", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -5 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-13", "pr": "333", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR clarifies that Warp usage through a connected SuperGrok or eligible X Premium subscription counts against xAI's shared weekly usage pool, explains the API label in xAI's usage dashboard, and updates related wording in the Grok subscription docs.\n\n## Concerns\n- No blocking correctness, security, or spec-alignment concerns found.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-13", "pr": "333", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/grok-subscription.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +14 -5 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-12", "pr": "316", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a new recurring AEO new-guide recommendation skill and initializes its run log. The review found two workflow correctness issues in the skill instructions: the scope forbids PR creation while the required log workflow depends on a persistent log PR, and the newly included Oz scope is not backed by the configured Peec snapshot sources. No approved spec context was available, and no security-specific findings were identified.\n\n## Concerns\n- The skill tells agents not to open a PR even though step 7 requires creating or updating the long-lived run-log PR.\n- Oz is listed as a required pilot/output topic, but the source data instructions still point to a snapshot described as covering only agents, cloud agents, and orchestration.\n\n## Verdict\nFound: 0 critical, 2 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-12", "pr": "316", "skill_used": "unknown", "file": "src/content/docs/404.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +21 -0 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-12", "pr": "316", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +36 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-12", "pr": "316", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-12", "pr": "316", "skill_used": "unknown", "file": "src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +111 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-12", "pr": "316", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +73 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-12", "pr": "316", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +371 -6 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-12", "pr": "316", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +10 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "327", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a new `.agents/references/skill-authoring-guidelines.md` reference page documenting recurring patterns for docs-repo skill authoring. The structure is useful, but a command in the new guidance does not actually validate skill frontmatter strongly enough, and a couple of statements should be tightened for accuracy.\n\n## Concerns\n- The YAML frontmatter validation command can pass malformed `SKILL.md` files because it only checks for two `---` delimiters anywhere in the file.\n- No approved or repository spec context was provided, so there are no spec-alignment findings.\n- No security-sensitive code, dependency, secret, auth, or data-handling changes were introduced.\n\n## Verdict\nFound: 0 critical, 1 important, 2 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "326", "skill_used": "draft_docs", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "nice!", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "326", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the Team-managed LLM API keys and endpoints documentation page by replacing the existing Loom demo embed with the new YouTube walkthrough URL. The local `VideoEmbed` component supports `youtube.com/watch?v=` URLs, and the attached spec context contains no approved or repository spec requirements for this PR.\n\n## Concerns\n- None.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "326", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "nice! ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "326", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "321", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the weekly release documentation by adding the latest open-source license inventory changes and documenting the new `Terminal Lifecycle Recovery` telemetry event.\n\n## Concerns\n- No blocking general review concerns found.\n- No security findings found in the changed documentation lines.\n- No approved or repository spec context was available for this PR, so no material spec drift was identified.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "321", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -26 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "321", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "319", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR refreshes the AFDocs known-exceptions reference to match current audit behavior for markdown-content parity and intentionally long page-size exceptions. It only updates internal review guidance for the AFDocs audit skill; it does not change published documentation content, site behavior, code, or configuration.\n\n## Concerns\n- No blocking concerns found.\n- No approved or repository spec context was available for implementation drift validation.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "319", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "319", "skill_used": "unknown", "file": "src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +111 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "319", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +73 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "319", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -26 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "319", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "318", "skill_used": "unknown", "file": ".github/workflows/release-docs-update.yml", "feedback_type": "review_comment", "severity": "important", "comment": "Did we mean to remove the comment about the grafana token?", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "318", "skill_used": "unknown", "file": ".github/workflows/release-docs-update.yml", "feedback_type": "review_comment", "severity": "important", "comment": "yup, no longer using the DOCS_AGENT_GRAFANA_TOKEN anymore in this automation. \r\n\r\nI'm justing using the slack @oncall-client-primary/secondary since they already setup to notify the right people", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "318", "skill_used": "unknown", "file": ".github/workflows/release-docs-update.yml", "feedback_type": "review_comment", "severity": "important", "comment": "Using a docs bot slack token now to send the messages to #oncall-client :)", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "317", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis weekly release docs update adds the 2026.07.09 changelog entry, refreshes the open-source license inventory, and updates the privacy telemetry event list. I did not find blocking correctness, security, link, or spec-alignment concerns in the annotated diff.\n\n## Concerns\n- None.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "317", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +36 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "317", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +395 -8 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "317", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +9 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Please avoid colloquialisms like \"rule of thumb\".", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\nOn Apple Silicon Macs, unified memory is shared between CPU and GPU. An M2 Mac with 16GB unified memory can run 7–8B models comfortably.\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "I think we should rethink the framing here. Right now this reads like “paste this giant template and get a senior-engineer-quality review,” which feels a bit heavy handed.\n\nA stronger guide would focus on the actual workflow:\n\n1. Give the agent the PR goal and relevant context\n2. Ask it to inspect the diff and surrounding code\n3. Prioritize correctness, regressions, security, and missing tests\n4. Verify any findings before leaving review comments\n5. Use follow-ups to investigate specific concerns\n\nThe structured output can still be useful, but it should support the review process rather than be the main point of the guide.", "tag": "", "pattern_category": "content_structure", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "This opening feels too promotional and makes a pretty strong claim that the output will “mirror how a senior engineer” reviews a PR. I’d make this more grounded... something like:\n\n“Warp’s agent can help you understand a large pull request, identify risky changes, and investigate potential issues before you leave review comments. This guide walks through how to give the agent enough context, ask for focused feedback, and verify its findings.”", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "a few specific changes:\n- drop most of the emojis\n- ask the agent to inspect surrounding code\n- add an explicit verification step (link to computer use)\n- use the GH pR directly wherever possible: `gh pr diff` only gives the patch. `gh pr view`, the checked-out-branch, tests, etc, would provide more context\n\ngenerally, i think we can simplify this instead of recommending such a specific step by step guide to code review", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "i worry that this template would feel like ai slop to a senior dev and they wouldn't read it", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "@oliviajohnsto - do we want to do some co-marketing with ollama here perhaps?", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "you may want to confirm with an agent because i think this needs to be a publicly available URL for it to work with Warp's custom endpoints (which you should mention). i.e. in our docs somewhere else, we mention that you can expose this via an ngrok tunnel", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "315", "skill_used": "draft_guide", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "it should be to use Warp with this BYO inference, rather than set up claude code. we should push to Warp's agent here", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "315", "skill_used": "unknown", "file": "src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Please avoid colloquialisms like \"rule of thumb\".", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "315", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "I think we should rethink the framing here. Right now this reads like “paste this giant template and get a senior-engineer-quality review,” which feels a bit heavy handed.\n\nA stronger guide would focus on the actual workflow:\n\n1. Give the agent the PR goal and relevant context\n2. Ask it to inspect the diff and surrounding code\n3. Prioritize correctness, regressions, security, and missing tests\n4. Verify any findings before leaving review comments\n5. Use follow-ups to investigate specific concerns\n\nThe structured output can still be useful, but it should support the review process rather than be the main point of the guide.", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "315", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "This opening feels too promotional and makes a pretty strong claim that the output will “mirror how a senior engineer” reviews a PR. I’d make this more grounded... something like:\n\n“Warp’s agent can help you understand a large pull request, identify risky changes, and investigate potential issues before you leave review comments. This guide walks through how to give the agent enough context, ask for focused feedback, and verify its findings.”", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "315", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "a few specific changes:\n- drop most of the emojis\n- ask the agent to inspect surrounding code\n- add an explicit verification step (link to computer use)\n- use the GH pR directly wherever possible: `gh pr diff` only gives the patch. `gh pr view`, the checked-out-branch, tests, etc, would provide more context\n\ngenerally, i think we can simplify this instead of recommending such a specific step by step guide to code review", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Docs review — Jira integration (verification round)\r\n\r\nReviewed against the integration/feature-doc conventions and verified the open questions against `warp-server`, specifically the `simple_integrations` framework the Jira integration will build on. Solid initial page: correct placement under `platform/integrations/`, sidebar + index wired correctly, no broken links, and `npm run build` passing per the PR description. **Verdict: approve with changes.**\r\n\r\nIncluded in my review:\r\n- **5 one-click suggestions** on `jira.mdx`: identity/attribution requirement (+ `*` bullets), where to configure defaults (step 3), a run-monitoring cross-link, a troubleshooting error-code tip (+ `*` bullets), and a Related pages section.\r\n- **3 questions** for things I couldn't confirm from code: plan/credits + Enterprise eligibility, how the Jira label-adder maps to a Warp identity, and the \"our community\" link target.\r\n- **1 structural note** (not a clean one-click suggestion): section order should be", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_verdict", "severity": "important", "comment": "Left some suggested edits with context + question re: credits in a comment + a note about reordering the sections in this doc. Once those items are addressed/ feedback is implemented, this will be ready to ship 🚀", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "Beautiful, thank you! 🛸", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds an initial Jira integration page and wires it into the integrations landing page and sidebar. The structure is mostly in the right place, and the security pass did not identify code or configuration security findings, but the new page has user-facing terminology and requirements issues that should be fixed before publishing.\n\n## Concerns\n- The page uses the user-facing phrase \"Oz agents\" / \"Oz agent runs,\" which the docs terminology guide explicitly says to avoid in favor of \"agents\" or \"cloud agent runs.\"\n- The requirements understate integration access requirements compared with the existing integration docs: they omit credits and the precise eligible plan set.\n- Troubleshooting exposes the internal `JiraEnabled` flag name and sends users to a Warp team admin, who may not have a way to verify that internal gate.\n\n## Verdict\nFound: 0 critical, 2 important, 1 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up t", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds an initial Jira integration docs page, wires it into the Integrations overview, and adds it to the Platform integrations sidebar. The page covers the early-access flow, but the requirements section omits prerequisites users need before Jira-triggered agents can work on code.\n\n## Concerns\n- The Jira page should list the required cloud environment and GitHub authorization prerequisites alongside plan, credit, and Jira admin requirements.\n- One setup sentence should clarify that the automatic connection behavior applies to a single Warp workspace, not a Jira workspace.\n\n## Verdict\nFound: 0 critical, 1 important, 1 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "missing_context", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Docs review — Jira integration (verification round)\r\n\r\nReviewed against the integration/feature-doc conventions and verified the open questions against `warp-server`, specifically the `simple_integrations` framework the Jira integration will build on. Solid initial page: correct placement under `platform/integrations/`, sidebar + index wired correctly, no broken links, and `npm run build` passing per the PR description. **Verdict: approve with changes.**\r\n\r\nIncluded in my review:\r\n- **5 one-click suggestions** on `jira.mdx`: identity/attribution requirement (+ `*` bullets), where to configure defaults (step 3), a run-monitoring cross-link, a troubleshooting error-code tip (+ `*` bullets), and a Related pages section.\r\n- **3 questions** for things I couldn't confirm from code: plan/credits + Enterprise eligibility, how the Jira label-adder maps to a Warp identity, and the \"our community\" link target.\r\n- **1 structural note** (not a clean one-click suggestion): section order should be", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "important", "comment": "Left some suggested edits with context + question re: credits in a comment + a note about reordering the sections in this doc. Once those items are addressed/ feedback is implemented, this will be ready to ship 🚀 ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "Beautiful, thank you! 🛸 ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/404.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +21 -0 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +36 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-run-multiple-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -0 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/running-multiple-agents-at-once-with-warp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -99 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +111 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +73 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +371 -6 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +10 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "269", "skill_used": "draft_guide", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +36 -0 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "269", "skill_used": "draft_guide", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +371 -6 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "269", "skill_used": "draft_guide", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +10 -1 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "269", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a new Guides > Configuration page about reducing token and credit usage with agents, plus the corresponding sidebar entry. I checked the guide against the provided diff, existing docs references, and the security checklist; the links and referenced slash commands map to existing docs, and there are no security findings.\n\n## Concerns\n- No blocking concerns found.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "269", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +36 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "269", "skill_used": "unknown", "file": "src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +111 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "269", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/open-source-licenses.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +371 -6 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-10", "pr": "269", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +10 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "313", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR removes the project-level `src/pages/404.astro` route that collides with Starlight's injected `/404` route, replaces it with Starlight's supported `src/content/docs/404.mdx` content override, and preserves the existing `docs_404` Rudderstack tracking payload in a dedicated Astro component.\n\n## Concerns\n- No blocking correctness, security, or spec-alignment concerns found in the annotated diff.\n- `spec_context.md` reports that no approved or repository spec context was found, so there was no spec contract to validate beyond the PR description and diff.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "313", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "nice fix, ty!", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "313", "skill_used": "unknown", "file": "src/content/docs/404.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +21 -0 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "313", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "311", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +12 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "309", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR consolidates the older multiple-agents guide into the higher-traffic multi-agent guide, preserves the existing video asset, removes stale guide navigation entries, and adds a redirect from the deleted page to the consolidated destination.\n\n## Concerns\n- No blocking correctness, docs-structure, security, or spec-alignment concerns found in the annotated diff.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\n**Approve**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "309", "skill_used": "unknown", "file": "src/content/docs/agent-platform/local-agents/active-ai.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "309", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-run-multiple-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -0 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "309", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/running-multiple-agents-at-once-with-warp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -99 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR replaces Grafana-based on-call reviewer assignment with Slack notification guidance for the release docs agent and a GitHub Actions step that assigns the last recent human docs reviewer.\n\n## Concerns\n- The Slack notification snippet in `release_updates` cannot run as written because it formats an undefined `pr_url`.\n- The Slack error path references `sys.stderr` without importing `sys`, so API failures are masked by a secondary `NameError`.\n- The last-reviewer assignment currently checks only the single most recently merged PR before falling back, so it can miss the last human reviewer among recent docs PRs.\n\n## Verdict\nFound: 0 critical, 2 important, 1 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nReviewed the release docs workflow change that replaces Grafana on-call reviewer resolution with Slack notification instructions and a GitHub Actions last-reviewer assignment step.\n\n## Concerns\n- The new reviewer lookup likely calls the pulls endpoint with POST semantics because it passes `-F` fields to `gh api` without forcing GET, so the action can skip the intended last-reviewer assignment and fall back to the default reviewer.\n- The last-reviewer logic only inspects the newest merged PR instead of scanning recent merged PRs until it finds a human reviewer, which can incorrectly fall back when the newest merged PR has no human review.\n- The Slack notification example in the release update skill references names that are not defined/imported, so agents following it can fail before posting or while handling Slack errors.\n\n## Verdict\nFound: 0 critical, 4 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 t", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/agent-platform/cli-agents/overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/agent-platform/getting-started/faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +6 -7 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-routers.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +17 -8 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/agent-platform/local-agents/active-ai.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +135 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/enterprise/getting-started/getting-started-enterprise.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/enterprise/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -2 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/enterprise/security-and-compliance/security-overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/enterprise/support-and-resources/billing.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/enterprise/team-management/admin-panel.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/how-to-run-multiple-ai-coding-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -0 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/guides/agent-workflows/running-multiple-agents-at-once-with-warp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -99 lines", "tag": "", "pattern_category": "video_embed", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/platform/faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/platform-credits.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/terminal/more-features/uri-scheme.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +16 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "307", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +52 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "306", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "306", "skill_used": "unknown", "file": "src/content/docs/agent-platform/local-agents/active-ai.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/terminal/more-features/markdown-viewer.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "@rachaelrenk can we remove this section please? i don't think it's necessary to expose this technical detail", "tag": "", "pattern_category": "content_structure", "resolved_by": "human_review"} +{"date": "2026-07-09", "pr": "305", "skill_used": "draft_docs", "file": "src/content/docs/terminal/more-features/markdown-viewer.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "@rachaelrenk do you mind grabbing a screenshot for this? or maybe asking an agent to use computer use to grab one?", "tag": "", "pattern_category": "image_alt", "resolved_by": "human_review"} +{"date": "2026-07-09", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/terminal/more-features/markdown-viewer.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "@rachaelrenk can we remove this section please? i don't think it's necessary to expose this technical detail", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "305", "skill_used": "unknown", "file": "src/content/docs/terminal/more-features/markdown-viewer.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "@rachaelrenk do you mind grabbing a screenshot for this? or maybe asking an agent to use computer use to grab one?", "tag": "", "pattern_category": "missing_media", "resolved_by": "human_edit"} +{"date": "2026-07-09", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "nothing new with jira, we want to match slack and linear as much as we can here. updated!", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-09", "pr": "269", "skill_used": "draft_guide", "file": "src/content/docs/guides/configuration/how-to-reduce-token-usage-with-ai-coding-agents.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "@rachaelrenk I still think we could frame this more positively. Instead of “Reduce token usage,” maybe something like “Use tokens more efficiently with AI coding agents” or “Get more out of your tokens\" (i defer to you on the exact messaging, but i think we should stray away from \"reduce\" -- we'd love to encourage folks to use our agent more!)\n\nThe guide is less about cutting usage for its own sake and more about helping cost-conscious users make their usage go further: choosing the right model, keeping context focused, using routers/rules, etc.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-09", "pr": "269", "skill_used": "unknown", "file": "src/content/docs/guides/configuration/how-to-reduce-token-usage-with-ai-coding-agents.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "@rachaelrenk I still think we could frame this more positively. Instead of “Reduce token usage,” maybe something like “Use tokens more efficiently with AI coding agents” or “Get more out of your tokens\" (i defer to you on the exact messaging, but i think we should stray away from \"reduce\" -- we'd love to encourage folks to use our agent more!)\n\nThe guide is less about cutting usage for its own sake and more about helping cost-conscious users make their usage go further: choosing the right model, keeping context focused, using routers/rules, etc.", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "308", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "304", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "302", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the `missing_docs` skill to split drift-watch output into one feature PR plus a companion bookkeeping PR. The direction is reasonable, but the new workflow currently tells agents to create PRs that are not actually independently safe to merge or validate.\n\n## Concerns\n- The bookkeeping PR is described as mergeable in any order even though surface-map entries can point at pages that do not exist until sibling feature PRs merge.\n- The split workflow validates only the combined working tree, which can miss broken links or dependencies in the individual PR branches that reviewers will merge separately.\n\n## Verdict\nFound: 0 critical, 2 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "302", "skill_used": "unknown", "file": "src/content/docs/agent-platform/cli-agents/overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "302", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +52 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "300", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/cli-agents/overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "300", "skill_used": "draft_docs", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +52 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "300", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR consolidates the duplicate `### Custom routers` sections in `src/content/docs/agent-platform/inference/model-choice.mdx`, preserving the custom routers guidance while removing the duplicate anchor. The new text points readers to **Settings** > **AI** > **Custom Routers** and links to the dedicated page.\n\n## Concerns\nNo blocking concerns found. No security findings, and `spec_context.md` reports no approved or repository spec context for this PR.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "300", "skill_used": "unknown", "file": "src/content/docs/agent-platform/cli-agents/overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "300", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -8 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "300", "skill_used": "unknown", "file": "src/content/docs/terminal/more-features/uri-scheme.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +16 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "300", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +52 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "299", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/cli-agents/overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "299", "skill_used": "draft_docs", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +52 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "299", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR documents the `warp://settings` deep-link family in the URI scheme reference. I checked the added entries against the local Warp URI handler and found the documented settings, search, widget, sub-page, MCP autoinstall, and team invite paths are implemented. This is a docs-only change, and the supplemental security pass found no security concerns.\n\n## Concerns\n- The widget deep-link syntax would be more actionable if the docs listed or linked the currently supported widget slugs.\n- One settings page label should match the app/docs terminology more closely.\n\n## Verdict\nFound: 0 critical, 0 important, 2 suggestions\n\nApprove with nits\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "299", "skill_used": "unknown", "file": "src/content/docs/agent-platform/cli-agents/overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "299", "skill_used": "unknown", "file": "src/content/docs/terminal/more-features/uri-scheme.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +16 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "299", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +52 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds a new Enterprise documentation page for team-managed API keys and endpoints, updates related BYOK/custom endpoint pages, and wires the page into Enterprise navigation. The structure and links are generally coherent, but the new page currently overstates the self-serve credential boundary and leaves admin/member precedence ambiguous in a way that could mislead security-sensitive teams.\n\n## Security\n- The new page says self-serve member-managed keys never leave the member's device, but the existing BYOK/custom endpoint docs state those secrets are sent to Warp's backend in-flight for interactive requests and are not stored there.\n- The member-key precedence section should explicitly respect the admin setting that disables member-managed keys/endpoints, otherwise it reads like member credentials always override team policy.\n\n## Concerns\n- Billing copy should qualify compute credits for Warp-hosted cloud runs, because existing billing docs exclude self-hosted compu", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "This looks so great! Just some small comments in certain places. But thank you!!! ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Nit: I'm wondering if it make sense / is a fair comparison to compare BYOLLM with the user-level form of BYOK in the table below if we also now have team-managed BYOK? ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/index.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "I'm not entirely sure what the Analytics API is. Is this a currently available enterprise feature? ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "I think the \"takes precedence\" only applies for BYOK and not BYOE. For BYOE, team provided models and user provided models will be distinct, so we don't have to pick. For BYOK on the other hand, we can only use one key at request time, so a precedence is necessary. ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Oh exactly yes. So maybe in the sentence above we can remove the \"or endpoint configuration\" from that sentence. ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "They actually ended up being two separate cards (I think in my old tech spec it was one card which is why AM probably wrote this). One card is 'First-party API keys', other card underneath is 'Custom endpoints'", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "The disabling thing isn't true _yet_ (will be true in a few days), nbd though - it's not disabled, but we won't respect any request they make to an endpoint / key they try to add if their admin doesn't allow it. ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "nice!", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Ahh. When I was reading this page at first, I was slightly concerned when reading things like \n\n\"BYOK does not apply to [Cloud Agents](https://docs.warp.dev/platform/). Because your API keys are stored locally on your device, they are not available to cloud-hosted agent runs. Cloud agent runs always consume [Warp credits](https://docs.warp.dev/support-and-community/plans-and-billing/credits/).\"\n\nat the top of the page. But seeing this clears that up!", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "same here with the \"endpoint\" not being very relevant to the precedence piece. ", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "maybe including links to these pages at the top of this page where we currently say have the \"Optional member-managed keys\" would be useful as well (just in case people don't scroll down this far lol). ", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Good call. Clarified that the FAQ table compares BYOLLM with the self-serve, user-level form of BYOK, and added a link to the full side-by-side comparison (team-managed keys, self-serve BYOK, custom endpoints, and BYOLLM) on the team-managed keys page.", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/index.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "The Analytics API is a real Enterprise feature (currently Early Access, available to all enterprise teams). It's documented at /enterprise/enterprise-features/analytics-api/. I've also linked it from the 'Usage visibility' capability bullet above so it's clearer what it is.", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Agreed. Reworded so precedence applies to keys (BYOK) only, and added a note that a member's custom endpoint and a team endpoint are always distinct, so no precedence is needed for endpoints (BYOE).", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Done. Removed 'or endpoint configuration' from the precedence intro, and also removed 'or endpoint' from the 'Member key precedence' key-feature bullet.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Updated. The config section now references the two separate cards, 'First-party API keys' and 'Custom endpoints', instead of one combined card.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Reworded. Instead of saying the controls are disabled, it now says that when member-managed keys are off, Warp won't use any key or endpoint a member adds, and their saved keys are preserved for when it's turned back on.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Added links to the self-serve BYOK and custom inference endpoint pages in the 'Optional member-managed keys' bullet near the top, so readers don't have to scroll to find them.", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Glad it cleared up. To help readers who don't scroll, I added a pointer from the top-of-page cloud-agent caution to team-managed API keys and endpoints for Enterprise teams that need their own keys to work with cloud agents.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Fixed. Removed 'or endpoint' from the 'Member key precedence' bullet and added a short note that custom endpoints don't need precedence since a member's endpoint and a team endpoint are always distinct.", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/index.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Ahh okay gotcha, just wasn't sure if it was related to the team managed API key stuff but that makes sense!", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/agent-platform/getting-started/faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +6 -7 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/custom-routers.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -8 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +135 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/getting-started/getting-started-enterprise.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -2 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/security-and-compliance/security-overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/support-and-resources/billing.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/enterprise/team-management/admin-panel.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/platform/faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/platform-credits.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "295", "skill_used": "unknown", "file": "src/content/docs/terminal/more-features/uri-scheme.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +16 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "⚠️ [IMPORTANT] Add an identity/attribution requirement, and switch these bullets to `*` to match the Slack/Linear pages and the docs templates.\n\nConfirmed against the `simple_integrations` framework in `warp-server` (`router/handlers/external/linear.go`, `IntegrationList/CreateEditModal.tsx`): the integration matches the external user to a Warp account **by email** and runs as that user, using their GitHub authorization to open PRs. A missing match returns `external_authentication_required`.\n\n```suggestion\n* **Jira Cloud** - Jira Server and Data Center are not supported.\n* **Warp team and eligible plan** - Your team must be on a **Build, Max, or Business** plan with at least **20 credits** available, or on an **Enterprise** plan with a team credit pool. See [Access, Billing, and Identity](/platform/team-access-billing-and-identity/) for details.\n* **A configured cloud environment** - Agents run inside an [environment](/platform/environments/) that includes the repositories and dependen", "tag": "", "pattern_category": "list_format", "resolved_by": "human_review"} +{"date": "2026-07-08", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "💡 [SUGGESTION] Confirmed accurate against `SimpleIntegrationConfig` (`model/types/simple_integrations.go`) and the Oz web app integration form (`IntegrationList/CreateEditModal.tsx`) — environment, model, and harness are all configurable. Just add *where* these settings live.\n\n```suggestion\nIn the [Oz web app](https://oz.warp.dev/integrations), open your Jira integration to set the default [environment](/platform/environments/), model, and harness Oz uses for Jira-triggered runs. If you don't set these, Oz uses your team's default configuration.\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-08", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "💡 [SUGGESTION] Point readers to where they can watch runs, matching the Slack/Linear pages (which link the Agent Management Panel / **All** tab).\n\n```suggestion\nWhen the run finishes, Oz posts a summary comment to the issue with links to any pull requests or branches it created, along with a link to the full conversation in Warp. To track runs across your team, open the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app, where Jira-triggered runs appear in the **All** tab.\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-08", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "💡 [SUGGESTION] Switch to `*` bullets and add an error-code tip, consistent with the Slack/Linear/GitHub Actions pages. Codes confirmed in `platformerrors.go`; integration runs surface errors back to the source as comments (`error_reporting.go`).\n\n```suggestion\nIf Oz doesn't respond after adding the label, check that:\n\n* The Oz app is installed and the workspace is connected (see the app's Configure screen in Jira).\n* The issue is in Jira Cloud (not Server or Data Center).\n\n:::tip\nWhen a Jira-triggered run can't start, Oz posts an error comment on the issue. Common codes:\n\n* [`feature_not_available`](/reference/api-and-sdk/troubleshooting/errors/feature-not-available/) - your plan doesn't support integrations.\n* [`external_authentication_required`](/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/) - no Warp account matches the Jira user's email, or GitHub isn't authorized.\n* [`integration_disabled`](/reference/api-and-sdk/troubleshooting/errors/integration", "tag": "", "pattern_category": "callout", "resolved_by": "human_review"} +{"date": "2026-07-08", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "💡 [SUGGESTION] The page currently dead-ends — add a Related pages section for cross-linking (docs guideline + parity with Slack/Linear). Keeps line 60 and appends the section.\n\n```suggestion\nFor other issues, reach out to your Warp contact or post in our community.\n\n---\n\n### Related pages\n\n* [Integrations overview](/platform/integrations/) - How environments and integrations work together.\n* [Slack](/platform/integrations/slack/) and [Linear](/platform/integrations/linear/) - Other chat- and issue-triggered integrations.\n* [Managing cloud agents](/platform/managing-cloud-agents/) - Monitor Jira-triggered runs across your team.\n* [Environments](/platform/environments/) - Configure where agents run.\n```", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_review"} +{"date": "2026-07-08", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "❓ [QUESTION] I couldn't confirm this in `warp-server` (integration billing policy isn't in the code I reviewed). Two things to verify: (1) the **20-credit** minimum, and (2) **Enterprise plan with a team credit pool** — the Slack and Linear pages list only *Build, Max, or Business* and don't mention Enterprise. Is Enterprise eligibility Jira-specific/new, or should this match the sibling wording (and should Slack/Linear be updated too)? 👀 @hongyi-chen", "tag": "", "pattern_category": "list_format", "resolved_by": "human_review"} +{"date": "2026-07-08", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "❓ [QUESTION] How is the triggering user resolved when someone adds the label? The `simple_integrations` framework maps external users to Warp accounts **by email** and runs as that user (or a pinned executor / team service account for app-created events). The Jira webhook handler isn't in `warp-server` yet, so please confirm the Jira label event carries the label-adder's email — this determines whose GitHub identity opens the PR, and the exact wording of the identity requirement suggested in Requirements.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-08", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "❓ [QUESTION] \"our community\" isn't a link. What's the canonical destination (Discord? a support page)? I'll wire it in once you confirm.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-08", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "⚠️ [IMPORTANT] Section order should follow the reader's chronology: **Requirements → Setup → How to start a run**. The current order puts the action before the prerequisites and setup. \r\n\r\nBecause this relocates whole sections it isn't a clean one-click suggestion and would collide with the inline suggestions in this review. I recommend applying the other suggestions first, then reordering. I can push the reorder as a commit if you'd like, just lmk!", "tag": "", "pattern_category": "content_structure", "resolved_by": "human_review"} +{"date": "2026-07-08", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "✅ Answered — direct users to **Slack**, not Discord.\n\n**Canonical community:** the Warp community on Slack at https://go.warp.dev/join-preview — the same link used in `support-and-community/index.mdx` and `sending-us-feedback.mdx`.\n\n**Is there a Discord?** One still exists (~18K members), but it's been intentionally demoted. The 2025.10.29 changelog notes: _\"Updated community links from Discord to Slack throughout the app,\"_ and the current open-source repo README and the docs Support & Community hub both point only to Slack.\n\nThe one-click fix for line 60 is in the Related pages suggestion thread on this same line — I consolidated the community-link change into it so both edits apply together. Resolving this question.", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-08", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Now that we've confirmed the canonical community is Slack (see the resolved question on this line), I've folded the community-link fix into this suggestion. **Apply this version instead of the original above** — it changes `our community` to the Slack link _and_ adds the Related pages section in one apply.\n\n```suggestion\nFor other issues, reach out to your Warp contact or join the [Warp community on Slack](https://go.warp.dev/join-preview).\n\n---\n\n### Related pages\n\n* [Integrations overview](/platform/integrations/) - How environments and integrations work together.\n* [Slack](/platform/integrations/slack/) and [Linear](/platform/integrations/linear/) - Other chat- and issue-triggered integrations.\n* [Managing cloud agents](/platform/managing-cloud-agents/) - Monitor Jira-triggered runs across your team.\n* [Environments](/platform/environments/) - Configure where agents run.\n```", "tag": "", "pattern_category": "list_format", "resolved_by": "human_review"} +{"date": "2026-07-08", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "⚠️ [IMPORTANT] Add an identity/attribution requirement, and switch these bullets to `*` to match the Slack/Linear pages and the docs templates.\n\nConfirmed against the `simple_integrations` framework in `warp-server` (`router/handlers/external/linear.go`, `IntegrationList/CreateEditModal.tsx`): the integration matches the external user to a Warp account **by email** and runs as that user, using their GitHub authorization to open PRs. A missing match returns `external_authentication_required`.\n\n```suggestion\n* **Jira Cloud** - Jira Server and Data Center are not supported.\n* **Warp team and eligible plan** - Your team must be on a **Build, Max, or Business** plan with at least **20 credits** available, or on an **Enterprise** plan with a team credit pool. See [Access, Billing, and Identity](/platform/team-access-billing-and-identity/) for details.\n* **A configured cloud environment** - Agents run inside an [environment](/platform/environments/) that includes the repositories and dependen", "tag": "", "pattern_category": "content_structure", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "💡 [SUGGESTION] Point readers to where they can watch runs, matching the Slack/Linear pages (which link the Agent Management Panel / **All** tab).\n\n```suggestion\nWhen the run finishes, Oz posts a summary comment to the issue with links to any pull requests or branches it created, along with a link to the full conversation in Warp. To track runs across your team, open the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app, where Jira-triggered runs appear in the **All** tab.\n```", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "💡 [SUGGESTION] The page currently dead-ends — add a Related pages section for cross-linking (docs guideline + parity with Slack/Linear). Keeps line 60 and appends the section.\n\n```suggestion\nFor other issues, reach out to your Warp contact or post in our community.\n\n---\n\n### Related pages\n\n* [Integrations overview](/platform/integrations/) - How environments and integrations work together.\n* [Slack](/platform/integrations/slack/) and [Linear](/platform/integrations/linear/) - Other chat- and issue-triggered integrations.\n* [Managing cloud agents](/platform/managing-cloud-agents/) - Monitor Jira-triggered runs across your team.\n* [Environments](/platform/environments/) - Configure where agents run.\n```", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "❓ [QUESTION] I couldn't confirm this in `warp-server` (integration billing policy isn't in the code I reviewed). Two things to verify: (1) the **20-credit** minimum, and (2) **Enterprise plan with a team credit pool** — the Slack and Linear pages list only *Build, Max, or Business* and don't mention Enterprise. Is Enterprise eligibility Jira-specific/new, or should this match the sibling wording (and should Slack/Linear be updated too)? 👀 @hongyi-chen ", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "❓ [QUESTION] How is the triggering user resolved when someone adds the label? The `simple_integrations` framework maps external users to Warp accounts **by email** and runs as that user (or a pinned executor / team service account for app-created events). The Jira webhook handler isn't in `warp-server` yet, so please confirm the Jira label event carries the label-adder's email — this determines whose GitHub identity opens the PR, and the exact wording of the identity requirement suggested in Requirements.", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "❓ [QUESTION] \"our community\" isn't a link. What's the canonical destination (Discord? a support page)? I'll wire it in once you confirm.", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "⚠️ [IMPORTANT] Section order should follow the reader's chronology: **Requirements → Setup → How to start a run**. The current order puts the action before the prerequisites and setup. \r\n\r\nBecause this relocates whole sections it isn't a clean one-click suggestion and would collide with the inline suggestions in this review. I recommend applying the other suggestions first, then reordering. I can push the reorder as a commit if you'd like, just lmk!", "tag": "", "pattern_category": "missing_context", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "✅ Answered — direct users to **Slack**, not Discord.\n\n**Canonical community:** the Warp community on Slack at https://go.warp.dev/join-preview — the same link used in `support-and-community/index.mdx` and `sending-us-feedback.mdx`.\n\n**Is there a Discord?** One still exists (~18K members), but it's been intentionally demoted. The 2025.10.29 changelog notes: _\"Updated community links from Discord to Slack throughout the app,\"_ and the current open-source repo README and the docs Support & Community hub both point only to Slack.\n\nThe one-click fix for line 60 is in the Related pages suggestion thread on this same line — I consolidated the community-link change into it so both edits apply together. Resolving this question.\n", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-08", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Now that we've confirmed the canonical community is Slack (see the resolved question on this line), I've folded the community-link fix into this suggestion. **Apply this version instead of the original above** — it changes `our community` to the Slack link _and_ adds the Related pages section in one apply.\n\n```suggestion\nFor other issues, reach out to your Warp contact or join the [Warp community on Slack](https://go.warp.dev/join-preview).\n\n---\n\n### Related pages\n\n* [Integrations overview](/platform/integrations/) - How environments and integrations work together.\n* [Slack](/platform/integrations/slack/) and [Linear](/platform/integrations/linear/) - Other chat- and issue-triggered integrations.\n* [Managing cloud agents](/platform/managing-cloud-agents/) - Monitor Jira-triggered runs across your team.\n* [Environments](/platform/environments/) - Configure where agents run.\n```\n", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "298", "skill_used": "draft_docs", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\n:::note\nThe active tab is always included in a selection.\n:::\n```\n\nSmall note here.", "tag": "", "pattern_category": "callout", "resolved_by": "human_review"} +{"date": "2026-07-07", "pr": "298", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/cli-agents/overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "298", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds documentation for tab groups and cross-window tab movement in `terminal/windows/tabs.mdx`. I reviewed the attached annotated diff, PR description, and spec context; no approved spec context was available, and the docs-only change did not introduce security concerns.\n\n## Concerns\n- The `New tab group` menu item is documented as creating an empty group, but the implementation creates a new group containing a new tab.\n\n## Verdict\nFound: 0 critical, 1 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "298", "skill_used": "unknown", "file": "src/content/docs/agent-platform/cli-agents/overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "298", "skill_used": "unknown", "file": "src/content/docs/terminal/windows/tabs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +52 -0 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "297", "skill_used": "unknown", "file": "src/content/docs/agent-platform/cli-agents/overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +7 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "293", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates docs cloud-agent skill instructions and helper scripts to use the dedicated `GROWTH_DOCS_SLACK_CHANNEL_ID` secret and adds guidance to resolve Oz run links at runtime instead of hard-coding an Oz host.\n\n## Concerns\n- No blocking concerns found.\n- Security pass found no issues in the changed lines.\n- No approved or repository spec context was provided, so there was no implementation/spec drift to evaluate.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "293", "skill_used": "unknown", "file": "src/content/docs/agent-platform/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "293", "skill_used": "unknown", "file": "src/content/docs/agent-platform/local-agents/overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "293", "skill_used": "unknown", "file": "src/content/docs/enterprise/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "293", "skill_used": "unknown", "file": "src/content/docs/enterprise/security-and-compliance/security-overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "293", "skill_used": "unknown", "file": "src/content/docs/getting-started/quickstart/customizing-warp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "293", "skill_used": "unknown", "file": "src/content/docs/getting-started/quickstart/installation-and-setup.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "293", "skill_used": "unknown", "file": "src/content/docs/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "293", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/contributing.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -4 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "293", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "293", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "292", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates broken external GitHub source links in the docs from the nonexistent `warpdotdev/warp` `main` branch to the existing `master` branch. The changes are narrow documentation-link fixes and map consistently to the stated scope.\n\n## Concerns\n- No blocking concerns found.\n\n## Verification\n- Security pass found no security-sensitive changes.\n- Spec-alignment pass skipped because `spec_context.md` reports no approved or repository spec context for this PR.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "292", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "Ty!", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "292", "skill_used": "unknown", "file": "src/content/docs/agent-platform/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "292", "skill_used": "unknown", "file": "src/content/docs/agent-platform/local-agents/overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "292", "skill_used": "unknown", "file": "src/content/docs/enterprise/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "292", "skill_used": "unknown", "file": "src/content/docs/enterprise/security-and-compliance/security-overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "292", "skill_used": "unknown", "file": "src/content/docs/getting-started/quickstart/customizing-warp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "292", "skill_used": "unknown", "file": "src/content/docs/getting-started/quickstart/installation-and-setup.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "292", "skill_used": "unknown", "file": "src/content/docs/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "292", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/contributing.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -4 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "292", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "292", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "291", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR removes the deprecated `glm-5.1-fireworks` row from the Fireworks-hosted models table while leaving the current GLM 5.2 entry intact. The diff is narrowly scoped and does not introduce docs structure, link, or security concerns.\n\n## Concerns\n- No blocking concerns found.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "291", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the `improve-drafting-skills` workflow to persist drafting signal logs through a standing branch/PR and removes the obsolete `style_lint_runs` log. The direction matches the stated goal, but the new standing-branch flow leaves correctness gaps that can still drop signals or mix monthly improvement edits into the log PR.\n\n## Concerns\n- The persistence helper checks out the standing log branch but never returns to a clean improvement branch before later skill/template edits.\n- The analysis step still only names Step A in-memory records plus on-disk human feedback, so Step B's failure fallback can discard current-run human feedback.\n\n## Verdict\nFound: 0 critical, 2 important, 0 suggestions\n\nRequest changes\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR updates the `improve-drafting-skills` skill so drafting signal logs persist through a standing branch/PR instead of direct pushes to protected `main`, removes the stale `style_lint_runs` run-log reference, and aligns the analysis instructions with the new persistence flow.\n\n## Concerns\n- No correctness, security, or spec-alignment concerns found in the annotated diff.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\nApprove\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/agent-platform/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +0 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/agent-platform/local-agents/overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +65 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/enterprise/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/enterprise/security-and-compliance/security-overview.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/enterprise/team-management/teams.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/getting-started/quickstart/customizing-warp.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "frontmatter", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/getting-started/quickstart/installation-and-setup.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/knowledge-and-collaboration/teams.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/support-and-community/community/contributing.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +4 -4 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/add-on-credits.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/plans-pricing-refunds.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/support-and-community/privacy-and-security/privacy.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-07", "pr": "285", "skill_used": "unknown", "file": "src/content/docs/terminal/settings/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +15 -0 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-03", "pr": "288", "skill_used": "unknown", "file": "", "feedback_type": "review_verdict", "severity": "suggestion", "comment": "## Overview\nThis PR adds the 2026-07-03 weekly changelog entry. I found one changelog correctness issue where an added item duplicates a PR already listed in the previous 2026 entry; no approved spec context was available, and the markdown-only diff did not introduce security findings.\n\n## Concerns\n- The custom model routers entry for #13052 is already present under the 2026.06.24 changelog entry, so it should not be repeated in the 2026.07.03 release notes unless there is a distinct second release event to document.\n- One Settings path uses `->` instead of the arrow style used elsewhere in the changelog.\n\n## Verdict\nFound: 0 critical, 1 important, 1 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 times on the same pull request).\n\n_Powered by [Oz](https://oz.warp.dev)_", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-03", "pr": "288", "skill_used": "unknown", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +65 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/capabilities/slash-commands.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -0 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +11 -9 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/local-agents/code-diffs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "image_alt", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/changelog/2021.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/changelog/2022.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "settings_path", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/changelog/2023.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/changelog/2026.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +3 -3 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/getting-started/keyboard-shortcuts.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +42 -42 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/getting-started/quickstart/installation-and-setup.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "callout", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/guides/agent-workflows/build-a-self-improving-agent.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +126 -0 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/guides/agent-workflows/build-a-triage-agent.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +127 -0 lines", "tag": "", "pattern_category": "prerequisites", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/guides/agent-workflows/run-a-software-factory-in-the-cloud.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +101 -0 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/guides/agent-workflows/set-up-a-software-factory.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +169 -0 lines", "tag": "", "pattern_category": "prerequisites", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/guides/agent-workflows/write-product-and-tech-specs-with-agents.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +78 -0 lines", "tag": "", "pattern_category": "prerequisites", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/platform/quickstart.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +6 -34 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/platform/software-factory.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +76 -0 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/reference/cli/api-keys.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +44 -0 lines", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/reference/cli/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +98 -6 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/plans-and-billing/add-on-credits.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/plans-and-billing/plans-pricing-refunds.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/plans-and-billing/pricing-faqs.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/troubleshooting-and-support/known-issues.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +5 -5 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/troubleshooting-and-support/sending-us-feedback.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +2 -2 lines", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/terminal/entry/command-corrections.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +1 -1 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/terminal/settings/all-settings.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +31 -10 lines", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "287", "skill_used": "draft_docs", "file": "src/content/docs/terminal/settings/index.mdx", "feedback_type": "human_edit", "severity": "important", "comment": "Human edit after agent commit: +15 -0 lines", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} +{"date": "2026-07-02", "pr": "282", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/model-choice.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "I just merged a change to make high the default effort level for fable. It'll go out next Tuesday, but probably worth just updating now?", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-02", "pr": "269", "skill_used": "draft_guide", "file": "src/content/docs/guides/configuration/how-to-reduce-token-usage-with-ai-coding-agents.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "instead of framing it as \"reduce\" i would try to frame this more around how to be more efficient with tokens / make them go further / accomplish more with less for a cost-conscious audience", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-02", "pr": "269", "skill_used": "draft_guide", "file": "src/content/docs/guides/configuration/how-to-reduce-token-usage-with-ai-coding-agents.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "it's worth mentioning somewhere that in Warp, the unit of measurement is actually credits, but it's essentially packages up tokens into an easier to grok measurement (e.g. different tokens rates across different providers, price of per token, etc)", "tag": "", "pattern_category": "terminology", "resolved_by": "human_review"} +{"date": "2026-07-02", "pr": "269", "skill_used": "draft_guide", "file": "src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "maybe worth mentioning that if folks prefer open source models, we also have an `auto-open` (need to double check the exact name) router, or they can create their own custom router", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-02", "pr": "269", "skill_used": "draft_guide", "file": "src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "ah i see you mention the custom routers below, nvm", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-02", "pr": "269", "skill_used": "unknown", "file": "src/content/docs/guides/configuration/how-to-reduce-token-usage-with-ai-coding-agents.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "it's worth mentioning somewhere that in Warp, the unit of measurement is actually credits, but it's essentially packages up tokens into an easier to grok measurement (e.g. different tokens rates across different providers, price of per token, etc)", "tag": "", "pattern_category": "general", "resolved_by": "human_edit"} +{"date": "2026-07-01", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/index.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\n* [Jira](/platform/integrations/jira/) - Trigger agents from Jira Cloud issues.\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-01", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "we can just remove this line entirely", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-01", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\nThe Oz app is not yet published to the Atlassian marketplace. Install the Warp Forge app into your Jira Cloud site using the link provided by your Warp contact. Only Jira site admins can install apps.\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-01", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-01", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\n Trigger cloud agent runs directly from Jira issues.\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-01", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\n#### 1. Install the Oz app in Jira\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-01", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\nThe Oz app is not yet published to the Atlassian marketplace. Install the Oz app into your Jira Cloud site using the link provided by your Warp contact. Only Jira site admins can install apps.\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-01", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\nIn your integration settings, you can configure the default environment, model, and harness that Oz will use for runs triggered from Jira. If none is set, Oz uses your team's default configuration.\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-01", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\n- **Jira site admin** — Installing the Oz app in Jira requires site admin permissions.\n```", "tag": "", "pattern_category": "list_format", "resolved_by": "human_review"} +{"date": "2026-07-01", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\n- The Oz app is installed and the workspace is connected (see the app's Configure screen in Jira).\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-01", "pr": "281", "skill_used": "draft_feature_doc", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "```suggestion\nAfter installing the app, open the app's **Configure** screen inside Jira. This takes you to a Warp page to connect your app installation to your Warp workspace.\n```", "tag": "", "pattern_category": "general", "resolved_by": "human_review"} +{"date": "2026-07-01", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "```suggestion\nThe Oz app is not yet published to the Atlassian marketplace. Install the Warp Forge app into your Jira Cloud site using the link provided by your Warp contact. Only Jira site admins can install apps.\n```", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-01", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "```suggestion\n Trigger cloud agent runs directly from Jira issues.\n```", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-07-01", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "```suggestion\nThe Oz app is not yet published to the Atlassian marketplace. Install the Oz app into your Jira Cloud site using the link provided by your Warp contact. Only Jira site admins can install apps.\n```", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-01", "pr": "281", "skill_used": "unknown", "file": "src/content/docs/platform/integrations/jira.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "```suggestion\n- **Jira site admin** — Installing the Oz app in Jira requires site admin permissions.\n```", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} +{"date": "2026-06-29", "pr": "256", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/custom-routers.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Link out to the model-choice page's available-models list from the examples.", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-06-29", "pr": "238", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/plans-and-billing/credits.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Standardized Free-plan AI-usage messaging and Warp Agent terminology, with consistent crosslinks to BYOK, custom inference endpoint, and Grok subscription pages.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} +{"date": "2026-06-29", "pr": "189", "skill_used": "draft_docs", "file": "src/content/docs/guides/external-tools/github-mcp-summarizing-open-prs-and-creating-gh-issues.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Multiple suggested edits normalizing guide section headings to a consistent, descriptive phrasing (e.g. 'Step 3. Workflow 1 - Summarize all open PRs', 'Why it's useful').", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} +{"date": "2026-06-29", "pr": "166", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/cloud-agents/team-access-billing-and-identity.mdx", "feedback_type": "review_verdict", "severity": "important", "comment": "Be careful about embedding too many error message references throughout canonical docs pages. Lean toward a dedicated section at the bottom of the page (Troubleshooting) rather than weaving them into the main flow everywhere.", "tag": "", "pattern_category": "content_structure", "resolved_by": "human_edit"} +{"date": "2026-06-29", "pr": "160", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/local-agents/interacting-with-agents/agent-questions.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Rewrote the opening paragraph and bullets to be more concise and use the bold-term + dash list format.", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} {"date": "2026-06-29", "pr": "143", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/cloud-agents/agents.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "This section may scan better if we separate the primary recommendation, the API reference details, and the constraints. Moving the endpoint names into a compact table also makes the legacy path feel like API reference material.", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} {"date": "2026-06-29", "pr": "143", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/cloud-agents/agents.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "nit: more readable to use a Markdown table here?", "tag": "", "pattern_category": "scannability", "resolved_by": "human_edit"} {"date": "2026-06-29", "pr": "143", "skill_used": "draft_docs", "file": "src/content/docs/reference/cli/api-keys.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "This section is really about how the key type changes attribution, billing, and GitHub credentials. It would scan better with a more specific heading and parallel bullets for the two key types.", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} {"date": "2026-06-29", "pr": "143", "skill_used": "draft_docs", "file": "src/content/docs/reference/cli/api-keys.mdx", "feedback_type": "review_comment", "severity": "important", "comment": "Procedural steps did not match the live UI: corrected to 'Generate new token', the 'Type' label, and 'Warp app'. Masked-suffix and Created/Last used columns are not present in the Oz web app.", "tag": "", "pattern_category": "ui_label_accuracy", "resolved_by": "human_edit"} -{"date": "2026-06-29", "pr": "160", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/local-agents/interacting-with-agents/agent-questions.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Rewrote the opening paragraph and bullets to be more concise and use the bold-term + dash list format.", "tag": "", "pattern_category": "list_format", "resolved_by": "human_edit"} -{"date": "2026-06-29", "pr": "166", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/cloud-agents/team-access-billing-and-identity.mdx", "feedback_type": "review_verdict", "severity": "important", "comment": "Be careful about embedding too many error message references throughout canonical docs pages. Lean toward a dedicated section at the bottom of the page (Troubleshooting) rather than weaving them into the main flow everywhere.", "tag": "", "pattern_category": "content_structure", "resolved_by": "human_edit"} -{"date": "2026-06-29", "pr": "189", "skill_used": "draft_docs", "file": "src/content/docs/guides/external-tools/github-mcp-summarizing-open-prs-and-creating-gh-issues.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Multiple suggested edits normalizing guide section headings to a consistent, descriptive phrasing (e.g. 'Step 3. Workflow 1 - Summarize all open PRs', 'Why it's useful').", "tag": "", "pattern_category": "heading_specificity", "resolved_by": "human_edit"} -{"date": "2026-06-29", "pr": "238", "skill_used": "draft_docs", "file": "src/content/docs/support-and-community/plans-and-billing/credits.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Standardized Free-plan AI-usage messaging and Warp Agent terminology, with consistent crosslinks to BYOK, custom inference endpoint, and Grok subscription pages.", "tag": "", "pattern_category": "terminology", "resolved_by": "human_edit"} -{"date": "2026-06-29", "pr": "256", "skill_used": "draft_docs", "file": "src/content/docs/agent-platform/inference/custom-routers.mdx", "feedback_type": "review_comment", "severity": "suggestion", "comment": "Link out to the model-choice page's available-models list from the examples.", "tag": "", "pattern_category": "link_quality", "resolved_by": "human_edit"} +{"date": "2026-07-08","pr": "295","skill_used": "draft_docs","file": "src/content/docs/agent-platform/getting-started/faqs.mdx","feedback_type": "review_verdict","severity": "suggestion","comment": "This looks so great! Just some small comments in certain places. But thank you!!!","tag": "","pattern_category": "general","resolved_by": "human_edit"} +{"date": "2026-07-08","pr": "295","skill_used": "draft_docs","file": "src/content/docs/enterprise/index.mdx","feedback_type": "review_comment","severity": "important","comment": "I'm not entirely sure what the Analytics API is. Is this a currently available enterprise feature?","tag": "","pattern_category": "general","resolved_by": "human_edit"} +{"date": "2026-07-08","pr": "295","skill_used": "draft_docs","file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx","feedback_type": "review_comment","severity": "important","comment": "Oh exactly yes. So maybe in the sentence above we can remove the \"or endpoint configuration\" from that sentence.","tag": "","pattern_category": "general","resolved_by": "human_edit"} +{"date": "2026-07-08","pr": "295","skill_used": "draft_docs","file": "src/content/docs/enterprise/enterprise-features/team-managed-keys-and-endpoints.mdx","feedback_type": "review_comment","severity": "important","comment": "same here with the \"endpoint\" not being very relevant to the precedence piece.","tag": "","pattern_category": "general","resolved_by": "human_edit"} +{"date": "2026-07-08","pr": "307","skill_used": "draft_docs","file": "","feedback_type": "review_verdict","severity": "suggestion","comment": "## Overview\nReviewed the release docs workflow change that replaces Grafana on-call reviewer resolution with Slack notification instructions and a GitHub Actions last-reviewer assignment step.\n\n## Concerns\n- The new reviewer lookup likely calls the pulls endpoint with POST semantics because it passes `-F` fields to `gh api` without forcing GET, so the action can skip the intended last-reviewer assignment and fall back to the default reviewer.\n- The last-reviewer logic only inspects the newest merged PR instead of scanning recent merged PRs until it finds a human reviewer, which can incorrectly fall back when the newest merged PR has no human review.\n- The Slack notification example in the release update skill references names that are not defined/imported, so agents following it can fail before posting or while handling Slack errors.\n\n## Verdict\nFound: 0 critical, 4 important, 0 suggestions\n\n**Request changes**\n\nComment `/oz-review` on this pull request to retrigger a review (up to 3 t","tag": "","pattern_category": "general","resolved_by": "human_edit"} +{"date": "2026-07-17","pr": "342","skill_used": "draft_docs","file": "src/content/docs/terminal/windows/tabs.mdx","feedback_type": "review_comment","severity": "important","comment": "Same as above","tag": "","pattern_category": "general","resolved_by": "human_edit"} +{"date": "2026-07-23","pr": "364","skill_used": "draft_docs","file": "","feedback_type": "review_verdict","severity": "suggestion","comment": "## Overview\nThis PR removes `collapsed: true` from the 10 top-level section groups in the Oz (`/platform/`) sidebar topic in `src/sidebar.ts` so they render expanded by default, matching the Agents (`/agent-platform/`) topic. The change is a targeted 10-line deletion: the nested GitHub Actions and Self-hosting sub-groups retain `collapsed: true`, and all other topics are untouched. CI is green, and I re-ran the repo gates locally — `astro check` (0 errors, 0 warnings, 6 pre-existing hints) and `astro build` (348 pages) both pass. I also exercised the running dev server and confirmed all 10 Oz top-level sections are expanded by default on initial load while the two nested sub-groups stay collapsed, satisfying the ticket's acceptance criteria.\n\n## Verdict\nFound: 0 critical, 0 important, 0 suggestions\n\n**Approve**\n\n## Review run\nhttps://oz.staging.warp.dev/runs/019f8cbb-f89c-7ae4-8687-d1b9aebb91fd","tag": "","pattern_category": "ui_label_accuracy","resolved_by": "human_edit"} +{"date": "2026-07-27","pr": "374","skill_used": "draft_docs","file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx","feedback_type": "review_verdict","severity": "important","comment": "## Overview\nAdds a dedicated `Testing with Computer Use and video recordings` page, trims the `Recording sessions` section on `computer-use.mdx` to a teaser that links out, and wires the new page into the sidebar. The structure matches the approved outline, the PR-attachment wording is accurate and correctly scoped, and the troubleshooting section's failure modes all trace to real error strings in the client. Two areas need work before merge: the recording-feature descriptions are stated as unconditional when they are Linux-only, and the example section ships reader-facing links that point at internal/authoring surfaces.\n\n## Concerns\n**Platform scope of the recording features is missing and makes the page factually wrong on macOS.** `What's in a recording` presents the smart cut, action overlays, and click ripples/drag trails as properties of every recording. In the client they are produced only by the Linux post-processing pass: `post_process_recording` in `crates/computer_use/src/lib","tag": "","pattern_category": "callout","resolved_by": "human_edit"} +{"date": "2026-07-27","pr": "374","skill_used": "draft_docs","file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx","feedback_type": "review_verdict","severity": "suggestion","comment": "## Overview\nRe-review of head `7ee0590` against my prior pass. All four blocking findings are genuinely fixed, not just claimed: the `Platform support` bullet now scopes the smart cut, overlays, and pointer annotations to the Linux post-processing pass and correctly describes the macOS 4x uniform speedup, matching `post_process_recording`'s `cfg` gate and the `mac/recording.rs` `setpts` filter; the staging conversation link and all three `:::note` callouts pointing at PR #374 are gone; the internal-voice sentence is rewritten; the tracking claim is scoped to successful interactive calls; and the two missing troubleshooting causes (feature flag not enabled, platform not supported) are both accurate against `create_recorder` and the `VideoRecording` flag checks. Gates re-verified independently on this head: CI 8/8 green, `npm run build` clean at 349 pages, style lint clean on the changed files, 0 broken links across 3168 internal links.\n\n## Concerns\n**One residual scoping gap, non-blocki","tag": "","pattern_category": "callout","resolved_by": "human_edit"} +{"date": "2026-07-27","pr": "374","skill_used": "draft_docs","file": "src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx","feedback_type": "review_verdict","severity": "suggestion","comment": "## Overview\nFinal pass at head `644216a`, scoped to the two-item delta over `daa3850`. Both are correctly applied. The `computer-use.mdx` teaser now reads \"are attached to the pull request description when a cloud agent run produces them\", which matches the new page's statement that attachment is automatic once the recording artifact is associated with the run — the two pages no longer contradict each other and the disavowed wording is gone from the PR entirely. The `Recording failed to start` subsection was removed cleanly: no dangling anchor, no in-page or cross-page reference to it anywhere in `src/`, no sidebar impact, code fences still balanced, and `Retry guidance` still covers the failure path end to end (\"if a recording fails or produces an unexpected result\" → check the error, retry, file an issue if it repeats), so the intro's promise to explain \"how to handle common recording failures\" is still met. Regression sweep is clean: build 349 pages, style lint clean on the changed ","tag": "","pattern_category": "link_quality","resolved_by": "human_edit"} +{"date": "2026-07-30","pr": "402","skill_used": "draft_docs","file": "src/content/docs/cli/cloud-and-orchestration.mdx","feedback_type": "review_verdict","severity": "suggestion","comment": "nice! Just a few thoughts and clarifications","tag": "","pattern_category": "general","resolved_by": "human_edit"} +{"date": "2026-07-29","pr": "405","skill_used": "draft_docs","file": "src/content/docs/cli/reference.mdx","feedback_type": "review_comment","severity": "important","comment": "Fixed in 1c6b6aea: WARP_API_KEY=YOUR_API_KEY warp is now the primary non-interactive auth example; --api-key stays documented secondarily with a caution that command-line arguments can be captured in shell history and process listings. The troubleshooting sign-in section now also lists the environment variable first.","tag": "","pattern_category": "content_structure","resolved_by": "human_edit"} +{"date": "2026-07-28","pr": "407","skill_used": "draft_docs","file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx","feedback_type": "review_verdict","severity": "suggestion","comment": "## Overview\nThis PR establishes a dedicated Gemini Enterprise BYOLLM page, places it correctly beside the existing BYOLLM overview, and adds useful cross-links across Enterprise, inference, and billing content. The WIF, IAM, model-routing, and credential-lifecycle descriptions align with the shipped client and server implementation; publication still needs release-state, billing, cloud-agent-support, and verified-UI-surface corrections.\n\n## Concerns\n**Messaging and accuracy** — Clarify whether the public launch is intentional while the current production feature flag remains disabled, reconcile AI-credit and platform-credit language, and remove or verify the model-details UI claim.\n\n**Information architecture** — The new page and sidebar placement are appropriate, and the AWS/Gemini pages now cross-link bidirectionally. Update the provider comparison table so its cloud-agent column does not imply that Gemini Enterprise supports cloud agents.\n\n**Tone and style** — The new content follow","tag": "","pattern_category": "callout","resolved_by": "human_edit"} +{"date": "2026-07-29","pr": "407","skill_used": "draft_docs","file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx","feedback_type": "review_verdict","severity": "suggestion","comment": "## Final re-review — accepted\n\nThe rework at `b6f32547def468d63663964c242c6e2e67e8cc95` resolves the four prior review items. I found no must-fix issues or follow-up polish.\n\nVerified:\n\n* **Credits** - No `80%` claim remains in `src/content/docs/`. The billing, BYOLLM overview, and Gemini Enterprise pages consistently state that customer-routed inference consumes no AI credits, provider inference is billed to the customer cloud account, and local runs still consume platform credits.\n* **Cloud agents** - The comparison table now distinguishes AWS Bedrock BYOLLM (**Yes**) from Gemini Enterprise BYOLLM (**No, interactive sessions only**). Related copy consistently scopes Gemini Enterprise to interactive requests and AWS Bedrock to current cloud-agent BYOLLM support.\n* **Model picker** - The unverified model-details label was removed. The remaining references describe only the Gemini Enterprise badge without asserting an unverified UI string.\n* **Regression checks** - The MDX table renders","tag": "","pattern_category": "link_quality","resolved_by": "human_edit"} +{"date": "2026-07-29","pr": "407","skill_used": "draft_docs","file": "src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx","feedback_type": "review_verdict","severity": "suggestion","comment": "## Overview\nThis PR adds a new Gemini Enterprise (Vertex AI) BYOLLM page and updates related Enterprise, billing, inference, and sidebar references to treat Gemini Enterprise as a supported BYOLLM provider. The structure and link placement are generally consistent with the docs, and no approved spec context was provided for a spec-drift pass.\n\n## Concerns\n- The billing copy introduces `AI credits`, which conflicts with the docs terminology standard to use `credits` for the AI usage bucket.\n- The credential-security section says nothing sensitive leaves the customer's boundary, but the documented flow still sends request content and short-lived access tokens through Warp's backend; the claim needs to be narrowed to long-lived Google credentials.\n\n## Security\n- Narrow the boundary claim so customers do not infer that prompts, responses, or access tokens never pass through Warp during Gemini Enterprise routing.\n\n## Verdict\nFound: 0 critical, 3 important, 0 suggestions\n\n**Request changes**","tag": "","pattern_category": "link_quality","resolved_by": "human_edit"} +{"date": "2026-07-30","pr": "420","skill_used": "draft_docs","file": "src/content/docs/agent-platform/capabilities/index.mdx","feedback_type": "review_verdict","severity": "suggestion","comment": "approving to unblock, leaving high level thoughts in slack thread","tag": "","pattern_category": "general","resolved_by": "human_edit"} diff --git a/.agents/logs/pr_review_runs.md b/.agents/logs/pr_review_runs.md index 7b2eaad0a..e92541edd 100644 --- a/.agents/logs/pr_review_runs.md +++ b/.agents/logs/pr_review_runs.md @@ -15,3 +15,11 @@ This is a human-readable audit trail of `review-docs-pr` runs on agent-authored ``` --- +## 2026-08-03 — collector scan (no [SIGNAL:pr-review] markers) +- **Branch**: n/a +- **Skill used**: improve-drafting-skills feedback collector +- **Critical**: 0 · **Important**: 0 · **Suggestions**: 0 · **Nits**: 0 +- **Top issue categories**: none (0 markers across drafting-related Oz runs in the last 30 days) +- **Oz run**: collector-only; style-lint/pr-review inner-loop markers still absent + +--- diff --git a/.agents/logs/weekly_404_monitor_runs.md b/.agents/logs/weekly_404_monitor_runs.md index b96a81a2c..2fdf8f080 100644 --- a/.agents/logs/weekly_404_monitor_runs.md +++ b/.agents/logs/weekly_404_monitor_runs.md @@ -7,3 +7,49 @@ This log tracks every run of the `weekly-404-monitor` skill — both runs that o **Format**: see the `## Run log format` section in `.agents/skills/weekly-404-monitor/SKILL.md`. --- + +## 2026-08-10 — No data +- **Total 404s this week**: n/a +- **Total 404s last week**: n/a +- **Trend**: n/a +- **Significant gaps (≥5 hits)**: n/a +- **Redirect candidates processed**: 0 (hits ≥ 5) +- **HIGH-confidence redirects**: 0 +- **PR**: none +- **Oz run**: https://app.warp.dev/conversation/28103b9a-cbdb-4b07-b73e-555b88656028 +- **Notes**: Metabase query failed with HTTP 401 Unauthenticated. `METABASE_API_KEY` is present in environment K5KStCm5aYvhfBJb8cHol6 but is a short placeholder/invalid value, not a real Metabase API key for https://warp.metabaseapp.com. Posted failure notice to #growth-docs. Action needed: replace the secret with a valid Metabase API key and re-run. + +## 2026-08-03 — No PR +- **Total 404s this week**: 323 +- **Total 404s last week**: 458 +- **Trend**: ▼ 135 (-29.5%) +- **Significant gaps (≥5 hits)**: 0 (0 new) +- **Redirect candidates processed**: 0 (hits ≥ 5) +- **HIGH-confidence redirects**: 0 +- **PR**: none +- **Oz run**: https://staging.warp.dev/conversation/1703d43c-d6c3-46bc-adf9-d0531cc582ac +- **Notes**: `docs_404` data is flowing now (METABASE_API_KEY set in this run's environment, unlike the earlier same-day "No data" entry below). 257 pages had SQL-normalised hits; 252 uncovered, all below the 5-hit reporting threshold (pure long tail — no significant gaps). 295 resolved since last week. Posted summary to #growth-docs. + +## 2026-08-03 — No data +- **Total 404s this week**: n/a +- **Total 404s last week**: n/a +- **Trend**: n/a +- **Significant gaps (≥5 hits)**: n/a +- **Redirect candidates processed**: 0 (hits ≥ 5) +- **HIGH-confidence redirects**: 0 +- **PR**: none +- **Oz run**: https://app.warp.dev/conversation/61e9dfd8-e1c0-4d61-a007-9f2d8ea3360d +- **Notes**: Failed fast — METABASE_API_KEY is not set in the current Oz environment (current_environment_id=6qDvDbgkCLF3I0rLFEmiFo). Posted failure notice to #growth-docs. Expected secret on Docs Agent env K5KStCm5aYvhfBJb8cHol6. + +## 2026-07-27 — PR opened +- **Total 404s this week**: 458 +- **Total 404s last week**: 439 +- **Trend**: ▲ 19 (4.3%) +- **Significant gaps (≥5 hits)**: 3 (2 new) +- **Redirect candidates processed**: 1 (hits ≥ 5, excluding `/404` which is the error page itself) +- **HIGH-confidence redirects**: 1 +- **PR**: https://github.com/warpdotdev/docs/pull/385 +- **Oz run**: https://staging.warp.dev/conversation/5557485e-b9bc-4136-9b3c-0faadde5e1ab +- **Notes**: `/404` gap (6 hits) excluded from redirects — it is the 404 error page path itself, not a content page. `/team/index.md` (5 hits) excluded — raw `.md` extension URL with no clear landing page target; likely a stale link to a markdown file from an external source. 326 pages had SQL-normalised hits; 321 uncovered (318 below threshold). 239 resolved since last week. + +--- diff --git a/.agents/references/skill-authoring-guidelines.md b/.agents/references/skill-authoring-guidelines.md index eab3fbcf5..ad9698fc5 100644 --- a/.agents/references/skill-authoring-guidelines.md +++ b/.agents/references/skill-authoring-guidelines.md @@ -37,6 +37,31 @@ Reviewers should merge the log PR periodically so entries reach `main` and becom **Keep the log branch separate from content PRs.** Never write log updates and skill/content edits in the same commit or branch. +### One standing PR per automation + +**The second biggest failure mode: PR stacking.** A skill that mints a new date-suffixed branch on every run accumulates one open PR per run. Because recurring skills tend to edit the same small set of files, those PRs conflict with each other and none of them can be merged cleanly. The `improve-drafting-skills` agent produced four mutually-conflicting open PRs in six days this way, every one of them editing `draft_docs/SKILL.md`. + +The log-branch pattern above already solves this for logs. Generalize it to content PRs: **an automation has at most one open PR at any time.** + +**Required pattern for all PR-opening skills:** + +1. **Use a stable branch name with no date suffix** — `docs/<skill-name>`, not `docs/<skill-name>-2026-08-06`. +2. **Use a stable PR title with no date.** The run date belongs in a dated section of the PR body, not the title. A date in the title defeats title-based lookup and guarantees a new PR on every run. +3. **Look before creating:** + ```bash + gh pr list --repo warpdotdev/docs --state open \ + --search '<stable title> in:title' --json number,headRefName + ``` +4. **If an open PR exists**, add to it rather than opening another: + - Check out its branch and rebase on the latest `origin/main`. + - Apply this run's edits, commit, and push. + - Append a new dated section to the PR body. Fetch the current body and make a minimal additive edit — never regenerate it wholesale (see "Outer loop PR body integrity"). + - Re-run `check_pr_body.py` after the edit. +5. **If no open PR exists**, create the stable branch from the latest `origin/main` and open a draft PR. +6. **Never leave two open PRs for the same automation.** If a stale or superseded one is found, close it with an explanatory comment before opening a replacement. + +This keeps a run's work reviewable without letting unreviewed work pile up, and it means a missed review cycle costs one stale PR rather than one per run. + ### Verifying log writes explicitly Agents often proceed past a failed file write without noticing. For any log update step, verify explicitly: @@ -45,33 +70,37 @@ Agents often proceed past a failed file write without noticing. For any log upda - After appending: `tail -5 <file>` and confirm the new entry appears. - After push: `git log --oneline -1 origin/<branch>` and confirm the commit SHA matches the expected commit. -### Source data and freshness +### Source data from authenticated APIs -**Cloud agents cannot call Peec MCP directly.** Peec requires OAuth authentication, which is not available in cloud agent environments. Any skill that needs Peec data must read from a pre-exported snapshot committed to the `buzz` repo. +**Prefer live API calls with a token over pre-exported snapshots.** Cloud agents can authenticate with services that issue long-lived tokens. Peec, for example, is reached through its MCP server using a Personal Access Token stored as the `PEEC_PAT` Oz secret — cloud agents do not need OAuth, and they do not need a committed snapshot. -If your skill uses external data (Peec, GSC, or any authenticated API) that is unavailable in cloud agents: +When your skill needs data from an authenticated API: -1. Build the data export into a separate **local-only skill** (e.g., `refresh-peec-aeo-snapshot`). -2. The cloud skill reads the committed snapshot, not the live API. -3. Add an explicit **freshness gate**: define a maximum age (e.g., 14 days), check `generated_at`, and exit with a stale-snapshot report if the threshold is exceeded. Never proceed with stale data. -4. Document the freshness constraint clearly at the top of the `## Source data` section: explain why a snapshot is used instead of a live call, so future editors don't remove the constraint thinking it is overly cautious. +1. Store the credential as an Oz secret and reference it by name in the skill's `## Environment requirements` section. Never inline it. +2. For MCP-based sources, document the `mcp_servers` config the scheduled agent needs, so whoever creates the schedule knows the skill will not work without it: + ```json + { + "peec-ai": { + "url": "https://api.peec.ai/mcp", + "headers": { + "Authorization": "Bearer ${PEEC_PAT}" + } + } + } + ``` +3. Define an explicit **unavailable path**: what the skill does when the token is missing or expired, the MCP server is not configured, or the call fails. Log the specific failure (never the token value), degrade to the remaining signals, and raise the confidence bar for any output produced without the primary signal. +4. Record availability in the run log (for example, `Source signals: Peec [available | unavailable]`) so the outer loop can distinguish a low-signal period from a broken credential. -Freshness gate pattern: -- Read `generated_at` from the snapshot metadata file. -- If the file is missing, `generated_at` is absent, or the age exceeds the threshold: - - Write a stale-snapshot report with the exact age (or error reason). - - Write a run log entry with a `No-run reason` of `snapshot stale — N days old`. - - Post a Slack alert. - - Exit. Do not proceed or open a PR. +**Use a committed snapshot only as a last resort** — when a source genuinely cannot be authenticated from a cloud agent. Snapshots introduce a freshness gate, a manual local refresh step, and a failure mode where the agent exits without doing work because nobody refreshed the data. If you do use one, define a maximum age, check it before use, and pair the skill with a scheduled refresh so the gate cannot silently starve the pipeline. ### Scope consistency When you add a new topic area to a skill's scope, audit every section — especially `## Source data` — to confirm the source data actually covers the new topic. A common mistake: a skill lists four topic areas but the source data description names only three. The agent then produces lower-quality briefs for the fourth topic with no signal, or invents signals. Checklist when expanding scope: -- Does the snapshot include data for the new topic? If not, update the snapshot refresh skill, or document the lower confidence explicitly. +- Does the source data include the new topic? If not, extend the tracked queries or prompts at the source, or document the lower confidence explicitly. - Are all quality gates still valid for the new topic? (e.g., minimum brief count thresholds) -- Does the stale-snapshot report reflect the full scope? +- Do the no-action and unavailable-signal reports reflect the full scope? ### Scope contradictions in "Do not" lists @@ -96,18 +125,45 @@ Never hard-code the Oz host in Slack messages or run output. The agent may run o Always resolve the Oz run link at runtime: ```bash -oz-dev run get "<your run ID>" --output-format json | jq -r '.session_link' +oz run get "<your run ID>" --output-format json | jq -r '.session_link' ``` +Use `oz`, not `oz-dev`. `oz-dev` is a local development build that ships with the Warp dev app; cloud sandboxes only have `oz`, so any skill instructing an agent to call `oz-dev` silently loses its run link. + If the command fails or returns an empty value, omit the `Oz run` line rather than posting a broken link. ### Secrets and environment variables -Always use `SLACK_BOT_TOKEN` and other secrets from environment variables — never inline them or print them to run output, logs, or Slack messages. If a required secret is unavailable, write the payload to the run output instead of posting to Slack. Do not crash the run on missing notification credentials. Include this in the skill as an explicit fallback, not just as an assumed environment guarantee. +Always read Slack tokens and other secrets from environment variables — never inline them or print them to run output, logs, or Slack messages. If a required secret is unavailable, write the payload to the run output instead of posting to Slack. Do not crash the run on missing notification credentials. Include this in the skill as an explicit fallback, not just as an assumed environment guarantee. + +**Pick the token that matches the destination channel.** Several Slack bot tokens exist in the Oz secret store, and they authenticate as different bots with different channel memberships. A token that authenticates successfully still cannot post to a channel its bot has not joined. Name the expected bot in the skill's environment requirements (for example, `BUZZ_SLACK_TOKEN` posts as `buzz`, which is the account in `#growth-docs`) so a future editor does not swap in a token that authenticates but cannot deliver. + +**A secret being present does not mean it works.** A token can authenticate while the paired channel ID is stale, or the bot may not be a member of the target channel — Slack returns `channel_not_found` in both cases. Skills that post to Slack should define what to do on a failed post (attempt a lookup by channel name, then fall back to run output) and must report the failure explicitly rather than logging the run as fully successful. ### Slack notifications -Post a Slack notification on every run, including no-action runs and stale-snapshot exits. A missing notification on a no-action run is indistinguishable from a run that silently failed. Use a simple text message (not Block Kit) that can be scanned in under 30 seconds. +**Post only when the run produced something a human needs to act on.** Recurring agents that post unconditionally train the channel to ignore them, which costs more than a missed notification does. + +Actionable means one of: + +- A PR was created or received new commits. +- A threshold was crossed (broken links found, significant 404 gaps, a score regression). +- The agent hit a failure or an early exit that stopped it from completing its job — including a missing or expired credential, an unavailable source signal, a stale-snapshot exit, or a blocked audit. These are not no-ops, and they always post. + +Everything else is silent. A no-change or no-op run records its outcome and posts nothing. + +**Silence means "ran, nothing to do."** An earlier version of this guidance required posting on every run, reasoning that a silent no-action run is indistinguishable from a run that silently failed. That concern is real, but Slack is the wrong place to solve it: Oz lifecycle events surface failed and errored runs directly, and every scheduled run leaves an inspectable run record on the Runs page. + +The corollary is a requirement, not a nicety: **a skill may only be silent when the run leaves a durable record of its outcome.** One of these must be true: + +- The skill writes a run log entry on every run, including no-ops. Prefer this for any skill whose history is read by an outer loop — without it, the outer loop cannot tell a quiet period from a broken one. +- Or the run writes an explicit outcome line to run output stating what it checked and why it took no action. This is sufficient for a short-circuit exit that happens before the skill does any work, such as a schedule guard. + +A skill that can exit without producing either must post instead. + +**Never post twice for one run.** If a skill has multiple phases, fold the later phase's results into the single message rather than posting a follow-up. + +Use a simple text message (not Block Kit) that can be scanned in under 30 seconds. --- @@ -117,21 +173,41 @@ Outer loop skills run less frequently (typically monthly) and read the inner loo ### Data minimum before the outer loop can run -The outer loop needs enough run log entries to identify real patterns, not noise. Require a minimum entry count before acting (the `improve-aeo-crosslink-skill` uses 8 entries ≈ 2 months; `improve-aeo-new-guide-rec-skill` should start after ~4 entries ≈ 6–8 weeks). If the minimum is not met, write a "too early to analyze" notice to run output and skip the PR. +The outer loop needs enough run log entries to identify real patterns, not noise. Require a minimum entry count before acting (the `improve-aeo-crosslink-skill` uses 8 entries ≈ 2 months at a weekly cadence; `improve-aeo-new-guide-rec-skill` should start after ~4 entries ≈ 4 months at a monthly cadence). If the minimum is not met, write a "too early to analyze" notice to run output and skip the PR. This minimum must be stated explicitly in the skill's `## Schedule` section so the deployer knows when to start the agent. ### Log availability -The outer loop reads the inner loop's log from `main`. For entries to be available, the inner loop's standing log PR must be merged into `main` before the outer loop runs. Document this as a prerequisite: +**Read the log from the log branch, not from `main`.** The inner loop writes every entry to `chore/<inner-loop>-log` and only reaches `main` when a human merges the standing PR. An outer loop that reads `main` therefore sees a truncated history whose staleness depends on review cadence — and silently analyzes fewer entries than it thinks it has. -```markdown -## Prerequisites +Read from the branch, which always holds the complete history: -- The standing log PR (`chore: <inner-loop> run log`) merged into `main` so the entries are present there. - If it is unmerged, merge it first (or read the log from the `chore/<inner-loop>-log` branch) before analyzing. +```bash +git fetch origin chore/<inner-loop>-log +git checkout origin/chore/<inner-loop>-log -- .agents/logs/<log-file>.md ``` +Treat `main` as the convenience case only — if the PR happens to have been merged, the branch and `main` agree, and the branch read is still correct. + +**Do not make merging the standing log PR a step in the outer loop.** Merging is a human housekeeping task, not a precondition for analysis. An outer loop that tries to merge its own input couples the run to a repo write it may not have permission to perform, and turns an unmerged PR into a hard failure instead of a non-event. + +**If the log branch cannot be fetched, stop — do not fall back to another copy.** Falling back to the checkout's copy reintroduces exactly the truncated history the branch read exists to avoid. Treat the fetch failure as a blocked run: post it and end before analysis. + +### Never fall back to lower-quality data + +The log-branch rule above is one instance of a general hazard. When a skill's primary data source is unavailable, the tempting fix is a fallback that keeps the run alive. Resist it whenever the fallback is **quieter but less correct** than failing. + +A degraded-data fallback is dangerous precisely because it does not look like a failure: + +- A shorter log still parses. Counts just come out lower. +- Lower counts silently cross thresholds in both directions. The run either reports "too early to analyze" and goes quiet, or clears the minimum on stale entries and proposes changes from an incomplete picture. +- Either way the output is shaped like a normal run, so no one investigates. + +The test to apply: **if the fallback can change the answer rather than just the completeness of the answer, do not take it.** Stop, mark the run blocked, and post — a loud failure costs one notification, while a quiet wrong answer costs trust in every quiet run that follows. + +Fallbacks are still fine when they degrade *coverage* transparently and the skill says so in its output — for example, proceeding with one source signal when a second is unavailable, while raising the confidence bar and recording the unavailability in the run log. The difference is that the reader can see what was missing. + ### Security boundary for signal logs Outer loops read logs that contain untrusted content: human review comments, PR descriptions, run output from external contributors. Apply these rules before using any log content to propose skill edits: diff --git a/.agents/references/terminology.md b/.agents/references/terminology.md index edf662704..e33e04198 100644 --- a/.agents/references/terminology.md +++ b/.agents/references/terminology.md @@ -2,7 +2,7 @@ Use this glossary everywhere you write about Warp. Keep definitions short, concrete, and consistent. If a term is likely unfamiliar outside developer audiences, include a short plain-language explanation you can reuse on first mention. -For the summary of the most critical terms (core features, Oz terms, terms to avoid), see the [Terminology standards](../../AGENTS.md#terminology-standards) section of AGENTS.md. This file is the full canonical reference. +For the summary of the most critical terms (core features, Automation Platform terms, terms to avoid), see the [Terminology standards](../../AGENTS.md#terminology-standards) section of AGENTS.md. This file is the full canonical reference. > **Product name variables**: Product names are defined in `src/data/vars.ts`. When writing new content, use `{VARS.WARP_AGENT_CLI}` (body prose) or `{{WARP_AGENT_CLI}}` (frontmatter) rather than hardcoding product names. See the ["Content variables" section of AGENTS.md](../../AGENTS.md#content-variables) for full usage instructions. @@ -33,7 +33,7 @@ For the summary of the most critical terms (core features, Oz terms, terms to av *Usage note:* Use as the name of the feature, not "input box." - **Warp** — The agentic development environment for professional developers, built around a modern terminal and AI agents. - *Usage note:* Use "Warp" as the product name. Add "AI terminal" only when you need the positioning shorthand. Do not use "Warp Terminal" unless specifically distinguishing from Oz. + *Usage note:* Use "Warp" as the product name. Add "AI terminal" only when you need the positioning shorthand. Do not use "Warp Terminal" unless specifically distinguishing from the Automation Platform. ## Navigation and UI terms @@ -51,12 +51,13 @@ For the summary of the most critical terms (core features, Oz terms, terms to av - **Settings** — Warp's configuration interface. *Usage note:* Capitalize as a UI name. The Settings sidebar has three **umbrellas** (**Agents**, **Code**, and **Cloud platform**) that expand into subpages — always reference the specific subpage in paths, not the umbrella alone. - - **Agents** umbrella subpages: **Oz**, **Profiles**, **MCP servers**, **Knowledge**, **Third party CLI agents**. + - **Agents** umbrella subpages: **Warp Agent**, **Profiles**, **MCP servers**, **Knowledge**, **Third party CLI agents**. - **Code** umbrella subpages: **Indexing and projects**, **Editor and Code Review**. - - **Cloud platform** umbrella subpages: **Environments**, **Oz Cloud API Keys**. + - **Cloud platform** umbrella subpages: **Environments**, **API keys**. - Deprecated labels to avoid: - - **Settings** > **AI** — now under the **Agents** umbrella; pick the relevant subpage (**Oz** for the global toggle + Active AI/Input/Voice/Other/Experimental; **Profiles** for permissions and allow/denylists; **Knowledge**; **Third party CLI agents**). - - **Settings** > **Platform** — now **Settings** > **Cloud platform** > **Oz Cloud API Keys** for `oz agent` API keys. + - **Settings** > **AI** — now under the **Agents** umbrella; pick the relevant subpage (**Warp Agent** for the global toggle + Active AI/Input/Voice/Other/Experimental; **Profiles** for permissions and allow/denylists; **Knowledge**; **Third party CLI agents**). + - **Settings** > **Platform** — now **Settings** > **Cloud platform** > **API keys** for Warp API keys. + - **Settings** > **Cloud platform** > **Oz Cloud API Keys** — now **Settings** > **Cloud platform** > **API keys**. - **Settings** > **MCP Servers** (top-level) — now **Settings** > **Agents** > **MCP servers**. - **Settings** > **Environments** (top-level) — now **Settings** > **Cloud platform** > **Environments**. @@ -71,7 +72,7 @@ For the summary of the most critical terms (core features, Oz terms, terms to av ## Agent concepts -- **Cloud Agents** — Agents that run in the cloud on a schedule, trigger, or integration, without interactive input. Managed by the Oz Platform. +- **Cloud Agents** — Agents that run in the cloud on a schedule, trigger, or integration, without interactive input. Managed by the Automation Platform. *Usage note:* Use lowercase "cloud agents" in most contexts. Capitalize as "Cloud Agents" only when referring to the product section or feature name. - **Agent Profiles** — Saved configurations that define how an Agent runs (for example, permissions and model selection). @@ -95,7 +96,7 @@ For the summary of the most critical terms (core features, Oz terms, terms to av - **Slash Commands** — Built-in commands you run by typing `/` to trigger actions (or run saved prompts). -- **Agent Memory** — Oz's persistent, cross-harness memory layer that lets agents read and write durable knowledge across conversations, harnesses, and devices. Currently in research preview. +- **Agent Memory** — The Automation Platform's persistent, cross-harness memory layer that lets agents read and write durable knowledge across conversations, harnesses, and devices. Currently in research preview. *Usage note:* Capitalize as a feature name. Lowercase "memory" only when describing the generic concept (e.g., "the memory layer"). - **memory store** — A named collection of memories owned by a user (personal) or team. Multiple agents can share a store, and per-agent attachments control read/write access. @@ -104,6 +105,9 @@ For the summary of the most critical terms (core features, Oz terms, terms to av - **Handoff** — The feature for moving an agent's work between a local Warp session and the cloud, or continuing a finished cloud run. Supports local-to-cloud, cloud-to-cloud, and cloud-to-local directions. *Usage note:* Capitalize as a feature name. Use lowercase "hand off" / "handed off" only as a verb. +- **Active AI** — The feature that proactively surfaces fixes and next actions based on terminal errors, inputs, and outputs. Covers Prompt Suggestions, Next Command predictions, and Suggested Code Diffs. + *Usage note:* Always capitalize "Active AI" — it is a proper feature name and the label of the Settings toggle. Write the full capability as **Active AI Recommendations**, matching the page title. Lowercase the following word only when it is a plain common noun rather than part of the name, as in "Active AI features" or "the Active AI toggle". + ## Coding terms (Warp features) - **Code** — Warp's coding experience for agent-assisted changes (editing, diffs, code review). @@ -130,13 +134,39 @@ For the summary of the most critical terms (core features, Oz terms, terms to av - **Workflow** / **Workflows** — Saved, runnable workflows in Warp Drive (often multi-step command sequences). -## Oz terminology +## Automation Platform terminology + +Renamed from "Oz" on 2026-08-18. Two surfaces keep the Oz name until 2026-09-15 +and are **not** stale in the meantime: the `oz` CLI binary and the Oz v1 web app +at `oz.warp.dev`. See "What still says Oz" at the end of this section. + +### The article rule + +"Oz" was a proper noun and read correctly bare. "Automation Platform" is a +common-noun phrase, so it needs a definite article in referential positions. +This is the single most common mistake when writing about the platform. + +- **Referential** (the platform as an entity — subject, object, possessor) takes + "the": "with the Automation Platform", "The Automation Platform provides", + "the Automation Platform's backend". +- **Attributive** (modifying a following noun) stays bare: "Automation Platform + settings", "Automation Platform-hosted", "Automation Platform overview". + +In docs prose, always write the name as `{VARS.WARP_AUTOMATION_PLATFORM}` (body) +or `{{WARP_AUTOMATION_PLATFORM}}` (frontmatter) rather than the literal string, +and put the article outside the token. `style_lint` enforces both: `hardcoded-var` +catches the literal, `platform-determiner` catches a missing article. -### Warp Agent vs Oz +### Warp Agent vs the Automation Platform -- **Warp Agent** — Warp's built-in agent harness. Use "Warp Agent" when specifically referring to the built-in harness, especially when contrasting with third-party agents (Claude Code, Codex, etc.), or when referencing the Settings label (**Settings** > **Agents** > **Warp Agent**). -- **Oz** — Warp's programmable platform for running and coordinating agents at scale -- There is typically one Warp environment per user session. Oz can run many agents concurrently, across machines, repos, and teams. +- **Warp Agent** — Warp's built-in agent harness. Capitalized, singular, treated as a proper noun. Use "Warp Agent" when specifically referring to the built-in harness, especially when contrasting with third-party agents (Claude Code, Codex, etc.), or when referencing the Settings label (**Settings** > **Agents** > **Warp Agent**). Use lowercase "agent" / "agents" everywhere else. + *Usage note:* Avoid "Warp's agent" and "Warp's agents" — the ambiguous middle ground, and the main source of capitalization drift in the docs. Rewrite as "the Warp Agent" (the built-in harness), "agents" or "agents in Warp" (generic), or "the Warp Agent harness" (the server-side runtime). + *Usage note:* In prose the term takes the definite article — "the Warp Agent". Reserve the bare form for headings, sidebar labels, page titles, and the Settings path. "Runs the Warp Agent" reads correctly; "runs Warp Agent" reads as a different product. +- **The Automation Platform is the platform, not the agent.** Never introduce it as "Warp's agent" or equate the two. The Automation Platform runs and coordinates agents; the Warp Agent is the agent. +- **Warp Agent CLI** — The standalone terminal program (the `warp` binary) that runs the Warp Agent in any terminal, including over SSH and on machines without the Warp app. Documented at `/agents/cli/`. + *Usage note:* Distinct from the Oz CLI (the `oz` binary), which runs and manages cloud agents. At the next launch (approximately August 18, 2026) the Oz CLI is retired and wrapped into the Warp Agent CLI, leaving a single CLI under this name. Until that ships, keep the two clearly separate in prose; afterwards, "Warp Agent CLI" covers both. +- **Automation Platform** — Warp's programmable platform for running and coordinating agents at scale +- There is typically one Warp environment per user session. The Automation Platform can run many agents concurrently, across machines, repos, and teams. ### Core terms @@ -149,14 +179,17 @@ For the summary of the most critical terms (core features, Oz terms, terms to av - **Environment** — The execution context for an agent, including repo access, dependencies, secrets, compute, and runtime configuration. -- **Oz** — Warp's programmable platform for running and coordinating agents at scale. - *Example:* With Oz, you can orchestrate multiple agents to automate and parallelize complex workflows. +- **Automation Platform** — Warp's programmable platform for running and coordinating agents at scale. + *Example:* With the Automation Platform, you can orchestrate multiple agents to automate and parallelize complex workflows. -- **Oz dashboard** — The app surface to manage all Oz runs, unified across the Warp app and web. +- **cloud agent dashboard** — The app surface to manage all runs, unified across the Warp app and web. + *Usage note:* Platform-level default (HYC, 2026-08-17). Use `{VARS.DASHBOARD}`. On pages specifically about a factory, write "factory dashboard" directly. Both are lowercase common nouns, so capitalize only at the start of a sentence or bullet — which the variable cannot do, so reword rather than leading a bullet with it. -- **Oz run** — A single execution lifecycle of an agent, including actions, outputs, and logs. An Oz run is always cloud-based. +- **cloud agent run** — A single execution lifecycle of an agent, including actions, outputs, and logs. Always cloud-based. + *Usage note:* This is the platform-level default (HYC, 2026-08-17). Use `{VARS.PLATFORM_RUN}`, or "Warp cloud agent run" when you need to disambiguate from another vendor's runs. On pages that are specifically about a factory, write "factory run" directly instead — the variable holds the general term, so it cannot carry that distinction. - **Oz web app** — The web app for configuring agents and managing runs. + *Usage note:* Holds the Oz name until 2026-09-15. Use `{VARS.WEB_APP}`. - **subagent** — A child agent created by a parent agent to parallelize or delegate work. @@ -172,9 +205,15 @@ For the summary of the most critical terms (core features, Oz terms, terms to av ### Preferred phrases -- ✅ "Ask Oz to..." -- ✅ "Oz can help you..." -- ✅ "What would you like Oz to do?" +The platform is not something you address. It runs and coordinates agents; the +agent is what you ask. The older "Ask Oz to..." phrasings worked only because +"Oz" was doing double duty as both platform and assistant, which the rename +ended — "Ask the Automation Platform to..." is plainly wrong. Address the agent. + +- ✅ "Ask the agent to..." +- ✅ "Run an agent on the Automation Platform" +- ✅ "The Automation Platform can run this on a schedule" +- ❌ "Ask the Automation Platform to..." — you ask an agent, not a platform ### Terms to avoid @@ -189,6 +228,28 @@ For the summary of the most critical terms (core features, Oz terms, terms to av - ❌ "AI agents" → Use "agents" (the "AI" prefix is redundant) - ❌ "Ambient Agents" / "ambient agents" → Use "Cloud Agents" / "cloud agents" ("ambient" is no longer a product term; acceptable only in code identifiers like `AmbientAgentConfig`) - ❌ "agent identity" / "agent identities" → Use "agent," "agents," or "cloud agent(s)" in user-facing copy. Use legacy API names such as `agent_identity_uid` or `/agent/identities` only when documenting the exact field, path, or compatibility behavior. +- ❌ A bare "Automation Platform" in a referential position → Add "the". See "The article rule" above. +- ❌ The literal string "Automation Platform" in prose → Use `{VARS.WARP_AUTOMATION_PLATFORM}` / `{{WARP_AUTOMATION_PLATFORM}}`. + +### What still says Oz + +Not every "Oz" in the docs is stale. These are deliberate and correct until +2026-09-15, when they get their own value flip: + +- **The `oz` binary** and every `oz <command>` 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; + variabilizing them would silently rewrite a working handle into an invalid + one. This one keeps its name. + *The Slack/Linear handle moved from `@Oz` to `@warp` on 2026-08-17. It is + hardcoded for the same reason — that is what made it a safe one-line change + when the answer came back, rather than something a variable flip had already + broken.* +- **Changelog entries.** Historical records of what shipped under the old name. ## Platform terms @@ -209,7 +270,57 @@ For the summary of the most critical terms (core features, Oz terms, terms to av - **Trigger** — The event that starts a run (Slack mention, schedule, CI event, API call). -- **Warp CLI** — The command-line tool for running and managing Warp Platform workflows. Formerly called `warp-cli`, now `oz`. +- **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. + *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. + +## Warp Factories terminology + +### The product/instance rule + +This works like GitHub Actions. **Warp Factories** is the product and is always +written in full. An individual **factory** is a common noun and is always +lowercase. A bare capitalized **Factory** is never a proper noun — there is no +such product. + +- ✅ "Warp Factories is in Early Access" (the product) +- ✅ "your factory", "each factory's agents", "set up a factory" (an instance) +- ✅ "factory dashboard", "factory run", "factory agents", "factory definition" +- ❌ "the Factory", "your Factory", "Factory runs", "Factory metrics" +- ❌ "Factories" on its own to mean the product — write "Warp Factories" + +Sentence-initial capitals are positional, not proper nouns: a heading, sidebar +label, or page title may begin "Factory agents" or "Factory dashboard" for the +same reason it would begin "Cloud agents." The rule governs mid-sentence prose. + +Verbatim product strings are quoted as they ship, even when they break the rule. +The setup wizard currently renders **Factory name**, **Add your Factory to your +team**, and "Factory running!", and the sidebar renders **Factory definition**. +Docs match the screen; the fix belongs in the app. + +- **Warp Factories** — Warp's product for deploying and operating cloud software factories: automation loops around the SDLC where cloud agents triage, spec, implement, review, and verify work, with humans in the loop at key decision points. Launched in Early Access 2026-08-18. + *Usage note:* Capitalize both words as the product name; plural "Factories." Always write it in full — never a bare "Factory" or "Factories." Distinct from "software factory" (see below), the generic industry term for the pattern. + +- **software factory** — The generic, lowercase industry term for an automation loop around the SDLC (triage, spec, implement, review, verify). Warp Factories is Warp's product implementation of this pattern. + *Usage note:* Lowercase when used generically ("a software factory," "cloud software factories"). Capitalize only when part of the product name "Warp Factories." + +- **factory** — An individual deployed instance of a software factory, built on Warp Factories infrastructure. + *Usage note:* Lowercase common noun ("your factory," "set up a factory"). + +- **factory definitions as code** — The practice of specifying a factory's repos, agent roles, skills, MCPs, and permissions as version-controlled code, similar to infrastructure-as-code. Enables rollback, canarying, and agentic self-improvement of the factory itself. + +- **work item** — A unit of work moving through a factory (for example an issue, ticket, or triggered task) as it passes through triage, spec, implementation, review, and verification. + +- **foreman agent** — The orchestrator agent that receives a work item's triggering context and dispatches subagents to move it through the factory, choosing model, harness, and context for each step. + +- **Factory MCP** — The MCP server that lets any coding agent or MCP client interact with a factory: push work in, pull status, or guide sessions. + *Usage note:* The one sanctioned exception to the product/instance rule above, because it is the feature's own shipped name — the server registers as `warp-factory` and its skill calls itself "the Warp Factory MCP." Capitalize both words; do not generalize the exception to other phrases. + +- **factory dashboard** — The web app surface for operating a single factory: its work items, runs, agents, automations, and settings. + *Usage note:* Lowercase common noun. Distinct from **Dashboard**, the metrics page inside it, which is also the factory's landing page — bold **Dashboard** when you mean that page, and leave "factory dashboard" unbolded when you mean the surface. Replaced "control room," a docs-only coinage that appeared nowhere in the product. + +- **AI sovereignty** — Warp Factories' positioning around customer ownership and control of inference, hosting, and data exhaust (agent conversations, evals, memories) for their factory. ## Technical terms @@ -248,6 +359,8 @@ For the summary of the most critical terms (core features, Oz terms, terms to av ## Billing and credits - **Add-on Credits** — capitalized as a product feature name +- **Auto-reload** — the setting that automatically purchases another add-on credit pack when a user's balance drops below 100 credits. Hyphenated; capitalize the first letter only at the start of a sentence, bullet, or bolded list term. +- **team-wide spend cap** — the admin-configured monthly ceiling on add-on credit spending across a whole team. Use instead of "budget" or "credit limit" when describing the cap. The per-account wording "monthly spend limit" refers to the same setting in single-user contexts. - **compute credits** — lowercase common noun; capitalize the first letter only at the start of a sentence or bullet. The compute bucket, consumed when an agent run uses Warp-hosted compute. Use alongside AI credits and platform credits when describing credit types. - **cloud agent credits** — lowercase common noun; capitalize the first letter only at the start of a sentence or bullet. Credits consumed by cloud agents, in contrast with local agent credits. Refers to the same compute bucket as compute credits; choose the term that fits the framing. - **platform credits** — lowercase common noun; capitalize the first letter only at the start of a sentence or bullet. The platform-infrastructure bucket, consumed for every cloud agent run plus local runs with customer-supplied inference. diff --git a/.agents/rules/oz-style-guidelines.md b/.agents/rules/oz-style-guidelines.md index 99675b24d..6d298f848 100644 --- a/.agents/rules/oz-style-guidelines.md +++ b/.agents/rules/oz-style-guidelines.md @@ -144,6 +144,8 @@ Avoid framing Warp as: ## Voice and Style +The authoritative tone rules live in the "Voice & tone" section of the docs style guide (`AGENTS.md`), including the lists of AI-generated-sounding words and structural patterns to avoid. The points below cover positioning-specific guidance. + ### Do's: - **Talk about outcomes, not hype** - Show what changes when agents are reliable and orchestrated - **Emphasize control and trust** - Warp augments developers, doesn't replace them @@ -159,6 +161,10 @@ Avoid framing Warp as: - Don't use corporate or disconnected language - Skip theoretical posts without practical value - Don't list features without context or problem-solving +- Don't use AI-slop buzzwords ("seamless," "powerful," "robust," "leverage," "streamline"): name the specific capability instead +- Don't open pages with meta-text ("This page covers...") or narrate the page's structure +- Don't document internal architecture (orchestrators, control planes, lifecycle states): describe the user-visible model the reader acts on +- Don't stack an em dash and a colon in the same sentence: pick one, or split into two direct sentences ## Writing Guidelines @@ -172,9 +178,11 @@ Avoid framing Warp as: - Descriptive text and captions end in periods ### Preferred Phrases -- ✅ "Ask Oz to..." -- ✅ "Oz can help you..." -- ✅ "What would you like Oz to do?" +- ✅ "Ask the agent to..." +- ✅ "Run an agent on the Automation Platform" +- ✅ "The Automation Platform can run this on a schedule" +- ❌ "Ask Oz to..." (stale: Oz was renamed to the Automation Platform on 2026-08-18) +- ❌ "Ask the Automation Platform to..." (you ask an agent, not a platform) ## Problem Framing diff --git a/.agents/skills/aeo_crosslink_audit/SKILL.md b/.agents/skills/aeo_crosslink_audit/SKILL.md index c22a59c79..898f115a7 100644 --- a/.agents/skills/aeo_crosslink_audit/SKILL.md +++ b/.agents/skills/aeo_crosslink_audit/SKILL.md @@ -29,7 +29,7 @@ Do not: The following environment secrets should be set in the Oz cloud agent environment: - `PEEC_PAT` — Peec Personal Access Token for MCP authentication. Create one at **app.peec.ai → Company → API Keys → Personal Access Tokens**. If unavailable or expired, the audit proceeds with GSC and docs-only signals and logs "Peec: unavailable" in the run output. -- `SLACK_BOT_TOKEN` — Slack bot token for posting to `#growth-docs`. If unavailable, write the notification body to the run output instead and skip Slack posting. +- `BUZZ_SLACK_TOKEN` — Slack bot token for posting to `#growth-docs`, authenticating as the `buzz` bot. This is the account that posts to that channel; do not substitute another Slack token without confirming the bot is a member of the channel. If unavailable, write the notification body to the run output instead and skip Slack posting. - `GROWTH_DOCS_SLACK_CHANNEL_ID` — Slack channel ID for `#growth-docs`. Find it in Slack by right-clicking the channel → Copy link (the ID begins with `C`). If unavailable, skip Slack posting. The scheduled cloud agent must also include the Peec MCP server in its agent config (pass via `--mcp` flag or the agent config file `mcp_servers` key): @@ -51,6 +51,8 @@ Do NOT print, log, commit, or include secret values in reports or Slack messages Use the smallest reliable set of source data needed to justify link changes: - **Peec** - Use the Peec MCP (configured in the agent with a Personal Access Token via the `PEEC_PAT` secret) to collect prompts, search queries, actions/recommendations, and source URLs for agents, cloud agents, and orchestration (last 30 days). Filter prompts and queries for relevance to the topic area. If the Peec MCP returns an error or is unavailable (missing `PEEC_PAT`, expired token, or connection failure), log "Peec: unavailable" in the run output and proceed with GSC and docs-only signals only. + - A cloud run may not expose `peec-ai` as a native tool even when it is in the agent config. If no tool appears, call `https://api.peec.ai/mcp` directly over JSON-RPC with `Authorization: Bearer $PEEC_PAT` (initialize, capture the `Mcp-Session-Id` header, then `tools/call`) rather than declaring Peec unavailable. + - Resolve the project with `list_projects` first; all other tools require `project_id`. `get_actions` needs `url_classification` for `scope=owned` and `scope=editorial` drill-downs, and `list_search_queries` returns `query_text` rather than `query`. - **Google Search Console** - When available, use the environment's `GSC_SERVICE_ACCOUNT_CREDENTIALS_JSON` secret to inspect recent queries and pages related to agents, cloud agents, and orchestration. Never print, log, commit, or include the secret value in reports. If a GSC client requires a credentials file path, write the secret to a restricted temporary file, use it for the run, and remove it before finishing. - **Docs repo** - Search existing pages under `src/content/docs/` for relevant source pages, link targets, and related terminology. @@ -70,7 +72,7 @@ If Google Search Console data is unavailable, say what could not be verified and 4. **Make only safe edits.** Add links with minimal surrounding copy changes. Preserve the existing page structure and voice. Follow the link quality rules below when choosing anchor text and surrounding context. 5. **Run self-review.** Apply the quality gates in this skill before opening a PR or writing a no-change report. 6. **Deduplicate, re-validate, then open a PR or report no changes.** - - **Deduplicate first.** Check for an existing open AEO cross-link PR before opening one: `gh pr list --repo warpdotdev/docs --search 'docs: add AEO cross-links in:title' --state open`. Never leave two open AEO cross-link PRs. If one already exists, either skip this run (note it in the run output) or, if the existing PR is stale or superseded, close it with an explanatory comment before opening the new one. + - **Deduplicate first.** This skill follows the "One standing PR per automation" contract in `.agents/references/skill-authoring-guidelines.md`. Check for an existing open AEO cross-link PR before opening one: `gh pr list --repo warpdotdev/docs --search 'docs: add AEO cross-links in:title' --state open`. Never leave two open AEO cross-link PRs. If one already exists, prefer adding this run's links to it — check out its branch, rebase on the latest `origin/main`, apply the new links, push, and append them to the existing PR body under its existing headings. Skip the run only when the new links duplicate what the open PR already proposes. - **Re-validate against the latest `main`.** Fetch `origin/main` and confirm every edited file still exists at its path and every link target resolves to a current page (see "Self-review before opening a PR"). If a restructure moved your targets, rebase onto the latest `main` and fix paths before opening. - **Open a PR** only when there are at least 2 high-confidence link additions (at least 3 for low-signal runs; see "Source data"). Otherwise, write a no-change report in the Oz run output. @@ -89,16 +91,18 @@ If Google Search Console data is unavailable, say what could not be verified and This produces one perpetual, low-noise PR that accumulates every run's entry regardless of outcome. Reviewers merge it periodically (at minimum before each monthly `improve-aeo-crosslink-skill` run) so the log reaches `main`. If any git step fails, write the log entry to the run output instead and continue to step 8. -8. **Post Slack notification.** After writing the log entry, post the formatted message to `#growth-docs` using the Python snippet below. Python is preferred over curl because it reads `SLACK_BOT_TOKEN` from the environment (keeping the token out of process argv) and JSON-encodes the payload correctly regardless of newlines or special characters. If either secret is unavailable, write the notification body to the run output instead. +8. **Post Slack notification — only if there is something to act on.** Follow the actionable-only rule in `.agents/references/skill-authoring-guidelines.md`: post **only** when a cross-link PR was opened or updated this run, or when the run failed or exited early in a way that stopped it from completing (including an unavailable Peec credential). A no-change run is silent — the run log entry from step 7 is its record. + + When the run is actionable, post the formatted message to `#growth-docs` using the Python snippet below. Python is preferred over curl because it reads `BUZZ_SLACK_TOKEN` from the environment (keeping the token out of process argv) and JSON-encodes the payload correctly regardless of newlines or special characters. If either secret is unavailable, write the notification body to the run output instead. ```bash python3 - <<'SLACK_EOF' import os, json, urllib.request, sys - token = os.environ.get("SLACK_BOT_TOKEN", "") + token = os.environ.get("BUZZ_SLACK_TOKEN", "") channel = os.environ.get("GROWTH_DOCS_SLACK_CHANNEL_ID", "") if not token or not channel: - print("SLACK_BOT_TOKEN or GROWTH_DOCS_SLACK_CHANNEL_ID not set — skipping Slack notification", file=sys.stderr) + print("BUZZ_SLACK_TOKEN or GROWTH_DOCS_SLACK_CHANNEL_ID not set — skipping Slack notification", file=sys.stderr) sys.exit(0) # Replace the triple-quoted string with the message from the Slack notification format section. @@ -124,7 +128,11 @@ If Google Search Console data is unavailable, say what could not be verified and SLACK_EOF ``` - Replace `<message text here>` with the message from the appropriate format in the "Slack notification format" section. Do not print `SLACK_BOT_TOKEN` or `GROWTH_DOCS_SLACK_CHANNEL_ID` values in the run output or in any file. + Replace `<message text here>` with the message from the appropriate format in the "Slack notification format" section. Do not print `BUZZ_SLACK_TOKEN` or `GROWTH_DOCS_SLACK_CHANNEL_ID` values in the run output or in any file. + + **If `chat.postMessage` returns `channel_not_found`**, the secrets being set is not sufficient — either the channel ID is stale or the bot is not a member of the channel. Do not treat this as a successful post. Instead: + 1. Try resolving the channel by name: call `conversations.list` (types `public_channel,private_channel`) and look for `growth-docs`. If found, retry the post with that ID and report that the stored `GROWTH_DOCS_SLACK_CHANNEL_ID` is wrong so a human can correct the secret. + 2. If the lookup also fails or returns `missing_scope`, the bot is not in the channel or lacks scope. Write the notification body to the run output, and state explicitly in the run output that the Slack post failed with `channel_not_found` — never imply it was delivered. ## Link quality rules @@ -223,7 +231,7 @@ Use this format: - [One specific improvement for the next run.] ``` -No-change reports stay in the Oz run output. The Oz run link is posted automatically to `#growth-docs` as part of step 8. +No-change reports stay in the Oz run output and are recorded in the run log from step 7. They are **not** posted to Slack — see the notification rules in step 8 and the actionable-only rule in `.agents/references/skill-authoring-guidelines.md`. ## Human review expectations @@ -255,29 +263,28 @@ Keep each entry to 7 fields and under 10 lines. Do not add narrative prose. Use a simple text message (not Block Kit). The message should be scannable in under 30 seconds. -**PR opened:** +**PR opened or updated:** ``` ✅ AEO crosslink audit · YYYY-MM-DD -PR opened: [PR URL] +PR [opened | updated]: [PR URL] Links added: [N links] across [N pages]: [page names] Signals: [Peec | GSC | Peec + GSC] Oz run: [run URL] ``` -**No change:** +**Run blocked by a failure:** ``` -ℹ️ AEO crosslink audit · YYYY-MM-DD — No changes -Checked: agents, cloud agents, and orchestration docs -No PR: [brief reason — e.g., "fewer than 2 high-confidence opportunities"] +⚠️ AEO crosslink audit · YYYY-MM-DD — run blocked +What failed: [brief reason — e.g., "docs repo checkout unavailable"] Oz run: [run URL] ``` Rules: -- Post on every run, including no-change runs. +- Post only when a PR was opened or updated, or when the run was blocked by a failure. A no-change run posts nothing — its record is the run log entry. - Never include raw secret values, personal access tokens, or credential file paths in the Slack message. -- Build the `Oz run` link at runtime — never hard-code the Oz host (for example `app.warp.dev` or `oz.warp.dev`). This agent may run on staging or production, and a hard-coded host resolves to the wrong environment (or a generic Runs page). Resolve the environment-correct link from your current run with `oz-dev run get "<your run ID>" --output-format json | jq -r '.session_link'`, substituting the run ID this agent is executing as. +- Build the `Oz run` link at runtime — never hard-code the Oz host (for example `app.warp.dev` or `oz.warp.dev`). This agent may run on staging or production, and a hard-coded host resolves to the wrong environment (or a generic Runs page). Resolve the environment-correct link from your current run with `oz run get "<your run ID>" --output-format json | jq -r '.session_link'`, substituting the run ID this agent is executing as. Cloud sandboxes ship the `oz` CLI; `oz-dev` is a local development build and is not present, so do not call it. - If the Oz run URL is unavailable, omit that line rather than posting a broken link. ## Future expansion boundaries diff --git a/.agents/skills/aeo_new_guide_recommendations/SKILL.md b/.agents/skills/aeo_new_guide_recommendations/SKILL.md index 81beeaaf4..64e82a021 100644 --- a/.agents/skills/aeo_new_guide_recommendations/SKILL.md +++ b/.agents/skills/aeo_new_guide_recommendations/SKILL.md @@ -1,11 +1,11 @@ --- name: aeo_new_guide_recommendations -description: Run a recurring AEO new-guide recommendations brief for Warp docs using Peec data and existing docs. Use for scheduled agents that run every two weeks and identify missing or underserved topics in agents, cloud agents, orchestration, and Oz — and recommend whether to create a new page, update an existing page, or avoid a topic. Does not draft content. +description: Run a recurring AEO new-guide recommendations brief for Warp docs using Peec data and existing docs. Use for scheduled agents that run monthly and identify missing or underserved topics in agents, cloud agents, orchestration, and Oz — and recommend whether to create a new page, update an existing page, or avoid a topic. Does not draft content. --- # AEO new-guide recommendations -Produce 3–5 source-grounded AEO briefs that recommend whether to create a new guide, update an existing page, or avoid a topic — without drafting content. This skill is designed for an Oz scheduled agent that runs every two weeks (not twice a week — "bi-weekly" is intentionally avoided here because it is ambiguous). The goal is to give the Docs team a repeatable upstream input to content planning without generating more noise than the team can act on. +Produce 3–5 source-grounded AEO briefs that recommend whether to create a new guide, update an existing page, or avoid a topic — without drafting content. This skill is designed for an Oz scheduled agent that runs monthly. The goal is to give the Docs team a repeatable upstream input to content planning without generating more noise than the team can act on. ## Scope @@ -28,33 +28,61 @@ Do not: The following environment secrets should be set in the Oz cloud agent environment: -- `SLACK_BOT_TOKEN` — Slack bot token for posting to `#growth-docs`. If unavailable, write the notification body to the run output instead and skip Slack posting. +- `PEEC_PAT` — Peec Personal Access Token for MCP authentication. Create one at **app.peec.ai → Company → API Keys → Personal Access Tokens**. If unavailable or expired, the run proceeds with docs-only signals and logs "Peec: unavailable" in the run output. +- `BUZZ_SLACK_TOKEN` — Slack bot token for posting to `#growth-docs`, authenticating as the `buzz` bot. This is the account that posts to that channel; do not substitute another Slack token without confirming the bot is a member of the channel. If unavailable, write the notification body to the run output instead and skip Slack posting. - `GROWTH_DOCS_SLACK_CHANNEL_ID` — Slack channel ID for `#growth-docs`. Find it in Slack by right-clicking the channel → Copy link (the ID begins with `C`). If unavailable, skip Slack posting. +The scheduled cloud agent must also include the Peec MCP server in its agent config (pass via `--mcp` flag or the agent config file `mcp_servers` key): + +```json +{ + "peec-ai": { + "url": "https://api.peec.ai/mcp", + "headers": { + "Authorization": "Bearer ${PEEC_PAT}" + } + } +} +``` + Do NOT print, log, commit, or include secret values in reports or Slack messages. ## Source data Use the smallest reliable set of source data needed to justify recommendations. -**Why a snapshot, not live Peec MCP calls:** This skill runs as an Oz cloud agent, which cannot authenticate with Peec MCP directly. All Peec data must come from a pre-exported snapshot committed to the `buzz` repo. The snapshot is generated locally (where Peec OAuth works) using the `refresh-peec-aeo-snapshot` skill, then committed so cloud runs can read it. If the snapshot is stale, this run exits rather than proceeding without data. - -- **Peec snapshot** - Check freshness before using any data: - 1. Read `generated_at` from `/workspace/buzz/aeo-snapshots/docs/agents-orchestration/latest.json`. - 2. If the file is missing, `generated_at` is absent, or the snapshot is **14 days old or older**: write the stale-snapshot report (see "Stale snapshot report" below), write a run log entry (step 7) with the appropriate `No-run reason` (see "Stale snapshot report" for exact wording), post the stale Slack alert (step 8), and exit. Do not continue or open a PR. - 3. If the snapshot is fewer than 14 days old, read both `latest.json` and `latest.md` as source signals. These contain pre-exported Peec data (prompts, recommendations, source URLs, query vocabulary, and visibility scores) for agents, cloud agents, and orchestration. Because Oz is the agent platform underlying cloud agents and orchestration, substantial Oz-relevant signal is present in this snapshot — look for Oz-related prompts and queries within the agents/orchestration data. However, dedicated Oz-surface signals (Oz web app, Oz CLI, Oz scheduling) may be limited; when Oz-specific coverage is thin, flag the brief as lower-confidence and note what additional signal would strengthen the recommendation. Use the snapshot as the primary Peec source — do not attempt to call Peec MCP directly (cloud agents cannot authenticate). +- **Peec** - Call the Peec MCP (authenticated with the `PEEC_PAT` secret) to collect prompts, search queries, actions/recommendations, and source URLs for agents, cloud agents, orchestration, and Oz (last 30 days). See "Calling Peec" below for the call contract — the MCP may not appear as a native tool in a cloud run, in which case call the HTTP endpoint directly. Filter prompts and queries for relevance to the topic areas. Because Oz is the agent platform underlying cloud agents and orchestration, substantial Oz-relevant signal appears within the agents and orchestration data — look for Oz-related prompts and queries there. Dedicated Oz-surface signals (Oz web app, Oz CLI, Oz scheduling) may still be thin; when Oz-specific coverage is sparse, flag the brief as lower-confidence and note what additional signal would strengthen the recommendation. If the Peec MCP returns an error or is unavailable (missing `PEEC_PAT`, expired token, or connection failure), log "Peec: unavailable" in the run output and follow the "Peec unavailable" section below. - **Docs repo** - Search existing pages under `src/content/docs/` for relevant coverage of each candidate topic. Read `AGENTS.md` and `.agents/references/terminology.md` for product naming guidance. - **Prior run log** - Read `.agents/logs/aeo_new_guide_recommendation_runs.md` to identify topics that were recommended in previous runs. If a candidate topic from this run matches a topic from a prior run, note it explicitly in the brief (see "Repeat topic flag" below). -Do not invent Peec signals. If the snapshot has no usable data for a candidate topic, say so in the brief and flag it as low-confidence. +Do not invent Peec signals. If Peec has no usable data for a candidate topic, say so in the brief and flag it as low-confidence. + +### Calling Peec + +Even when `peec-ai` is configured in the agent config, a cloud run may not expose it as a native tool. In that case, call the MCP endpoint directly over HTTP with the `PEEC_PAT` secret — do not conclude that Peec is unavailable just because no `peec-ai` tool appears in your tool list. + +The endpoint speaks JSON-RPC over HTTP at `https://api.peec.ai/mcp`: + +1. `POST` an `initialize` request with `Authorization: Bearer $PEEC_PAT`, `Content-Type: application/json`, and `Accept: application/json, text/event-stream`. Capture the `Mcp-Session-Id` response header. +2. Send the `notifications/initialized` notification with that session header. +3. Call tools with `method: "tools/call"` and `params: {"name": "<tool>", "arguments": {...}}`, passing the session header on every request. + +Resolve the project first with `list_projects` — every other tool requires a `project_id`. Select the Warp project from the result rather than hard-coding an ID. + +Tool contract details that are easy to get wrong: + +- **`get_actions` requires `url_classification` for drill-downs.** Call `scope=overview` first; those rows are navigation metadata and carry no recommendation text. Drilling into `scope=owned` or `scope=editorial` fails validation unless you pass the `url_classification` from the overview row (for example `HOW_TO_GUIDE` or `ARTICLE`). `scope=reference` and `scope=ugc` require `domain` instead. +- **`list_search_queries` returns `query_text`**, not `query`. Parsing for a generic `query` field yields empty clusters. +- **Editorial actions are often outreach, not docs work.** Many `EDITORIAL` rows read like "pitch this publication" or "contact this author." Use `OWNED` rows with a `HOW_TO_GUIDE` or `ARTICLE` classification as the primary docs signal, and only treat an editorial row as a docs signal when its text describes a genuine content gap. +- Responses are columnar JSON (`{columns, rows, rowCount}`), so map values by column index rather than assuming objects. ## Workflow -1. **Check snapshot freshness.** Read `generated_at` from `latest.json`. If the snapshot is missing or 14 days old or older, write the stale-snapshot report, write a run log entry (step 7), post the stale Slack alert (step 8), and exit — do not proceed further. +1. **Collect Peec signals.** Use the Peec MCP to collect prompts, search queries, actions/recommendations, and source URLs for agents, cloud agents, orchestration, and Oz (last 30 days). If the Peec MCP is unavailable, log "Peec: unavailable" and follow the "Peec unavailable" section. 2. **Read the prior run log.** Open `.agents/logs/aeo_new_guide_recommendation_runs.md` and extract the `Topics` field from each previous entry. Build a list of previously recommended topic slugs so you can detect repeats in step 4. -3. **Gather source signals from the Peec snapshot.** From `latest.json` and `latest.md`, extract: +3. **Extract and cluster the signals.** From the Peec results, pull out: - Top prompts and their relevance to agents, cloud agents, orchestration, and Oz. - Search-query clusters — group repeated phrasing; do not list every raw query. - Action recommendations — use the recommendation text as the source of truth. Focus on owned and editorial opportunities relevant to docs content. @@ -97,16 +125,16 @@ Do not invent Peec signals. If the snapshot has no usable data for a candidate t This produces one perpetual, low-noise PR that accumulates every run's entry regardless of outcome. Reviewers merge it periodically so the log data reaches `main` and can inform the skill-improvement loop. If any git step fails, write the log entry to the run output instead and continue to step 8 — do not silently skip the log. -8. **Post Slack notification.** After writing the log entry, post the formatted message to `#growth-docs` using the Python snippet below. Python is preferred over curl because it reads `SLACK_BOT_TOKEN` from the environment (keeping the token out of process argv) and JSON-encodes the payload correctly regardless of newlines or special characters. If either secret is unavailable, write the notification body to the run output instead. +8. **Post Slack notification.** After writing the log entry, post the formatted message to `#growth-docs` using the Python snippet below. Python is preferred over curl because it reads `BUZZ_SLACK_TOKEN` from the environment (keeping the token out of process argv) and JSON-encodes the payload correctly regardless of newlines or special characters. If either secret is unavailable, write the notification body to the run output instead. ```bash python3 - <<'SLACK_EOF' import os, json, urllib.request, sys - token = os.environ.get("SLACK_BOT_TOKEN", "") + token = os.environ.get("BUZZ_SLACK_TOKEN", "") channel = os.environ.get("GROWTH_DOCS_SLACK_CHANNEL_ID", "") if not token or not channel: - print("SLACK_BOT_TOKEN or GROWTH_DOCS_SLACK_CHANNEL_ID not set — skipping Slack notification", file=sys.stderr) + print("BUZZ_SLACK_TOKEN or GROWTH_DOCS_SLACK_CHANNEL_ID not set — skipping Slack notification", file=sys.stderr) sys.exit(0) # Replace the triple-quoted string with the message from the Slack notification format section. @@ -132,13 +160,17 @@ Do not invent Peec signals. If the snapshot has no usable data for a candidate t SLACK_EOF ``` - Replace `<message text here>` with the message from the appropriate format in the "Slack notification format" section. Do not print `SLACK_BOT_TOKEN` or `GROWTH_DOCS_SLACK_CHANNEL_ID` values in the run output or in any file. + Replace `<message text here>` with the message from the appropriate format in the "Slack notification format" section. Do not print `BUZZ_SLACK_TOKEN` or `GROWTH_DOCS_SLACK_CHANNEL_ID` values in the run output or in any file. + + **If `chat.postMessage` returns `channel_not_found`**, the secrets being set is not sufficient — either the channel ID is stale or the bot is not a member of the channel. Do not treat this as a successful post. Instead: + 1. Try resolving the channel by name: call `conversations.list` (types `public_channel,private_channel`) and look for `growth-docs`. If found, retry the post with that ID and report that the stored `GROWTH_DOCS_SLACK_CHANNEL_ID` is wrong so a human can correct the secret. + 2. If the lookup also fails or returns `missing_scope`, the bot is not in the channel or lacks scope. Write the notification body to the run output, and state explicitly in the run output that the Slack post failed with `channel_not_found` — never imply it was delivered. ## Brief quality rules Before finalizing each brief: -- **Real signal** — Each recommendation is backed by a Peec snapshot signal, not generic SEO advice. +- **Real signal** — Each recommendation is backed by a Peec signal, not generic SEO advice. - **Actionable scope** — A reviewer can act on the recommendation in a 15–30 minute planning session without re-doing the research. - **No drafting** — The brief recommends what to create or update; it does not draft any docs content. - **Distinct from crosslinks** — Do not recommend adding a link as a substitute for a new or updated page. @@ -153,7 +185,7 @@ Write the full run output to the Oz run report. Structure it as follows: # AEO new-guide recommendations — YYYY-MM-DD **Topic areas:** Agents, cloud agents, orchestration, and Oz. -**Snapshot age:** N days (generated YYYY-MM-DD) +**Source signals:** Peec [available | unavailable] **Briefs produced:** N --- @@ -187,7 +219,7 @@ If no briefs can be produced (fewer than 3 topics with usable signal), write a n ## No-run report -If the run cannot produce at least 3 actionable briefs — because the snapshot has insufficient signal for the topic areas, existing docs already cover all candidates well, or fewer than 3 topics pass the brief quality rules — write a no-run report in the Oz run output instead of the full brief set. +If the run cannot produce at least 3 actionable briefs — because Peec has insufficient signal for the topic areas, existing docs already cover all candidates well, or fewer than 3 topics pass the brief quality rules — write a no-run report in the Oz run output instead of the full brief set. ```text ## AEO new-guide recommendations — no briefs produced — YYYY-MM-DD @@ -195,7 +227,7 @@ If the run cannot produce at least 3 actionable briefs — because the snapshot **Topic area:** Agents, cloud agents, orchestration, and Oz. **Source signals reviewed:** -- [Peec snapshot summary.] +- [Peec signal summary, or "Peec: unavailable".] - [Existing-docs signal.] **Docs pages inspected:** @@ -211,51 +243,32 @@ If the run cannot produce at least 3 actionable briefs — because the snapshot - [One specific improvement for the next run.] ``` -## Stale snapshot report +## Peec unavailable -If the Peec snapshot is missing or 14 days old or older, stop immediately. Write this report to the Oz run output: +Peec is the primary signal for this skill. When the Peec MCP is unavailable — missing or expired `PEEC_PAT`, the MCP server is not configured in the agent, or the connection fails — do not invent signals and do not silently continue as though the data existed. -```text -## AEO new-guide recommendations — snapshot stale +Instead: -**Date:** YYYY-MM-DD -**Snapshot age:** [N days (generated YYYY-MM-DD) | file not found | generated_at field missing] -**Threshold:** 14 days +1. Log `Peec: unavailable` in the run output, along with the specific failure (for example, "MCP server not configured" or "401 from api.peec.ai"). Never include the token value. +2. Continue with docs-only analysis. A docs-only run can still identify obvious coverage gaps, but every brief it produces must be flagged as low-confidence with a note that Peec signal was unavailable. +3. Apply a higher bar: only produce a brief when the gap is clearly evident from existing docs structure alone. If fewer than 3 topics clear that bar, write the no-run report with `peec unavailable` as the `No-run reason`. +4. Post the Slack notification as usual, using the "No briefs" format when no briefs were produced. -The Peec snapshot is too old to support high-confidence recommendations. No briefs were produced. - -**Action required:** -Run the `refresh-peec-aeo-snapshot` skill in a local Warp agent session where Peec MCP is authenticated. -Skill: buzz/.agents/skills/refresh-peec-aeo-snapshot/SKILL.md - -The agent will run normally on the next scheduled execution once a fresh snapshot is committed to the buzz repo. -``` - -Fill in the `Snapshot age` field as follows — do not invent values: -- File exists and `generated_at` is present: `N days (generated YYYY-MM-DD)` — compute `N` from today's date minus `generated_at`. -- File does not exist: `file not found`. -- File exists but `generated_at` is absent or unparseable: `generated_at field missing`. - -Use the same wording in the `No-run reason` field of the run log entry: -- File stale: `snapshot stale — N days old` -- File missing: `snapshot missing — file not found` -- Field missing: `snapshot missing — generated_at field absent` - -Then post the stale Slack alert (step 8). Exit. Do not write a no-run report. Do not open a PR. +If `PEEC_PAT` is present but Peec still fails, note in the run output that the token may need rotating at **app.peec.ai → Company → API Keys → Personal Access Tokens** so a human can fix it before the next run. ## Run log format Prepend each new entry at the top of `.agents/logs/aeo_new_guide_recommendation_runs.md`, immediately after the `---` separator line. Use this format: ```markdown -## YYYY-MM-DD — [Briefs produced | No briefs | Snapshot stale] +## YYYY-MM-DD — [Briefs produced | No briefs] - **Run**: [Oz run URL if available, otherwise the run ID] -- **Source signals**: Peec snapshot [available | stale | missing] -- **Briefs produced**: [N | 0 | N/A] +- **Source signals**: Peec [available | unavailable] +- **Briefs produced**: [N | 0] - **Topics**: [comma-separated topic slugs, e.g. "oz-scheduling, cloud-agent-setup, ambient-agents" | N/A] - **Repeat topics**: [comma-separated slugs that appeared in a prior run, or "none"] -- **No-run reason**: [low signal | well-covered | snapshot stale — N days old | N/A] +- **No-run reason**: [low signal | well-covered | peec unavailable | N/A] ``` Keep each entry to 6 fields and under 8 lines. Do not add narrative prose. The `Topics` field is how future runs detect repeats — be consistent with slug naming (lowercase, hyphenated). @@ -278,25 +291,14 @@ Oz run: [run URL] ``` ℹ️ AEO new-guide recommendations · YYYY-MM-DD — No briefs Topics reviewed: agents, cloud agents, orchestration, Oz -No briefs: [brief reason — e.g., "fewer than 3 topics with usable signal"] -Oz run: [run URL] -``` - -**Snapshot stale:** - -``` -⚠️ AEO new-guide recommendations · YYYY-MM-DD — Snapshot stale -Snapshot: [N days old (generated YYYY-MM-DD) | file not found | generated_at missing], threshold: 14 days -No recommendations produced. Refresh the snapshot before the next run. -How: run refresh-peec-aeo-snapshot in a local Warp session -Skill: buzz/.agents/skills/refresh-peec-aeo-snapshot/SKILL.md +No briefs: [brief reason — e.g., "fewer than 3 topics with usable signal" or "Peec unavailable"] Oz run: [run URL] ``` Rules: - Post on every run, including no-brief runs. - Never include raw secret values, personal access tokens, or credential file paths in the Slack message. -- Build the `Oz run` link at runtime — never hard-code the Oz host (for example `app.warp.dev` or `oz.warp.dev`). This agent may run on staging or production, and a hard-coded host resolves to the wrong environment (or a generic Runs page). Resolve the environment-correct link from your current run with `oz-dev run get "<your run ID>" --output-format json | jq -r '.session_link'`, substituting the run ID this agent is executing as. +- Build the `Oz run` link at runtime — never hard-code the Oz host (for example `app.warp.dev` or `oz.warp.dev`). This agent may run on staging or production, and a hard-coded host resolves to the wrong environment (or a generic Runs page). Resolve the environment-correct link from your current run with `oz run get "<your run ID>" --output-format json | jq -r '.session_link'`, substituting the run ID this agent is executing as. Cloud sandboxes ship the `oz` CLI; `oz-dev` is a local development build and is not present, so do not call it. - If the Oz run URL is unavailable, omit that line rather than posting a broken link. ## Human review expectations @@ -311,17 +313,17 @@ The Docs team reviewer should be able to read the full brief set in 15–30 minu ## Relationship to other AEO skills - **`aeo_brief`** — The brief format this skill uses for each recommendation. Read `.agents/skills/aeo_brief/SKILL.md` for format guidance and vocabulary translation rules. -- **`aeo_crosslink_audit`** — Handles internal cross-linking between existing pages. If the main gap is a missing link, refer to that skill instead of creating a brief here. -- **`refresh-peec-aeo-snapshot`** — Run locally to refresh the Peec snapshot when stale. See `buzz/.agents/skills/refresh-peec-aeo-snapshot/SKILL.md`. +- **`aeo_crosslink_audit`** — Handles internal cross-linking between existing pages. If the main gap is a missing link, refer to that skill instead of creating a brief here. It reads Peec through the same MCP and `PEEC_PAT` setup. +- **`refresh-peec-aeo-snapshot`** — Legacy. This skill previously read a Peec snapshot committed to the `buzz` repo because cloud agents could not authenticate with Peec. That is no longer the case, and the snapshot is not part of this pipeline. See `buzz/.agents/skills/refresh-peec-aeo-snapshot/SKILL.md` only if you need a local snapshot for another purpose. ## Future expansion Do not implement future expansion ideas in this pilot skill. If the audit finds opportunities outside the four topic areas, mention them only as follow-up notes in the run output. Possible future phases include: -- **Outer self-improvement loop** — After the run log has accumulated several entries (roughly 3–4 runs, equivalent to 6–8 weeks of data), an `improve-aeo-new-guide-rec-skill` skill should read the log and the run outputs to identify systematic weaknesses: topics that keep repeating without being addressed, briefs that reviewers consistently ignore, vocabulary the agent gets wrong, or signal gaps that suggest the Peec snapshot scope needs expanding. This mirrors the `improve-aeo-crosslink-skill` pattern used for the crosslink audit. The improvement skill should run manually (not on a schedule) and propose diffs to this SKILL.md for human review before being applied. +- **Outer self-improvement loop** — After the run log has accumulated several entries (roughly 3–4 runs, equivalent to 3–4 months at a monthly cadence), an `improve-aeo-new-guide-rec-skill` skill should read the log and the run outputs to identify systematic weaknesses: topics that keep repeating without being addressed, briefs that reviewers consistently ignore, vocabulary the agent gets wrong, or signal gaps that suggest the Peec query scope needs expanding. This mirrors the `improve-aeo-crosslink-skill` pattern used for the crosslink audit. The improvement skill should run manually (not on a schedule) and propose diffs to this SKILL.md for human review before being applied. - **Expanding topic areas** beyond agents, cloud agents, orchestration, and Oz once the pilot cadence is stable. - **Comparison against open Notion content-planning items** to detect when a recommended topic is already tracked or in progress. - **Lightweight trend reporting** across scheduled runs (e.g., topics that recur three or more times without a logged action become high-priority backlog items). - **Integration with the `missing_docs` skill's output** as an additional signal source. -- **Oz-specific Peec snapshot expansion** — Update the `refresh-peec-aeo-snapshot` skill to collect dedicated Oz-surface signals (Oz web app, Oz CLI, Oz scheduling) so the snapshot covers the full pilot scope with equal confidence. +- **Oz-specific Peec coverage** — Add tracked Peec prompts for dedicated Oz surfaces (Oz web app, Oz CLI, Oz scheduling) so the pilot scope is covered with equal confidence. diff --git a/.agents/skills/afdocs-audit/SKILL.md b/.agents/skills/afdocs-audit/SKILL.md index 0f3baf01b..35b3dfccc 100644 --- a/.agents/skills/afdocs-audit/SKILL.md +++ b/.agents/skills/afdocs-audit/SKILL.md @@ -110,29 +110,87 @@ AFDocs audit complete: 23 checks run, score 82/100 (B). After reporting, ask the user which issues they want to address. -## Slack notification (optional) +## Run log + +Write a run log entry on **every** scheduled run — clean, regressed, or blocked. The log is what makes the regression comparison possible and what makes a silent run distinguishable from a broken one. + +Use the standing log-branch pattern from `.agents/references/skill-authoring-guidelines.md`: + +1. Fetch and check out `chore/afdocs-audit-log`. Create it from the latest `origin/main` if it does not exist. +2. Prepend the entry to `.agents/logs/afdocs_audit_runs.md`. +3. Verify the write with `head -10 .agents/logs/afdocs_audit_runs.md` before committing. +4. Stage only the log file and commit: + ```text + chore: log afdocs audit run YYYY-MM-DD + ``` +5. Push and verify with `git log --oneline -1 origin/chore/afdocs-audit-log`. +6. Ensure exactly one open PR exists from `chore/afdocs-audit-log` into `main`, titled `chore: afdocs audit run log`. + +If any git step fails, write the entry to the run output and continue. + +### Run log format + +```markdown +## YYYY-MM-DD — [valid | blocked] +- **Score**: N/100 (grade) +- **Checks**: N total — N pass, N fail, N warn +- **Failing check ids**: comma-separated list, or "none" +- **Allowlisted**: N +- **Oz run**: [URL] +- **Notes**: [anything unusual] +``` + +For a firewall-blocked run, record `blocked`, omit the score entirely rather than logging the meaningless one, and note the mitigation status. + +## Regression detection + +Compare this run against the most recent **valid** entry in the run log — never against a `blocked` entry, whose score is an artifact of the firewall challenge rather than a real measurement. If there is no prior valid entry, this run establishes the baseline: log it and post nothing. + +A run is a regression when either: +- The score dropped versus the last valid entry. +- A check id appears in this run's failing set that was not in the last valid entry's failing set. + +## Slack notification + +Post **only** when the run is actionable, per the actionable-only rule in `.agents/references/skill-authoring-guidelines.md`: -If instructed to send a report to Slack, post a summary after the audit completes. +- **Regression detected** — post the summary below. +- **Audit blocked** by the Vercel Firewall challenge — post the blocked notice. This is a failure, so it always posts. Never post a score for a blocked run; every check is a false positive. +- **Clean run with no regression** — post nothing. The run log entry is the record. + +A first-ever run with no baseline posts nothing. 1. Check if `BUZZ_SLACK_TOKEN` environment variable exists. -2. If the token exists, send a summary to the channel the user specified (or the channel configured in the agent's instructions). +2. If the token exists, send the summary to the channel the user specified (or the channel configured in the agent's instructions). -**Format:** +**Format — regression:** ``` -*AFDocs Audit — <date>* -Score: <score>/100 (<grade>) | <total_checks> checks | <pass> pass, <fail> fail, <warn> warn +*AFDocs Audit — <date>* — regression +Score: <score>/100 (<grade>), down from <previous_score>/100 on <previous_date> +<total_checks> checks | <pass> pass, <fail> fail, <warn> warn -*Failures (<count>):* +*New failures since last valid run (<count>):* • <check_id>: <message> -*Warnings (<count>):* +*Pre-existing failures (<count>):* • <check_id>: <message> *Allowlisted (<count>):* • <check_id>: <reason> ``` +Lead with what changed. Pre-existing failures are context, not news — keep that list short or omit it when long. + +**Format — audit blocked:** + +``` +*AFDocs Audit — <date>* — audit blocked, no score +The crawler was blocked by the Vercel Firewall bot challenge, so no checks could run. +Fix: disable Attack Mode, switch Bot Protection to log mode, or add a WAF bypass for the runner. +Details: references/vercel-firewall-challenge.md +``` + Send using: ```bash diff --git a/.agents/skills/afdocs-fix/SKILL.md b/.agents/skills/afdocs-fix/SKILL.md index e7f72ea51..31be075fb 100644 --- a/.agents/skills/afdocs-fix/SKILL.md +++ b/.agents/skills/afdocs-fix/SKILL.md @@ -151,14 +151,29 @@ These checks require infrastructure or design changes that can't be automated: ## Applying fixes -1. Create a branch: `git checkout -b afdocs-fixes origin/main` -2. Apply the fixes for each failing check (skip allowlisted checks). -3. Validate: `npm run build` (the build must succeed). -4. Commit with the prefix: `AFDocs fixes: <summary of what was fixed>` -5. Open a PR: `gh pr create` +This skill maintains **one** long-lived fixes PR rather than one per run — see "One standing PR per automation" in `.agents/references/skill-authoring-guidelines.md`. + +1. Look for an existing open PR before creating a branch: + ```bash + gh pr list --repo warpdotdev/docs --state open \ + --search 'AFDocs fixes in:title' --json number,headRefName + ``` +2. Check out the standing branch. If the PR exists, continue on its branch and rebase; otherwise create it from `main`: + ```bash + git fetch origin + git checkout afdocs-fixes 2>/dev/null || git checkout -b afdocs-fixes origin/main + git rebase origin/main + ``` +3. Apply the fixes for each failing check (skip allowlisted checks). If a fix on the existing branch already addresses a check that is still failing, do not duplicate it — the audit may have run before the PR merged. +4. Validate: `npm run build` (the build must succeed). +5. Commit with the prefix: `AFDocs fixes: <summary of what was fixed>` +6. Push. If the PR already exists the push updates it; otherwise open one with `gh pr create`. + +Never leave two open AFDocs PRs. If you find more than one, consolidate onto `afdocs-fixes` and close the extras with a comment pointing at the survivor. ## PR conventions -- Title must be prefixed with `AFDocs fixes:` (e.g., `AFDocs fixes: add llms.txt directive and content negotiation middleware`) +- Title must be prefixed with `AFDocs fixes:` and must not contain a date — a dated title defeats the title search in step 1 and produces a new PR every run - Include the audit score (before/after if known) in the PR description +- When updating an existing PR, append the new run's score and fixes under the existing headings rather than adding duplicate headings, which `check_pr_body.py` rejects - Include the co-author line: `Co-Authored-By: Oz <oz-agent@warp.dev>` diff --git a/.agents/skills/answer_question/SKILL.md b/.agents/skills/answer_question/SKILL.md index f4c98bbf1..44b69e642 100644 --- a/.agents/skills/answer_question/SKILL.md +++ b/.agents/skills/answer_question/SKILL.md @@ -24,7 +24,7 @@ Search strategy: - Use `grep` when searching for exact feature names, settings, CLI commands, or specific terms. - Read matched files to gather authoritative content. Skim broadly first, then read key sections in detail. - If the question spans multiple topics (e.g. "How do skills work with cloud agents?"), search each topic independently and cross-reference. -- Check `astro.config.mjs (sidebar config)` files in the relevant section if you need to locate a page by name. +- Check `src/sidebar.ts` if you need to locate a page by name; it holds the full navigation tree for every section. ### 2. Search source code (if needed) @@ -49,7 +49,7 @@ Both repos are indexed for `codebase_semantic_search`. Use `grep` for exact symb - Be direct and matter-of-fact. Answer the question, don't summarize the docs. - Be comprehensive — cover what the user needs to fully understand the answer — but don't pad with tangential information. -- Use Warp's standard terminology from `AGENTS.md` and the full glossary in `.warp/references/terminology.md`. Key rules: capitalize feature names (Agent, Agent Mode, Warp Drive, Codebase Context), use "agent" (generic) or "Warp Agent" (built-in harness) not "Oz agent" or "Ozzie", use "credits" not "AI credits." +- Use Warp's standard terminology from `AGENTS.md` and the full glossary in `.agents/references/terminology.md`. Key rules: capitalize feature names (Agent, Agent Mode, Warp Drive, Codebase Context), use "agent" (generic) or "Warp Agent" (built-in harness) not "Oz agent" or "Ozzie", use "credits" not "AI credits." - If the docs do not cover the topic, say so honestly. Do not guess or fabricate information. ### 4. Generate doc links diff --git a/.agents/skills/check_for_broken_links/SKILL.md b/.agents/skills/check_for_broken_links/SKILL.md index e1cef6347..af6053ef4 100644 --- a/.agents/skills/check_for_broken_links/SKILL.md +++ b/.agents/skills/check_for_broken_links/SKILL.md @@ -1,6 +1,6 @@ --- name: check_for_broken_links -description: Check the Warp Astro Starlight documentation for broken links by scanning source markdown files. Run the diagnostic script, review the output, fix broken links, and optionally notify Slack. +description: Check the Warp Astro Starlight documentation for broken links and broken heading anchors by scanning source markdown files. Run the diagnostic script, review the output, fix broken links, and optionally notify Slack. --- # Check for Broken Links @@ -12,7 +12,7 @@ This skill checks the Warp Astro Starlight documentation for broken links by sca From the docs repo root: ```bash -python3 .warp/skills/check_for_broken_links/check_links.py +python3 .agents/skills/check_for_broken_links/check_links.py ``` ### Options @@ -20,6 +20,8 @@ python3 .warp/skills/check_for_broken_links/check_links.py - `--internal-only`: Only check internal links (fast, no HTTP requests) - `--external-only`: Only check external links - `--timeout N`: HTTP timeout in seconds (default: 10) +- `--workers N`: Concurrent external link requests (default: 16) +- `--strict`: Treat bot-blocked (401/403/429) responses as broken links - `--output FILE`: Save results to JSON file - `--slack-notify`: Send results to Slack (requires `SLACK_BOT_TOKEN` and `GROWTH_DOCS_SLACK_CHANNEL_ID` env vars) - `--slack-channel ID`: Override the default Slack channel @@ -27,9 +29,25 @@ python3 .warp/skills/check_for_broken_links/check_links.py ### Quick internal-only check: ```bash -python3 .warp/skills/check_for_broken_links/check_links.py --internal-only +python3 .agents/skills/check_for_broken_links/check_links.py --internal-only ``` +### How external links are checked + +External URLs are deduplicated and resolved concurrently before the per-file +pass begins, so a page with hundreds of links (such as `changelog/2026.mdx`) +doesn't stall the run. A full check of the docs takes roughly a minute. + +If you're on a slow or rate-limited network, lower the concurrency and raise the +timeout: + +```bash +python3 .agents/skills/check_for_broken_links/check_links.py --workers 4 --timeout 20 +``` + +Requests use a browser-like `User-Agent`, retry once on a timeout or connection +reset, and fall back to `GET` when `HEAD` fails. + ## Output Format The script outputs a report like: @@ -55,6 +73,30 @@ src/content/docs/getting-started/what-is-warp.md:42 Error: HTTP 404 ``` +### Bot-blocked links + +URLs that answer `401`, `403`, or `429` are reported in a separate +`BOT-BLOCKED` section, grouped by URL, and are **not** counted as broken. These +statuses mean the server refused an automated client, not that the page is gone. +Cloudflare interstitials (`sourceforge.net`), OpenAI's bot challenge, and +login-gated destinations (Slack invite links) all land here and are working +links in a browser. + +``` +### BOT-BLOCKED (2 URLs, not counted as broken) + +These returned 401/403/429, which means the server refused an +automated request. Verify in a browser before changing them. + + https://vimdoc.sourceforge.net/htmldoc/motion.html + Error: HTTP 403 (2 occurrence(s)) + First seen: src/content/docs/terminal/editor/vim.mdx:39 +``` + +Don't "fix" these without confirming in a browser first — replacing a working +link because a scraper was blocked makes the docs worse. Use `--strict` if you +want them to fail the run. + ## Fixing Broken Links After running the script, fix each broken link based on the error type: @@ -72,6 +114,18 @@ After running the script, fix each broken link based on the error type: 3. **Missing .mdx extension**: Directory link doesn't resolve - Add `.mdx` extension or ensure `index.mdx` exists in the directory +4. **Heading anchor not found**: The page resolves but the `#fragment` doesn't + match any heading on it. This is the failure mode that looks fine in review: + the link works, and the reader lands at the top of the page instead of the + section it names. + - Retarget the fragment at the heading that carries the content now. The + error includes a `Try: #...` suggestion when a heading shares a word with + the fragment. + - Watch for fragments pointing at `<TabItem label="Windows">` or a bolded + line. Only headings get anchor ids, so link the enclosing heading instead. + - If the section was deleted because the feature shipped or was removed, fix + the surrounding sentence too, not just the link. + 4. **Cross-space links**: Links between Astro Starlight spaces (warp/, agent-platform/, support-and-community/, reference/) - **Relative paths do NOT work across spaces** — use absolute URLs instead - **IMPORTANT: `src/content/docs/` is the docs homepage, so "warp" is NOT included in URLs** @@ -93,26 +147,33 @@ After running the script, fix each broken link based on the error type: - Consider linking to an archived version if appropriate 2. **Timeout/Connection Error**: Temporary issue or site blocking bots - - Re-run the check to confirm it's persistent + - The checker already retries once, but heavy concurrency can still cause a + flake. Re-run with `--workers 4 --timeout 20` to confirm it's persistent - Visit the URL manually to verify +3. **HTTP 401/403/429**: Reported under `BOT-BLOCKED`, not as broken + - Verify in a browser before touching the link; it's usually working + - Only change it if the page is genuinely gone or has moved + ### Adding Redirects -If content moved, you can add a redirect in the appropriate `vercel.json (redirects)`: +If content moved, add a redirect to the `redirects` array in `vercel.json` at the repo root: ```json { - "redirects": [ - { "source": "/old/path", "destination": "/new/path" } - ] + "source": "/old/path", + "destination": "/new/path/", + "statusCode": 308 } ``` +Include the trailing slash on `destination` and the `statusCode`, matching the existing entries. + ## Creating a PR with Fixes 1. Create a branch: `git checkout -b fix/broken-links` 2. Fix the broken links identified by the script -3. Re-run the script to verify all fixes: `python3 .warp/skills/check_for_broken_links/check_links.py` +3. Re-run the script to verify all fixes: `python3 .agents/skills/check_for_broken_links/check_links.py` 4. Commit and create a PR ## Slack Notifications @@ -132,7 +193,7 @@ You'll be prompted to enter the token securely. The token needs `chat:write` sco ### Usage ```bash -python3 .warp/skills/check_for_broken_links/check_links.py --internal-only --slack-notify +python3 .agents/skills/check_for_broken_links/check_links.py --internal-only --slack-notify ``` For ambient agent runs, the `SLACK_BOT_TOKEN` secret is automatically injected as an environment variable. @@ -142,7 +203,7 @@ For ambient agent runs, the `SLACK_BOT_TOKEN` secret is automatically injected a To post to a different channel: ```bash -python3 .warp/skills/check_for_broken_links/check_links.py --slack-notify --slack-channel YOUR_CHANNEL_ID +python3 .agents/skills/check_for_broken_links/check_links.py --slack-notify --slack-channel YOUR_CHANNEL_ID ``` ## Dependencies @@ -157,13 +218,25 @@ pip3 install requests - Markdown links: `[text](path/to/file.md)` - Directory links: `[text](code-editor/)` → resolved to `index.mdx` -- Anchor links: `[text](file.md#section)` → file existence checked, anchor not validated +- Anchor links: `[text](file.md#section)` → file existence **and** heading anchor both checked - External URLs: `[text](https://example.com)` - Video embeds: `<VideoEmbed url="..." />` - Image references: `<img src="...">` and `![alt](path)` +### How anchors are validated + +Heading anchors are rebuilt from the target page's markdown using the same +slug rules Starlight applies (github-slugger): lowercase, punctuation dropped, +spaces to hyphens, with inline code, emphasis, links, and MDX expressions +stripped first. Explicit `id="..."` attributes count too. + +Fragments pointing at pages outside the content collection (`/api`, assets) +are skipped, as are pages that expose no headings at all, so a stub page never +produces noise. + ## Limitations -- Anchor links (#section) are not validated for heading existence +- Anchors generated by components rather than markdown headings aren't seen, so + a fragment aimed at one is skipped rather than flagged - Some external sites block automated requests (Twitter, LinkedIn) - Astro Starlight-specific includes/partials are not followed diff --git a/.agents/skills/check_for_broken_links/check_links.py b/.agents/skills/check_for_broken_links/check_links.py index 95b625cad..4a5af7fd6 100644 --- a/.agents/skills/check_for_broken_links/check_links.py +++ b/.agents/skills/check_for_broken_links/check_links.py @@ -3,7 +3,8 @@ Broken Link Checker for Warp Astro Starlight Documentation Scans markdown source files to find and validate links. -- Internal links: validated by checking if the target file exists +- Internal links: validated by checking if the target file exists, and, when the + link carries a #fragment, that the target page has a matching heading anchor - External links: validated via HTTP HEAD requests - Optional Slack notifications for CI/ambient agent integration """ @@ -13,7 +14,9 @@ import os import re import sys +import threading import time +from concurrent.futures import ThreadPoolExecutor from pathlib import Path from urllib.parse import urlparse, unquote @@ -47,16 +50,60 @@ # Directories to skip when scanning SKIP_DIRECTORIES = {'_book', 'node_modules', '.git', '.vercel', 'dist'} +# A browser-like User-Agent. Several sites we legitimately link to (OpenAI, +# TikTok) reject an obvious bot UA with a 403 while serving the page fine to a +# real browser, which showed up as a wall of false positives. +BROWSER_UA = ( + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 ' + '(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36' +) + +# Statuses that mean "the server refused to talk to an automated client", +# not "this page is gone". Cloudflare's interstitial (sourceforge.net), OpenAI's +# bot challenge, and login-gated destinations (Slack invites) all land here. +# These are reported separately and don't fail the run, because treating them as +# broken buries the 404s that actually need fixing. +BOT_BLOCK_STATUSES = {401, 403, 429} + +# Transient failures worth one retry before we believe them. +RETRYABLE_ERRORS = {'Timeout', 'Connection Error'} + +# --- Heading anchors ------------------------------------------------------- +# A link to a heading that no longer exists resolves to a real page, so the +# file-existence check above passes and the reader silently lands at the top. +# These patterns rebuild the anchor ids Starlight emits (github-slugger) so +# fragments can be validated too. +ATX_HEADING = re.compile(r'^(#{1,6})\s+(.*?)\s*#*$') +EXPLICIT_ID = re.compile(r'\sid=["\']([^"\']+)["\']') +FENCE = re.compile(r'^\s*(`{3,}|~{3,})') + + +def slugify_heading(text): + """Approximate github-slugger, which is what Starlight uses for anchor ids.""" + text = re.sub(r'\{[^}]*\}', '', text) # MDX expressions, e.g. {VARS.X} + text = re.sub(r'<[^>]+>', '', text) # inline HTML/JSX + text = re.sub(r'`([^`]*)`', r'\1', text) # code spans + text = re.sub(r'\[([^\]]*)\]\([^)]*\)', r'\1', text) # links keep their text + text = re.sub(r'[*_]{1,3}', '', text) # emphasis + text = text.strip().lower() + text = re.sub(r'[^\w\- ]+', '', text, flags=re.UNICODE) + return text.replace(' ', '-') + class LinkChecker: - def __init__(self, docs_root, timeout=10): + def __init__(self, docs_root, timeout=10, workers=16, strict=False): self.docs_root = Path(docs_root).resolve() self.timeout = timeout + self.workers = max(1, workers) + self.strict = strict self.files_scanned = 0 self.internal_checked = 0 self.external_checked = 0 self.broken_links = [] + self.blocked_links = [] self.external_cache = {} + # slug set per target page, built lazily by _anchors_for() + self.anchor_cache = {} # Astro Starlight projects may define additional pages outside # the content collection (e.g. `src/pages/api.astro` -> /api). @@ -90,11 +137,8 @@ def __init__(self, docs_root, timeout=10): route = route[:-len('index')] self.extra_routes.add(route.rstrip('/') or '/') - if HAS_REQUESTS: - self.session = requests.Session() - self.session.headers['User-Agent'] = 'WarpDocsLinkChecker/1.0' - else: - self.session = None + # Sessions are not thread-safe, so give each worker thread its own. + self._local = threading.local() def find_markdown_files(self): files = [] @@ -192,7 +236,11 @@ def is_external(self, url): return parsed.scheme in ('http', 'https') def should_skip(self, url): - if not url or url.startswith('#'): + # A bare `#fragment` is a same-page link, not a no-op: it must still + # resolve to a heading on the source page itself, so it falls through + # to check_internal()/check_fragment() below instead of being skipped + # here. Only a truly empty url has nothing to check. + if not url: return True parsed = urlparse(url) if parsed.scheme in SKIP_SCHEMES: @@ -266,37 +314,187 @@ def check_internal(self, url, source_file): return False, "File not found", None - def check_external(self, url): - if not self.session: - return True, "Skipped (requests not installed)", None - - if url in self.external_cache: - return self.external_cache[url] - + def _anchors_for(self, page): + """Heading slugs and explicit ids on a target page.""" + key = str(page) + if key in self.anchor_cache: + return self.anchor_cache[key] + + slugs = set() try: - resp = self.session.head(url, timeout=self.timeout, allow_redirects=True) - if resp.status_code == 405: - resp = self.session.get(url, timeout=self.timeout, allow_redirects=True, stream=True) - + text = page.read_text(encoding='utf-8') + except OSError: + self.anchor_cache[key] = slugs + return slugs + + in_fence = False + in_frontmatter = False + for n, line in enumerate(text.splitlines()): + if n == 0 and line.strip() == '---': + in_frontmatter = True + continue + if in_frontmatter: + if line.strip() == '---': + in_frontmatter = False + continue + if FENCE.match(line): + in_fence = not in_fence + continue + if in_fence: + continue + m = ATX_HEADING.match(line) + if m: + slugs.add(slugify_heading(m.group(2))) + # Hand-written anchors, e.g. <a id="foo"> or <h2 id="foo">. + slugs.update(EXPLICIT_ID.findall(text)) + slugs.discard('') + + self.anchor_cache[key] = slugs + return slugs + + def check_fragment(self, url, source_file): + """Validate a link's #fragment against the target page's headings. + + The file-existence check passes for a link whose heading was renamed or + removed, so the reader silently lands at the top of the page instead of + the section they were sent to. Returns (valid, error, suggestion). + """ + fragment = url.partition('#')[2].split('?')[0] + if not fragment: + return True, None, None + + route = url.split('#')[0] + # A bare `#frag` and a self-referential `/page/#frag` are both + # same-page links, so either way the target is the source file. + page = self.resolve_internal(url, source_file) if route else source_file + if page is None: + page = source_file + + for candidate in ( + page, + Path(str(page) + '.mdx'), + Path(str(page) + '.md'), + page / 'index.mdx', + page / 'index.md', + ): + try: + if candidate.exists() and candidate.is_file(): + page = candidate + break + except OSError: + continue + else: + return True, None, None # not a content page; nothing to check + + anchors = self._anchors_for(page) + if not anchors or fragment in anchors: + return True, None, None + + # Offer the closest heading that shares a word with the fragment. + words = set(fragment.split('-')) + near = [a for a in sorted(anchors) if words & set(a.split('-'))] + suggestion = f"Try: #{', #'.join(near[:3])}" if near else None + return False, f"Heading anchor '#{fragment}' not found on target page", suggestion + + def _session(self): + """Return this thread's requests session, creating it on first use.""" + if not HAS_REQUESTS: + return None + session = getattr(self._local, 'session', None) + if session is None: + session = requests.Session() + session.headers.update({ + 'User-Agent': BROWSER_UA, + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'en-US,en;q=0.9', + }) + self._local.session = session + return session + + def _request_external(self, url): + """Single attempt. Returns (valid, error, category). + + category is None when valid, 'blocked' when the server refused an + automated client, and 'broken' for a genuine failure. + """ + session = self._session() + try: + resp = session.head(url, timeout=self.timeout, allow_redirects=True) + # Many servers mishandle HEAD. Retry anything that failed with GET + # before concluding the link is bad. + if resp.status_code >= 400: + resp = session.get(url, timeout=self.timeout, allow_redirects=True, stream=True) + resp.close() + if resp.status_code < 400: - result = (True, None, None) - else: - result = (False, f"HTTP {resp.status_code}", None) + return True, None, None + if resp.status_code in BOT_BLOCK_STATUSES: + return False, f"HTTP {resp.status_code}", 'blocked' + return False, f"HTTP {resp.status_code}", 'broken' except requests.exceptions.Timeout: - result = (False, "Timeout", None) + return False, "Timeout", 'broken' except requests.exceptions.SSLError: - result = (False, "SSL Error", None) + return False, "SSL Error", 'broken' except requests.exceptions.ConnectionError: - result = (False, "Connection Error", None) + return False, "Connection Error", 'broken' except Exception as e: - result = (False, f"Error: {type(e).__name__}", None) - + return False, f"Error: {type(e).__name__}", 'broken' + + def check_external(self, url): + if not HAS_REQUESTS: + return True, "Skipped (requests not installed)", None + + if url in self.external_cache: + return self.external_cache[url] + + valid, error, category = self._request_external(url) + # Timeouts and connection resets are frequently transient; confirm once + # before reporting, so a blip doesn't look like a broken link. + if not valid and error in RETRYABLE_ERRORS: + time.sleep(1) + valid, error, category = self._request_external(url) + + result = (valid, error, category) self.external_cache[url] = result return result + def warm_external_cache(self, files): + """Resolve every unique external URL up front, in parallel. + + Checking these one at a time as files are walked is unusably slow: a + single changelog page can carry hundreds of GitHub links, and one + rate-limited host stalls the entire run. Populating the cache + concurrently keeps the per-file pass to pure cache reads. + """ + if not HAS_REQUESTS: + return + + urls = set() + for filepath in files: + for link in self.extract_links(filepath): + url = link['url'] + if not self.should_skip(url) and self.is_external(url): + urls.add(url) + + if not urls: + return + + urls = sorted(urls) + total = len(urls) + print(f"Resolving {total} unique external URLs with {self.workers} workers...") + + done = 0 + with ThreadPoolExecutor(max_workers=self.workers) as pool: + for _ in pool.map(self.check_external, urls): + done += 1 + if done % 25 == 0 or done == total: + print(f"\r {done}/{total}", end='', flush=True) + print() + def check_file(self, filepath, check_internal=True, check_external=True): links = self.extract_links(filepath) broken = [] + blocked = [] for link in links: url = link['url'] @@ -310,24 +508,35 @@ def check_file(self, filepath, check_internal=True, check_external=True): if not is_ext and not check_internal: continue + category = 'broken' if is_ext: self.external_checked += 1 - valid, error, suggestion = self.check_external(url) + valid, error, category = self.check_external(url) + suggestion = None else: self.internal_checked += 1 valid, error, suggestion = self.check_internal(url, filepath) + # The page resolves; now confirm the #fragment does too. Without + # this the link passes and the reader lands at the top of the + # page rather than the section it names. + if valid and '#' in url: + valid, error, suggestion = self.check_fragment(url, filepath) if not valid: - broken.append({ + entry = { 'file': str(filepath.relative_to(self.docs_root)), 'line': link['line'], 'url': url, 'error': error, 'suggestion': suggestion, 'type': 'external' if is_ext else 'internal' - }) + } + if category == 'blocked' and not self.strict: + blocked.append(entry) + else: + broken.append(entry) - return broken + return broken, blocked def run(self, check_internal=True, check_external=True): files = self.find_markdown_files() @@ -341,16 +550,17 @@ def run(self, check_internal=True, check_external=True): modes.append("external") print(f"Checking: {' + '.join(modes)} links\n") + if check_external: + self.warm_external_cache(files) + for i, filepath in enumerate(files, 1): rel = filepath.relative_to(self.docs_root) print(f"\r[{i}/{total}] {rel}", end='', flush=True) self.files_scanned += 1 - broken = self.check_file(filepath, check_internal, check_external) + broken, blocked = self.check_file(filepath, check_internal, check_external) self.broken_links.extend(broken) - - if check_external: - time.sleep(0.05) + self.blocked_links.extend(blocked) print("\n") @@ -362,12 +572,10 @@ def print_report(self): print(f"Internal links checked: {self.internal_checked}") print(f"External links checked: {self.external_checked}") print(f"Broken links found: {len(self.broken_links)}") + if self.blocked_links: + print(f"Bot-blocked (not failures): {len(self.blocked_links)}") print("=" * 60) - if not self.broken_links: - print("\n✓ No broken links found!") - return - internal = [l for l in self.broken_links if l['type'] == 'internal'] external = [l for l in self.broken_links if l['type'] == 'external'] @@ -388,6 +596,26 @@ def print_report(self): print(f" Link: {link['url']}") print(f" Error: {link['error']}") print() + + if self.blocked_links: + # Grouped by URL: one bot-protected domain can appear on dozens of + # lines, and listing every occurrence drowns out real breakage. + by_url = {} + for link in self.blocked_links: + by_url.setdefault((link['url'], link['error']), []).append( + f"{link['file']}:{link['line']}" + ) + print(f"\n### BOT-BLOCKED ({len(by_url)} URLs, not counted as broken)\n") + print("These returned 401/403/429, which means the server refused an") + print("automated request. Verify in a browser before changing them.\n") + for (url, error), locations in sorted(by_url.items()): + print(f" {url}") + print(f" Error: {error} ({len(locations)} occurrence(s))") + print(f" First seen: {locations[0]}") + print() + + if not self.broken_links: + print("\n✓ No broken links found!") def get_results(self): return { @@ -396,15 +624,28 @@ def get_results(self): 'internal_checked': self.internal_checked, 'external_checked': self.external_checked, 'broken_count': len(self.broken_links), - 'broken_links': self.broken_links + 'broken_links': self.broken_links, + 'blocked_count': len(self.blocked_links), + 'blocked_links': self.blocked_links } def format_slack_message(self): internal = [l for l in self.broken_links if l['type'] == 'internal'] external = [l for l in self.broken_links if l['type'] == 'external'] + blocked_note = "" + if self.blocked_links: + blocked_urls = {l['url'] for l in self.blocked_links} + blocked_note = ( + f"\n\n_{len(blocked_urls)} URL(s) returned 401/403/429 (bot-blocked) " + "and were not counted as broken._" + ) + if not self.broken_links: - return ":white_check_mark: *Broken Link Check Passed*\n\nNo broken links found in Astro Starlight docs." + return ( + ":white_check_mark: *Broken Link Check Passed*\n\n" + "No broken links found in Astro Starlight docs." + blocked_note + ) lines = [ ":warning: *Broken Link Check Found Issues*", @@ -414,6 +655,9 @@ def format_slack_message(self): f"• External links checked: {self.external_checked}", f"• *Broken links found: {len(self.broken_links)}*", ] + if self.blocked_links: + blocked_urls = {l['url'] for l in self.blocked_links} + lines.append(f"• Bot-blocked, not failures: {len(blocked_urls)} URL(s)") if internal: lines.append(f"\n*Internal ({len(internal)} broken):*") @@ -495,6 +739,10 @@ def main(): parser.add_argument('--internal-only', action='store_true', help='Only check internal links') parser.add_argument('--external-only', action='store_true', help='Only check external links') parser.add_argument('--timeout', type=int, default=10, help='HTTP timeout (default: 10)') + parser.add_argument('--workers', type=int, default=16, + help='Concurrent external link requests (default: 16)') + parser.add_argument('--strict', action='store_true', + help='Treat bot-blocked (401/403/429) responses as broken links') parser.add_argument('--output', help='Output JSON file') parser.add_argument('--slack-notify', action='store_true', help='Send results to Slack (requires SLACK_BOT_TOKEN and GROWTH_DOCS_SLACK_CHANNEL_ID env vars)') @@ -518,7 +766,8 @@ def main(): print(f"Docs root: {docs_root}\n") - checker = LinkChecker(docs_root, timeout=args.timeout) + checker = LinkChecker(docs_root, timeout=args.timeout, workers=args.workers, + strict=args.strict) start = time.time() checker.run(check_internal=check_internal, check_external=check_external) diff --git a/.agents/skills/check_for_broken_links/test_check_links.py b/.agents/skills/check_for_broken_links/test_check_links.py new file mode 100644 index 000000000..88f181a61 --- /dev/null +++ b/.agents/skills/check_for_broken_links/test_check_links.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +"""Regression cases for same-page (`#fragment`) link validation. + +`should_skip()` used to filter out every bare `#fragment` link before +`check_fragment()` ever ran, so a same-page link to a renamed or deleted +heading passed silently instead of being reported broken. These cases pin +the fix: a valid same-page fragment stays valid, and an invalid one is +flagged. + +Run from the repo root: + python3 .agents/skills/check_for_broken_links/test_check_links.py +""" +import importlib.util +import pathlib +import sys +import tempfile + +HERE = pathlib.Path(__file__).parent +spec = importlib.util.spec_from_file_location("check_links", HERE / "check_links.py") +check_links = importlib.util.module_from_spec(spec) +spec.loader.exec_module(check_links) + +# (description, filename, page content, expected broken urls) +CASES = [ + ( + "valid bare #fragment matches a heading on the same page", + "valid.md", + "## Getting Started\n\nSee [the setup steps](#getting-started) for details.\n", + [], + ), + ( + "invalid bare #fragment has no matching heading on the same page", + "invalid.md", + "## Getting Started\n\nSee [a missing section](#does-not-exist) for details.\n", + ["#does-not-exist"], + ), +] + + +def main() -> int: + failures = 0 + + with tempfile.TemporaryDirectory() as tmp: + root = pathlib.Path(tmp) + checker = check_links.LinkChecker(root) + + skip = checker.should_skip("#getting-started") + ok = skip is False + failures += 0 if ok else 1 + print(f" [{'PASS' if ok else 'FAIL'}] should_skip() no longer drops bare #fragment links") + + for description, filename, content, expected_broken in CASES: + page = root / filename + page.write_text(content, encoding="utf-8") + + broken, _ = checker.check_file(page, check_internal=True, check_external=False) + broken_urls = [link["url"] for link in broken] + ok = broken_urls == expected_broken + failures += 0 if ok else 1 + print(f" [{'PASS' if ok else 'FAIL'}] {description:<58} broken={broken_urls}") + + total = len(CASES) + 1 + print() + if failures: + print(f"{failures} of {total} cases regressed.") + return 1 + print(f"All {total} cases behave correctly.") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.agents/skills/create_pr/SKILL.md b/.agents/skills/create_pr/SKILL.md index 158c078d0..7b988bfd7 100644 --- a/.agents/skills/create_pr/SKILL.md +++ b/.agents/skills/create_pr/SKILL.md @@ -55,10 +55,10 @@ Run the link checker to validate all internal and external links: ```bash # Quick internal-only check (fast, no HTTP requests) -python3 .warp/skills/check_for_broken_links/check_links.py --internal-only +python3 .agents/skills/check_for_broken_links/check_links.py --internal-only # Full check including external links -python3 .warp/skills/check_for_broken_links/check_links.py +python3 .agents/skills/check_for_broken_links/check_links.py ``` Fix any broken links before opening the PR. See the `check_for_broken_links` skill for detailed guidance on fixing different link types. @@ -83,31 +83,30 @@ This helps you: - Catch unintended changes before review - Write an accurate PR description -### 5. Verify astro.config.mjs (sidebar config) updates +### 5. Verify sidebar updates If you added, moved, or renamed any documentation pages: -- Update the sidebar config in `astro.config.mjs` at the repo root (see AGENTS.md "Navigation and redirects") -- Ensure the page title in the sidebar config matches the H1 title in the document -- Check that the file path is correct +- Update the sidebar in `src/sidebar.ts`. That file is the source of truth; `astro.config.mjs` only imports it via `starlightSidebarTopics(sidebarTopics)`. +- Ensure the label matches the H1 title in the document, or omit the label and let Starlight derive it. +- Check that the slug is correct: no leading slash and no `.md`/`.mdx` extension. ### 6. Add redirects for moved/renamed pages -If you renamed or moved a page that's already published: +If you renamed or moved a page that's already published, add a redirect to the `redirects` array in `vercel.json` at the repo root. Every redirect lives in that one file, including redirects between top-level sections — there is no per-section redirect file and no external redirect tool. -- Add a redirect entry to the appropriate `vercel.json (redirects)` file -- For cross-space redirects, use the `scripts/docs_redirects.py` tool -- Check existing redirects first to avoid duplicates +Check existing redirects first to avoid duplicates. ```json -// Example redirect in vercel.json { - "redirects": [ - { "source": "/old/path", "destination": "/new/path" } - ] + "source": "/old/path", + "destination": "/new/path/", + "statusCode": 308 } ``` +Include the trailing slash on `destination` and the `statusCode`, matching the existing entries. + ## PR Description Guidelines Structure your PR description with these sections: @@ -129,10 +128,29 @@ This PR updates the Terminal and Agent modes documentation for the Oz launch. - Updated keyboard shortcuts with comprehensive tables - Added fork functionality documentation -### src/content/docs/agent-platform/astro.config.mjs (sidebar config) +### src/sidebar.ts - Updated navigation entry title ``` +### Unverified claims (required on drafting PRs) + +Any PR that adds or updates page content must state which UI labels, Settings paths, CLI flags, permission defaults, plan eligibility, and platform-support claims could not be verified against `warp-internal`, `warp-server`, or a live build. See step 9.5 of the `draft_docs` skill. + +Include the section even when nothing is outstanding: + +```markdown +## Unverified claims +None — all UI labels, flags, defaults, and eligibility claims were verified against source. +``` + +When claims are outstanding, give the reviewer one bullet per claim with what would confirm it: + +```markdown +## Unverified claims +- `--auto-approve` flag name — `cloud-agents.mdx`, "Run an agent" — taken from the PRD; confirm against `TuiArgs` in `warp-internal`. +- **Settings** > **Agents** > **Permissions** path — `permissions.mdx`, "Defaults" — source repos were not available in this environment. +``` + ### Additional context (optional) - Link to related issues or discussions - Screenshots for visual changes diff --git a/.agents/skills/docs-seo-audit/SKILL.md b/.agents/skills/docs-seo-audit/SKILL.md index 38dd00e7b..3e2722c87 100644 --- a/.agents/skills/docs-seo-audit/SKILL.md +++ b/.agents/skills/docs-seo-audit/SKILL.md @@ -118,7 +118,7 @@ Before making any changes, read these references: 2. **Meta descriptions come from frontmatter**. To fix a description, edit the `description:` field in the page's YAML frontmatter. 3. **OG and Twitter tags mirror title and description** automatically. No separate fix needed. 4. **Changing a sidebar config label has side effects**: it also changes the sidebar label, breadcrumbs, and prev/next pagination. URLs are NOT affected (URLs are based on the file path/slug). -5. **When changing a title, also update the H1** in the markdown file for consistency. +5. **Never add or edit a manual H1 heading in a markdown file.** Astro Starlight auto-generates the page's H1 from the frontmatter `title` (falling back to the sidebar label or slug, per the precedence in `references/starlight-seo.md`), so this repo's pages never write an explicit `# Heading` at the top of the body — that pattern is leftover behavior from the old GitBook-based docs platform. Changing a `title` or sidebar `label` never requires a matching H1 edit, because there is no H1 in the markdown to edit. If the audit's `multiple_h1` or `missing_h1` check flags a page and you find a manual H1 in its body, treat that as an incidental defect: remove the manual H1 (do not keep it in sync with the title) as its own cleanup, separate from any title/description fix. 6. **All titles, labels, and H1 headings must use sentence case.** Capitalize only the first word and proper nouns. Only recognized proper feature names retain their capitalization — check `AGENTS.md` and `.agents/references/terminology.md` for the canonical list. Common mistakes to avoid: - ✅ `Computer use for agents` — generic term, sentence case - ❌ `Computer Use for Agents` — not a proper feature name, don't capitalize @@ -151,13 +151,13 @@ When the audit flags these pages for `title_too_short`, exclude them from your f If you believe a new title should be added to this exceptions list, flag it for human review before proceeding. -### Sidebar config labels vs. H1 headings +### Sidebar config labels vs. page titles -Sidebar config labels (the `label` property in `src/sidebar.ts`) and H1 page headings are **intentionally different** in some cases. Do not change either to match the other unless you are fixing a genuine duplicate title collision. Specifically: +Sidebar config labels (the `label` property in `src/sidebar.ts`) and frontmatter `title` values are **intentionally different** in some cases. Do not change either to match the other unless you are fixing a genuine duplicate title collision. Specifically: - Do **not** add section-context prefixes (like "Terminal", "Warp", or "Agent") to short but accurate titles just because the title appears generic in isolation. Sidebar context already provides that disambiguation. - Do **not** rename sidebar config labels for pages in the exceptions list above. -- Do **not** sync sidebar config label text to match H1 headings (or vice versa) as a standalone change — the two are allowed to differ. +- Do **not** sync sidebar config label text to match the frontmatter `title` (or vice versa) as a standalone change — the two are allowed to differ. Neither one requires touching an H1 in the markdown body, since there isn't one (see Key principle #5). ### Fixing duplicate titles @@ -185,7 +185,7 @@ Example: - `agent-platform/capabilities/index.mdx`: `title: 'Capabilities overview'` + `sidebar.label: 'Overview'` - `platform/integrations/index.mdx`: `title: 'Integrations overview'` + `sidebar.label: 'Overview'` -When using this approach, also update the H1 in the markdown file to match the new `title`. +Do not add or update an H1 in the markdown file — Starlight renders the page's H1 from this frontmatter `title` automatically (see Key principle #5 above). #### Alternative: rename the sidebar config label @@ -193,7 +193,7 @@ If the short label is not intentional, rename the `label` in `src/sidebar.ts` to - Before: `{ slug: 'agent-platform/local-agents', label: 'Overview' }` + `{ slug: 'platform', label: 'Overview' }` - After: `{ slug: 'agent-platform/local-agents', label: 'Local agents overview' }` + `{ slug: 'platform', label: 'Cloud agents overview' }` -When changing a sidebar config label, also update the H1 in the markdown file for consistency. +Do not add or update an H1 in the markdown file for this — Starlight renders the page's H1 from the frontmatter `title` (or the slug when no `title` is set), never from the sidebar label (see Key principle #5 above). ### Fixing missing descriptions @@ -219,7 +219,7 @@ After making fixes, review every change before presenting to the user. Run throu - **Does this still mean the same thing?** Titles and descriptions must accurately represent the page content. Read the actual page before writing or rewriting anything. Never invent features, capabilities, or details that aren't on the page. If unsure what the page covers, read it first. - **Did I introduce a new duplicate?** Scan the full sidebar config in `src/sidebar.ts`. Verify every label is unique within the site. This is the most common mistake — fixing one duplicate by picking a name that collides with an existing entry. -- **Does the H1 match?** Every sidebar config label change needs a corresponding H1 update in the markdown file. Mismatches between sidebar label and page heading confuse readers. +- **Did I leave any manual H1 behind?** Scan every file you touched for a body-level `# Heading` and remove it — Starlight already renders the page's H1 from frontmatter `title`, so a manual H1 is always a duplicate, never something to add or sync with a title/label change. - **Is the terminology right?** Cross-check against `AGENTS.md` and how the feature is actually referred to in the existing docs. Don't rename things to terms that aren't used elsewhere in the docs. - **Is the casing right?** All labels and H1 headings must use sentence case. Proper product feature names (e.g., "Agent Mode", "Codebase Context", "Admin Panel", "Remote Control", "Warp Drive") retain their capitalization, but generic terms ("overview", "quickstart", "agents", "notifications") are lowercase. Never use title case. - **Does this read naturally in context?** Consider how the title appears (a) as a sidebar label under its section header, and (b) as a search result: `{Title} | {Topic} | Warp`. If it sounds awkward or uses internal jargon that users wouldn't recognize, rephrase. diff --git a/.agents/skills/draft_conceptual/SKILL.md b/.agents/skills/draft_conceptual/SKILL.md index 3c51cfecd..65d41a7a5 100644 --- a/.agents/skills/draft_conceptual/SKILL.md +++ b/.agents/skills/draft_conceptual/SKILL.md @@ -11,6 +11,14 @@ Draft a conceptual documentation page that explains what a feature or concept is Follow the workflow in `.warp/skills/draft_docs/SKILL.md`, using the **conceptual template** at `.warp/templates/conceptual.md`. +## Frontmatter description + +One sentence, 50-160 characters, saying what the concept is and why it matters. Start with the subject. +- ✅ `Environments give cloud agents the same toolchain and setup on every run, no matter what triggers them.` +- ❌ `Learn about environments and why they are useful.` + +See "Descriptions by content type" under Frontmatter in `AGENTS.md` for the full rules. + ## Content type rules These rules are specific to conceptual pages (from the "Drafting by content type" section of `AGENTS.md`): @@ -21,6 +29,7 @@ These rules are specific to conceptual pages (from the "Drafting by 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 - Title convention: noun or "About [subject]" +- Apply the tone rules in AGENTS.md → Voice & tone: no marketing buzzwords or meta-openers, and no internal architecture the reader can't act on. Run a deletion-only "Cut again" pass before presenting the draft — a short page is a finished page. ## Heading case diff --git a/.agents/skills/draft_docs/SKILL.md b/.agents/skills/draft_docs/SKILL.md index 41fccc5a5..9799a7c83 100644 --- a/.agents/skills/draft_docs/SKILL.md +++ b/.agents/skills/draft_docs/SKILL.md @@ -81,6 +81,15 @@ To find these repos, search for directories named `warp-internal` and `warp-serv Use source code to verify technical behavior, understand feature implementation, and find accurate terminology. +When the draft names UI labels, Settings paths, CLI flags, default permissions, plan eligibility, or platform support, treat source (or a live build) as required verification, not optional color. A PRD or spec is not verification: labels and flag names routinely change between spec and ship. + +If you cannot verify a claim (for example, the source repos are not available in this environment), do not guess and do not silently drop it. Choose one of these, and record the claim either way: + +1. **Omit the claim** - Write around it when the page still works without it. Describe the action without naming the exact flag, or link to the reference page that will carry the detail. +2. **Include it with an inline marker** - Keep the spec's wording and flag it in an MDX comment next to the claim: `{/* VERIFY: flag name from PRD, unconfirmed against warp-internal */}`. + +Keep a running list of every unverified claim as you draft. Reporting that list is required — see step 9.5. + ### 6.5. Critical formatting rules These rules are frequently violated by agents. Apply them carefully during drafting: @@ -88,11 +97,28 @@ These rules are frequently violated by agents. Apply them carefully during draft - **Product name variables** — For any product name in `src/data/vars.ts`, use the variable instead of the hardcoded string. Add `import { VARS } from '@data/vars';` immediately after the frontmatter closing `---`. Use `{VARS.KEY}` in MDX prose (e.g. `{VARS.WARP_AGENT_CLI}` not "Oz CLI"). Use `{{TOKEN}}` directly in frontmatter YAML values (e.g. `title: "{{WARP_AGENT_CLI}} reference"`). Key vars: `WARP_AGENT_CLI`, `WARP_AUTOMATION_PLATFORM`, `WEB_APP`, `WEB_APP_URL`, `DASHBOARD`, `AGENT_MODE`, `WARP_DRIVE`. See `src/data/vars.ts` for the full list. - **Sentence case for all headings (H1–H4)** — Capitalize only the first word and proper feature names. ✅ `## How it works` ❌ `## How It Works` -- **Descriptive, specific headings** — Beyond correct case, a heading should name the specific topic so readers and agents can scan the page and extract a self-contained answer. ✅ `## How key type affects billing and GitHub access` ❌ `## More details` -- **Bold + dash format for list items** — `* **Term** - Description`, not `* Term: Description` +- **Descriptive, specific headings** — Beyond correct case, a heading should name the specific topic so readers and agents can scan the page and extract a self-contained answer. Prefer the concrete object or outcome over a vague section label. ✅ `## How key type affects billing and GitHub access` / `## Configuring Workload Identity Federation` ❌ `## More details` / `## Overview` / `## Additional information` / `## Other` +- **Frontmatter `description` is a standalone search summary** — One to two sentences, roughly 50–160 characters, stating the user benefit and primary keywords. It must make sense out of context, in a search result or an AI citation. ✅ `description: Environments keep cloud agents on a consistent toolchain across every trigger.` ❌ `description: This page describes environments.` ❌ a description that only restates the title +- **Bold + dash format for list items** — `* **Term** - Description`, not `* Term: Description` and not `* **Term** — Description`. Use a hyphen with spaces around it as the separator after the bold term. +- **Unordered list marker is `*`** — Match the templates and existing docs. Reserve `-` for nested lists whose parent already uses `*`; use `1.` for numbered procedures. ✅ `* **Codebase Context** - Warp indexes your Git-tracked codebase` ❌ `- **Codebase Context** - ...` as the top-level marker on a new page - **Tables or parallel bullets for comparison and reference data** — When you present two or more parallel items (key types, plan tiers, environments) or structured reference data (API endpoints, parameters), use a Markdown table or tightly parallel bullets instead of one dense paragraph. ✅ a table with one row per API endpoint, or parallel `**Personal API keys**` / `**Agent API keys**` bullet groups ❌ a single paragraph mixing both key types and their billing rules - **Bold for UI elements** — Use `**Save**` not `` `Save` `` after action verbs like "click" - **Bold per-segment for Settings paths** — Use `**Settings** > **AI** > **Knowledge**` not `` `Settings > AI > Knowledge` `` +- **Orient the reader before every Settings path, CLI command, or URL** — On first reference in the page, name the app or tool. ✅ `In the Warp app, go to **Settings** > **AI** > **Knowledge**.` ❌ `Go to **Settings** > **AI** > **Knowledge**.` +- **Verify labels, flags, and defaults against source** — Before documenting a button name, Settings path, CLI flag, permission default, or eligibility rule, confirm it in `warp-internal` / `warp-server` or the live UI. ✅ `warp --auto-approve` after checking `TuiArgs` ❌ inventing `--fast-forward` from memory or an old PR description +- **Document durable behavior, not ephemeral chrome** — Prefer workflows, shortcuts, and outcomes that stay true when styling shifts. Drop glyph colors, pixel-level layout narration, and other pure presentation detail unless the reader must recognize them to succeed. ✅ "Press `Ctrl+C` once to stop the in-progress response." ❌ a full inventory of pending/running/failed glyph colors +- **State availability honestly** — If a capability is preview-only, platform-limited, interactive-only, or not yet in cloud agents, say so next to the claim. Never describe limited-preview behavior as generally available. ✅ "Linux post-processing adds smart cut; macOS applies a uniform speedup." ❌ listing smart cut as a property of every recording +- **Cover team-wide and admin effects** — For integrations and team features, state who can install, whether every teammate gets access immediately, and any per-user auth or admin steps on the external system. ✅ "A Jira admin must install the app; each teammate links their own account for run attribution." ❌ setup steps that only describe the installer's happy path +- **Section order follows reader chronology** — Prerequisites and requirements before setup, setup before usage, usage before advanced options. ✅ `## Prerequisites` → `## Set up the integration` → `## Start a run` ❌ setup steps before the reader knows what they need +- **Keep error messages out of the main flow** — Do not weave full error strings through conceptual or procedural sections. Put them in a dedicated `## Troubleshooting` section near the end, formatted symptom → cause → fix. ✅ one Troubleshooting section with the exact error as a bold lead-in ❌ repeating the same error callout after every step +- **Use callouts sparingly** — Prefer body prose. At most one or two callouts per page unless the content type template requires more, never two callouts back to back, and at most one per section. ✅ a single `:::note` for a non-obvious prerequisite ❌ a `:::note` / `:::tip` after every subsection +- **No AI-ism buzzwords or meta-openers** — Never open with "This page covers/explains/walks through..."; state the thing itself. Avoid marketing adjectives (seamless, powerful, robust, comprehensive), inflated verbs (leverage, streamline, empower, unlock), restated cause-and-effect ("This process ensures..."), and recap lines. See AGENTS.md → Voice & tone for the full lists. ✅ "Run agents directly in your GitHub Actions workflows using `oz-agent-action`." ❌ "This page covers how the integration works, how to set it up, and common automation patterns." +- **Document the user-visible model, not internal architecture** — Internal components (orchestrators, control planes, lifecycle state machines) get at most one sentence, and only when the reader can act on them. ✅ "Warp tracks every run. Check its status from the CLI, the API, or the dashboard." ❌ "The orchestration layer runs on Warp's servers (cloud control plane) and tracks lifecycle state (created → running → completed/failed)." +- **Descriptive link text, and no dead-end pages** — Never use "here", "this page", or a bare URL as link text. End every new page with a `## Related pages` section (or the type-equivalent, such as `## Next steps` on a quickstart) containing at least one internal link whose anchor names the destination topic. ✅ `Learn more about [Codebase Context](/code/codebase-context/)` ❌ `Click [here](/code/codebase-context/)` ❌ ending a new feature page with no cross-links +- **Disambiguate conditional and multi-clause wording** — If a sentence has two plausible readings (especially with "when", "if", "can", or stacked clauses), rewrite it so only one meaning remains. Prefer one idea per sentence. ✅ `Cloud handoff keeps your conversation's model only when that model is available in the cloud.` ❌ `Cloud handoff keeps your conversation's model when it can run in the cloud.` (keeps the model when it can? or only when cloud supports the model?) +- **Lead instructional sentences with the action or goal** — In steps, keyboard shortcuts, and "how to" sentences, put the action or goal first, then the control or condition. Readers should not need prior context to know what values or targets you mean. ✅ `To open the searchable environment and model selectors, press Ctrl+E.` ❌ `To change either value, press Ctrl+E.` (which values?) +- **Screenshots for hard-to-describe UI** — When a page documents a visual surface (statusline chips, tab bars, settings panes, multi-control layouts), include a screenshot after the prose that introduces that surface. Prefer prose for straightforward clicks, and prefer one well-placed figure over repeating the same surface. Always use descriptive alt text, never "screenshot". Do not invent or request screenshots of internal-only, flagged, or unfinished UI. ✅ a statusline screenshot after the paragraph that names the chips ❌ describing chip layout in a long paragraph with no image when humans keep asking "should we include a screenshot?" +- **`VideoEmbed` requires a specific `title`** — Every `<VideoEmbed>` must include a `title` prop that names the integration, workflow, feature, or task shown. ✅ `<VideoEmbed url="..." title="Warp Agent CLI conversation transcript walkthrough" />` ❌ `<VideoEmbed url="..." />` or a generic title like `"video"` / `"demo"` ### 7. Draft the doc Create the documentation using the appropriate template from `.agents/templates/`. Follow the structure for the identified content type and all rules in `AGENTS.md`. Each template includes visible bracketed instructions explaining what to put in each section. @@ -115,26 +141,60 @@ Skip steps 1–3 in local/interactive sessions. ### 9. Review against checklist Before presenting the draft, verify against the quality checklist in `AGENTS.md`: -- [ ] Frontmatter includes clear description written as a standalone summary +- [ ] Frontmatter description is a standalone search summary (benefit + keywords; not "This page describes..." and not a restatement of the title) - [ ] Content follows the structure for its content type +- [ ] Section order follows reader chronology (requirements → setup → usage → advanced → troubleshooting) +- [ ] Error messages and failure modes live in Troubleshooting, not woven through the main flow +- [ ] Callouts are sparse (usually 0–2 per page), never consecutive, and not used as a substitute for body prose +- [ ] Prose passes the tone rules: no marketing buzzwords, no meta-openers ("This page covers..."), no restated cause-and-effect or recap lines, and it reads naturally aloud (AGENTS.md → Voice & tone) +- [ ] Internal architecture (orchestrators, control planes, lifecycle states) appears only where the reader can act on it, and relocated detail landed on a maintainer-facing surface instead of being deleted +- [ ] A deletion-only second pass removed framing lines, self-commentary, rule justifications, and boilerplate a parent page already covers (AGENTS.md → Voice & tone → Cut again) - [ ] Terminology matches the glossary (`.agents/references/terminology.md`) - [ ] Headers use sentence case (with proper feature name capitalization) -- [ ] Lists use bold term + dash + explanation format -- [ ] Cross-references to related features are included +- [ ] Headers name a specific topic (not bare Overview / More details / Other) +- [ ] Lists use `*` markers with bold term + hyphen + explanation format +- [ ] Cross-references are included, and every new page ends with `## Related pages` or a type-equivalent `## Next steps` +- [ ] Link text names the destination topic (not "here" / "this page" / raw URLs) +- [ ] The first Settings path, CLI command, or URL on the page names the app or tool - [ ] Instructions include expected outcomes +- [ ] Instructional sentences lead with the action or goal before the control, shortcut, or condition +- [ ] Conditional or multi-clause sentences have only one clear reading (no ambiguous "when/if/can" stacking) - [ ] Procedures are scannable: dense sections are split into numbered steps, short bullets, or concise subsections - [ ] UI surfaces and product terms use canonical names from `.agents/references/terminology.md` +- [ ] UI labels, CLI flags, permission defaults, and eligibility claims were verified against source or the live product — anything unverified is marked inline and reported per step 9.5 +- [ ] The draft emphasizes durable behavior over ephemeral UI chrome (glyphs, pure styling, layout minutiae) +- [ ] Preview-only, platform-limited, or interactive-only capabilities are labeled as such +- [ ] Integrations and team features state admin requirements and who gets access after install - [ ] Product names with a corresponding entry in `src/data/vars.ts` use the variable syntax (`{VARS.KEY}` in prose, `{{TOKEN}}` in frontmatter) — not hardcoded strings - [ ] If AEO-driven, the draft follows the AEO brief, uses source vocabulary naturally, and avoids duplicative or junk-drawer coverage -- [ ] Images have descriptive alt text +- [ ] Images have descriptive alt text and are used only where the UI is hard to describe in prose +- [ ] Visual UI surfaces that are hard to reconstruct from prose include a screenshot (or an explicit note that no screenshot is available yet) +- [ ] Every `VideoEmbed` includes a specific `title` prop describing the workflow or feature shown + +### 9.5. Report unverified claims + +Inline `{/* VERIFY: ... */}` markers alone are skippable: a reviewer who skims the rendered page or the diff will miss them. Surface the full list where the human cannot miss it. + +- **Agent-authored PRs** - Add an `## Unverified claims` section to the PR description. Include one bullet per claim with the claim itself, the file and section where it appears, and what would confirm it (for example, "check `TuiArgs` in `warp-internal`"). Include the section even when the list is empty, with the single line `None — all UI labels, flags, defaults, and eligibility claims were verified against source.` Never drop the section. +- **Local or interactive sessions** - List the same claims in your response to the user, before they review the draft. + +A reviewer must be able to see every unconfirmed claim without opening the diff. ### 10. Update navigation and redirects If this is a new page, remind the user to: - Add it to the relevant section in `src/sidebar.ts`. -If this page replaces, renames, or moves an existing page, remind the user to add a redirect: -- **Same-space redirect**: Add an entry to the space's `vercel.json (redirects)` file under `redirects:`. -- **Cross-space redirect**: Add the redirect through the Astro Starlight UI (cross-space redirects cannot be managed via `vercel.json (redirects)`). +If this page replaces, renames, or moves an existing page, remind the user to add a redirect to the `redirects` array in `vercel.json` at the repo root: + +```json +{ + "source": "/old/path", + "destination": "/new/path/", + "statusCode": 308 +} +``` + +All redirects live in that one file, including redirects between top-level sections — there is no separate per-section redirect file and no UI for managing them. Include the trailing slash on `destination` to match the existing entries. Always check the current list of redirects before adding a new one to avoid duplicates. diff --git a/.agents/skills/draft_faq/SKILL.md b/.agents/skills/draft_faq/SKILL.md index 3890e34c2..58ce877c3 100644 --- a/.agents/skills/draft_faq/SKILL.md +++ b/.agents/skills/draft_faq/SKILL.md @@ -11,6 +11,14 @@ Draft an FAQ page with questions grouped by theme and answers that lead with a d Follow the workflow in `.warp/skills/draft_docs/SKILL.md`, using the **FAQ template** at `.warp/templates/faq.md`. +## Frontmatter description + +One sentence, 50-160 characters, naming the topic area the questions cover. +- ✅ `Answers to common questions about cloud agent billing, credits, and plan limits.` +- ❌ `Frequently asked questions.` + +See "Descriptions by content type" under Frontmatter in `AGENTS.md` for the full rules. + ## Content type rules These rules are specific to FAQ pages (from the "Drafting by content type" section of `AGENTS.md`): diff --git a/.agents/skills/draft_feature_doc/SKILL.md b/.agents/skills/draft_feature_doc/SKILL.md index b4233c95f..50d9c02eb 100644 --- a/.agents/skills/draft_feature_doc/SKILL.md +++ b/.agents/skills/draft_feature_doc/SKILL.md @@ -11,6 +11,14 @@ Draft a feature documentation page that combines conceptual and procedural conte Follow the workflow in `.agents/skills/draft_docs/SKILL.md`, using the **feature-doc template** at `.agents/templates/feature-doc.md`. +## Frontmatter description + +One sentence, 50-160 characters, saying what the feature does and its primary benefit. +- ✅ `Control what the agent can do with permission cards, auto-approve, and execution profiles.` +- ❌ `Documentation for permissions and profiles.` + +See "Descriptions by content type" under Frontmatter in `AGENTS.md` for the full rules. + ## Content type rules These rules are specific to feature documentation pages (from the "Drafting by content type" section of `AGENTS.md`): @@ -19,6 +27,7 @@ These rules are specific to feature documentation pages (from the "Drafting by c - Apply the **procedural** rules to the step-by-step sections (motivate steps, expected outcomes, focused steps). - **Keep the conceptual and procedural sections clearly separated with distinct headers.** Don't let explanation creep into procedures or vice versa. - Title convention: feature name as noun +- Apply the tone rules in AGENTS.md → Voice & tone: no marketing buzzwords or meta-openers, and no internal architecture the reader can't act on. Run a deletion-only "Cut again" pass before presenting the draft — a short page is a finished page. ## Heading case diff --git a/.agents/skills/draft_guide/SKILL.md b/.agents/skills/draft_guide/SKILL.md index 209b8d51a..2f6162dbe 100644 --- a/.agents/skills/draft_guide/SKILL.md +++ b/.agents/skills/draft_guide/SKILL.md @@ -28,6 +28,14 @@ The sidebar nav is defined in `src/sidebar.ts`, which organizes guides into topi - **DevOps & infrastructure** — Cloud logs, Docker, Kubernetes, testing, database optimization - **Frontend & UI** — Building and refining UI components with coding agents +## Frontmatter description + +One sentence, 50-160 characters, saying what the reader will build or accomplish, using the non-branded phrasing they would search for. +- ✅ `Set up Claude Code and run your first agentic coding session from the terminal.` +- ❌ `A guide to using Claude Code with Warp.` + +See "Descriptions by content type" under Frontmatter in `AGENTS.md` for the full rules. + ## Content type rules These rules are specific to guide pages (from the "Drafting by content type" section of `AGENTS.md`): diff --git a/.agents/skills/draft_procedural/SKILL.md b/.agents/skills/draft_procedural/SKILL.md index 022f3a3c7..73d327c8b 100644 --- a/.agents/skills/draft_procedural/SKILL.md +++ b/.agents/skills/draft_procedural/SKILL.md @@ -11,6 +11,14 @@ Draft a procedural documentation page with step-by-step instructions to accompli Follow the workflow in `.agents/skills/draft_docs/SKILL.md`, using the **procedural template** at `.agents/templates/procedural.md`. +## Frontmatter description + +One sentence, 50-160 characters, naming the task the reader will complete. Start with an imperative verb. +- ✅ `Connect Slack to Oz so mentions and channel messages can trigger cloud agent runs.` +- ❌ `This page explains the Slack integration setup process.` + +See "Descriptions by content type" under Frontmatter in `AGENTS.md` for the full rules. + ## Content type rules These rules are specific to procedural pages (from the "Drafting by content type" section of `AGENTS.md`): diff --git a/.agents/skills/draft_quickstart/SKILL.md b/.agents/skills/draft_quickstart/SKILL.md index 531477926..e8889feaf 100644 --- a/.agents/skills/draft_quickstart/SKILL.md +++ b/.agents/skills/draft_quickstart/SKILL.md @@ -11,6 +11,14 @@ Draft a quickstart that gets the reader from zero to a working result in about 1 Follow the workflow in `.warp/skills/draft_docs/SKILL.md`, using the **quickstart template** at `.warp/templates/quickstart.md`. +## Frontmatter description + +One sentence, 50-160 characters, saying what the reader ends up with plus the time budget. Start with an imperative verb. +- ✅ `Install the Warp Agent CLI, log in, and run your first agent conversation in about five minutes.` +- ❌ `Get started with the Warp Agent CLI.` + +See "Descriptions by content type" under Frontmatter in `AGENTS.md` for the full rules. + ## Content type rules These rules are specific to quickstart pages (from the "Drafting by content type" section of `AGENTS.md`): @@ -23,6 +31,7 @@ These rules are specific to quickstart pages (from the "Drafting by content type - All procedural rules apply (focused steps, motivate steps, expected outcomes). - End with 2-3 actionable next steps linking to deeper content. - 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. ## Heading case diff --git a/.agents/skills/draft_reference/SKILL.md b/.agents/skills/draft_reference/SKILL.md index 59608841b..feb2a5c4c 100644 --- a/.agents/skills/draft_reference/SKILL.md +++ b/.agents/skills/draft_reference/SKILL.md @@ -11,6 +11,14 @@ Draft a reference documentation page with structured, exhaustive information for Follow the workflow in `.warp/skills/draft_docs/SKILL.md`, using the **reference template** at `.warp/templates/reference.md`. +## Frontmatter description + +One sentence, 50-160 characters, saying what the reader can look up. Name the artifacts, not the genre. +- ✅ `Look up Warp Agent CLI flags, environment variables, slash commands, and keyboard shortcuts.` +- ❌ `Reference documentation for the Warp Agent CLI.` + +See "Descriptions by content type" under Frontmatter in `AGENTS.md` for the full rules. + ## Content type rules These rules are specific to reference pages (from the "Drafting by content type" section of `AGENTS.md`): diff --git a/.agents/skills/draft_troubleshooting/SKILL.md b/.agents/skills/draft_troubleshooting/SKILL.md index 915e3989a..8e400a1d5 100644 --- a/.agents/skills/draft_troubleshooting/SKILL.md +++ b/.agents/skills/draft_troubleshooting/SKILL.md @@ -11,6 +11,14 @@ Draft a troubleshooting page that helps users diagnose and fix common issues. Follow the workflow in `.warp/skills/draft_docs/SKILL.md`, using the **troubleshooting template** at `.warp/templates/troubleshooting.md`. +## Frontmatter description + +One sentence, 50-160 characters, naming the symptoms covered rather than the act of troubleshooting. +- ✅ `Fix sign-in failures, failed conversation resumes, and update problems in the Warp Agent CLI.` +- ❌ `Troubleshooting information for common problems.` + +See "Descriptions by content type" under Frontmatter in `AGENTS.md` for the full rules. + ## Content type rules These rules are specific to troubleshooting pages (from the "Drafting by content type" section of `AGENTS.md`): @@ -22,6 +30,7 @@ These rules are specific to troubleshooting pages (from the "Drafting by content - Link to related troubleshooting pages and support channels. - Include workarounds even when no fix exists — documenting a known issue without a workaround still saves the user time searching. - Title convention: "Troubleshooting [feature]" or "Error: [error name]" +- Apply the tone rules in AGENTS.md → Voice & tone: lead with the fix, not framing; no marketing buzzwords or meta-openers. Delete any category or symptom section you don't have real content for — a short page is a finished page. ## Heading case diff --git a/.agents/skills/improve-404-monitor-skill/SKILL.md b/.agents/skills/improve-404-monitor-skill/SKILL.md index ccf2d305e..9e28de149 100644 --- a/.agents/skills/improve-404-monitor-skill/SKILL.md +++ b/.agents/skills/improve-404-monitor-skill/SKILL.md @@ -11,20 +11,49 @@ This skill is part of the self-improvement loop architecture. The `weekly-404-mo ## Schedule -Monthly, first Monday of each month, 9am PT (`0 17 1-7 * 1` in UTC). Run this agent starting in month 2 after `weekly-404-monitor` begins writing log entries, but only act on patterns if at least 6 entries exist. +Monthly, first Monday of each month, 9am PT. Run this agent starting in month 2 after `weekly-404-monitor` begins writing log entries, but only act on patterns if at least 6 entries exist. + +Cron: `0 17 * * 1` (UTC) — every Monday — combined with the first-week guard in step 0 below. + +:::caution +Do **not** use `0 17 1-7 * 1`. That expression looks like "first Monday" but is not: when a cron expression restricts **both** day-of-month and day-of-week, the two fields are **ORed**, so it fires on every day of the 1st through 7th **and** every Monday — roughly 11 times a month. The `improve-drafting-skills` agent shipped with this exact expression and opened four conflicting PRs in six days before it was caught. Standard cron cannot express "first Monday," so the day-of-month guard is required. +::: + +## Step 0: First-week guard + +Run this before anything else. The schedule fires every Monday, so a run outside the first week of the month must exit immediately without reading logs, editing files, opening a PR, or posting to Slack. + +```bash +DAY_OF_MONTH=$(date -u +%d) +if [ "$DAY_OF_MONTH" -gt 7 ]; then + echo "Skipping: today is day $DAY_OF_MONTH, not the first Monday of the month. This agent runs monthly." + exit 0 +fi +``` + +A skipped run is a no-op, not a failure. Write the skip line to the run output and post nothing. ## Prerequisites - Docs repo checked out at `main` -- `.agents/logs/weekly_404_monitor_runs.md` present on `main` (or on `chore/404-monitor-log` if the standing PR has not been merged yet) +- The `chore/404-monitor-log` branch reachable, since the run log is read from there (see "Signal source") - At least 6 entries in the run log - `gh` CLI authenticated with write access to `warpdotdev/docs` -- `SLACK_BOT_TOKEN` — for posting a summary to `#growth-docs` +- `BUZZ_SLACK_TOKEN` — for posting a summary to `#growth-docs`. This token posts as `buzz`, the bot account that is a member of that channel. Do not substitute another Slack token: several exist in the Oz secret store, and one that authenticates successfully can still fail with `channel_not_found` if its bot is not in the channel. - `GROWTH_DOCS_SLACK_CHANNEL_ID` — channel ID for `#growth-docs` ## Signal source -Read `.agents/logs/weekly_404_monitor_runs.md`. If the standing log PR (`chore: 404 monitor run log`) has not been merged into `main`, read from the `chore/404-monitor-log` branch instead. +Read the run log from the `chore/404-monitor-log` branch, which always holds the complete history: + +```bash +git fetch origin chore/404-monitor-log +git checkout origin/chore/404-monitor-log -- .agents/logs/weekly_404_monitor_runs.md +``` + +Do not read it from `main`. `main` only has entries up to the last time a human merged the standing log PR, so it can silently under-count entries — which matters here because the 6-entry minimum and the 3+ occurrence thresholds below are both counts. Do not attempt to merge the standing log PR; merging is human housekeeping, not a precondition for this analysis. See "Log availability" in `.agents/references/skill-authoring-guidelines.md`. + +**If the fetch fails, stop before step 1.** Do not fall back to the copy in the current checkout — that is the `main` copy, and a truncated log does not fail loudly, it silently changes the answer. A fetch failure is a blocked run, not a no-op: post the "run blocked" message (see step 7) naming the branch that could not be fetched, and end the run without analyzing or opening a PR. Each entry captures: date, outcome (PR opened / No PR / No data), total 404 volume (this week vs last week), trend direction, significant gap count, redirect candidates processed, HIGH-confidence redirect count, PR URL, Oz run URL, and notes. @@ -118,44 +147,58 @@ Before opening a PR, verify: python3 -c "import sys; content = open(sys.argv[1]).read(); parts = content.split('---', 2); assert len(parts) >= 3" .agents/skills/weekly-404-monitor/SKILL.md ``` -### 6. Open a draft PR +### 6. Create or update the standing improvement PR -PR title: +This agent maintains **one** long-lived improvement PR, never one per run — see "One standing PR per automation" in `.agents/references/skill-authoring-guidelines.md`. + +Stable branch: `docs/improve-404-monitor-skill` +Stable title (no date — the date goes in the body): ```text -docs(skills): improve weekly-404-monitor skill from run log analysis YYYY-MM-DD +docs(skills): improve weekly-404-monitor skill from run log analysis ``` -PR body must include: +Look for an existing open PR first: +```bash +gh pr list --repo warpdotdev/docs --state open \ + --search 'improve weekly-404-monitor skill from run log analysis in:title' \ + --json number,headRefName +``` +If one exists, check out its branch, rebase on the latest `origin/main`, apply this run's edits, push, and append dated bullets under the existing headings. If none exists, create the branch from the latest `origin/main` and open a draft PR. + +PR body carries these headings, each appearing exactly once (`check_pr_body.py` rejects duplicates, so do not add a per-run copy): - **Entries analyzed**: N run log entries, date range - **Patterns identified**: each pattern, evidence (entry count and dates), and proposed fix - **GitHub PR quality check**: summary of how many redirect PRs were accepted, corrected, or closed - **Patterns reviewed but not acted on**: observed patterns below threshold or already addressed - **Open questions for human review**: anything requiring editorial judgment +Prefix each appended bullet with its run date so the reviewer can tell runs apart. + Cap the diff at `weekly-404-monitor/SKILL.md` only. Do not rewrite unrelated sections. -### 7. Post Slack notification +### 7. Notify only if there is something to act on + +Post to `#growth-docs` **only** when the standing PR was created or received new commits, or when the run was blocked by a failure. Follow the actionable-only rule in `.agents/references/skill-authoring-guidelines.md`. A run that finds no actionable patterns — or that skips via the step 0 guard, or exits because fewer than 6 entries exist — posts nothing and is recorded in the run output only. -**PR opened:** +**PR opened or updated:** ``` ✅ 404 monitor skill improvement · YYYY-MM-DD -PR: [PR URL] +PR [created | updated]: [PR URL] Patterns addressed: N Evidence base: N run log entries (last N weeks) Oz run: [run URL] ``` -**No action (too few patterns or entries):** +**Run blocked by a failure:** ``` -ℹ️ 404 monitor skill review · YYYY-MM-DD — No changes -Entries analyzed: N -No actionable patterns found: [brief reason] +⚠️ 404 monitor skill review · YYYY-MM-DD — run blocked +What failed: [brief reason — e.g., "could not fetch the log branch"] Oz run: [run URL] ``` In both messages, build the `Oz run` link at runtime — never hard-code the Oz host. Resolve from your current run: ```bash -oz-dev run get "<your run ID>" --output-format json | jq -r '.session_link' +oz run get "<your run ID>" --output-format json | jq -r '.session_link' ``` If the command fails or returns an empty value, omit the `Oz run` line. @@ -165,10 +208,10 @@ This skill is designed for a monthly Oz scheduled agent. To deploy: 1. Push this skill to `main` in the docs repo. -2. Verify the Oz environment has `SLACK_BOT_TOKEN` and `GROWTH_DOCS_SLACK_CHANNEL_ID` set. +2. Verify the Oz environment has `BUZZ_SLACK_TOKEN` and `GROWTH_DOCS_SLACK_CHANNEL_ID` set. 3. In the Oz web app, create a new scheduled agent: - **Skill**: `improve-404-monitor-skill` from `warpdotdev/docs` - - **Schedule**: `0 17 1-7 * 1` (UTC) = first Monday of each month at 9am PT + - **Schedule**: `0 17 * * 1` (UTC) = every Monday at 9am PT. The step 0 first-week guard narrows this to the first Monday only. See the caution in `## Schedule` for why the day-of-month field must stay `*`. - **Environment**: the same environment used for `weekly-404-monitor` (already has `warpdotdev/docs` checked out and secrets set) - **Branch**: `main` 4. Start this agent after at least 6 weekly-404-monitor run log entries exist on `main` (approximately 6 weeks after run log writing is deployed). diff --git a/.agents/skills/improve-aeo-crosslink-skill/SKILL.md b/.agents/skills/improve-aeo-crosslink-skill/SKILL.md index 546f82d0a..dc2a0bb00 100644 --- a/.agents/skills/improve-aeo-crosslink-skill/SKILL.md +++ b/.agents/skills/improve-aeo-crosslink-skill/SKILL.md @@ -13,13 +13,31 @@ This skill is part of the self-improvement loop architecture. The `aeo_crosslink Monthly, first Monday of each month, 9am PT. Start this agent on month 3 after `aeo_crosslink_audit` is running regularly (requires at least 8 run log entries for meaningful pattern analysis). -Suggested cron: `0 17 1-7 * 1` (UTC) = first Monday of each month at 9am PT. +Cron: `0 17 * * 1` (UTC) — every Monday — combined with the first-week guard in step 0 below. + +:::caution +Do **not** use `0 17 1-7 * 1`. That expression looks like "first Monday" but is not: when a cron expression restricts **both** day-of-month and day-of-week, the two fields are **ORed**, so it fires on every day of the 1st through 7th **and** every Monday — roughly 11 times a month. The `improve-drafting-skills` agent shipped with this exact expression and opened four conflicting PRs in six days before it was caught. Standard cron cannot express "first Monday," so the day-of-month guard is required. +::: + +## Step 0: First-week guard + +Run this before anything else. The schedule fires every Monday, so a run outside the first week of the month must exit immediately without reading logs, editing files, opening a PR, or posting to Slack. + +```bash +DAY_OF_MONTH=$(date -u +%d) +if [ "$DAY_OF_MONTH" -gt 7 ]; then + echo "Skipping: today is day $DAY_OF_MONTH, not the first Monday of the month. This agent runs monthly." + exit 0 +fi +``` + +A skipped run is a no-op, not a failure. Write the skip line to the run output and post nothing. ## Prerequisites - Docs repo checked out at `main` - `gh` CLI authenticated with write access to `warpdotdev/docs` -- `SLACK_BOT_TOKEN` — for posting summary to `#growth-docs` +- `BUZZ_SLACK_TOKEN` — for posting a summary to `#growth-docs`. This token posts as `buzz`, the bot account that is a member of that channel. Do not substitute another Slack token: several exist in the Oz secret store, and one that authenticates successfully can still fail with `channel_not_found` if its bot is not in the channel. - `GROWTH_DOCS_SLACK_CHANNEL_ID` — channel ID for `#growth-docs` ## Signal @@ -30,47 +48,22 @@ Do not act if fewer than 8 entries exist. Write a "too early to analyze" notice ## Workflow -### 0. Merge the standing log PR +### 0. Read the run log from its branch -Before reading the run log, ensure all accumulated entries are on `main` by merging the standing log PR. This is the PR from `chore/aeo-crosslink-audit-log` that the `aeo_crosslink_audit` agent continuously appends to. - -```bash -# Find the open log PR (there should be at most one) -OPEN_LOG_PR=$(gh pr list --repo warpdotdev/docs \ - --head chore/aeo-crosslink-audit-log \ - --state open \ - --json number \ - --jq '.[0].number' 2>/dev/null) - -if [[ -n "$OPEN_LOG_PR" ]]; then - # Safety check: only merge if the PR touches exactly the expected log file. - CHANGED_FILES=$(gh pr view "$OPEN_LOG_PR" --repo warpdotdev/docs --json files --jq '[.files[].path]') - ONLY_LOG=$(echo "$CHANGED_FILES" | python3 -c " -import json, sys -files = json.load(sys.stdin) -print('yes' if all(f == '.agents/logs/aeo_crosslink_audit_runs.md' for f in files) else 'no') -") - if [[ "$ONLY_LOG" == 'yes' ]]; then - gh pr merge "$OPEN_LOG_PR" --repo warpdotdev/docs --merge - # Non-destructive fast-forward: fails loudly if worktree is dirty or not fast-forwardable. - git fetch origin main - git merge --ff-only origin/main - else - echo "Log PR contains unexpected files — skipping merge, reading log from branch instead." - git fetch origin chore/aeo-crosslink-audit-log - git checkout origin/chore/aeo-crosslink-audit-log -- .agents/logs/aeo_crosslink_audit_runs.md - fi -fi -``` - -If the merge fails (conflict, permissions, or the branch is ahead of main in an unexpected way), log the failure to run output and read the log from the `chore/aeo-crosslink-audit-log` branch instead: +Read the log directly from `chore/aeo-crosslink-audit-log`, the branch the `aeo_crosslink_audit` agent appends to after every run: ```bash git fetch origin chore/aeo-crosslink-audit-log git checkout origin/chore/aeo-crosslink-audit-log -- .agents/logs/aeo_crosslink_audit_runs.md ``` -Do not abort the skill run because the log PR could not be merged. Proceed with whatever log entries are available. +The branch always holds the complete history. `main` only has entries up to the last time a human merged the standing log PR, so reading `main` would silently analyze a truncated set and skew every pattern threshold below. + +**Do not merge the standing log PR.** An earlier version of this skill attempted the merge as its first step. That coupled the analysis to a repo write the agent may not have permission to perform, and turned an unmerged PR into a hard failure rather than a non-event. Merging is human housekeeping; see "Log availability" in `.agents/references/skill-authoring-guidelines.md`. + +**If the branch does not exist or the fetch fails, stop before step 1.** Do not fall back to the copy in the current checkout. That copy comes from `main`, which is exactly the truncated history this step exists to avoid — and a truncated log does not fail loudly, it silently changes the answer. With fewer entries the run either drops below the 8-entry minimum and reports "too early to analyze," or clears it with stale entries and proposes skill edits from an incomplete picture. Both look like normal outcomes. + +A fetch failure is a blocked run, not a no-op: post the "run blocked" message (see step 6) naming the branch that could not be fetched, and end the run without analyzing or opening a PR. ### 1. Parse the run log @@ -114,7 +107,7 @@ Note: this requires checking GitHub PR history. Use `gh pr list --repo warpdotde For each confirmed pattern, draft the smallest edit that addresses it: - **No-change too frequent**: Lower the "at least 2 high-confidence link additions" threshold to 1, or add new topic areas to the pilot scope under `## Scope`. -- **Peec unavailable**: Update the snapshot path references or add a fallback instruction in `## Source data`. +- **Peec unavailable**: This is usually a credential or config problem rather than a skill problem. Confirm the `PEEC_PAT` secret is valid and that the schedule still passes the `peec-ai` MCP server, and flag it for a human instead of editing the skill. Only change `## Source data` if the call contract itself has drifted. - **Links proposed not added**: Loosen the specific gate in `## Self-review before opening a PR` that is rejecting otherwise valid candidates (identify which gate by reading the no-change reports in run output). - **Recurring theme**: Move the theme from `## Future expansion boundaries` to `## Scope` with a clear instruction. - **PR acceptance problems**: Strengthen the specific heuristic that led to incorrect link proposals. @@ -131,42 +124,54 @@ Before opening a PR, verify: - Verify the YAML frontmatter of any changed `.md` file is parseable: `python3 -c "import sys; content = open(sys.argv[1]).read(); parts = content.split('---', 2); assert len(parts) >= 3" .agents/skills/aeo_crosslink_audit/SKILL.md` - Note: `style_lint.py --changed` only scans `src/content/docs/` and does not cover `.agents/skills/`; do not rely on it to validate skill file edits -### 5. Open a draft PR +### 5. Create or update the standing improvement PR -Open a draft PR with title: +This agent maintains **one** long-lived improvement PR, never one per run — see "One standing PR per automation" in `.agents/references/skill-authoring-guidelines.md`. + +Stable branch: `docs/improve-aeo-crosslink-skill` +Stable title (no date — the date goes in the body): ```text -docs(skills): improve aeo_crosslink_audit skill from run log analysis YYYY-MM-DD +docs(skills): improve aeo_crosslink_audit skill from run log analysis ``` -PR body must include: +Look for an existing open PR first: +```bash +gh pr list --repo warpdotdev/docs --state open \ + --search 'improve aeo_crosslink_audit skill from run log analysis in:title' \ + --json number,headRefName +``` +If one exists, check out its branch, rebase on the latest `origin/main`, apply this run's edits, push, and append dated bullets under the existing headings. If none exists, create the branch from the latest `origin/main` and open a draft PR. + +PR body carries these headings, each appearing exactly once (`check_pr_body.py` rejects duplicates, so do not add a per-run copy): - **Entries analyzed**: N run log entries, date range - **Patterns identified**: each pattern, evidence (entry count and dates), and proposed fix - **Patterns reviewed but not acted on**: patterns observed but below threshold or already addressed - **Open questions for human review**: anything that requires editorial judgment before the change is applied -### 6. Post Slack notification +Prefix each appended bullet with its run date so the reviewer can tell runs apart. + +### 6. Notify only if there is something to act on -Post to `#growth-docs`: +Post to `#growth-docs` **only** when the standing PR was created or received new commits, or when the run was blocked by a failure. Follow the actionable-only rule in `.agents/references/skill-authoring-guidelines.md`. A run that finds no actionable patterns — or that skips via the step 0 guard, or exits because fewer than 8 entries exist — posts nothing and is recorded in the run output only. -**PR opened:** +**PR opened or updated:** ``` ✅ AEO crosslink audit skill improvement · YYYY-MM-DD -PR: [PR URL] +PR [created | updated]: [PR URL] Patterns addressed: N Evidence base: N run log entries (last N weeks) Oz run: [run URL] ``` -**No action (too few patterns or too few entries):** +**Run blocked by a failure:** ``` -ℹ️ AEO crosslink audit skill review · YYYY-MM-DD — No changes -Entries analyzed: N -No actionable patterns found: [brief reason] +⚠️ AEO crosslink audit skill review · YYYY-MM-DD — run blocked +What failed: [brief reason — e.g., "could not fetch the log branch"] Oz run: [run URL] ``` In both messages, build the `Oz run` link at runtime — never hard-code the Oz host (for example `app.warp.dev` or `oz.warp.dev`). This agent may run on staging or production, and a hard-coded host resolves to the wrong environment (or a generic Runs page). Resolve the environment-correct link from your current run, substituting the run ID this agent is executing as: ```bash -oz-dev run get "<your run ID>" --output-format json | jq -r '.session_link' +oz run get "<your run ID>" --output-format json | jq -r '.session_link' ``` If the command fails or returns an empty value, omit the `Oz run` line rather than posting a hard-coded or broken URL. @@ -176,9 +181,9 @@ This skill is designed for a monthly Oz scheduled agent. Start it on month 3 aft To deploy: 1. Push this skill to `main` in the docs repo. -2. Verify the Oz environment has `SLACK_BOT_TOKEN` and `GROWTH_DOCS_SLACK_CHANNEL_ID` set. +2. Verify the Oz environment has `BUZZ_SLACK_TOKEN` and `GROWTH_DOCS_SLACK_CHANNEL_ID` set. 3. In the Oz web app, create a new scheduled agent: - **Skill**: `improve-aeo-crosslink-skill` from `warpdotdev/docs` - - **Schedule**: `0 17 1-7 * 1` (UTC) = first Monday of each month at 9am PT + - **Schedule**: `0 17 * * 1` (UTC) = every Monday at 9am PT. The step 0 first-week guard narrows this to the first Monday only. See the caution in `## Schedule` for why the day-of-month field must stay `*`. - **Environment**: the same environment used for `aeo_crosslink_audit` (has `warpdotdev/docs` and buzz workspace checked out) - **Branch**: `main` diff --git a/.agents/skills/improve-drafting-skills/SKILL.md b/.agents/skills/improve-drafting-skills/SKILL.md index 8c56df7e8..0d26a824a 100644 --- a/.agents/skills/improve-drafting-skills/SKILL.md +++ b/.agents/skills/improve-drafting-skills/SKILL.md @@ -11,7 +11,35 @@ This skill is part of the self-improvement loop architecture. See the architectu ## Schedule -Monthly, first Monday of each month, 9am PT (`0 17 1-7 * 1` in UTC). +Monthly, on the 1st of each month. + +Cron: `0 15 1 * *` (UTC) — 15:00 UTC is 8am PT during daylight saving, 7am PT otherwise. + +Restricting only day-of-month is unambiguous: because the day-of-week field is `*`, this fires exactly once a month and nothing else. The tradeoff is that the 1st can land on a weekend, so a PR opened then may wait until Monday for a reviewer. + +:::caution +Do **not** "simplify" this to `0 15 1-7 * 1` or any other expression that restricts **both** day-of-month and day-of-week. Cron **ORs** those two fields rather than ANDing them, so `1-7 * 1` fires on every day of the 1st through 7th **and additionally** on every Monday — roughly 11 times a month. That exact mistake caused this agent to open four conflicting PRs in six days. Standard cron cannot express "first Monday" in a single expression: either restrict day-of-month alone (as here) or restrict day-of-week alone and gate the day-of-month in the skill, as step 0 does. +::: + +## Step 0: First-week guard + +Run this before anything else. It exits immediately — without collecting signals, editing files, opening a PR, or posting to Slack — on any run outside the first week of the month. + +Under the current `0 15 1 * *` schedule the guard never actually trips, since the day is always the 1st. Keep it anyway: it is the safety net that makes a cron mistake harmless. If someone later switches the schedule to a day-of-week expression such as `0 15 * * 1` (every Monday, to guarantee a weekday), this guard is what narrows it back to the first Monday. It also contains the blast radius if the ORing mistake above is ever reintroduced. + +```bash +DAY_OF_MONTH=$(date -u +%d) +if [ "$DAY_OF_MONTH" -gt 7 ]; then + echo "Skipping: today is day $DAY_OF_MONTH, outside the first week of the month. This agent runs monthly." + exit 0 +fi +``` + +The `[ ... -gt ... ]` test builtin compares as decimal, so the zero-padded output of `date -u +%d` (for example `08`) is handled correctly as written. + +Do not rewrite this comparison using arithmetic expansion. `$((08))` fails with `value too great for base` because bash reads a leading zero as an octal prefix, which would make the guard error out on the 8th and 9th of the month — the very days it exists to catch. If arithmetic expansion is ever genuinely needed here, force base 10 with `$((10#$DAY_OF_MONTH))`. + +A skipped run is a no-op, not a failure. Write the skip line to the run output and post nothing. ## Prerequisites @@ -19,7 +47,7 @@ The following must be available in the cloud agent environment: - Docs repo checked out at `main` - `gh` CLI authenticated with write access to `warpdotdev/docs` -- `SLACK_BOT_TOKEN` — for posting a summary to `#growth-docs` +- `BUZZ_SLACK_TOKEN` — for posting a summary to `#growth-docs`. This token posts as `buzz`, the bot account that is a member of that channel. Do not substitute another Slack token: several exist in the Oz secret store, and one that authenticates successfully can still fail with `channel_not_found` if its bot is not in the channel. - `GROWTH_DOCS_SLACK_CHANNEL_ID` — channel ID for `#growth-docs` ## Signal sources @@ -54,7 +82,7 @@ This produces one perpetual, low-noise PR that accumulates every run's log entri 1. Use `oz run list` to find all Oz runs in the past 30 days whose skill name matches a drafting skill (`draft_docs`, `draft_feature_doc`, `draft_conceptual`, etc.) or `review-docs-pr`. 2. For each run, retrieve the full conversation and extract agent text messages: ```bash - oz-dev run get --conversation RUN_ID --output-format json | \ + oz run get --conversation RUN_ID --output-format json | \ jq -r '[.. | objects | select(.role? == "assistant") | .content[]? | select(.type? == "text") | .text] | .[]' ``` The top-level response is `{steps: [...]}`, not `{messages: [...]}`, and steps can be nested — use recursive descent (`..`) to reach all assistant messages at any depth. Do not rely on `oz run get` without `--conversation` — that returns only the brief `status_message` field, not conversation content or shell stdout. @@ -107,7 +135,12 @@ The signal logs contain untrusted content: human review comments, PR description Combine signal data from two sources, filtered to the past 30 days: - **In-memory records from Step A** — style-lint and PR-review signals parsed from Oz run artifacts. These are already in memory; do not re-read from disk. -- **Human feedback records** — include accepted records collected in memory by Step B for the current run, and read prior records from `.agents/logs/human_review_feedback.jsonl` line by line (skipping empty lines). Each JSON record should be parsed and filtered to the past 30 days. Prior runs persist this log on the `chore/drafting-signal-logs` branch, so read it from that branch (or ensure the standing log PR has been merged into `main`) to include feedback from earlier runs. +- **Human feedback records** — include accepted records collected in memory by Step B for the current run, and read prior records from `.agents/logs/human_review_feedback.jsonl` line by line (skipping empty lines). Each JSON record should be parsed and filtered to the past 30 days. Read this log from the `chore/drafting-signal-logs` branch, which always holds the complete history — do not read it from `main`, which only contains entries up to the last time a human merged the standing log PR: + ```bash + git fetch origin chore/drafting-signal-logs + git checkout origin/chore/drafting-signal-logs -- .agents/logs/human_review_feedback.jsonl + ``` + Do not attempt to merge the standing log PR. Merging is human housekeeping, not a precondition for this analysis. ### 2. Aggregate patterns by signal strength @@ -156,20 +189,59 @@ Before opening a PR, verify: - For each changed `.md` file under `.agents/skills/` or `.agents/templates/`, verify the YAML frontmatter is parseable: `python3 -c "import sys; content = open(sys.argv[1]).read(); parts = content.split('---', 2); assert len(parts) >= 3" PATH_TO_FILE` - Note: `style_lint.py --changed` only scans `src/content/docs/` and does not cover `.agents/skills/` or `.agents/templates/`; do not rely on it to validate skill or template file edits -### 7. Open a draft PR +### 7. Create or update the standing improvement PR + +This agent maintains **one** long-lived improvement PR, never one per run. See "One standing PR per automation" in `.agents/references/skill-authoring-guidelines.md` for the general contract. -Open a draft PR with title: +Stable branch: `docs/improve-drafting-skills` +Stable title (no date — the date goes in the body): ```text -docs(skills): improve drafting skills from signal log patterns YYYY-MM-DD +docs(skills): improve drafting skills from signal log patterns ``` -PR body must include: -- **Patterns addressed** — list each pattern, its signal source (which log, which check/tag), and the occurrence count -- **Improvement targets** — which files were edited and why -- **Patterns reviewed but not acted on** — any patterns that met the threshold but were already covered or had insufficient signal -- **Open questions for human review** — any judgment calls about whether a proposed rule change is correct +**First, look for an existing open PR:** +```bash +gh pr list --repo warpdotdev/docs --state open \ + --search 'improve drafting skills from signal log patterns in:title' \ + --json number,headRefName +``` + +**If one exists**, add this run's work to it: +1. Check out `docs/improve-drafting-skills` and rebase on the latest `origin/main`. +2. Apply this run's edits and commit. +3. Push. +4. Append this run's dated bullets under the PR body's existing headings (see "PR body" below). Fetch the current body first and make a minimal additive edit — do not regenerate it, and do not add new copies of the headings. + +**If none exists**, create `docs/improve-drafting-skills` from the latest `origin/main` and open a draft PR. + +Never leave two open improvement PRs. If you find more than one, consolidate onto the stable branch and close the extras with a comment pointing at the survivor. + +#### PR body -Write the body to a file and verify it before opening the PR — this catches repetition-loop corruption that has reached PR descriptions before (see the `create_pr` skill for details): +The body carries a **fixed set of headings that appear exactly once**, no matter how many runs have contributed. Each run appends dated bullets under the existing headings rather than adding its own run section. + +This structure is required, not stylistic. `check_pr_body.py` flags any duplicate heading and asserts each required heading appears exactly once, so a body with per-run copies of `## Patterns addressed` fails the check and blocks the update. + +```markdown +## Run history +- YYYY-MM-DD — N patterns addressed, M files touched + +## Patterns addressed +- `YYYY-MM-DD` **pattern_category** — signal source (which log, which check/tag), occurrence count, and the edit made + +## Improvement targets +- `YYYY-MM-DD` `path/to/file.md` — what changed and which pattern it addresses + +## Patterns reviewed but not acted on +- `YYYY-MM-DD` **pattern_category** — why not acted on (already covered, below threshold) + +## Open questions for human review +- `YYYY-MM-DD` — judgment call needing a reviewer's opinion +``` + +Before appending, re-read the existing body and check whether the pattern you are about to add is already listed. Consecutive runs draw from an overlapping 30-day signal window, so the same pattern will often resurface. Do not add a duplicate bullet — append the new date to the existing bullet instead, so the reviewer can see the pattern recurred without the list growing. + +Write the body to a file and verify it before creating or editing the PR — this catches repetition-loop corruption that has reached PR descriptions before (see the `create_pr` skill for details): ```bash python3 .agents/skills/create_pr/check_pr_body.py /tmp/pr-body.md \ --require-heading "## Patterns addressed" \ @@ -177,23 +249,33 @@ python3 .agents/skills/create_pr/check_pr_body.py /tmp/pr-body.md \ --require-heading "## Patterns reviewed but not acted on" \ --require-heading "## Open questions for human review" ``` -Run `gh pr create --draft --body-file /tmp/pr-body.md` only if the check passes. If you later edit this PR's body (for example, to record a human-review follow-up), fetch the current body first and apply a minimal, additive edit rather than regenerating it, then re-run the check — see the `create_pr` skill's "Update an existing PR" section. +Run `gh pr create --draft --body-file /tmp/pr-body.md` (or `gh pr edit`) only if the check passes. See the `create_pr` skill's "Update an existing PR" section for the update workflow. + +### 8. Notify only if there is something to act on + +Post to `#growth-docs` **only** when the standing PR was created or received new commits this run. Follow the actionable-only rule in `.agents/references/skill-authoring-guidelines.md`. -Post a Slack summary to `#growth-docs`: ``` ✅ Drafting skills improvement · YYYY-MM-DD -PR: [PR URL] -Patterns addressed: N (human feedback: N, agent review: N, style lint: N) +PR: [PR URL] ([created | updated]) +Patterns addressed this run: N (human feedback: N, agent review: N, style lint: N) Top patterns: [pattern 1], [pattern 2], [pattern 3] Oz run: [run URL] ``` + Build the `Oz run` link at runtime — never hard-code the Oz host (for example `app.warp.dev` or `oz.warp.dev`). This agent may run on staging or production, and a hard-coded host resolves to the wrong environment (or a generic Runs page). Resolve the environment-correct link from your current run, substituting the run ID this agent is executing as: ```bash -oz-dev run get "<your run ID>" --output-format json | jq -r '.session_link' +oz run get "<your run ID>" --output-format json | jq -r '.session_link' ``` If the command fails or returns an empty value, omit the `Oz run` line rather than posting a hard-coded or broken URL. -If fewer than 2 actionable patterns are found, do not open a PR. Write a no-change report to the run output instead: +**Do not post** when: +- The first-week guard skipped the run (step 0). +- Fewer than 2 actionable patterns were found and no PR was created or updated. + +**Do post** when the run fails in a way that prevents it from completing — for example the signal collection step errors out, or the log branch cannot be fetched. A blocked run is actionable; a quiet run is not. + +If fewer than 2 actionable patterns are found, do not open or update a PR. Write a no-change report to the run output and stop: ```text ## Drafting skills improvement — no-change report @@ -205,11 +287,16 @@ If fewer than 2 actionable patterns are found, do not open a PR. Write a no-chan **Suggested adjustment**: [one specific suggestion for the next run, e.g., lower a threshold or check a different log] ``` -Post the no-change report link to Slack. - ## Run log -This skill does not have its own run log. Its durable outputs are the improvement PR (or no-change report), the Slack message, and the standing `chore: drafting signal logs` PR that accumulates the signal logs it collects. +This skill does not keep a separate run-log file. Its durable records are: + +- **Runs that reach the collector** — the standing `chore: drafting signal logs` PR accumulates a signal-log entry, including on no-change runs. +- **Runs that exit at the step 0 guard** — these stop before the collector, so they write **no** signal-log entry. Their record is the skip line in the run output, which must state the day of the month and that the agent runs monthly. + +Both satisfy the "durable record of its outcome" requirement in `.agents/references/skill-authoring-guidelines.md`, which is what makes the actionable-only Slack policy safe here: a silent run is still inspectable, so silence means "ran, nothing to do" rather than "possibly broken." Do not remove the skip line from the guard — without it, a guard-skipped run would be silent with no record at all, and the skill would have to post instead. + +Its other durable outputs are the standing improvement PR and, when warranted, the Slack message. ## Deployment @@ -217,9 +304,9 @@ This skill is designed for a monthly Oz scheduled agent. To deploy: 1. Push this skill to `main` in the docs repo. -2. Verify the Oz environment has `SLACK_BOT_TOKEN` and `GROWTH_DOCS_SLACK_CHANNEL_ID` set. +2. Verify the Oz environment has `BUZZ_SLACK_TOKEN` and `GROWTH_DOCS_SLACK_CHANNEL_ID` set. 3. In the Oz web app, create a new scheduled agent: - **Skill**: `improve-drafting-skills` from `warpdotdev/docs` - - **Schedule**: `0 17 1-7 * 1` (UTC) = first Monday of each month at 9am PT + - **Schedule**: `0 15 1 * *` (UTC) = the 1st of each month. The step 0 first-week guard is retained as a safety net. See the caution in `## Schedule` before changing this — never restrict day-of-month and day-of-week in the same expression. - **Environment**: the same environment used for `weekly-404-monitor` (already has `warpdotdev/docs` checked out) - **Branch**: `main` diff --git a/.agents/skills/missing_docs/references/feature_surface_map.md b/.agents/skills/missing_docs/references/feature_surface_map.md index 945b90d25..f30480279 100644 --- a/.agents/skills/missing_docs/references/feature_surface_map.md +++ b/.agents/skills/missing_docs/references/feature_surface_map.md @@ -25,29 +25,33 @@ auto-surfaces for docs once the flag goes GA. ## Feature flags -> doc pages -AgentMode -> src/content/docs/agent-platform/local-agents/overview.mdx +# The local-agents overview page was folded into the agents landing page +# (/agents/local-agents/overview now 308s to /agents/ in vercel.json). +AgentMode -> src/content/docs/agents/index.mdx AgentManagementView -> src/content/docs/platform/managing-cloud-agents.md AgentManagementDetailsView -> src/content/docs/platform/managing-cloud-agents.md -AgentModeComputerUse -> src/content/docs/agent-platform/capabilities/computer-use.mdx +AgentModeComputerUse -> src/content/docs/agents/capabilities/computer-use/index.mdx AgentModeWorkflows -> src/content/docs/knowledge-and-collaboration/warp-drive/workflows.md -AgentOnboarding -> src/content/docs/agent-platform/getting-started/agents-in-warp.md -AIRules -> src/content/docs/agent-platform/capabilities/rules.mdx -AIResumeButton -> src/content/docs/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes.mdx -InlineCodeReview -> src/content/docs/agent-platform/local-agents/interactive-code-review.mdx +# agents-in-warp was folded into the agents landing page as well +# (/agents/getting-started/agents-in-warp now 308s to /agents/). +AgentOnboarding -> src/content/docs/agents/index.mdx +AIRules -> src/content/docs/agents/capabilities/rules.mdx +AIResumeButton -> src/content/docs/agents/local-agents/interacting-with-agents/terminal-and-agent-modes.mdx +InlineCodeReview -> src/content/docs/agents/local-agents/interactive-code-review.mdx FileTree -> src/content/docs/code/code-editor/file-tree.md CodeFindReplace -> src/content/docs/code/code-editor/find-and-replace.md VimCodeEditor -> src/content/docs/code/code-editor/code-editor-vim-keybindings.md -McpServer -> src/content/docs/agent-platform/capabilities/mcp.mdx -McpOauth -> src/content/docs/agent-platform/capabilities/mcp.mdx -ImageAsContext -> src/content/docs/agent-platform/local-agents/agent-context/images-as-context.mdx -SelectionAsContext -> src/content/docs/agent-platform/local-agents/agent-context/selection-as-context.mdx -DiffSetAsContext -> src/content/docs/agent-platform/local-agents/agent-context/selection-as-context.mdx -WebSearchUI -> src/content/docs/agent-platform/capabilities/web-search.mdx -WebFetchUI -> src/content/docs/agent-platform/capabilities/web-search.mdx -CrossRepoContext -> src/content/docs/agent-platform/capabilities/codebase-context.mdx -FullSourceCodeEmbedding -> src/content/docs/agent-platform/capabilities/codebase-context.mdx -SearchCodebaseUI -> src/content/docs/agent-platform/capabilities/codebase-context.mdx -RemoteCodebaseIndexing -> src/content/docs/agent-platform/capabilities/codebase-context.mdx +McpServer -> src/content/docs/agents/capabilities/mcp.mdx +McpOauth -> src/content/docs/agents/capabilities/mcp.mdx +ImageAsContext -> src/content/docs/agents/local-agents/agent-context/images-as-context.mdx +SelectionAsContext -> src/content/docs/agents/local-agents/agent-context/selection-as-context.mdx +DiffSetAsContext -> src/content/docs/agents/local-agents/agent-context/selection-as-context.mdx +WebSearchUI -> src/content/docs/agents/capabilities/web-search.mdx +WebFetchUI -> src/content/docs/agents/capabilities/web-search.mdx +CrossRepoContext -> src/content/docs/agents/capabilities/codebase-context.mdx +FullSourceCodeEmbedding -> src/content/docs/agents/capabilities/codebase-context.mdx +SearchCodebaseUI -> src/content/docs/agents/capabilities/codebase-context.mdx +RemoteCodebaseIndexing -> src/content/docs/agents/capabilities/codebase-context.mdx CloudEnvironments -> src/content/docs/platform/environments.md CloudMode -> src/content/docs/platform/index.mdx AmbientAgentsCommandLine -> src/content/docs/platform/index.mdx @@ -58,76 +62,79 @@ 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 -APIKeyAuthentication -> src/content/docs/reference/cli/api-keys.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 +# entry is needed. APIKeyManagement -> src/content/docs/reference/cli/api-keys.md CreatingSharedSessions -> src/content/docs/knowledge-and-collaboration/session-sharing/index.mdx -AgentSharedSessions -> src/content/docs/agent-platform/local-agents/session-sharing.mdx -ProfilesDesignRevamp -> src/content/docs/agent-platform/capabilities/agent-profiles-permissions.mdx -MultiProfile -> src/content/docs/agent-platform/capabilities/agent-profiles-permissions.mdx -InlineProfileSelector -> src/content/docs/agent-platform/capabilities/agent-profiles-permissions.mdx -ListSkills -> src/content/docs/agent-platform/capabilities/skills.mdx -BundledSkills -> src/content/docs/agent-platform/capabilities/skills.mdx -SyncAmbientPlans -> src/content/docs/agent-platform/capabilities/planning.mdx -SuggestedRules -> src/content/docs/agent-platform/capabilities/rules.mdx +AgentSharedSessions -> src/content/docs/agents/local-agents/session-sharing.mdx +ProfilesDesignRevamp -> src/content/docs/agents/capabilities/agent-profiles-permissions.mdx +MultiProfile -> src/content/docs/agents/capabilities/agent-profiles-permissions.mdx +InlineProfileSelector -> src/content/docs/agents/capabilities/agent-profiles-permissions.mdx +ListSkills -> src/content/docs/agents/capabilities/skills.mdx +BundledSkills -> src/content/docs/agents/capabilities/skills.mdx +SyncAmbientPlans -> src/content/docs/agents/capabilities/planning.mdx +SuggestedRules -> src/content/docs/agents/capabilities/rules.mdx RectSelection -> src/content/docs/terminal/more-features/text-selection.md -ContextWindowUsageV2 -> src/content/docs/agent-platform/local-agents/interacting-with-agents/index.mdx +ContextWindowUsageV2 -> src/content/docs/agents/local-agents/interacting-with-agents/index.mdx CommandCorrectionKey -> src/content/docs/terminal/entry/command-corrections.md ClassicCompletions -> src/content/docs/terminal/command-completions/completions.md DynamicWorkflowEnums -> src/content/docs/knowledge-and-collaboration/warp-drive/workflows.md SharedWithMe -> src/content/docs/knowledge-and-collaboration/warp-drive/index.mdx WarpPacks -> src/content/docs/knowledge-and-collaboration/warp-drive/index.mdx TabbedEditorView -> src/content/docs/code/code-editor/index.mdx -ReadImageFiles -> src/content/docs/agent-platform/local-agents/agent-context/images-as-context.mdx -FileRetrievalTools -> src/content/docs/agent-platform/capabilities/codebase-context.mdx -ConversationArtifacts -> src/content/docs/agent-platform/local-agents/interacting-with-agents/index.mdx +ReadImageFiles -> src/content/docs/agents/local-agents/agent-context/images-as-context.mdx +FileRetrievalTools -> src/content/docs/agents/capabilities/codebase-context.mdx +ConversationArtifacts -> src/content/docs/agents/local-agents/interacting-with-agents/index.mdx OzChangelogUpdates -> src/content/docs/changelog/index.mdx -ActiveConversationRequiresInteraction -> src/content/docs/agent-platform/local-agents/interacting-with-agents/index.mdx +ActiveConversationRequiresInteraction -> src/content/docs/agents/local-agents/interacting-with-agents/index.mdx # Recently shipped GA features VerticalTabs -> src/content/docs/terminal/windows/vertical-tabs.mdx VerticalTabsSummaryMode -> src/content/docs/terminal/windows/vertical-tabs.mdx TabConfigs -> src/content/docs/terminal/windows/tab-configs.mdx PluggableNotifications -> src/content/docs/terminal/more-features/notifications.md -RevertToCheckpoints -> src/content/docs/agent-platform/capabilities/slash-commands.mdx -RewindSlashCommand -> src/content/docs/agent-platform/capabilities/slash-commands.mdx -ForkFromCommand -> src/content/docs/agent-platform/capabilities/slash-commands.mdx -SummarizationConversationCommand -> src/content/docs/agent-platform/capabilities/slash-commands.mdx -CreateEnvironmentSlashCommand -> src/content/docs/agent-platform/capabilities/slash-commands.mdx +RevertToCheckpoints -> src/content/docs/agents/capabilities/slash-commands.mdx +RewindSlashCommand -> src/content/docs/agents/capabilities/slash-commands.mdx +ForkFromCommand -> src/content/docs/agents/capabilities/slash-commands.mdx +SummarizationConversationCommand -> src/content/docs/agents/capabilities/slash-commands.mdx +CreateEnvironmentSlashCommand -> src/content/docs/agents/capabilities/slash-commands.mdx CodeReviewFind -> src/content/docs/code/code-review.md CodeReviewSaveChanges -> src/content/docs/code/code-review.md DiscardPerFileAndAllChanges -> src/content/docs/code/code-review.md AutoOpenCodeReviewPane -> src/content/docs/code/code-review.md GitOperationsInCodeReview -> src/content/docs/code/code-review.md RemoteCodeReview -> src/content/docs/code/code-review.md -AgentView -> src/content/docs/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes.mdx -AgentViewBlockContext -> src/content/docs/agent-platform/local-agents/agent-context/blocks-as-context.mdx -CloudConversations -> src/content/docs/agent-platform/local-agents/cloud-conversations.mdx +AgentView -> src/content/docs/agents/local-agents/interacting-with-agents/terminal-and-agent-modes.mdx +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 # 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. -PRCommentsV2 -> src/content/docs/agent-platform/local-agents/interacting-with-agents/index.mdx -CLIAgentRichInput -> src/content/docs/agent-platform/cli-agents/rich-input.md -HOANotifications -> src/content/docs/agent-platform/capabilities/agent-notifications.mdx -OpenCodeNotifications -> src/content/docs/agent-platform/cli-agents/opencode.md -CodexNotifications -> src/content/docs/agent-platform/cli-agents/codex.md +PRCommentsV2 -> src/content/docs/agents/local-agents/interacting-with-agents/index.mdx +CLIAgentRichInput -> src/content/docs/agents/cli-agents/rich-input.mdx +HOANotifications -> src/content/docs/agents/capabilities/agent-notifications.mdx +OpenCodeNotifications -> src/content/docs/agents/cli-agents/opencode.mdx +CodexNotifications -> src/content/docs/agents/cli-agents/codex.mdx # Codex Warp plugin marketplace integration; documented alongside Codex notifications. -CodexPlugin -> src/content/docs/agent-platform/cli-agents/codex.md -HOARemoteControl -> src/content/docs/agent-platform/cli-agents/remote-control.md +CodexPlugin -> src/content/docs/agents/cli-agents/codex.mdx +HOARemoteControl -> src/content/docs/agents/cli-agents/remote-control.mdx GlobalSearch -> src/content/docs/code/overview.md -FileBasedMcp -> src/content/docs/agent-platform/capabilities/mcp.mdx -ConversationsAsContext -> src/content/docs/agent-platform/local-agents/agent-context/blocks-as-context.mdx -GithubPrPromptChip -> src/content/docs/agent-platform/capabilities/agent-notifications.mdx -AskUserQuestion -> src/content/docs/agent-platform/local-agents/interacting-with-agents/index.mdx -AIContextMenuEnabled -> src/content/docs/agent-platform/local-agents/agent-context/using-to-add-context.mdx -AtMenuOutsideOfAIMode -> src/content/docs/agent-platform/local-agents/agent-context/using-to-add-context.mdx -AIContextMenuCode -> src/content/docs/agent-platform/local-agents/agent-context/using-to-add-context.mdx -DriveObjectsAsContext -> src/content/docs/agent-platform/local-agents/agent-context/using-to-add-context.mdx +FileBasedMcp -> src/content/docs/agents/capabilities/mcp.mdx +ConversationsAsContext -> src/content/docs/agents/local-agents/agent-context/blocks-as-context.mdx +GithubPrPromptChip -> src/content/docs/agents/capabilities/agent-notifications.mdx +AskUserQuestion -> src/content/docs/agents/local-agents/interacting-with-agents/index.mdx +AIContextMenuEnabled -> src/content/docs/agents/local-agents/agent-context/using-to-add-context.mdx +AtMenuOutsideOfAIMode -> src/content/docs/agents/local-agents/agent-context/using-to-add-context.mdx +AIContextMenuCode -> src/content/docs/agents/local-agents/agent-context/using-to-add-context.mdx +DriveObjectsAsContext -> src/content/docs/agents/local-agents/agent-context/using-to-add-context.mdx KittyKeyboardProtocol -> src/content/docs/terminal/more-features/full-screen-apps.mdx -InlineRepoMenu -> src/content/docs/agent-platform/capabilities/codebase-context.mdx -InlineHistoryMenu -> src/content/docs/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes.mdx -SkillArguments -> src/content/docs/agent-platform/capabilities/skills.mdx +InlineRepoMenu -> src/content/docs/agents/capabilities/codebase-context.mdx +InlineHistoryMenu -> src/content/docs/agents/local-agents/interacting-with-agents/terminal-and-agent-modes.mdx +SkillArguments -> src/content/docs/agents/capabilities/skills.mdx ConfigurableToolbar -> src/content/docs/terminal/windows/configurable-toolbar.mdx SettingsFile -> src/content/docs/terminal/settings/index.mdx Changelog -> src/content/docs/changelog/index.mdx @@ -149,9 +156,10 @@ SshRemoteServer -> src/content/docs/terminal/warpify/ssh.mdx # Computer use: session recording (VideoRecording gates the start/stop recording # tools) and window-targeted background capture (BackgroundComputerUse). Both are -# GA and documented on the computer use capability page. -VideoRecording -> src/content/docs/agent-platform/capabilities/computer-use.mdx -BackgroundComputerUse -> src/content/docs/agent-platform/capabilities/computer-use.mdx +# GA and documented on the computer use capability pages (the page was split from +# a flat computer-use.mdx into a computer-use/ directory). +VideoRecording -> src/content/docs/agents/capabilities/computer-use/testing-and-recordings.mdx +BackgroundComputerUse -> src/content/docs/agents/capabilities/computer-use/index.mdx # Feature flags whose only user-facing surface is a documented setting in the # all-settings reference (terminal/settings/all-settings.mdx). @@ -173,11 +181,11 @@ OzIdentityFederation -> src/content/docs/reference/cli/federate.mdx AgentHarness -> src/content/docs/platform/harnesses/index.mdx # Image context for cloud agents -AmbientAgentsImageUpload -> src/content/docs/agent-platform/local-agents/agent-context/images-as-context.mdx -CloudModeImageContext -> src/content/docs/agent-platform/local-agents/agent-context/images-as-context.mdx +AmbientAgentsImageUpload -> src/content/docs/agents/local-agents/agent-context/images-as-context.mdx +CloudModeImageContext -> src/content/docs/agents/local-agents/agent-context/images-as-context.mdx # Skills on the Oz platform -OzPlatformSkills -> src/content/docs/agent-platform/capabilities/skills.mdx +OzPlatformSkills -> src/content/docs/agents/capabilities/skills.mdx # Handoff (local <-> cloud, cloud <-> cloud) and snapshots OzHandoff -> src/content/docs/platform/handoff/index.mdx @@ -189,20 +197,20 @@ HandoffCloudCloud -> src/content/docs/platform/handoff/cloud-to-cloud.mdx # after the feature stabilized (GA), so it no longer needs a map entry. # Prompt queueing -QueueSlashCommand -> src/content/docs/agent-platform/local-agents/interacting-with-agents/prompt-queueing.mdx -QueuedPromptsV2 -> src/content/docs/agent-platform/local-agents/interacting-with-agents/prompt-queueing.mdx +QueueSlashCommand -> src/content/docs/agents/local-agents/interacting-with-agents/prompt-queueing.mdx +QueuedPromptsV2 -> src/content/docs/agents/local-agents/interacting-with-agents/prompt-queueing.mdx # Reusable agents (named agents + agent-scoped API keys) NamedAgents -> src/content/docs/platform/agents.mdx # Inference: BYOK and custom endpoints -SoloUserByok -> src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx +SoloUserByok -> src/content/docs/agents/inference/bring-your-own-api-key.mdx # CustomInferenceEndpoints flag was removed after the feature stabilized (GA); # the feature remains documented at inference/custom-inference-endpoint.mdx. # Connect a SuperGrok subscription instead of pasting an xAI API key. -SuperGrok -> src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx +SuperGrok -> src/content/docs/agents/inference/bring-your-own-api-key.mdx # Custom model routers (Settings > AI > Custom Routers) surface in the model picker. -CustomModelRouters -> src/content/docs/agent-platform/inference/model-choice.mdx +CustomModelRouters -> src/content/docs/agents/inference/model-choice.mdx # Billing & Usage settings page (redesigned) BillingAndUsagePageV2 -> src/content/docs/support-and-community/plans-and-billing/index.mdx @@ -214,6 +222,31 @@ BillingAndUsagePageV2 -> src/content/docs/support-and-community/plans-and-billin CloudRunners -> src/content/docs/platform/runners.mdx CloudAgentRunners -> src/content/docs/platform/runners.mdx +# Per-segment context window usage breakdown (system prompt, tool definitions, +# conversation history, latest input, images, other) in the conversation usage +# summary. Promoted dogfood -> GA; documented alongside the context window usage +# indicator it drills into (paired with ContextWindowUsageV2 above). +ContextWindowUsageBreakdown -> src/content/docs/agents/local-agents/interacting-with-agents/index.mdx + +# BYOLLM routing through Gemini Enterprise Agent Platform (Vertex AI). Promoted +# dogfood -> GA; documented on the enterprise BYOLLM page for that host. +GeminiEnterprise -> src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx + +# OSC 8 terminal hyperlinks (clickable link text emitted by CLI tools). Promoted +# preview -> GA; documented with the rest of Warp's link handling. +OscHyperlinks -> src/content/docs/terminal/more-features/files-and-links.mdx + +# Well-known managed MCP ids: accepts short integration ids (linear, slack, +# 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 + +# Auto-attaches the Warp-hosted Factory MCP server to agent sessions with no +# manual setup. Promoted dogfood -> GA; that zero-config behavior is documented +# in the "Connect and authenticate" section of the Factory MCP page. +FactoryMcp -> src/content/docs/factories/factory-mcp.mdx + ## CLI commands -> doc pages # Top-level Oz CLI commands @@ -305,6 +338,32 @@ POST /oauth/token -> internal GET /oauth/jwks.json -> internal GET /.well-known/openid-configuration -> internal +# RFC 8414 / RFC 9728 OAuth discovery documents that MCP clients fetch +# automatically before authenticating against the hosted Factory MCP endpoint +# (router/handlers/public_api/oauth2.go, registered by registerMCPDiscoveryRoutes +# only when the dogfood-only factory_mcp flag is on). They are machine-facing +# protocol metadata for an unreleased product, absent from warp-server's +# canonical public spec, so they are not a documentable public API surface. The +# path-suffixed variants implement RFC 8414 section 5 path-aware discovery for +# the /api/v1/mcp/factory resource. +GET /.well-known/oauth-authorization-server -> internal +GET /.well-known/oauth-authorization-server/api/v1/mcp/factory -> internal +GET /.well-known/openid-configuration/api/v1/mcp/factory -> internal +GET /.well-known/oauth-protected-resource/api/v1/mcp/factory -> internal + +# OAuth consent screen, connected-apps (grant) management, token revocation, and +# RFC 7591 dynamic client registration backing the MCP harness OAuth flows +# (router/handlers/public_api/oauth2.go; registration is additionally +# flag-gated). Like the device-flow endpoints above, these are protocol and web +# plumbing rather than a released public REST surface, and they are absent from +# warp-server's canonical public spec. +GET /oauth/consent/info -> internal +POST /oauth/consent -> internal +GET /oauth/grants -> internal +DELETE /oauth/grants/{client_id} -> internal +POST /oauth/register -> internal +POST /oauth/revoke -> internal + # Anonymous-viewer redirect probes (documented exceptions to auth, not API surfaces). GET /agent/sessions/{session_uuid}/redirect -> internal GET /agent/conversations/{conversation_id}/redirect -> internal @@ -334,6 +393,154 @@ POST /harness-support/notify-user -> internal POST /harness-support/finish-task -> internal POST /harness-support/report-shutdown -> internal POST /harness-support/upload-snapshot -> internal +POST /harness-support/commit-snapshot -> internal + +# Oz Factory REST API (router/handlers/public_api/factory*.go). Warp Factories +# is now documented publicly (src/content/docs/factories/) as an Early Access +# product, but its REST API is a different question: these routes are defined in +# warp-server's canonical spec but marked `x-internal: true`, so the publish +# filter strips them from the public docs copy and they are not part of the +# released public Oz Agent API. They must not be hand-documented and stay +# internal; revisit and route through the sync-openapi-spec skill if/when those +# `x-internal` markers come off. See SKILL.md "Public vs. private surfaces". +GET /factory -> internal +GET /factory/access -> internal +GET /factory-alias/{alias} -> internal +POST /factory -> internal +POST /factory/avatar -> internal +GET /factory/{uid} -> internal +PATCH /factory/{uid} -> internal +DELETE /factory/{uid} -> internal +POST /factory/{uid}/apply -> internal +POST /factory/{uid}/plan -> internal +GET /factory/{uid}/source -> internal +PUT /factory/{uid}/source -> internal +DELETE /factory/{uid}/source -> internal +# Factory-as-code source browsing, editing, export, and merge plumbing backing +# the factory definition editor in the Oz web app. +GET /factory/{uid}/source/tree -> internal +GET /factory/{uid}/source/file -> internal +PUT /factory/{uid}/source/files -> internal +GET /factory/{uid}/source/export -> internal +POST /factory/{uid}/source/clone-url -> internal +GET /factory/{uid}/source/link-readiness -> internal +POST /factory/{uid}/merges -> internal +POST /factory/{uid}/merges/check -> internal +GET /factory/{uid}/merges/{merge_uid} -> internal +# Factory file JSON schemas and validation, consumed by the factory definition +# editor and the factory-files authoring tooling. +GET /factory-files/schemas -> internal +GET /factory-files/schemas/{schema_version} -> internal +GET /factory-files/schemas/{schema_version}/{document} -> internal +POST /factory-files/validate -> internal +# Factory review (AI review of a factory definition) and its refine loop. +GET /factory/{uid}/review -> internal +POST /factory/{uid}/review/refine -> internal +# Factory outbound webhooks: CRUD, delivery history, and secret rotation. +GET /factory/webhooks -> internal +POST /factory/webhooks -> internal +POST /factory/webhooks/dry-run -> internal +GET /factory/webhooks/{uid} -> internal +PUT /factory/webhooks/{uid} -> internal +DELETE /factory/webhooks/{uid} -> internal +GET /factory/webhooks/{uid}/deliveries -> internal +GET /factory/webhooks/{uid}/deliveries/{delivery_id} -> internal +POST /factory/webhooks/{uid}/rotate -> internal +GET /factory/{uid}/syncs -> internal +GET /factory/{uid}/task-by-conversation -> internal +GET /factory/{uid}/tasks -> internal +POST /factory/{uid}/tasks -> internal +GET /factory/{uid}/tasks/{task_uid} -> internal +PATCH /factory/{uid}/tasks/{task_uid} -> internal +DELETE /factory/{uid}/tasks/{task_uid} -> internal +POST /factory/{uid}/tasks/{task_uid}/cancel -> internal +GET /factory/{uid}/task-by-run -> internal +# Also marked `x-internal: true` in warp-server's canonical spec, so the publish +# filter strips it from the public docs copy. +GET /factory/{uid}/metrics -> internal +GET /factory/{uid}/metrics/cost-by-pr-size -> internal +GET /factory/{uid}/metrics/run-breakdown -> internal +GET /factory/{uid}/metrics/top-prs -> internal +GET /factory/{uid}/integrations/linear/teams -> internal +GET /factory/{uid}/integrations/linear/teams/{team_id}/labels -> internal +PUT /factory/{uid}/integrations/linear/teams/{team_id}/labels -> internal +GET /factory/{uid}/integrations/jira/projects -> internal +GET /factory/{uid}/integrations/jira/labels -> internal +GET /factory/{uid}/integrations/jira/statuses -> internal +GET /factory/{uid}/integration-activations -> internal +GET /factory/{uid}/integration-destinations -> internal +GET /factory/{uid}/gitlab-automation-capability -> internal +POST /factory/{uid}/gitlab-automation-capability/refresh -> internal +# Integration pickers used during factory setup, before a factory exists. +GET /factory-setup/integrations/jira/projects -> internal +GET /factory-setup/integrations/linear/teams -> internal +GET /factory/automations -> internal +POST /factory/automations -> internal +GET /factory/automations/events/{provider} -> internal +GET /factory/automations/{id} -> internal +PUT /factory/automations/{id} -> internal +DELETE /factory/automations/{id} -> internal +PUT /factory/automations/{id}/subscriptions -> internal +DELETE /factory/automations/{id}/subscriptions/{subscription_id} -> internal +GET /factory/scorers -> internal +POST /factory/scorers -> internal +PATCH /factory/scorers/{scorer_id} -> internal +DELETE /factory/scorers/{scorer_id} -> internal +GET /factory/scorers/{scorer_id}/results -> internal +GET /factory/scorers/{scorer_id}/results/reasons -> internal +GET /factory/scorers/{scorer_id}/metrics/pass-rate -> internal +# The scorer pause/resume routes and the autofix-config trio were replaced by +# the self-improvement-config routes below; their dead map entries were pruned. +GET /factory/scorers/{scorer_id}/self-improvement-config -> internal +PUT /factory/scorers/{scorer_id}/self-improvement-config -> internal +DELETE /factory/scorers/{scorer_id}/self-improvement-config -> internal +GET /factory/runs/{run_id}/scores -> internal +POST /factory/run-scoring/dispatches -> internal +PUT /factory/automations/{id}/subscriptions/{subscription_id} -> internal +GET /factory/{uid}/integrations/github/branches -> internal +GET /factory/{uid}/integrations/github/labels -> internal +GET /factory/{uid}/integrations/github/teams -> internal +GET /factory/{uid}/integrations/github/users -> internal +GET /factory/{uid}/integrations/github/workflows -> internal +GET /factory/{uid}/integrations/linear/issues -> internal +GET /factory/{uid}/integrations/linear/projects -> internal +GET /factory/{uid}/integrations/linear/users -> internal +GET /factory/{uid}/integrations/linear/workflow-states -> internal +GET /factory/{uid}/integrations/slack/conversations -> internal +GET /factory/{uid}/integrations/slack/users -> internal +# Factory benchmark suites and benchmark runs +# (router/handlers/public_api/benchmarks.go). Same unreleased Factory product as +# the routes above, and absent from warp-server's canonical public spec. +GET /factory/{uid}/benchmarks/suites -> internal +POST /factory/{uid}/benchmarks/suites -> internal +GET /factory/{uid}/benchmarks/suites/{suite_uid} -> internal +PATCH /factory/{uid}/benchmarks/suites/{suite_uid} -> internal +DELETE /factory/{uid}/benchmarks/suites/{suite_uid} -> internal +POST /factory/{uid}/benchmarks/suites/{suite_uid}/runs -> internal +POST /factory/{uid}/benchmarks/suites/{suite_uid}/tasks -> internal +POST /factory/{uid}/benchmarks/suites/{suite_uid}/tasks/compose-from-run -> internal +GET /factory/{uid}/benchmarks/runs -> internal +GET /factory/{uid}/benchmarks/runs/{run_uid} -> internal +GET /factory/{uid}/benchmarks/runs/{run_uid}/results -> internal +POST /factory/{uid}/benchmarks/runs/{run_uid}/cancel -> internal + +# Orchestration messaging and lifecycle-event endpoints. These are marked +# `x-internal: true` in warp-server's canonical spec (public_api/openapi.yaml), +# so the publish filter deliberately strips them from the public docs copy. +# They back the agent-to-agent messaging tools and the documented +# `oz run message` CLI, but the REST surface itself is not part of the released +# public Oz Agent API. Revisit if warp-server drops the x-internal marker. +POST /agent/messages -> internal +GET /agent/messages/{run_id} -> internal +POST /agent/messages/{id}/read -> internal +POST /agent/messages/{id}/delivered -> internal +GET /agent/events -> internal +POST /agent/events/{run_id} -> internal + +# SSE lifecycle-event stream consumed by the Warp client and the Oz web app. +# Absent from warp-server's canonical public spec entirely, and registered only +# on the RTC host, so it is not a released public API operation. +GET /agent/events/stream -> internal # Agent Memory REST API — research preview (gating flag AIMemories is non-GA), # deferred via `gated:` and auto-surfaces when AIMemories goes GA. See @@ -370,9 +577,29 @@ GET /memory_stores/{uid}/memories/{memoryUid}/versions -> gated:AIMemories # replaced by a single toggle, /natural-language-detection. Like the other Warp # Agent CLI-only commands above, it isn't in the GUI, so it stays internal. /natural-language-detection -> internal -# TUI-only voice input and version commands (Warp Agent CLI surface). +# TUI-only voice input command (Warp Agent CLI surface). The /version command was +# removed from code; its entry has been pruned. /voice -> internal -/version -> internal +# TUI-only team switcher (SlashCommandSurfaces::TuiOnly in static_commands/ +# commands.rs). The GUI switches teams from the title-bar pill instead, so this +# isn't documented on the public slash-commands page. +/team -> internal +# More Warp Agent CLI-only (SlashCommandSurfaces::TuiOnly in static_commands/ +# commands.rs) commands. None are present in the GUI desktop app, so they aren't +# documented on the public slash-commands page: +# - /status: show session and account status +# - /clear: clear the transcript and start a new conversation +# - /statusline: configure the Warp Agent CLI statusline (agents.statusline, internal) +# - /reset-statusline: restore the statusline to its default items and ordering +# - /api-keys: view and manage model-provider API keys. It replaced the removed +# /add-api-key and /clear-provider-api-key pair, whose entries were pruned. +# - /vim-mode: toggle Vim keybindings in the Warp Agent CLI input +/status -> internal +/clear -> internal +/statusline -> internal +/reset-statusline -> internal +/api-keys -> internal +/vim-mode -> internal # TUI-only color-theme picker (Warp Agent CLI surface, SlashCommandSurfaces::TuiOnly # in static_commands/commands.rs). It sets the Warp Agent CLI theme # (appearance.theme, mapped internal below) and isn't present in the GUI, so it @@ -395,6 +622,13 @@ warpify.ssh.ssh_tmux_deprecation_notice_pending -> internal # documented in the all-settings reference. general.autoupdate_enabled -> internal +# Warp Agent CLI-only (crates/warp_tui) statusline configuration (surface: +# SettingSurfaces::TUI in app/src/settings/ai.rs; controls the order and +# visibility of the Warp Agent CLI bottom statusline items). It isn't present in +# the GUI settings UI, so it isn't documented in the all-settings reference. +# Paired with the /statusline Warp Agent CLI slash command mapped internal above. +agents.statusline -> internal + # Warp Agent CLI-only (crates/warp_tui) color theme (surface: Warp Agent CLI, # SettingSurfaces::TUI in tui_theme.rs; "auto|light|dark" matching the host # terminal background). It isn't present in the GUI settings UI, so it isn't @@ -411,6 +645,27 @@ appearance.zero_state.object -> internal appearance.zero_state.rotation_period_seconds -> internal appearance.zero_state.extrusion_depth -> internal +# Warp Agent CLI-only (crates/warp_tui) per-section visibility toggles for the +# zero state (surface: SettingSurfaces::TUI in app/src/settings/tui_zero_state.rs). +# Each hides one section of the Warp Agent CLI empty state. They aren't present in +# the GUI settings UI, so they aren't documented in the all-settings reference. +appearance.zero_state.show_signed_in_user -> internal +appearance.zero_state.show_changelog -> internal +appearance.zero_state.show_project_info -> internal +appearance.zero_state.show_mcp -> internal +appearance.zero_state.show_animation -> internal + +# Warp Agent CLI-only toggle that stops the zero-state animation from repainting +# while the terminal is unfocused (app/src/settings/tui_zero_state.rs). Like the +# other zero-state knobs it isn't in the GUI settings UI, so it's documented on +# the Warp Agent CLI configuration page instead of the all-settings reference. +appearance.zero_state.freeze_animation_when_unfocused -> src/content/docs/agents/cli/configuration.mdx + +# Warp Agent CLI-only (crates/warp_tui) push-to-talk key for voice input (surface: +# SettingSurfaces::TUI in app/src/settings/tui_voice.rs). The GUI equivalent is the +# separate agents.voice.voice_input_toggle_key, which is documented. +agents.voice.voice_input_hold_key -> internal + ## Unlisted docs pages to ignore # Pages intentionally absent from src/sidebar.ts (one slug per line, e.g. @@ -421,10 +676,8 @@ guides/agent-workflows/warp-vs-claude-code # Custom Starlight 404 page (template: splash). Starlight renders it through its # own prerendered /404 route, so it is intentionally not in the sidebar. 404 -# Jira integration page is draft: true (private beta — the Oz Jira app is not yet -# published to the Atlassian marketplace). Kept out of the sidebar until the -# integration goes GA; the snapshot diff will flag it for docs on promotion. -platform/integrations/jira +# The Jira integration page left draft status and is now listed in src/sidebar.ts, +# so its allowlist entry was pruned. ## Flags to ignore (internal-only, not user-facing) @@ -483,6 +736,10 @@ OpenWarpLaunchModal # One-time launch modal announcing multi-agent orchestration; the feature itself # is documented via RunAgentsTool -> orchestration/multi-agent-runs.mdx. OrchestrationLaunchModal +# One-time launch modal announcing the Warp Agent CLI. Its "Get started" button +# links to the CLI quickstart, and the CLI itself is documented under +# agents/cli/, so the modal has no separate documentable surface. +AgentCliLaunchModal GetStartedTab CreateProjectFlow # Account-first onboarding is an internal login/onboarding flow variant with no @@ -530,6 +787,22 @@ GitCredentialRefresh # State-mutating recovery for abnormal terminal lifecycle sequences — an internal # reliability mechanism with no user-facing configuration or UI, so it needs no docs. TerminalLifecycleRecovery +# Orchestration plumbing promoted dogfood -> GA. Neither changes what a user sees +# or configures, so both are internal implementation details of the documented +# multi-agent orchestration feature (platform/orchestration/multi-agent-runs.mdx): +# - WaitForEventsParentRegistration: on `wait_for_events`, confirms parent status +# with the server and registers an orchestrator for the ancestor event stream so +# children created out-of-band (CLI/API) still deliver events. +# - OrchestrationUnifiedStack: consolidates child-state tracking behind a single +# tracker, one ancestor SSE per parent family, and one remote-child placeholder. +WaitForEventsParentRegistration +OrchestrationUnifiedStack +# Internal persistence-backend detail: gates storing execution profiles in a +# file-backed settings collection (agents.execution_profiles) versus the legacy +# per-profile Warp Drive cloud objects. It changes where profiles are stored, not +# any user-facing behavior — execution profiles are documented via +# ProfilesDesignRevamp/MultiProfile -> agent-profiles-permissions.mdx — so it needs no docs. +FileBackedExecutionProfiles # Sub-feature toggles and pre-launch flags. Section placement does NOT assert # rollout status (the audit computes that from code); entries here are ignored @@ -570,6 +843,6 @@ SuggestedAgentModeWorkflows # the user-facing /pr-comments command is mapped via PRCommentsSlashCommand. PRCommentsSkill FigmaDetection -# OSC 8 hyperlink support (Cmd+click-able linked text). Currently Preview, not GA, -# so it isn't documented yet; the snapshot diff re-flags it when it promotes to GA. -OscHyperlinks +# OSC 8 hyperlink support was promoted preview -> GA and is now documented at +# terminal/more-features/files-and-links.mdx, so its ignore entry was pruned in +# favor of the mapping in "Feature flags -> doc pages" above. diff --git a/.agents/skills/missing_docs/references/surface_snapshot.json b/.agents/skills/missing_docs/references/surface_snapshot.json index 9e38f7e35..b3e67526f 100644 --- a/.agents/skills/missing_docs/references/surface_snapshot.json +++ b/.agents/skills/missing_docs/references/surface_snapshot.json @@ -9,10 +9,10 @@ "AIMemories": "other", "AIResumeButton": "ga", "AIRules": "ga", - "APIKeyAuthentication": "ga", "APIKeyManagement": "ga", "AccountFirstOnboarding": "ga", "ActiveConversationRequiresInteraction": "ga", + "AgentCliLaunchModal": "ga", "AgentDecidesCommandExecution": "ga", "AgentHarness": "ga", "AgentManagementDetailsView": "ga", @@ -86,7 +86,7 @@ "ConfigurableToolbar": "ga", "ContextChips": "other", "ContextLineReviewComments": "dogfood", - "ContextWindowUsageBreakdown": "dogfood", + "ContextWindowUsageBreakdown": "ga", "ContextWindowUsageV2": "ga", "ConversationApi": "ga", "ConversationArtifacts": "ga", @@ -96,6 +96,7 @@ "CreateProjectFlow": "ga", "CreatingSharedSessions": "dogfood", "CrossRepoContext": "dogfood", + "CtrlCCancelsThirdPartyHarness": "dogfood", "CustomModelRouters": "ga", "CycleNextCommandSuggestion": "other", "DebugMode": "other", @@ -110,13 +111,14 @@ "EditableMarkdownMermaid": "dogfood", "EmbeddedCodeReviewComments": "other", "ExpandEditToPane": "ga", + "FactoryMcp": "ga", "FallbackModelLoadOutputMessaging": "ga", "FastForwardAutoexecuteButton": "ga", "FetchChannelVersionsFromWarpServer": "other", "FetchGenericStringObjects": "other", "FigmaDetection": "ga", "FileAndDiffSetComments": "dogfood", - "FileBackedExecutionProfiles": "dogfood", + "FileBackedExecutionProfiles": "ga", "FileBasedMcp": "ga", "FileGlobV2Warnings": "dogfood", "FileRetrievalTools": "ga", @@ -127,7 +129,7 @@ "FullScreenZenMode": "ga", "FullSourceCodeEmbedding": "dogfood", "GPTConfigurableContextWindow": "dogfood", - "GeminiEnterprise": "dogfood", + "GeminiEnterprise": "ga", "GeminiNotifications": "dogfood", "GetStartedTab": "ga", "GitCredentialRefresh": "ga", @@ -182,6 +184,7 @@ "McpOauth": "ga", "McpServer": "ga", "MinimalistUI": "ga", + "MultiLevelOrchestration": "dogfood", "MultiProfile": "ga", "MultiWorkspace": "dogfood", "NamedAgents": "ga", @@ -192,7 +195,8 @@ "OpenWarpLaunchModal": "ga", "OpenWarpNewSettingsModes": "ga", "OrchestrationLaunchModal": "ga", - "OscHyperlinks": "preview", + "OrchestrationUnifiedStack": "ga", + "OscHyperlinks": "ga", "OzChangelogUpdates": "ga", "OzHandoff": "ga", "OzIdentityFederation": "ga", @@ -202,9 +206,11 @@ "PRCommentsV2": "ga", "PartialNextCommandSuggestions": "other", "PendingUserQueryIndicator": "ga", + "PeriodicHandoffCheckpoints": "dogfood", "PinnedTabs": "ga", "PluggableNotifications": "ga", "PredictAMQueries": "other", + "PricingTransparency": "dogfood", "ProfilesDesignRevamp": "ga", "Projects": "dogfood", "PromptCacheExpiryWarning": "dogfood", @@ -275,7 +281,7 @@ "VideoRecording": "ga", "ViewingSharedSessions": "ga", "VimCodeEditor": "ga", - "WaitForEventsParentRegistration": "dogfood", + "WaitForEventsParentRegistration": "ga", "WarpControlCli": "dogfood", "WarpManagedSecrets": "ga", "WarpPacks": "ga", @@ -284,7 +290,7 @@ "WebSearchUI": "ga", "WelcomeBlock": "other", "WelcomeTips": "other", - "WellKnownMcpIds": "dogfood", + "WellKnownMcpIds": "ga", "WithSandboxTelemetry": "other", "WorkflowAliases": "ga" }, @@ -676,6 +682,7 @@ "--no-computer-use", "--no-snapshot", "--open", + "--parent-run-id", "--profile", "--prompt", "--remove-all-secrets", @@ -695,7 +702,8 @@ "--snapshot-upload-timeout", "--sort-by", "--sort-order", - "--strict-mcp-startup" + "--strict-mcp-startup", + "--title" ], "api_key": [ "--agent", @@ -813,12 +821,21 @@ "DELETE /api/v1/agent/schedules/{id}", "DELETE /api/v1/factory/automations/{id}", "DELETE /api/v1/factory/automations/{id}/subscriptions/{subscription_id}", + "DELETE /api/v1/factory/scorers/{scorer_id}", + "DELETE /api/v1/factory/scorers/{scorer_id}/self-improvement-config", + "DELETE /api/v1/factory/webhooks/{uid}", "DELETE /api/v1/factory/{uid}", + "DELETE /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}", "DELETE /api/v1/factory/{uid}/source", "DELETE /api/v1/factory/{uid}/tasks/{task_uid}", "DELETE /api/v1/memory_stores/{uid}", "DELETE /api/v1/memory_stores/{uid}/memories/{memoryUid}", + "DELETE /api/v1/oauth/grants/{client_id}", + "GET /.well-known/oauth-authorization-server", + "GET /.well-known/oauth-authorization-server/api/v1/mcp/factory", + "GET /.well-known/oauth-protected-resource/api/v1/mcp/factory", "GET /.well-known/openid-configuration", + "GET /.well-known/openid-configuration/api/v1/mcp/factory", "GET /api/v1/agent", "GET /api/v1/agent/artifacts/{uid}", "GET /api/v1/agent/artifacts/{uid}/download", @@ -844,15 +861,65 @@ "GET /api/v1/agent/tasks", "GET /api/v1/agent/tasks/{id}", "GET /api/v1/factory", + "GET /api/v1/factory-alias/{alias}", + "GET /api/v1/factory-files/schemas", + "GET /api/v1/factory-files/schemas/{schema_version}", + "GET /api/v1/factory-files/schemas/{schema_version}/{document}", + "GET /api/v1/factory-setup/integrations/jira/projects", + "GET /api/v1/factory-setup/integrations/linear/teams", + "GET /api/v1/factory/access", "GET /api/v1/factory/automations", "GET /api/v1/factory/automations/events/{provider}", "GET /api/v1/factory/automations/{id}", + "GET /api/v1/factory/runs/{run_id}/scores", "GET /api/v1/factory/scorers", + "GET /api/v1/factory/scorers/{scorer_id}/metrics/pass-rate", "GET /api/v1/factory/scorers/{scorer_id}/results", + "GET /api/v1/factory/scorers/{scorer_id}/results/reasons", + "GET /api/v1/factory/scorers/{scorer_id}/self-improvement-config", + "GET /api/v1/factory/webhooks", + "GET /api/v1/factory/webhooks/{uid}", + "GET /api/v1/factory/webhooks/{uid}/deliveries", + "GET /api/v1/factory/webhooks/{uid}/deliveries/{delivery_id}", "GET /api/v1/factory/{uid}", + "GET /api/v1/factory/{uid}/benchmarks/runs", + "GET /api/v1/factory/{uid}/benchmarks/runs/{run_uid}", + "GET /api/v1/factory/{uid}/benchmarks/runs/{run_uid}/results", + "GET /api/v1/factory/{uid}/benchmarks/suites", + "GET /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}", + "GET /api/v1/factory/{uid}/gitlab-automation-capability", + "GET /api/v1/factory/{uid}/integration-activations", + "GET /api/v1/factory/{uid}/integration-destinations", + "GET /api/v1/factory/{uid}/integrations/github/branches", + "GET /api/v1/factory/{uid}/integrations/github/labels", + "GET /api/v1/factory/{uid}/integrations/github/teams", + "GET /api/v1/factory/{uid}/integrations/github/users", + "GET /api/v1/factory/{uid}/integrations/github/workflows", + "GET /api/v1/factory/{uid}/integrations/jira/labels", + "GET /api/v1/factory/{uid}/integrations/jira/projects", + "GET /api/v1/factory/{uid}/integrations/jira/statuses", + "GET /api/v1/factory/{uid}/integrations/linear/issues", + "GET /api/v1/factory/{uid}/integrations/linear/projects", + "GET /api/v1/factory/{uid}/integrations/linear/teams", + "GET /api/v1/factory/{uid}/integrations/linear/teams/{team_id}/labels", + "GET /api/v1/factory/{uid}/integrations/linear/users", + "GET /api/v1/factory/{uid}/integrations/linear/workflow-states", + "GET /api/v1/factory/{uid}/integrations/slack/conversations", + "GET /api/v1/factory/{uid}/integrations/slack/users", + "GET /api/v1/factory/{uid}/merges/{merge_uid}", + "GET /api/v1/factory/{uid}/metrics", + "GET /api/v1/factory/{uid}/metrics/cost-by-pr-size", + "GET /api/v1/factory/{uid}/metrics/run-breakdown", + "GET /api/v1/factory/{uid}/metrics/top-prs", + "GET /api/v1/factory/{uid}/review", "GET /api/v1/factory/{uid}/source", + "GET /api/v1/factory/{uid}/source/export", + "GET /api/v1/factory/{uid}/source/file", + "GET /api/v1/factory/{uid}/source/link-readiness", + "GET /api/v1/factory/{uid}/source/tree", "GET /api/v1/factory/{uid}/syncs", "GET /api/v1/factory/{uid}/task-by-conversation", + "GET /api/v1/factory/{uid}/task-by-run", "GET /api/v1/factory/{uid}/tasks", "GET /api/v1/factory/{uid}/tasks/{task_uid}", "GET /api/v1/harness-support/transcript", @@ -863,9 +930,13 @@ "GET /api/v1/memory_stores/{uid}/memories/{memoryUid}", "GET /api/v1/memory_stores/{uid}/memories/{memoryUid}/versions", "GET /api/v1/oauth/authorize", + "GET /api/v1/oauth/consent/info", + "GET /api/v1/oauth/grants", "GET /api/v1/oauth/jwks.json", "PATCH /api/v1/agent/runs/{runId}/event-sequence", + "PATCH /api/v1/factory/scorers/{scorer_id}", "PATCH /api/v1/factory/{uid}", + "PATCH /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}", "PATCH /api/v1/factory/{uid}/tasks/{task_uid}", "POST /api/v1/agent/events/{run_id}", "POST /api/v1/agent/handoff/upload-snapshot", @@ -880,18 +951,36 @@ "POST /api/v1/agent/runs/{runId}/cancel", "POST /api/v1/agent/runs/{runId}/client-events", "POST /api/v1/agent/runs/{runId}/followups", + "POST /api/v1/agent/runs/{runId}/scores", "POST /api/v1/agent/schedules", "POST /api/v1/agent/schedules/{id}/pause", "POST /api/v1/agent/schedules/{id}/resume", "POST /api/v1/agent/tasks/{id}/cancel", "POST /api/v1/factory", + "POST /api/v1/factory-files/validate", "POST /api/v1/factory/automations", "POST /api/v1/factory/avatar", + "POST /api/v1/factory/run-scoring/dispatches", "POST /api/v1/factory/scorers", + "POST /api/v1/factory/webhooks", + "POST /api/v1/factory/webhooks/dry-run", + "POST /api/v1/factory/webhooks/{uid}/rotate", "POST /api/v1/factory/{uid}/apply", + "POST /api/v1/factory/{uid}/benchmarks/runs/{run_uid}/cancel", + "POST /api/v1/factory/{uid}/benchmarks/suites", + "POST /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}/runs", + "POST /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}/tasks", + "POST /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}/tasks/compose-from-run", + "POST /api/v1/factory/{uid}/gitlab-automation-capability/refresh", + "POST /api/v1/factory/{uid}/merges", + "POST /api/v1/factory/{uid}/merges/check", "POST /api/v1/factory/{uid}/plan", + "POST /api/v1/factory/{uid}/review/refine", + "POST /api/v1/factory/{uid}/source/clone-url", "POST /api/v1/factory/{uid}/tasks", + "POST /api/v1/factory/{uid}/tasks/{task_uid}/cancel", "POST /api/v1/harness-support/block-snapshot", + "POST /api/v1/harness-support/commit-snapshot", "POST /api/v1/harness-support/external-conversation", "POST /api/v1/harness-support/finish-task", "POST /api/v1/harness-support/notify-user", @@ -902,14 +991,22 @@ "POST /api/v1/harness-support/upload-snapshot", "POST /api/v1/memory_stores", "POST /api/v1/memory_stores/{uid}/memories", + "POST /api/v1/oauth/consent", "POST /api/v1/oauth/device/auth", + "POST /api/v1/oauth/register", + "POST /api/v1/oauth/revoke", "POST /api/v1/oauth/session", "POST /api/v1/oauth/token", "PUT /api/v1/agent/identities/{uid}", "PUT /api/v1/agent/schedules/{id}", "PUT /api/v1/factory/automations/{id}", "PUT /api/v1/factory/automations/{id}/subscriptions", + "PUT /api/v1/factory/automations/{id}/subscriptions/{subscription_id}", + "PUT /api/v1/factory/scorers/{scorer_id}/self-improvement-config", + "PUT /api/v1/factory/webhooks/{uid}", + "PUT /api/v1/factory/{uid}/integrations/linear/teams/{team_id}/labels", "PUT /api/v1/factory/{uid}/source", + "PUT /api/v1/factory/{uid}/source/files", "PUT /api/v1/memory_stores/{uid}", "PUT /api/v1/memory_stores/{uid}/memories/{memoryUid}" ], @@ -918,13 +1015,17 @@ "/add-prompt", "/add-rule", "/agent", + "/api-keys", "/auto-approve", "/changelog", + "/clear", "/cloud-agent", "/compact", "/compact-and", + "/connect-grok", "/continue-locally", "/conversations", + "/copy-debugging-id", "/cost", "/create-environment", "/create-new-project", @@ -943,6 +1044,7 @@ "/index", "/init", "/logout", + "/manage-billing", "/mcp", "/model", "/natural-language-detection", @@ -961,13 +1063,18 @@ "/remote-control", "/rename-conversation", "/rename-tab", + "/reset-statusline", "/rewind", "/set-tab-color", "/skills", + "/status", + "/statusline", + "/team", "/theme", + "/upgrade", "/usage", - "/version", "/view-logs", + "/vim-mode", "/voice" ], "settings": { @@ -983,6 +1090,7 @@ "agents.profiles.agent_mode_command_execution_allowlist": "always_on", "agents.profiles.agent_mode_command_execution_denylist": "always_on", "agents.profiles.agent_mode_execute_readonly_commands": "always_on", + "agents.statusline": "always_on", "agents.third_party.auto_dismiss_composer_after_submit": "always_on", "agents.third_party.auto_open_composer_on_cli_agent_start": "always_on", "agents.third_party.auto_toggle_composer": "always_on", @@ -992,6 +1100,7 @@ "agents.third_party.submit_on_ctrl_enter": "always_on", "agents.usage_display_mode": "always_on", "agents.voice.voice_input_enabled": "always_on", + "agents.voice.voice_input_hold_key": "always_on", "agents.voice.voice_input_language": "always_on", "agents.voice.voice_input_toggle_key": "always_on", "agents.warp_agent.active_ai.agent_mode_query_suggestions_enabled": "always_on", @@ -1011,6 +1120,7 @@ "agents.warp_agent.input.show_model_selectors_in_prompt": "always_on", "agents.warp_agent.is_any_ai_enabled": "always_on", "agents.warp_agent.other.agent_attribution_enabled": "always_on", + "agents.warp_agent.other.auto_approve_bypasses_command_denylist": "always_on", "agents.warp_agent.other.auto_handoff_on_sleep_enabled": "always_on", "agents.warp_agent.other.cloud_agent_computer_use_enabled": "always_on", "agents.warp_agent.other.default_prompt_submission_mode": "ga", @@ -1080,8 +1190,14 @@ "appearance.window.override_opacity": "always_on", "appearance.window.zoom_level": "always_on", "appearance.zero_state.extrusion_depth": "always_on", + "appearance.zero_state.freeze_animation_when_unfocused": "always_on", "appearance.zero_state.object": "always_on", "appearance.zero_state.rotation_period_seconds": "always_on", + "appearance.zero_state.show_animation": "always_on", + "appearance.zero_state.show_changelog": "always_on", + "appearance.zero_state.show_mcp": "always_on", + "appearance.zero_state.show_project_info": "always_on", + "appearance.zero_state.show_signed_in_user": "always_on", "cloud_platform.third_party_api_keys.aws_bedrock_auth_refresh_command": "always_on", "cloud_platform.third_party_api_keys.aws_bedrock_auto_login": "always_on", "cloud_platform.third_party_api_keys.aws_bedrock_credentials_enabled": "always_on", @@ -1152,6 +1268,7 @@ "terminal.input.classic_completions_mode": "always_on", "terminal.input.command_corrections": "always_on", "terminal.input.completions_open_while_typing": "always_on", + "terminal.input.enable_ai_command_search_hash_trigger": "always_on", "terminal.input.enable_slash_commands_in_terminal": "always_on", "terminal.input.error_underlining_enabled": "always_on", "terminal.input.extra_meta_keys": "always_on", @@ -1159,6 +1276,7 @@ "terminal.input.input_box_type_setting": "always_on", "terminal.input.middle_click_paste_enabled": "always_on", "terminal.input.outline_codebase_symbols_for_at_context_menu": "always_on", + "terminal.input.right_click_behavior": "always_on", "terminal.input.show_hint_text": "always_on", "terminal.input.show_terminal_input_message_bar": "always_on", "terminal.input.syntax_highlighting": "always_on", @@ -1196,10 +1314,9 @@ ":scheduleId", ":secretId", "agents", + "artifacts/:artifactUid", "design", "environments", - "evaluations", - "evaluations/:evaluationId", "integrations", "login", "login/callback", @@ -1241,6 +1358,7 @@ "finish_task", "finish_warp_documentation_search", "get_artifacts_for_pull_request_description", + "get_media_artifact_links", "grep", "init_project", "insert_code_review_comments", @@ -1258,6 +1376,7 @@ "read_skill", "read_todos", "remove_todos", + "report_external_reference", "report_intent", "report_outcome", "report_pr", @@ -1292,6 +1411,8 @@ "claude-api": "bundled", "create-skill": "bundled", "create-tab-config": "bundled", + "factory-files": "bundled", + "factory-mcp": "bundled", "modify-settings": "bundled", "oz-platform": "bundled", "pr-comments": "bundled", @@ -1303,5 +1424,5 @@ "verify-ui-change-in-cloud": "dogfood", "warpctrl": "bundled" }, - "changelog_last_version": "2026.07.23" + "changelog_last_version": "2026.08.19" } diff --git a/.agents/skills/missing_docs/scripts/audit_docs.py b/.agents/skills/missing_docs/scripts/audit_docs.py index 8afed9df8..ee32cbf14 100755 --- a/.agents/skills/missing_docs/scripts/audit_docs.py +++ b/.agents/skills/missing_docs/scripts/audit_docs.py @@ -745,9 +745,20 @@ def _split_top_level_args(s: str) -> list[str]: return args +def _is_route_registrar(name: str) -> bool: + """Whether a Go function name looks like a route-registration helper. + + Matches both the exported `RegisterFooRoutes` entry points and unexported + helpers like `registerMCPDiscoveryRoutes`, which real handlers use to split + a large registration function up. Missing the unexported ones silently + dropped their routes from the audit universe. + """ + return name.startswith(("Register", "register")) + + def _iter_register_calls(body: str): - """Yield (callee, start_pos, args) for Register*(...) calls, paren-matched.""" - for match in re.finditer(r"\b(Register\w+)\(", body): + """Yield (callee, start_pos, args) for [Rr]egister*(...) calls, paren-matched.""" + for match in re.finditer(r"\b([Rr]egister\w+)\(", body): start = match.end() depth = 1 i = start @@ -911,7 +922,7 @@ def emit(fn_name: str, param_prefix: str): # to hang off the /api/v1 group (conservative default so routes are never # silently dropped). for fn_name in sorted(analyzed): - if fn_name.startswith("Register") and fn_name not in emitted_fns: + if _is_route_registrar(fn_name) and fn_name not in emitted_fns: emit(fn_name, "/api/v1") routes = [] @@ -939,10 +950,17 @@ def _normalize_path_params(path: str) -> str: def parse_openapi_paths(openapi_text: str) -> set[str]: - """Extract normalized path keys from the OpenAPI YAML text.""" + """Extract normalized path keys from the OpenAPI YAML text. + + Path keys containing `{param}` are usually emitted quoted (YAML treats a + leading `{` as a flow mapping), so both ` /agent/runs:` and + ` '/agent/runs/{runId}':` must be recognized. Missing the quoted form made + every parameterized endpoint look absent from the spec. + """ paths = set() - for match in re.finditer(r"(?m)^\s{2}(/[^\s:]+):", openapi_text): - paths.add(_normalize_path_params(match.group(1))) + for match in re.finditer(r"""(?m)^\s{2}(?:'(/[^']+)'|"(/[^"]+)"|(/[^\s:'"]+)):""", openapi_text): + path = match.group(1) or match.group(2) or match.group(3) + paths.add(_normalize_path_params(path)) return paths # --------------------------------------------------------------------------- diff --git a/.agents/skills/release_updates/scripts/update_telemetry.py b/.agents/skills/release_updates/scripts/update_telemetry.py index 873d551c3..3cab4c8a1 100644 --- a/.agents/skills/release_updates/scripts/update_telemetry.py +++ b/.agents/skills/release_updates/scripts/update_telemetry.py @@ -61,8 +61,15 @@ def parse_args() -> argparse.Namespace: return parser.parse_args() +# Keep this in sync with the heading emitted by `_table_markdown`. The heading is +# matched literally to find where the generated table starts, so renaming it in +# privacy.mdx without updating it here makes the whole file look like intro and +# appends a duplicate table on the next run. +TELEMETRY_TABLE_HEADING = "### Exhaustive telemetry table" + + def _extract_intro(content: str) -> str: - marker = "\n### Exhaustive Telemetry Table" + marker = f"\n{TELEMETRY_TABLE_HEADING}" index = content.find(marker) if index == -1: return content.rstrip() + "\n" @@ -71,7 +78,7 @@ def _extract_intro(content: str) -> str: def _table_markdown(events: dict[str, Any]) -> str: lines: list[str] = [ - "### Exhaustive Telemetry Table", + TELEMETRY_TABLE_HEADING, "", "| Event Name | Description |", "|---|---|", diff --git a/.agents/skills/review-docs-pr/SKILL.md b/.agents/skills/review-docs-pr/SKILL.md index a4d823fd7..c07e87556 100644 --- a/.agents/skills/review-docs-pr/SKILL.md +++ b/.agents/skills/review-docs-pr/SKILL.md @@ -25,9 +25,11 @@ Focus on: 2. **Style guide compliance**: Reference `AGENTS.md` for documentation standards (voice, formatting, terminology). 3. **Content quality**: Check for clarity, accuracy, proper frontmatter, and appropriate use of headers/lists. 4. **Code snippets**: Verify that any code examples, commands, or configuration snippets are correct and will work as documented. If you're unsure about technical details, use the `answer_question` skill to verify against the docs or search the source code. -5. **Astro Starlight structure**: Verify `src/sidebar.ts` updates if files were added, moved, or renamed, and that redirects are added to vercel.json (redirects) when needed. +5. **Astro Starlight structure**: Verify `src/sidebar.ts` updates if files were added, moved, or renamed, and that redirects are added to the `redirects` array in `vercel.json` when needed. 6. **Product name variables**: Check whether any product names with a corresponding entry in `src/data/vars.ts` are hardcoded as literal strings instead of using `{VARS.KEY}` (prose) or `{{TOKEN}}` (frontmatter). Key strings to watch for: "Oz CLI", "Oz web app", "oz.warp.dev", "Oz dashboard", "Oz run". Flag as `⚠️ [IMPORTANT]` if a new file adds these without using the variable system. For existing files, flag as `💡 [SUGGESTION]`. -7. **AEO/source-data fit**: +7. **Tone and AI-isms**: Flag marketing buzzwords (seamless, powerful, robust, comprehensive, leverage, streamline), meta-openers ("This page covers/explains/walks through..."), restated cause-and-effect ("This process ensures..."), recap lines, consecutive callouts or more than one callout per section, and internal-architecture detail the reader can't act on (orchestrators, control planes, lifecycle states). Reference the "Voice & tone" section of `AGENTS.md`. Use `💡 [SUGGESTION]` for isolated instances; use `⚠️ [IMPORTANT]` when the pattern is pervasive in new content. +8. **Length and brevity**: Flag a page that could be materially shorter, not just wordy sentences — a 2,000-word page that should be 600 is a more expensive problem than an isolated buzzword. Check whether a deletion-only "Cut again" pass (AGENTS.md → Voice & tone → Cut again) happened before the page was split into sub-pages, since splitting a bloated page produces two bloated pages. Use `💡 [SUGGESTION]` unless the page is far outside its content type's expected length, then use `⚠️ [IMPORTANT]`. +9. **AEO/source-data fit**: Provide actionable, constructive feedback. Focus on documentation quality issues, not code bugs. diff --git a/.agents/skills/style_lint/SKILL.md b/.agents/skills/style_lint/SKILL.md index ae442c1f3..b2c518a52 100644 --- a/.agents/skills/style_lint/SKILL.md +++ b/.agents/skills/style_lint/SKILL.md @@ -60,18 +60,41 @@ python3 .agents/skills/style_lint/style_lint.py --all --fix --create-pr - **Deprecated terminology**: "whitelist" (→ "allowlist"), "blacklist"/"blocklist" (→ "denylist") - **External product names**: "Github" (→ "GitHub"), "github actions" (→ "GitHub Actions"), "MacOS" (→ "macOS"), "A.I." (→ "AI") - **Unrecognized terms** (warning): Bolded terms that look like product names but aren't in `terminology.md`. Flags candidates for glossary addition — not errors, just suggestions. +- **Warp Factories naming**: A bare capitalized "Factory" used as a proper noun. "Warp Factories" is the product and is written in full; an individual "factory" is lowercase. Sentence-, heading-, bullet-, quote-, and cell-initial capitals are positional and stay, as do frontmatter titles and labels, the shipped feature name "Factory MCP", and verbatim UI strings such as **Factory name** and **Add your Factory to your team**. Regression cases live in `test_factory_proper_noun.py`. - **Hardcoded product name strings**: Product name strings that have a corresponding key in `src/data/vars.ts` but appear as literal text rather than variable syntax. Reports instances of known strings like "Oz CLI", "Oz web app", "oz.warp.dev", "Oz dashboard", "Oz run" (any value currently in `src/data/vars.ts`) in body prose and frontmatter. These are flagged as `⚠️ [IMPORTANT]` in PR context and reported (not auto-fixed) — they should use `{VARS.KEY}` in prose and `{{TOKEN}}` in frontmatter. +### Tone checks (report-only, never auto-fixed) + +These enforce the "Voice & tone" section of `AGENTS.md`. Every hit needs a human rewrite, so they are always warnings and never auto-fixed: + +- **Buzzwords** (`tone-buzzword`): AI-ism words like "seamless", "powerful", "robust", "comprehensive", "leverage", "streamline", "empower", "delve", abstract metaphors ("landscape", "realm", "tapestry", "testament to"), and filler frames ("it's important to note", "designed to", "ensures that", "allows you to", "in order to"). Words with legitimate technical uses in these docs ("harness", "unlock", "elevated", "journey") are deliberately excluded from the lint and covered by prose guidance only. +- **Meta-openers** (`tone-meta-opener`): Page-narrating text like "This page covers/explains/walks through...". The fix is to cut the sentence and state the thing itself. +- **Consecutive callouts** (`callout-consecutive`): Two `:::` asides back to back with nothing between them. Merge them or move one into body prose. +- **Callout budget** (`callout-density`): More than 4 callouts on one page. The style guide allows at most one per section; the per-page count is the lintable proxy. + ## Auto-fix behavior When run with `--fix`: - **High-confidence fixes applied automatically**: Settings path format, UI element format, product name casing, external product name casing - **Low-confidence issues reported but not auto-fixed**: link quality, VideoEmbed title specificity, list format, header case (due to feature name exceptions), ambiguous terminology +- **Tone checks are never auto-fixed**: buzzwords, meta-openers, and callout budget issues always need a human rewrite ## Relationship to validate_ui_refs This skill checks broader formatting and terminology. The `validate_ui_refs` skill validates UI paths and Command Palette names against the warp-internal codebase. They complement each other with no overlap. Both can run in scheduled cloud agent workflows. +## Tests + +Three checks have regression suites, because each is a narrow rule where the +hard part is not firing on legitimate text. Run them after touching any of +these checks: + +```bash +python3 .agents/skills/style_lint/test_platform_determiner.py +python3 .agents/skills/style_lint/test_factory_proper_noun.py +python3 .agents/skills/style_lint/test_tone_checks.py +``` + ## Dependencies Requires Python 3.7+. Optional: `requests` (for Slack notifications), `gh` CLI (for PR creation). diff --git a/.agents/skills/style_lint/style_lint.py b/.agents/skills/style_lint/style_lint.py index d6169a298..19437f7e0 100644 --- a/.agents/skills/style_lint/style_lint.py +++ b/.agents/skills/style_lint/style_lint.py @@ -18,7 +18,7 @@ import sys from dataclasses import dataclass, field from pathlib import Path -from typing import List, Optional, Tuple +from typing import Dict, List, Optional, Tuple # --------------------------------------------------------------------------- # Configuration @@ -39,7 +39,7 @@ "Codebase Context", "Code Review", "Command Palette", "Global Rules", "Oz CLI", "Oz Platform", "Project Rules", "Slash Commands", "Terminal Mode", "Universal Input", "Warp Drive", - "Warp Platform", + "Warp Platform", "Automation Platform", "Warp Factories", "Factory MCP", } # Terminology: wrong → right (case-sensitive checks) @@ -76,6 +76,13 @@ # entries whose values are expected to change at a product rename. Stable feature # names (AGENT_MODE, WARP_DRIVE, etc.) are intentionally excluded. # +# The bare "Oz" entries do double duty after the 8/18 rename. They no longer +# only mean "this should have been tokenized" -- a hardcoded "Oz" in prose is +# now a *stale* product name as well. Both readings want the same fix, so the +# entries stay. The "Automation Platform" entry is the mirror image: it catches +# the new name being hardcoded, which would silently miss the 9/15 changes and +# any later rename. +# # Each entry: (literal_string, var_key, suggestion) RENAME_SENSITIVE_VAR_STRINGS: List[Tuple[str, str, str]] = [ ("Oz CLI", "WARP_AGENT_CLI", "{VARS.WARP_AGENT_CLI} in prose or {{WARP_AGENT_CLI}} in frontmatter"), @@ -83,8 +90,95 @@ ("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 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"), ] +# Phrasings that deliberately name the old product. A transition callout has to +# say "Oz" to do its job, so without this the guard would fight the very copy +# that explains the rename -- and the author's only workaround would be to +# backtick a product name, which is semantically wrong. +# +# Keyed on explicit transition phrasings rather than a per-file or per-page +# opt-out, so an unrelated stale "Oz" elsewhere on the same page is still +# caught. Only old-name literals are suppressed; a hardcoded *new* name on the +# same line still gets flagged, since nothing about a transition sentence +# excuses that. +RENAME_TRANSITION_MARKERS: Tuple[str, ...] = ( + "formerly Oz", + "formerly called Oz", + "formerly the Oz", + "Oz is now", + "was called Oz", + "renamed from Oz", + # Explains why "Oz" still appears in commands and URLs before 9/15. + "the Oz name", +) + +# Product names that merely contain "Oz" but are not the platform name, so they +# do not change when it does. "Oz by Warp" is the GitHub App as it appears in +# GitHub's own UI, at github.com/apps/oz-by-warp, and is what PRs and commits +# are attributed to. Renaming it in the docs would make them disagree with what +# the reader sees on GitHub. Same reasoning as the `@oz-agent` handle. +# +# "Oz Cloud API Keys" is the literal Settings label the Warp client still +# renders (`SettingsSection::OzCloudAPIKeys`, per terminology.md's "What still +# says Oz"). It changes only when the app renames that page, not at the +# Automation Platform rename, so it must stay hardcoded rather than tokenized. +# +# Matched as a suffix on the literal rather than added as its own entry, +# because the goal is to suppress rather than redirect: there is no variable +# these should be using instead. +# +# Keyed per-literal (not a single flat tuple shared by every entry) because +# the exemption must not bleed into other rename-sensitive literals. A flat +# tuple would suppress a hardcoded "Automation Platform Cloud API Keys" too -- +# exactly the new-name literal this check exists to catch -- since that +# string also ends in " Cloud API Keys". Only the "Oz" literal gets these +# suffix exemptions. +RENAME_EXEMPT_SUFFIXES_BY_LITERAL: Dict[str, Tuple[str, ...]] = { + "Oz": (" by Warp", " Cloud API Keys"), +} + +# Determiner check for WARP_AUTOMATION_PLATFORM. See check_platform_determiner. +# +# "Oz" was a proper noun and read correctly bare. "Automation Platform" is a +# common-noun phrase and needs a definite article in referential positions. The +# defect is invisible in source -- `The {{WARP_AUTOMATION_PLATFORM}} provides` +# looks fine in the .mdx and only reads wrong once rendered -- so it needs a +# lint rule rather than review attention. +PLATFORM_TOKEN = re.compile(r"\{VARS\.WARP_AUTOMATION_PLATFORM\}|\{\{WARP_AUTOMATION_PLATFORM\}\}") +PLATFORM_DETERMINER = re.compile(r"\b(the|a|an|its|their|your|our|this|that)\s*(\*\*|\*|\[)?\s*$", re.IGNORECASE) +# Prepositions that take a noun phrase, so a bare platform name after one reads +# as a proper noun and is wrong under the new name. +PLATFORM_PREPOSITIONS = re.compile( + r"\b(with|to|in|on|by|from|for|into|across|via|using|of|about|through|within)\s*(\*\*|\*|\[)?\s*$", + re.IGNORECASE, +) +# Verbs that mark the token as a clause subject. +PLATFORM_SUBJECT_VERBS = re.compile( + r"^\s*(\*\*|\*)?\s*(is|are|was|were|can|will|provides|gives|uses|reads|detects|supports|posts|runs|orchestrates|handles|manages|creates|lets|exposes|routes|tracks)\b" +) +# A lowercase word directly after the token usually means the token is +# modifying it -- "{...} orchestration", "automated {...} runs", "{...} cloud +# environments" -- which is attributive and correctly bare. Function words are +# excluded because they continue the sentence rather than extend the noun +# phrase, so "with {...} for cloud runs" is still referential. +PLATFORM_FUNCTION_WORDS = { + "a", "an", "and", "are", "as", "at", "be", "blocks", "but", "by", "can", + "for", "from", "if", "in", "is", "of", "on", "or", "so", "than", "that", + "the", "then", "to", "was", "were", "when", "which", "while", "will", "with", +} +PLATFORM_NEXT_WORD = re.compile(r"^\s+([a-z][a-z-]*)") +# Several subject verbs double as nouns -- "runs", "uses", "reads". Requiring +# the token to actually begin a clause keeps "automated {...} runs" (a noun +# phrase) from being read as "{...} runs" (a subject and its verb). +PLATFORM_CLAUSE_START = re.compile( + r"(^|[.:!?]\s+|[-\u2013\u2014]\s+|^\s*[*-]\s+)(\*\*|\*|\[)?\s*$" +) + # Oz terms to avoid (case-insensitive patterns) OZ_TERMS_TO_AVOID = [ (r"\bagent identities\b", "Use 'agents' or 'cloud agents' unless referring to legacy API names in code"), @@ -101,6 +195,52 @@ (r"\b[Aa]mbient [Aa]gents?\b", "Use 'cloud agent(s)' — 'ambient' is no longer a product term"), ] +# Tone: AI-generated-sounding words from AGENTS.md → Voice & tone → "Words to +# avoid". Report-only (never auto-fixed): every hit needs a human rewrite that +# names the specific capability, not a mechanical substitution. +# +# Deliberately narrower than the prose guidance. Words with legitimate +# technical uses in these docs are excluded so warnings stay trustworthy: +# "harness" (agent harness), "unlock" (login/keychain unlock), "elevate(d)" +# (elevated permissions), and "journey" stay out of the lint and are covered +# by AGENTS.md only. +TONE_BUZZWORDS: List[Tuple[str, str]] = [ + (r"\bseamless(?:ly)?\b", "Marketing adjective; describe the specific behavior instead"), + (r"\beffortless(?:ly)?\b", "Marketing adjective; describe the specific behavior instead"), + (r"\bpowerful\b", "Marketing adjective; name what the feature does instead"), + (r"\brobust\b", "Marketing adjective; name what the feature does instead"), + (r"\bcomprehensive(?:ly)?\b", "Marketing adjective; say what is included instead"), + (r"\bcutting-edge\b", "Marketing adjective; delete it or name the capability"), + (r"\bgame-chang\w+\b", "Marketing adjective; delete it or name the capability"), + (r"\bsupercharg\w+\b", "Marketing verb; name the specific improvement instead"), + (r"\bleverag(?:e|es|ed|ing)\b", "Use 'use'"), + (r"\bstreamlin(?:e|es|ed|ing)\b", "Say what gets shorter or removed instead"), + (r"\bempower(?:s|ed|ing)?\b", "Use 'let' or name the capability"), + (r"\bdelv(?:e|es|ed|ing)\b", "Use 'cover' or name the topic directly"), + (r"\blandscape\b", "Abstract metaphor; name the concrete thing"), + (r"\brealm\b", "Abstract metaphor; name the concrete thing"), + (r"\btapestry\b", "Abstract metaphor; name the concrete thing"), + (r"\btestament to\b", "Filler phrase; state the fact directly"), + (r"\b(?:it'?s|it is) (?:important to note|worth noting)\b", "Filler frame; cut it and state the fact directly"), + (r"\bdesigned to\b", "Filler frame; say what it actually does instead"), + (r"\bensur(?:e|es|ed|ing) that\b", "Filler frame; state the fact directly"), + (r"\ballow(?:s|ed|ing)? you to\b", "Filler frame; use 'lets' or rewrite as a direct instruction"), + (r"\bin order to\b", "Use 'to'"), +] + +# Tone: meta-text that narrates the page instead of stating the thing itself. +# AGENTS.md → Voice & tone → "Every sentence earns its place". +META_OPENER = re.compile( + r"\bThis (?:page|guide|section|article|document) (?:covers|explains|describes|walks(?: you)? through)\b" +) + +# Starlight aside fences, for the callout-budget checks. +CALLOUT_OPEN = re.compile(r"^\s*:::(note|tip|caution|danger)\b") +CALLOUT_CLOSE = re.compile(r"^\s*:::\s*$") +# More callouts than this on one page almost always means caveats that belong +# in body prose. AGENTS.md allows at most one callout per section. +CALLOUT_PAGE_BUDGET = 4 + # Action verbs that precede UI elements (should be bold, not backtick) UI_ACTION_VERBS = r"(?:click|select|toggle|enable|disable|choose|check|uncheck|expand|collapse|open|close|tap)" @@ -108,7 +248,22 @@ TERMINOLOGY_FILE = Path(".agents/references/terminology.md") -STANDARD_SCREENSHOT_WIDTHS = {"300px", "350px", "375px", "563px"} +# Standard figure widths for screenshots. See AGENTS.md § "Screenshot sizing +# standards". +# +# 736px is full content width: it matches `.main-pane .sl-container`'s +# `max-width: 46rem` in src/styles/custom.css. Because the container already +# caps at that width, 736px renders identically to omitting maxWidth entirely. +# It is listed explicitly so authors can signal "this screenshot is +# deliberately full width" and so this check can tell that apart from a figure +# that is simply missing a width. If the content column in custom.css ever +# changes, update this value to match. +STANDARD_SCREENSHOT_WIDTHS = {"300px", "350px", "375px", "563px", "736px"} + +# Rendered as "300px, 350px, 375px, 563px, or 736px" in check messages, derived +# from the set above so the two can never drift apart. +_SORTED_WIDTHS = sorted(STANDARD_SCREENSHOT_WIDTHS) +STANDARD_WIDTHS_PHRASE = f"{', '.join(_SORTED_WIDTHS[:-1])}, or {_SORTED_WIDTHS[-1]}" SCREENSHOT_PATH_HINTS = ( "/assets/", @@ -166,6 +321,11 @@ ) MARKDOWN_LINK = re.compile(r"\[([^\]]*)\]\(([^)]+)\)") VIDEO_EMBED_TITLE = re.compile(r"\btitle\s*=\s*([\"'])(.*?)\1", re.DOTALL) +# JSX expression titles, e.g. title={`${VARS.WEB_APP} walkthrough`} — used when +# the title includes a rename-sensitive {VARS.KEY} reference. Content can't be +# statically evaluated, so these are treated as present but skipped by the +# generic-title check below. +VIDEO_EMBED_TITLE_EXPR = re.compile(r"\btitle\s*=\s*\{(.*?)\}", re.DOTALL) # Common bolded words that are NOT product terms (false positive suppression) COMMON_BOLD_WORDS = { @@ -556,7 +716,7 @@ def check_screenshot_widths(lines: List[str], filepath: str) -> List[Issue]: if figure_start_line is None: issues.append(Issue( filepath, i, "screenshot-width", - "Likely screenshot image should be wrapped in a <figure> with a standard maxWidth (300px, 350px, 375px, or 563px)", + f"Likely screenshot image should be wrapped in a <figure> with a standard maxWidth ({STANDARD_WIDTHS_PHRASE})", "warning", )) else: @@ -568,13 +728,13 @@ def check_screenshot_widths(lines: List[str], filepath: str) -> List[Issue]: if width is None: issues.append(Issue( filepath, figure_start_line, "screenshot-width", - "Screenshot figure is missing a standard maxWidth (300px, 350px, 375px, or 563px)", + f"Screenshot figure is missing a standard maxWidth ({STANDARD_WIDTHS_PHRASE})", "warning", )) elif width not in STANDARD_SCREENSHOT_WIDTHS: issues.append(Issue( filepath, figure_start_line, "screenshot-width", - f"Screenshot figure uses non-standard maxWidth \"{width}\"; use one of {', '.join(sorted(STANDARD_SCREENSHOT_WIDTHS))}", + f"Screenshot figure uses non-standard maxWidth \"{width}\"; use one of {STANDARD_WIDTHS_PHRASE}", "warning", )) figure_start_line = None @@ -641,21 +801,29 @@ def check_video_embed_titles(lines: List[str], filepath: str) -> List[Issue]: issues = [] for line_number, tag in _iter_video_embed_tags(lines): title_match = VIDEO_EMBED_TITLE.search(tag) - if not title_match or not title_match.group(2).strip(): - issues.append(Issue( - filepath, line_number, "video-title", - "VideoEmbed missing title prop. Add a specific title that describes the integration, workflow, feature, or task shown.", - "error", - )) + if title_match and title_match.group(2).strip(): + title = title_match.group(2).strip() + if _is_generic_video_title(title): + issues.append(Issue( + filepath, line_number, "video-title", + f"Generic VideoEmbed title: \"{title}\". Use a specific title that describes what the video shows.", + "warning", + )) continue - title = title_match.group(2).strip() - if _is_generic_video_title(title): - issues.append(Issue( - filepath, line_number, "video-title", - f"Generic VideoEmbed title: \"{title}\". Use a specific title that describes what the video shows.", - "warning", - )) + # Not a quoted string literal — check for a JSX expression title, e.g. + # title={`${VARS.WEB_APP} walkthrough`}. Content isn't statically + # evaluable, so skip the generic-title check but still confirm a + # non-empty title prop is present. + expr_match = VIDEO_EMBED_TITLE_EXPR.search(tag) + if expr_match and expr_match.group(1).strip(): + continue + + issues.append(Issue( + filepath, line_number, "video-title", + "VideoEmbed missing title prop. Add a specific title that describes the integration, workflow, feature, or task shown.", + "error", + )) return issues @@ -875,19 +1043,77 @@ def check_hardcoded_vars(lines: List[str], filepath: str) -> List[Issue]: Skips fenced code blocks and inline code spans so that CLI examples like `oz.warp.dev` in a code fence are not flagged. + + Literals are checked longest-first and matches are deduplicated by span so + overlapping rename-sensitive names are not double-flagged. + + Matches use word boundaries (`\b`) rather than plain substring search, so + literals don't false-positive inside unrelated tokens such as URL query + params, hashes, or other identifiers. + + An "@"-prefixed occurrence is skipped because mention handles are literal + strings that do not necessarily change with product names. Variabilizing + a handle could silently rewrite it into an invalid value at rename time. + + Old-name literals are also skipped on lines carrying a phrase from + RENAME_TRANSITION_MARKERS, so "formerly Oz" copy can name the old product + without the guard objecting. New-name literals on those lines still flag. """ issues = [] in_code_block = False + sorted_strings = sorted(RENAME_SENSITIVE_VAR_STRINGS, key=lambda entry: -len(entry[0])) + compiled = [ + (literal, var_key, suggestion, re.compile(r"\b" + re.escape(literal) + r"\b")) + for literal, var_key, suggestion in sorted_strings + ] for i, line in enumerate(lines, 1): if line.strip().startswith("```"): in_code_block = not in_code_block continue if in_code_block: continue + # Text that describes an image must match the image, so it cannot be + # tokenized. Two separate reasons, same conclusion: + # + # Alt text is markdown, not JSX -- `![... {VARS.WEB_APP}](...)` renders + # the literal "VARS.WEB_APP" on the page, so tokenizing it is simply + # broken. Figcaptions *are* JSX and would substitute correctly, but a + # caption that auto-flips ahead of the screenshot it captions is worse + # than one that stays stale: the page would claim a name the image + # visibly contradicts. Both have to be updated by hand, together with + # the images, when the screenshots are retaken. + if line.lstrip().startswith("![") or "<figcaption" in line: + continue # Strip inline code spans so backtick-wrapped references are not flagged prose_line = re.sub(r"`[^`]+`", "", line) - for literal, var_key, suggestion in RENAME_SENSITIVE_VAR_STRINGS: - if literal in prose_line: + # Deliberate historical reference on this line. See docstring. + is_transition_line = any( + marker in prose_line for marker in RENAME_TRANSITION_MARKERS + ) + matched_spans: List[Tuple[int, int]] = [] + for literal, var_key, suggestion, pattern in compiled: + for m in pattern.finditer(prose_line): + span = m.span() + if any(span[0] >= s and span[1] <= e for s, e in matched_spans): + continue + # Mention handles are literal strings, not prose. See docstring. + if span[0] > 0 and prose_line[span[0] - 1] == "@": + continue + # Only the old name is excused by transition phrasing; a + # hardcoded new name is still a bug on the same line. + if is_transition_line and literal.startswith(("Oz", "oz")): + continue + # Distinct product names that happen to contain "Oz", or the + # literal "Oz Cloud API Keys" Settings label. Looked up by the + # exact literal that matched, so this never suppresses a + # different rename-sensitive literal (e.g. "Automation + # Platform") that happens to share the same suffix. + if any( + prose_line[span[1]:].startswith(suffix) + for suffix in RENAME_EXEMPT_SUFFIXES_BY_LITERAL.get(literal, ()) + ): + continue + matched_spans.append(span) issues.append(Issue( filepath, i, "hardcoded-var", f'Hardcoded "{literal}" should use {suggestion} (see src/data/vars.ts)', @@ -896,6 +1122,309 @@ def check_hardcoded_vars(lines: List[str], filepath: str) -> List[Issue]: return issues +def check_platform_determiner(lines: List[str], filepath: str) -> List[Issue]: + """Flag {VARS.WARP_AUTOMATION_PLATFORM} used referentially without an article. + + "Oz" was a proper noun and read correctly bare: "with Oz", "Oz provides", + "Oz's backend". "Automation Platform" is a common-noun phrase, so the same + positions need a definite article: "with the ...", "The ... provides", + "the ...'s backend". + + This is worth a lint rule rather than review attention because the defect is + invisible in the source file. `The {{WARP_AUTOMATION_PLATFORM}} provides` + looks correct in the .mdx and only reads wrong once the variable is + substituted at build time. + + Only high-confidence positions are flagged, so that attributive uses stay + quiet: + * possessive -- token followed by 's + * prepositional -- token directly after "with", "to", "in", and friends + * subject -- token directly before a finite verb + + Deliberately NOT flagged, because bare is correct there: + * attributive compounds -- "{{...}} settings", "{{...}}-hosted", and any + token directly followed by a lowercase noun it modifies + * frontmatter title/label values -- "{{...}} overview" + * bold term leads in definition lists -- "* **{VARS....}** - ..." + + A determiner on the previous line still counts, so a soft-wrapped sentence + or a wrapped frontmatter description is not falsely flagged. + """ + issues = [] + in_code_block = False + in_frontmatter = False + # Frontmatter is not uniformly exempt. `title` and `sidebar.label` are + # headline-style and correctly bare, but `description` is a sentence, and it + # becomes the meta description -- the text search engines and AI engines + # read before deciding whether to cite the page. Skipping all of + # frontmatter left exactly that field unguarded against the defect this + # check exists to catch. + in_description = False + for i, line in enumerate(lines, 1): + stripped = line.strip() + if i == 1 and stripped == "---": + in_frontmatter = True + continue + if in_frontmatter: + if stripped == "---": + in_frontmatter = False + in_description = False + continue + # A description can be inline or a folded block (`description: >-`) + # continuing over several indented lines. Track which key we are + # inside so the continuation lines are scanned too. + key = re.match(r"([a-zA-Z_]+):", stripped) + if key: + in_description = key.group(1) == "description" + if not in_description: + continue + # fall through and scan this line + if stripped.startswith("```"): + in_code_block = not in_code_block + continue + if in_code_block or not PLATFORM_TOKEN.search(line): + continue + for m in PLATFORM_TOKEN.finditer(line): + before = line[:m.start()] + after = line[m.end():] + # A wrapped line can leave the determiner on the previous line. + lookback = before if before.strip() else (lines[i - 2] if i >= 2 else "") + if PLATFORM_DETERMINER.search(lookback): + continue + if after[:1] == "-": # attributive compound, e.g. "{{...}}-hosted" + continue + if re.match(r"^\s*[*-]\s+\*\*\s*$", before): # bold term lead + continue + + # Order matters. Possessive and subject positions are unambiguous, + # so they are classified first. The attributive exemption applies + # only to the prepositional case, which is the one that is genuinely + # ambiguous: "with {...} orchestration" modifies a noun and is fine + # bare, while "with {...}." is referential and needs the article. + # Applying the exemption earlier would swallow "{...} provides ...", + # since "provides" is just a lowercase word to a regex. + if after.startswith("'s") or after.startswith("\u2019s"): + position = "possessive" + elif PLATFORM_SUBJECT_VERBS.match(after) and PLATFORM_CLAUSE_START.search(before): + position = "as a clause subject" + elif PLATFORM_PREPOSITIONS.search(lookback): + nxt = PLATFORM_NEXT_WORD.match(after) + if nxt and nxt.group(1) not in PLATFORM_FUNCTION_WORDS: + continue # attributive: the token modifies the next noun + position = "after a preposition" + else: + continue + + issues.append(Issue( + filepath, i, "platform-determiner", + f"{{VARS.WARP_AUTOMATION_PLATFORM}} used {position} without a " + f"determiner. The value is a common-noun phrase, so this renders " + f'as e.g. "with Automation Platform". Add "the" before it.', + "warning", + )) + return issues + + +# "Warp Factories" is the product; a "factory" is an instance. A bare +# capitalized "Factory" is never a proper noun, with two classes of exception: +# the feature's own name (Factory MCP) and verbatim product strings the docs +# quote from the app. Both are matched on the word that FOLLOWS "Factory". +FACTORY_ALLOWED_NEXT_WORDS = { + # Feature name, shipped as such: the server registers as `warp-factory`. + "MCP", + # Verbatim UI strings. Changing these would make the docs disagree with the + # screen, so they are quoted as-is until the app copy changes. + "name", # **Factory name** field in the setup wizard + "definition", # **Factory definition** sidebar tab + "integrations", # **Factory integrations** section in Settings + "running", # "Factory running!" on the setup summary screen +} +# Whole phrases that are correct despite containing a bare "Factory": verbatim +# UI strings the docs quote, and references to unrelated products that happen to +# be named Factory. +FACTORY_ALLOWED_PHRASES = ( + "Add your Factory to your team", # verbatim setup wizard heading + "Factory's CLI coding agent", # Factory.ai, the company behind Droid +) +FACTORY_BARE = re.compile(r"\bFactory\b") +# Markup that can sit between the start of a sentence and the word itself: +# heading hashes, list bullets, blockquotes, emphasis, link text, quotes, and +# table cell pipes. Stripped before deciding whether the position is initial. +FACTORY_LEADING_MARKUP = re.compile(r"[\s*_\[\(\"'|>#\-\u2014\u2013]+$") + + +def check_factory_proper_noun(lines: List[str], filepath: str) -> List[Issue]: + """Flag a bare capitalized "Factory" used as a proper noun. + + The rule works like GitHub Actions: "Warp Factories" is the product and is + always written in full, an individual "factory" is a lowercase common noun, + and there is no product called "Factory". See AGENTS.md -> Warp Factories + terminology. + + Quiet by construction, because most capitalized "Factory" occurrences are + legitimate: + * "Warp Factories" and "Warp Factory" -- the product name + * sentence-, heading-, bullet-, link-, quote-, and cell-initial position, + where the capital is positional rather than a proper noun + * fenced code blocks, inline code, link targets, and HTML attributes + * frontmatter, whose titles and sidebar labels are headline-style + * the exceptions in FACTORY_ALLOWED_NEXT_WORDS and + FACTORY_ALLOWED_PHRASES + """ + issues = [] + in_code_block = False + in_frontmatter = False + for i, line in enumerate(lines, 1): + stripped = line.strip() + if i == 1 and stripped == "---": + in_frontmatter = True + continue + if in_frontmatter: + if stripped == "---": + in_frontmatter = False + continue + if stripped.startswith("```"): + in_code_block = not in_code_block + continue + if in_code_block or "Factory" not in line: + continue + if any(phrase in line for phrase in FACTORY_ALLOWED_PHRASES): + continue + # Strip inline code, link targets, and HTML/JSX attributes: a slug like + # `/factories/factory-as-code/` or an `alt="..."` value is not prose. + prose = re.sub(r"`[^`]*`", "", line) + prose = re.sub(r"\]\([^)]*\)", "]", prose) + prose = re.sub(r'\w+="[^"]*"', "", prose) + for m in FACTORY_BARE.finditer(prose): + before = prose[:m.start()] + after = prose[m.end():] + if before.rstrip().endswith("Warp"): + continue # "Warp Factories" / "Warp Factory" + # Strip the markup between the sentence start and the word, then ask + # whether anything is left. Nothing left means the capital is + # positional; a preceding clause means it is being used as a name. + prefix = FACTORY_LEADING_MARKUP.sub("", before) + if not prefix or prefix.endswith((".", "!", "?", ":", "|", "—")): + continue + nxt = re.match(r"\s+(\w+)", after) + if nxt and nxt.group(1) in FACTORY_ALLOWED_NEXT_WORDS: + continue + issues.append(Issue( + filepath, i, "factory-proper-noun", + 'Bare "Factory" used as a proper noun. "Warp Factories" is the ' + 'product and is written in full; an individual factory is ' + 'lowercase. Write "factory" (or "Warp Factories" if you mean ' + "the product).", + "warning", + )) + return issues + + +# --------------------------------------------------------------------------- +# Tone checks (report-only, never auto-fixed) +# --------------------------------------------------------------------------- + +def _strip_inline_code(line: str) -> str: + """Remove inline code spans so CLI flags and API fields never trip tone checks.""" + return re.sub(r"`[^`]*`", "", line) + + +def check_tone_buzzwords(lines: List[str], filepath: str) -> List[Issue]: + """Flag AI-ism buzzwords (AGENTS.md → Voice & tone → Words to avoid). + + Report-only: the fix is a rewrite that names the specific capability, + which cannot be automated. Frontmatter is scanned too — a buzzword in a + description is still a buzzword in search results. + """ + issues = [] + in_code_block = False + for i, line in enumerate(lines, 1): + stripped = line.strip() + if stripped.startswith("```"): + in_code_block = not in_code_block + continue + if in_code_block: + continue + prose = _strip_inline_code(line) + for pattern, suggestion in TONE_BUZZWORDS: + for m in re.finditer(pattern, prose, re.IGNORECASE): + issues.append(Issue( + filepath, i, "tone-buzzword", + f'"{m.group(0)}": {suggestion}', + "warning", + )) + return issues + + +def check_meta_openers(lines: List[str], filepath: str) -> List[Issue]: + """Flag meta-text that narrates the page ("This page covers..."). + + The title and description already frame the page; body prose should state + the thing itself. AGENTS.md → Voice & tone → Every sentence earns its place. + """ + issues = [] + in_code_block = False + for i, line in enumerate(lines, 1): + stripped = line.strip() + if stripped.startswith("```"): + in_code_block = not in_code_block + continue + if in_code_block: + continue + if META_OPENER.search(_strip_inline_code(line)): + issues.append(Issue( + filepath, i, "tone-meta-opener", + "Meta-text that narrates the page ('This page covers...'). " + "Cut it and state the thing itself", + "warning", + )) + return issues + + +def check_callout_density(lines: List[str], filepath: str) -> List[Issue]: + """Flag back-to-back callouts and pages over the callout budget. + + AGENTS.md → Callouts and hints: never consecutive, at most one per + section. Per-page count is the lintable proxy for the per-section rule. + """ + issues = [] + in_code_block = False + in_callout = False + open_lines: List[int] = [] + last_close_line: Optional[int] = None + for i, line in enumerate(lines, 1): + stripped = line.strip() + if stripped.startswith("```"): + in_code_block = not in_code_block + continue + if in_code_block: + continue + if not in_callout and CALLOUT_OPEN.match(line): + open_lines.append(i) + if last_close_line is not None and all( + not lines[j].strip() for j in range(last_close_line, i - 1) + ): + issues.append(Issue( + filepath, i, "callout-consecutive", + "Two callouts back to back; merge them or move one into " + "body prose (AGENTS.md → Callouts and hints)", + "warning", + )) + in_callout = True + continue + if in_callout and CALLOUT_CLOSE.match(line): + in_callout = False + last_close_line = i + if len(open_lines) > CALLOUT_PAGE_BUDGET: + issues.append(Issue( + filepath, open_lines[CALLOUT_PAGE_BUDGET], "callout-density", + f"{len(open_lines)} callouts on one page; keep to at most one per " + "section and move the rest into body prose", + "warning", + )) + return issues + + # Cache glossary terms once at module level _glossary_cache: Optional[set] = None @@ -921,10 +1450,15 @@ def run_all_checks(filepath: Path) -> List[Issue]: issues.extend(check_screenshot_widths(lines, str(filepath))) issues.extend(check_video_embed_titles(lines, str(filepath))) issues.extend(check_callout_syntax(lines, str(filepath))) + issues.extend(check_tone_buzzwords(lines, str(filepath))) + issues.extend(check_meta_openers(lines, str(filepath))) + issues.extend(check_callout_density(lines, str(filepath))) issues.extend(check_product_casing(lines, str(filepath))) issues.extend(check_oz_terms(lines, str(filepath))) issues.extend(check_deprecated_terms(lines, str(filepath))) issues.extend(check_hardcoded_vars(lines, str(filepath))) + issues.extend(check_platform_determiner(lines, str(filepath))) + issues.extend(check_factory_proper_noun(lines, str(filepath))) issues.extend(check_unrecognized_terms(lines, str(filepath), _get_glossary())) return issues diff --git a/.agents/skills/style_lint/test_factory_proper_noun.py b/.agents/skills/style_lint/test_factory_proper_noun.py new file mode 100644 index 000000000..43fab69be --- /dev/null +++ b/.agents/skills/style_lint/test_factory_proper_noun.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 +"""Regression cases for check_factory_proper_noun. + +Run from the repo root: + python3 .agents/skills/style_lint/test_factory_proper_noun.py + +The rule is narrow: "Warp Factories" is the product, an individual "factory" is +a lowercase common noun, and a bare capitalized "Factory" is never a proper +noun. Almost all of the difficulty is in NOT firing, because a capital F is +usually positional rather than a name -- headings, sidebar labels, bullets, +table cells, quoted terms, and link text all start with one legitimately. + +The first draft of this check produced 9 hits across the docs and 8 of them +were wrong: heading-initial ("## Factory-definition pull request checks"), +list-initial link text ("* [Factory dashboard](...)"), frontmatter labels, a +quoted term at the start of a sentence, a verbatim UI string ("Add your Factory +to your team"), and a reference to Factory.ai, the company behind Droid. Each +of those is a case below. If you touch the check, run this first. +""" +import importlib.util +import pathlib +import sys + +HERE = pathlib.Path(__file__).parent +spec = importlib.util.spec_from_file_location("style_lint", HERE / "style_lint.py") +style_lint = importlib.util.module_from_spec(spec) +spec.loader.exec_module(style_lint) + +CASES = [ + # (text, should_flag, description) + # --- genuine proper-noun uses --- + ("See [Factory agents](/factories/factory-agents/) for the roles.", True, + "mid-sentence link text"), + ("Every Factory gets its own Slack app.", True, + "mid-sentence, standing in for the product"), + ("Runs started by the Factory are tracked.", True, + "definite article plus a capital"), + ("Review the Factory metrics before deciding.", True, + "mid-sentence attributive use of the banned form"), + # --- the product name, written correctly --- + ("Warp Factories is in Early Access.", False, "the product name"), + ("Connect Warp Factories to your repository.", False, "product name mid-sentence"), + # --- positional capitals --- + ("## Factory-definition pull request checks", False, "heading-initial"), + ("### Factory agents", False, "subheading-initial"), + ("* [Factory dashboard](/factories/factory-dashboard/) - the surface.", False, + "list-initial link text"), + ("Factory setup doesn't choose models for you.", False, "sentence-initial"), + ('"Factory dashboard" names the whole surface.', False, "quoted term, sentence-initial"), + ("| **Factory definition** | The definition files |", False, "table-cell-initial"), + ("The tab is read-only. Factory owners can still edit it.", False, + "initial after a sentence boundary"), + # --- sanctioned exceptions --- + ("Send work through the Factory MCP.", False, "Factory MCP is the shipped feature name"), + ("Enter a **Factory name**, such as `Payments`.", False, "verbatim UI field label"), + ("The **Factory definition** tab lists the files.", False, "verbatim UI tab label"), + ("1. In factory setup, go to **Add your Factory to your team**.", False, + "verbatim UI string, allowlisted as a phrase"), + ("* **Droid** — Factory's CLI coding agent", False, + "Factory.ai, an unrelated company"), + # --- non-prose --- + ("Fetch `/api/v1/Factory/source` for the definition.", False, "inline code"), + ('<img alt="Factory settings page" src="x.png" />', False, "HTML attribute"), +] + +FRONTMATTER_CASE = ( + ['---', 'title: Factory dashboard', 'sidebar:', ' label: "Factory agents"', '---', + 'The factory dashboard is the web app for one factory.'], + False, + "frontmatter titles and labels are headline-style", +) + + +def main() -> int: + failures = 0 + for text, should_flag, description in CASES: + flagged = bool(style_lint.check_factory_proper_noun(text.split("\n"), "test.mdx")) + ok = flagged == should_flag + if not ok: + failures += 1 + print(f" [{'PASS' if ok else 'FAIL'}] {description:<48} flagged={flagged}") + + lines, should_flag, description = FRONTMATTER_CASE + flagged = bool(style_lint.check_factory_proper_noun(lines, "test.mdx")) + ok = flagged == should_flag + if not ok: + failures += 1 + print(f" [{'PASS' if ok else 'FAIL'}] {description:<48} flagged={flagged}") + + total = len(CASES) + 1 + print() + if failures: + print(f"{failures} of {total} cases regressed.") + return 1 + print(f"All {total} cases behave correctly.") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.agents/skills/style_lint/test_hardcoded_var_exemptions.py b/.agents/skills/style_lint/test_hardcoded_var_exemptions.py new file mode 100644 index 000000000..321272077 --- /dev/null +++ b/.agents/skills/style_lint/test_hardcoded_var_exemptions.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +"""Regression cases for the RENAME_EXEMPT_SUFFIXES_BY_LITERAL guard in check_hardcoded_vars. + +Run from the repo root: + python3 .agents/skills/style_lint/test_hardcoded_var_exemptions.py + +"Oz Cloud API Keys" is a literal Settings label the Warp client still renders +(see terminology.md's "What still says Oz"), so a bare "Oz" immediately +followed by " Cloud API Keys" must not be flagged as a hardcoded var that +should use {VARS.WARP_AUTOMATION_PLATFORM}. A previous migration got this +wrong exactly once (QUALITY-1768); this guard is what would have caught it. + +The exemption is scoped to the "Oz" literal only, and within that literal it +is still just a suffix match, so it must stay narrow on two axes: a bare "Oz" +on its own, or "Oz" followed by unrelated text, must still be flagged; and a +*different* rename-sensitive literal that happens to end in the same suffix +(e.g. a hardcoded "Automation Platform Cloud API Keys") must still be flagged +too -- an earlier draft of this guard used one suffix list shared by every +literal, which silently suppressed that exact case. +""" +import importlib.util +import pathlib +import sys + +HERE = pathlib.Path(__file__).parent +spec = importlib.util.spec_from_file_location("style_lint", HERE / "style_lint.py") +style_lint = importlib.util.module_from_spec(spec) +spec.loader.exec_module(style_lint) + +CASES = [ + # (text, should_flag, description) + ("Click **Oz Cloud API Keys**.", False, "exempt literal Settings label"), + ( + "**Settings** > **Cloud platform** > **Oz Cloud API Keys**.", + False, + "exempt literal Settings label inside a full path", + ), + ("Oz is deprecated in favor of the platform.", True, "bare Oz still flagged"), + ("Ask Oz to do this.", True, "bare Oz followed by unrelated text"), + ("Install the Oz CLI globally.", True, "distinct rename-sensitive entry still flagged"), + ( + "Click **Automation Platform Cloud API Keys**.", + True, + "different literal sharing the exempt suffix still flagged", + ), +] + + +def main() -> int: + failures = 0 + for text, should_flag, description in CASES: + issues = style_lint.check_hardcoded_vars(text.split("\n"), "test.mdx") + flagged = bool(issues) + ok = flagged == should_flag + if not ok: + failures += 1 + print(f" [{'PASS' if ok else 'FAIL'}] {description:<52} flagged={flagged}") + + print() + if failures: + print(f"{failures} of {len(CASES)} cases regressed.") + return 1 + print(f"All {len(CASES)} cases behave correctly.") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.agents/skills/style_lint/test_platform_determiner.py b/.agents/skills/style_lint/test_platform_determiner.py new file mode 100644 index 000000000..bfb4dc060 --- /dev/null +++ b/.agents/skills/style_lint/test_platform_determiner.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +"""Regression cases for check_platform_determiner. + +Run from the repo root: + python3 .agents/skills/style_lint/test_platform_determiner.py + +The check has to separate three referential positions (possessive, +prepositional, subject) from several attributive ones that are correctly bare. +The ordering between those tests is load-bearing and easy to get wrong: an +earlier draft applied the attributive exemption before classifying position, +which silently stopped flagging "{...} provides ..." because "provides" is +just a lowercase word to a regex. A later draft flagged "automated {...} runs" +because "runs" is in the subject-verb list even though it is a noun there. + +Both bugs are covered below. If you touch the check, run this first. +""" +import importlib.util +import pathlib +import sys + +HERE = pathlib.Path(__file__).parent +spec = importlib.util.spec_from_file_location("style_lint", HERE / "style_lint.py") +style_lint = importlib.util.module_from_spec(spec) +spec.loader.exec_module(style_lint) + +T = "{VARS.WARP_AUTOMATION_PLATFORM}" + +CASES = [ + # (text, should_flag, description) + (f"Run agents with {T}.", True, "prepositional - needs the article"), + (f"{T} provides the CLI and API.", True, "clause subject - needs the article"), + (f"Connects to {T}'s backend.", True, "possessive - needs the article"), + (f"Handled by {T}, then reported.", True, "prepositional before a comma"), + (f"Run agents with the {T}.", False, "determiner already present"), + (f"Use {T} orchestration for this.", False, "attributive - modifies a noun"), + (f"An environment for automated {T} runs.", False, "attributive - 'runs' is a noun here"), + (f"Available in {T} cloud environments.", False, "attributive - modifies a noun"), + (f"Deploy on {T}-hosted infrastructure.", False, "hyphenated compound"), + (f"* **{T}** - the platform.", False, "bold term lead in a definition list"), + (f"available with the\n{T} for teams.", False, "determiner on the previous line"), +] + + +def main() -> int: + failures = 0 + for text, should_flag, description in CASES: + flagged = bool(style_lint.check_platform_determiner(text.split("\n"), "test.mdx")) + ok = flagged == should_flag + if not ok: + failures += 1 + print(f" [{'PASS' if ok else 'FAIL'}] {description:<48} flagged={flagged}") + + print() + if failures: + print(f"{failures} of {len(CASES)} cases regressed.") + return 1 + print(f"All {len(CASES)} cases behave correctly.") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.agents/skills/style_lint/test_tone_checks.py b/.agents/skills/style_lint/test_tone_checks.py new file mode 100644 index 000000000..b50d1446c --- /dev/null +++ b/.agents/skills/style_lint/test_tone_checks.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +"""Regression cases for the tone checks: check_tone_buzzwords, +check_meta_openers, and check_callout_density. + +Run from the repo root: + python3 .agents/skills/style_lint/test_tone_checks.py + +These are regexes over prose, which is exactly where false positives creep +in. The intentional exclusions (harness, unlock, elevated, journey) must +stay silent, inline code and fenced code blocks must never trip a match, and +the callout checks must tell "back to back" apart from callouts separated by +body prose. +""" +import importlib.util +import pathlib +import sys + +HERE = pathlib.Path(__file__).parent +spec = importlib.util.spec_from_file_location("style_lint", HERE / "style_lint.py") +style_lint = importlib.util.module_from_spec(spec) +spec.loader.exec_module(style_lint) + +BUZZWORD_CASES = [ + # (text, should_flag, description) + ("This feature integrates seamlessly with your workflow.", True, "marketing adjective - seamless"), + ("Leverage the API to automate this.", True, "inflated verb - leverage"), + ("The dashboard shows the full landscape of running agents.", True, "abstract dramatics - landscape"), + ("Enter the realm of agentic development.", True, "abstract dramatics - realm"), + ("This is designed to help you ship faster.", True, "filler frame - designed to"), + ("This ensures that every run starts clean.", True, "filler frame - ensures that"), + ("Environment variables allow you to pass secrets safely.", True, "filler frame - allows you to"), + ("Configure the key in order to authenticate.", True, "filler frame - in order to"), + ("It's important to note that this is a preview feature.", True, "filler frame - it's important to note"), + ("Use the agent harness to run this command.", False, "excluded - harness has a legitimate technical use"), + ("Enter your password to unlock the keychain.", False, "excluded - unlock has a legitimate technical use"), + ("This requires elevated permissions.", False, "excluded - elevated has a legitimate technical use"), + ("Follow the onboarding journey to get set up.", False, "excluded - journey stays out of the lint"), + ("Run `leverage-config` to see current settings.", False, "inline code is stripped before matching"), +] + +META_OPENER_CASES = [ + (["This page covers how the integration works."], True, "meta-opener - covers"), + (["This guide explains the setup process."], True, "meta-opener - explains"), + (["This section walks through the API."], True, "meta-opener - walks through"), + (["This document walks you through configuration."], True, "meta-opener - walks you through"), + (["Run agents directly in your CI pipeline."], False, "states the thing itself"), + (["```", "This page covers setup in a code sample.", "```"], False, "fenced code block is skipped"), +] + +CALLOUT_DENSITY_CASES = [ + # (lines, should_flag, description) + ([":::note", "one", ":::", "", ":::caution", "two", ":::"], True, "consecutive - only a blank line between"), + ([":::note", "one", ":::", "Some body prose separates these.", ":::caution", "two", ":::"], False, "not consecutive - body prose between"), + ([":::note", "1", ":::", ":::note", "2", ":::", ":::note", "3", ":::", ":::note", "4", ":::", ":::note", "5", ":::", "sep", ":::note", "6", ":::"], True, "over the per-page callout budget"), +] + + +def main() -> int: + failures = 0 + total = 0 + + print("check_tone_buzzwords:") + for text, should_flag, description in BUZZWORD_CASES: + total += 1 + flagged = bool(style_lint.check_tone_buzzwords(text.split("\n"), "test.mdx")) + ok = flagged == should_flag + if not ok: + failures += 1 + print(f" [{'PASS' if ok else 'FAIL'}] {description:<55} flagged={flagged}") + + print("\ncheck_meta_openers:") + for lines, should_flag, description in META_OPENER_CASES: + total += 1 + flagged = bool(style_lint.check_meta_openers(lines, "test.mdx")) + ok = flagged == should_flag + if not ok: + failures += 1 + print(f" [{'PASS' if ok else 'FAIL'}] {description:<55} flagged={flagged}") + + print("\ncheck_callout_density:") + for lines, should_flag, description in CALLOUT_DENSITY_CASES: + total += 1 + flagged = bool(style_lint.check_callout_density(lines, "test.mdx")) + ok = flagged == should_flag + if not ok: + failures += 1 + print(f" [{'PASS' if ok else 'FAIL'}] {description:<55} flagged={flagged}") + + print() + if failures: + print(f"{failures} of {total} cases regressed.") + return 1 + print(f"All {total} cases behave correctly.") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.agents/skills/sync-error-docs/SKILL.md b/.agents/skills/sync-error-docs/SKILL.md index 89279fda0..209c67913 100644 --- a/.agents/skills/sync-error-docs/SKILL.md +++ b/.agents/skills/sync-error-docs/SKILL.md @@ -2,13 +2,13 @@ name: sync-error-docs description: >- Detect new platform error codes in warp-server that are missing documentation - pages in the docs repo. Creates doc pages, astro.config.mjs (sidebar config) entries, and - redirects for any gaps. Use on a weekly schedule or when error codes change. + pages in the docs repo. Creates doc pages, sidebar entries, and redirects for + any gaps. Use on a weekly schedule or when error codes change. --- # Sync Error Docs -Ensure every `ErrorCode` in `platformerrors.go` has a corresponding documentation page, astro.config.mjs (sidebar config) entry, and redirects. +Ensure every `ErrorCode` in `platformerrors.go` has a corresponding documentation page, sidebar entry, and redirect. ## Repos @@ -17,6 +17,8 @@ This skill requires two repos in the agent's environment: - `warpdotdev/warp-server` — source of truth for error codes - `warpdotdev/docs` — documentation pages +All paths below are relative to the **docs repo root**, with `warp-server` checked out as a sibling directory (`../warp-server`), matching the convention used by `sync-openapi-spec`. + ## Workflow ### Step 1: Extract error codes from warp-server @@ -24,7 +26,7 @@ This skill requires two repos in the agent's environment: Grep the `ErrorCode` constants from `platformerrors.go`: ```bash -grep 'ErrorCode = "' warp-server/logic/ai/ambient_agents/platformerrors/platformerrors.go +grep 'ErrorCode = "' ../warp-server/logic/ai/ambient_agents/platformerrors/platformerrors.go ``` Each match yields a line like `InsufficientCredits ErrorCode = "insufficient_credits"`. Extract the quoted string — that is the canonical error code (underscore format). @@ -34,7 +36,7 @@ Each match yields a line like `InsufficientCredits ErrorCode = "insufficient_cre List the markdown files in the errors directory: ```bash -ls docs/src/content/docs/reference/api-and-sdk/troubleshooting/errors/*.mdx +ls src/content/docs/reference/api-and-sdk/troubleshooting/errors/*.mdx ``` Each file is named `{hyphen-code}.mdx` (e.g., `insufficient-credits.mdx`). Ignore `index.mdx`. @@ -59,68 +61,111 @@ To fill in the template accurately: Place the new file at: ``` -docs/src/content/docs/reference/api-and-sdk/troubleshooting/errors/{hyphen-code}.mdx +src/content/docs/reference/api-and-sdk/troubleshooting/errors/{hyphen-code}.mdx ``` -### Step 5: Add to astro.config.mjs (sidebar config) +### Step 5: Add to the sidebar -Add the new page to `docs/src/content/docs/reference/astro.config.mjs (sidebar config)` under the Errors section. +The sidebar lives in `src/sidebar.ts`. (`astro.config.mjs` only imports it via `starlightSidebarTopics(sidebarTopics)` — do not edit the sidebar there.) -- User errors: insert before `authentication_required` (which begins the platform errors group) -- Platform errors: append after `internal_error` (currently the last entry in the list) -- Note: the list has no explicit section labels. The platform errors group starts at `authentication_required` and currently contains `authentication_required`, `resource_unavailable`, and `internal_error`. -- Use the format: ` * [{underscore\_code}](api-and-sdk/troubleshooting/errors/{hyphen-code}.md)` -- Note: underscores in the display name must be escaped as `\_` for Astro Starlight +Find the `Errors` group inside the `API Troubleshooting` group, under the `Reference` topic. Its `items` array begins with the index entry: -### Step 6: Add vercel.json (redirects) redirect +```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', +``` -Add a redirect entry in `docs/src/content/docs/reference/vercel.json (redirects)` that maps the underscore path to the hyphen path. This handles visitors who type the underscore form directly: +Add the new page as a bare slug string using the **hyphenated** code: -```yaml -api-and-sdk/troubleshooting/errors/{underscore_code}: api-and-sdk/troubleshooting/errors/{hyphen-code}.md +```ts +'reference/api-and-sdk/troubleshooting/errors/{hyphen-code}', ``` -Before adding, check if the entry already exists to avoid duplicates on re-runs: +Rules: +- Use a plain slug string. Do not use Markdown link syntax — `* [name](path.md)` is GitBook-era format and will not build. +- No `.md`/`.mdx` extension and no leading slash. +- Only add an explicit `{ slug, label }` object if the auto-derived title is wrong; the existing error entries all rely on the derived title. +- Append after the last existing error entry unless a grouping order is obvious from the surrounding entries. The list is not alphabetized and has no section labels. + +### Step 6: Add the underscore-to-hyphen redirects (only when the forms differ) + +Error codes are underscored (`insufficient_credits`) but page slugs are hyphenated (`insufficient-credits`). Add redirects to `vercel.json` (at the repo root) so the underscore form resolves. + +**Skip this step entirely for a code that contains no underscore.** Its hyphenated slug is the same string as the code, so there is nothing to redirect: the no-slash entry would be a redundant trailing-slash normalization, and the trailing-slash entry would have `source` equal to `destination` — a self-redirect, which is an infinite loop. `conflict` is the current example. It has no redirect entries in `vercel.json`, and that is correct, not a gap. Only add redirects when `{underscore_code}` and `{hyphen-code}` actually differ. + +**Otherwise add two entries, not one.** Every multi-word error code currently in `vercel.json` has both a no-trailing-slash and a trailing-slash source (34 entries covering 17 codes, with no code having only one form). Adding a single variant leaves the new code with half the coverage of every existing one, and the `/errors/:code/` catch-all forwards a trailing slash through, so the slashed underscore path would not resolve. + +Check for existing entries first, to stay idempotent across re-runs: ```bash -grep 'api-and-sdk/troubleshooting/errors/{underscore_code}:' docs/src/content/docs/reference/vercel.json (redirects) +grep -F '"/reference/api-and-sdk/troubleshooting/errors/{underscore_code}"' vercel.json +grep -F '"/reference/api-and-sdk/troubleshooting/errors/{underscore_code}/"' vercel.json ``` -If it returns a match, skip this step. Otherwise, add the entry under the existing `redirects:` block. - -### Step 7: Create site-level redirect +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}/", + "statusCode": 308 +}, +{ + "source": "/reference/api-and-sdk/troubleshooting/errors/{underscore_code}/", + "destination": "/reference/api-and-sdk/troubleshooting/errors/{hyphen-code}/", + "statusCode": 308 +} +``` -The API's `type` URI uses the format `https://docs.warp.dev/errors/{underscore_code}`. This needs a site-level redirect to reach the actual doc page. +Both `destination` values carry a trailing slash — every existing error redirect does, regardless of its source form. -<!-- TODO: Post-migration, update this step to use vercel.json redirects instead of the GitBook API. --> -Use the existing `docs_redirects.py` script (requires `GITBOOK_TOKEN` env var and `requests` Python package). +### Step 7: Confirm the site-level `/errors/` route (usually no action) -First, check if the redirect already exists to avoid duplicates on re-runs: +The API's `type` URI uses `https://docs.warp.dev/errors/{underscore_code}`. **Catch-all redirects already cover every code**, in both slash forms, so no per-code work is normally needed: -```bash -python3 docs/scripts/docs_redirects.py get-by-source \ - --source "/errors/{underscore_code}" +```json +{ + "source": "/errors/:code", + "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", + "statusCode": 308 +}, +{ + "source": "/errors/:code/", + "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", + "statusCode": 308 +} ``` -If a redirect is returned, skip the `create` step. Otherwise, create it: +These forward `:code` unchanged, so `/errors/insufficient_credits` lands on the underscored path and is then picked up by the step 6 redirects. Completing step 6 is therefore sufficient — which is why step 6 must add both slash variants. + +Verify both catch-alls are still present: ```bash -python3 docs/scripts/docs_redirects.py create \ - --source "/errors/{underscore_code}" \ - --destination-json '{"kind": "url", "url": "https://docs.warp.dev/reference/api-and-sdk/troubleshooting/errors/{hyphen-code}"}' +grep -F '"/errors/:code"' vercel.json +grep -F '"/errors/:code/"' vercel.json ``` -Read `references/redirect-patterns.md` in this skill directory for more details on the redirect setup. +If either is missing, restore it rather than adding per-code entries. Read `references/redirect-patterns.md` for background. -If `GITBOOK_TOKEN` is not set, skip this step and note it in the report. +This step no longer uses the GitBook API. The former `docs_redirects.py` / `GITBOOK_TOKEN` flow was left over from the GitBook era and does not apply to the Astro Starlight site. ### Step 8: Commit and open PR -If any pages were created: +If any pages were created, follow the "One standing PR per automation" contract in `.agents/references/skill-authoring-guidelines.md` — new error codes trickle in over time and each dated PR would edit the same `src/sidebar.ts` and `vercel.json`, so they would conflict. -1. Create a branch in the docs repo (e.g., `sync-error-docs/{date}`) -2. Commit all changes with a descriptive message -3. Push and open a PR targeting `main`. Write the body to a file: +1. Look for an existing open PR, then check out the stable branch: + ```bash + gh pr list --repo warpdotdev/docs --state open \ + --search 'add error code pages for new platform errors in:title' \ + --json number,headRefName + + git fetch origin + git checkout sync-error-docs 2>/dev/null || git checkout -b sync-error-docs origin/main + git rebase origin/main + ``` +2. Commit all changes with a descriptive message. +3. Push. If a PR already exists the push updates it — append the new codes under the existing `## New error code pages` heading rather than adding a duplicate heading, which `check_pr_body.py` rejects. If none exists, open one. Write the body to a file: ```bash cat > /tmp/sync-error-docs-pr-body.md << 'EOF' ## New error code pages @@ -142,9 +187,12 @@ Summarize what was found: - Total error codes in `platformerrors.go` - Number of existing doc pages - New codes that were missing pages (list them) -- Pages created, astro.config.mjs (sidebar config) entries added, redirects configured +- Pages created, `src/sidebar.ts` entries added, redirects configured +- Any codes skipped for redirects because they contain no underscore - Or confirm everything is already in sync +Follow the actionable-only Slack rule in `.agents/references/skill-authoring-guidelines.md`: a run that finds everything already in sync writes this report to the run output and posts nothing. + ## References - `references/error-page-template.md` — template for new error doc pages diff --git a/.agents/skills/sync-error-docs/references/redirect-patterns.md b/.agents/skills/sync-error-docs/references/redirect-patterns.md index 0e53da69a..cf0f5e0e3 100644 --- a/.agents/skills/sync-error-docs/references/redirect-patterns.md +++ b/.agents/skills/sync-error-docs/references/redirect-patterns.md @@ -1,6 +1,6 @@ # Redirect Patterns -Two types of redirects are needed for each error code to ensure the API's `type` URI resolves to the correct documentation page. +How an API error's `type` URI resolves to its documentation page, and what (if anything) a new error code needs. ## Background @@ -10,75 +10,100 @@ The `platformerrors` package defines `ProblemTypeBaseURI = "https://docs.warp.de https://docs.warp.dev/errors/insufficient_credits ``` -But the actual documentation page lives at: +The documentation page lives at: ``` https://docs.warp.dev/reference/api-and-sdk/troubleshooting/errors/insufficient-credits ``` -Two redirects bridge this gap: -1. A **site-level redirect** from `/errors/{underscore_code}` to the full doc page URL -2. A **Astro Starlight space redirect** from the underscore filename to the hyphen filename (within the reference space) +Two gaps separate them: -## 1. Site-level redirect (Astro Starlight API) +1. **Path prefix** — `/errors/{code}` versus the full `/reference/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. -<!-- TODO: Post-migration, update this to use vercel.json redirects instead of the GitBook API. --> -This redirect is created via the GitBook API using `scripts/docs_redirects.py`. It requires the `GITBOOK_TOKEN` environment variable. +Both are handled by entries in `vercel.json` at the repo root. All redirects for the site live in that one file. -### Create a redirect +## 1. Prefix redirect (already generic — no per-code work) -```bash -python3 docs/scripts/docs_redirects.py create \ - --source "/errors/{underscore_code}" \ - --destination-json '{"kind": "url", "url": "https://docs.warp.dev/reference/api-and-sdk/troubleshooting/errors/{hyphen-code}"}' -``` +Catch-alls already cover every error code, current and future, in both slash forms: -### Check if a redirect already exists - -```bash -python3 docs/scripts/docs_redirects.py get-by-source \ - --source "/errors/{underscore_code}" +```json +{ + "source": "/errors/:code", + "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", + "statusCode": 308 +}, +{ + "source": "/errors/:code/", + "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", + "statusCode": 308 +} ``` -### List existing error redirects +`:code` is forwarded unchanged, so `/errors/insufficient_credits` lands on the underscored path, which the separator redirects below then resolve. For a single-word code the forwarded path is already the canonical slug, so nothing further is needed. Note that the trailing-slash catch-all preserves the slash into the destination, which is why the separator step must also cover the slashed form whenever it applies. + +Because these rules are generic, **adding a new error code requires no change here.** Just confirm both still exist: ```bash -python3 docs/scripts/docs_redirects.py list --search "/errors/" +grep -F '"/errors/:code"' vercel.json +grep -F '"/errors/:code/"' vercel.json ``` -### Notes +If either is missing, restore that rule rather than adding one entry per code. -- The script uses hardcoded org ID (`-MbqIZLCtzerswjFm7mh`) and site ID (`site_FKhQ8`) which are the Warp docs defaults -- If `GITBOOK_TOKEN` is not set, skip this step and report it — the redirect can be created manually later -- The destination `kind` is `"url"` (external URL redirect), not `"site-page"` +There are also bare `/errors` and `/errors/` redirects pointing at the errors index, which likewise need no per-code maintenance. -## 2. Astro Starlight space redirect (vercel.json (redirects)) +## 2. Separator redirects (zero or two entries per code) -This redirect lives in `docs/src/content/docs/reference/vercel.json (redirects)` and handles in-space navigation where someone might visit the underscore form of the path. +These are the only redirects a new error code can need, and some codes need none. -### Format +**First check whether the code contains an underscore.** If it does not, its hyphenated slug is the same string, there is no separator to bridge, and you add nothing — skip to the rules below for why. Only codes whose underscored and hyphenated forms actually differ get entries, and those get two. -Add an entry under the `redirects:` key: +For a code that does differ, map the underscored form to the hyphenated page slug in both slash forms: -```yaml -redirects: - # ... existing redirects ... +```json +{ + "source": "/reference/api-and-sdk/troubleshooting/errors/{underscore_code}", + "destination": "/reference/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}/", + "statusCode": 308 +} +``` - # Error code underscore→hyphen redirects - api-and-sdk/troubleshooting/errors/{underscore_code}: api-and-sdk/troubleshooting/errors/{hyphen-code}.md +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/", + "statusCode": 308 +}, +{ + "source": "/reference/api-and-sdk/troubleshooting/errors/insufficient_credits/", + "destination": "/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/", + "statusCode": 308 +} ``` -### Example +Rules: -For `insufficient_credits`: +- **Skip a code with no underscore.** If `{underscore_code}` and `{hyphen-code}` are the same string, there is nothing to bridge. The no-slash entry would be a redundant trailing-slash normalization and the trailing-slash entry would be a self-redirect with `source` equal to `destination` — an infinite loop. `conflict` is the current example and correctly has no entries. +- **Otherwise add both slash variants.** All 17 multi-word codes currently in `vercel.json` have both (34 entries); none has only one. A single variant leaves the new code less covered than every existing one, and the trailing-slash catch-all in section 1 forwards its slash through, so the slashed underscore path would otherwise 404. +- `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. +- Check for existing entries before adding, so re-runs stay idempotent: -```yaml - api-and-sdk/troubleshooting/errors/insufficient_credits: api-and-sdk/troubleshooting/errors/insufficient-credits.md -``` + ```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 + ``` -### Notes +## Note on the former GitBook flow -- Paths are relative to the space root (defined by `root: ./` in the yaml) -- The source path has NO leading slash and NO `.md` extension -- The destination path includes the `.md` extension -- Group error redirect entries together with a comment for clarity +Earlier versions of this reference created the prefix redirect through the GitBook API using `scripts/docs_redirects.py` and a `GITBOOK_TOKEN` secret. That approach no longer applies: the docs moved from GitBook to Astro Starlight on Vercel, redirects are plain JSON in `vercel.json`, and the prefix case is now covered by the generic `/errors/:code` rule. Neither the script nor the token is needed. diff --git a/.agents/skills/sync-openapi-spec/SKILL.md b/.agents/skills/sync-openapi-spec/SKILL.md index 3084789e8..a90df6954 100644 --- a/.agents/skills/sync-openapi-spec/SKILL.md +++ b/.agents/skills/sync-openapi-spec/SKILL.md @@ -94,16 +94,33 @@ If `npm run build` fails, the most common cause is a malformed path or missing ` ### Step 6: Commit and open a PR +This skill maintains **one** long-lived sync PR rather than one per run — see "One standing PR per automation" in `.agents/references/skill-authoring-guidelines.md`. A dated branch per run would produce multiple open PRs that all rewrite the same generated YAML file and conflict with each other. + +```bash +# Is there already an open OpenAPI sync PR? +gh pr list --repo warpdotdev/docs --state open \ + --search 'sync agent-api-openapi.yaml from warp-server in:title' \ + --json number,headRefName + +git fetch origin +# If the PR exists, continue on its branch and rebase; otherwise create it from main. +git checkout sync-openapi-spec 2>/dev/null || git checkout -b sync-openapi-spec origin/main +git rebase origin/main +``` + +Re-run `--mode apply` after the rebase so the regenerated subset reflects the latest `main`, then commit: + ```bash -git checkout -b sync-openapi-spec/YYYY-MM-DD git add developers/agent-api-openapi.yaml git commit -m "docs: sync agent-api-openapi.yaml from warp-server Co-Authored-By: Oz <oz-agent@warp.dev>" -git push origin sync-openapi-spec/YYYY-MM-DD +git push origin sync-openapi-spec ``` -Open a draft PR. Write the body to a file before creating the PR — the diff output from Step 2 can be long and is prone to repetition-loop degeneration when passed inline: +If a PR already exists for this branch, the push updates it — do not open a second one. Replace the diff summary in the existing body with the current run's output (this spec is regenerated wholesale each run, so the latest diff supersedes rather than accumulates) and note the date of the refresh. Re-run `check_pr_body.py` after editing. + +If no PR exists, open a draft one. Write the body to a file before creating the PR — the diff output from Step 2 can be long and is prone to repetition-loop degeneration when passed inline: ```bash cat > /tmp/sync-openapi-pr-body.md << 'EOF' diff --git a/.agents/skills/sync-openapi-spec/references/sync-policy.md b/.agents/skills/sync-openapi-spec/references/sync-policy.md index a4fb5d3ed..2c36c72e6 100644 --- a/.agents/skills/sync-openapi-spec/references/sync-policy.md +++ b/.agents/skills/sync-openapi-spec/references/sync-policy.md @@ -1,25 +1,91 @@ # Sync Policy -This document records what `developers/agent-api-openapi.yaml` keeps from `warp-server/public_api/openapi.yaml`, and why. The exclusion lists live in `scripts/sync_openapi.py` as `EXCLUDED_TAGS` and `EXCLUDED_PATHS`. Update both this document and the script when the policy changes. +This document records what `developers/agent-api-openapi.yaml` keeps from `warp-server/public_api/openapi.yaml`, and why. The exclusion lists live in `scripts/sync_openapi.py` as `EXCLUDED_TAGS`, `EXCLUDED_PATHS`, and `EXCLUDED_PATH_PREFIXES`. Update both this document and the script when the policy changes. + +## Relationship to warp-server's release automation + +warp-server publishes the same file through `script/generate-public-openapi` and the `sync_public_openapi_to_docs` workflow, which runs at release-candidate time and opens a PR on the `automation/sync-agent-api-spec` branch. That pipeline is the authoritative publisher, and it filters with `public_api/public-openapi-filter.yaml` (`flagValues: [x-internal: true]`). + +This skill is the manual fallback for the same job, so its output has to match that pipeline's public/private decisions. Prefer letting the release automation land routine spec updates. Reach for `--mode apply` only when the docs copy needs a correction the automation won't deliver in time, and re-read this policy before doing so. ## How filtering works `scripts/sync_openapi.py` applies these rules, top-down: -1. Drop every tag listed in `EXCLUDED_TAGS`. -2. Drop every path whose tags are a subset of `EXCLUDED_TAGS`, plus every path listed explicitly in `EXCLUDED_PATHS`. -3. Keep every surviving path verbatim, including any `x-internal: true` markers on its operations. +1. Recursively drop every object marked `x-internal: true`, wherever it + appears in the tree — a path operation, a query/path parameter, a + schema property, a whole schema, a tag entry, and so on — not only + 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. 5. Keep only the `components.schemas` entries that are reachable from the surviving paths via `$ref` walking (recursive over `allOf`/`oneOf`/`anyOf`/`items`/`additionalProperties`/etc.). +6. Recursively strip every key in `STRIP_FLAGS` from whatever survives + steps 1-5, wherever it appears in the tree (operations, schemas, + individual properties, parameters). + +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. + +## `x-internal` deletes the whole marked object, not just the flag (`_prune_internal`) + +`x-internal: true` mirrors openapi-format's `flagValues` semantics in +warp-server's filter: the entire object bearing the marker is deleted, not +just the `x-internal` key on it. An earlier version of this script only +applied that rule to top-level path operations (`strip_internal_operations`) +and left every other marked object's `x-internal` key to be stripped later +by the `STRIP_FLAGS` pass (rule 6 above). Stripping the key without deleting +the object it was marking leaves the object itself — now unmarked — in the +published spec. This let several server-internal fields leak through: the +`factory_uid` and `automation_id` query parameters on `GET /agent/runs`, and +the `factory_uid`/`agent_type` properties on `CreateAgentRequest`, +`UpdateAgentRequest`, and `AgentResponse`. + +`_prune_internal` now runs first, before any other rule, and walks the +entire source tree deleting every marked object outright: a schema property +under `properties`, an item in a `parameters` array, a whole schema in +`components.schemas`, and so on, in addition to the path operations rule 1 +already covered. `STRIP_FLAGS` (rule 6) then only has to clean up the +`x-internal` key on anything that rule 1 doesn't fully own removing (there +is normally nothing left, since every `x-internal: true` object is deleted +outright) plus the other seven implementation-only extensions. + +## Implementation-only extensions are stripped everywhere (`STRIP_FLAGS`) + +`STRIP_FLAGS` mirrors the `stripFlags` list in +`warp-server/public_api/public-openapi-filter.yaml` verbatim: `x-internal`, +`x-enum-varnames`, `x-go-type`, `x-go-type-import`, +`x-go-type-skip-optional-pointer`, `x-oapi-codegen-extra-tags`, +`x-stainless-deprecation-message`, and `x-stainless-naming`. These +extensions are useful for server/SDK code generation (oapi-codegen, +Stainless) but carry no meaning for a docs reader, so none of them may +reach the published Scalar reference. + +An earlier version of this script only removed `x-internal` from +top-level operation objects (the key that decides whether to drop the +operation entirely). It never stripped the *other* six keys, and it never +walked into schemas, so implementation-only markers on component schemas +and their properties — `x-go-type-skip-optional-pointer` and +`x-stainless-deprecation-message` in particular — leaked into the +published copy verbatim. `_strip_flags` now walks the entire regenerated +tree after filtering and removes every `STRIP_FLAGS` key it finds, +regardless of nesting depth, matching `generate-public-openapi`'s own +post-generation check that no `x-*` key remains in warp-server's +published copy. + +When warp-server adds a new entry to its `stripFlags` list, add the same +key to `STRIP_FLAGS` here so the two filters stay in lockstep. ## Excluded tags -### `memory_stores` -Memory stores are gated as `x-internal: true` server-side. They are not part of the public Oz Agent API surface today and are excluded from the docs reference until they ship publicly. If/when this tag goes public, remove it from `EXCLUDED_TAGS` and update this section. +### `memory_stores` and `memory` +These tags back Agent Memory, which is a research preview. The tag was renamed `memory_stores` → `memory` upstream, so both names are excluded: keeping only the old name silently reopened the surface after the rename. Remove them from `EXCLUDED_TAGS` when Agent Memory ships publicly. ### `harness-support` The `/harness-support/*` endpoints form the worker-to-server contract used by Oz workers (transcripts, snapshots, finish-task signaling, etc.). They are not part of the public API contract — customers should not call them directly. Excluded permanently. +### `factory` +Oz Factory has not shipped publicly. Its `FactoryMcp` flag is dogfood and the `@warp/factory` front end is internal, so none of its endpoints belong in the public reference. Remove this tag when Factory goes GA. + ## Excluded paths (within otherwise-public tags) These four `agent`-tag paths are excluded individually because the `agent` tag itself remains public: @@ -31,17 +97,24 @@ These four `agent`-tag paths are excluded individually because the `agent` tag i If any of these become stable public surfaces, remove them from `EXCLUDED_PATHS` and update this list. -## What we deliberately KEEP that you might expect to be hidden +## Excluded path prefixes + +`EXCLUDED_PATH_PREFIXES` drops a path by prefix regardless of how its operations are tagged. Today it holds a single entry, `/factory`, because some Factory operations are tagged `agent` upstream — `GET /factory/scorers/{scorer_id}/results` is one — so a tags-only rule leaks them into the public reference. Use a prefix only when a whole URL namespace is private; prefer a tag or an explicit path everywhere else. + +## `x-internal` operations are dropped + +Operations marked `x-internal: true` are removed, and a path loses its entry when all of its operations are internal. This covers the `/agent/messages/*` and `/agent/events/*` orchestration-messaging operations, `/agent/runs/{runId}/client-events`, `/agent/conversations/{conversation_id}/rename`, and `/agent/sessions/{sessionUuid}/redirect`. -The script keeps `x-internal: true` operations under public paths. Today this means the `/agent/messages/*` and `/agent/events/*` operations are present in the docs file even though they're flagged `x-internal` in the source. This matches the pre-existing state of `developers/agent-api-openapi.yaml` and the way Scalar already renders the reference. If we want to start stripping `x-internal` operations from the docs spec, change the policy here and update `_should_keep_path`/the operation-level filter in `scripts/sync_openapi.py`. +An earlier version of this policy kept those operations verbatim so the regenerated file matched the docs copy already on disk. That made this script disagree with warp-server's release filter, which strips them, and meant every newly marked-internal operation would be republished here. Matching the upstream marker is the safer default: it can only ever remove surfaces, never add one. ## Adding a new exclusion Use the script's `_unknown_classifications` warnings as the trigger. When the diff flags a new tag or path with `!`: 1. Read the corresponding handler in `warp-server/router/handlers/public_api/` to determine intent. 2. If the endpoint should be hidden: + - Prefer asking the server team to mark the operation `x-internal: true` upstream, which hides it from both publishers at once. - For an entire new tag, add the tag name to `EXCLUDED_TAGS` in `scripts/sync_openapi.py`. - - For a single path, add it to `EXCLUDED_PATHS`. + - For a single path, add it to `EXCLUDED_PATHS`; for a whole private URL namespace, add a prefix to `EXCLUDED_PATH_PREFIXES`. 3. Add a short rationale to this document under "Excluded tags" or "Excluded paths." 4. Re-run `--mode diff` to confirm there are no remaining `!` warnings. 5. Then run `--mode apply` and proceed with the normal PR flow. diff --git a/.agents/skills/sync-openapi-spec/scripts/sync_openapi.py b/.agents/skills/sync-openapi-spec/scripts/sync_openapi.py index 345ee5dcc..7ef73d01d 100644 --- a/.agents/skills/sync-openapi-spec/scripts/sync_openapi.py +++ b/.agents/skills/sync-openapi-spec/scripts/sync_openapi.py @@ -6,15 +6,27 @@ `docs/developers/agent-api-openapi.yaml`, which is a curated subset. This script generates the docs subset deterministically: + * operations marked ``x-internal: true`` are removed, and a path whose + every operation is internal is dropped entirely * tags listed in EXCLUDED_TAGS are removed (and their paths/schemas) * paths listed in EXCLUDED_PATHS are removed - * surviving paths and operations are kept verbatim, including any - ``x-internal: true`` markers * components/schemas is pruned to only schemas reachable from the surviving paths via $ref walking + * every key in STRIP_FLAGS (implementation-only extensions such as + ``x-go-type`` and ``x-stainless-naming``) is removed recursively from + whatever survives the filtering above, wherever it appears in the tree * the regenerated spec is validated for unresolved $refs before being written; apply will refuse to write a broken spec +``x-internal`` is warp-server's own public/private marker: its +``public_api/public-openapi-filter.yaml`` strips those operations when the +release pipeline publishes the spec. Honoring the same marker here keeps this +script from publishing a surface the server team has explicitly marked private, +instead of relying only on a hand-maintained tag allowlist that goes stale +whenever a new private tag appears. STRIP_FLAGS mirrors that same filter's +``stripFlags`` list, so implementation-only extensions never reach the +published docs copy either. + Modes: diff Print structural drift between source and target. Exits 1 if drift is found. @@ -39,9 +51,41 @@ import yaml # Tags whose paths and tag entry should be removed entirely. -# `memory_stores` is gated as `x-internal` server-side. +# `memory_stores` / `memory` back Agent Memory, which is a research preview. # `harness-support` is the worker-to-server contract — not a public API. -EXCLUDED_TAGS: frozenset[str] = frozenset({"memory_stores", "harness-support"}) +# `factory` is Oz Factory, which has not shipped publicly. +# These are belt-and-braces on top of the `x-internal` filter below: a tag can +# be private even when individual operations aren't marked internal yet. +EXCLUDED_TAGS: frozenset[str] = frozenset( + {"memory_stores", "memory", "harness-support", "factory"} +) + +# OpenAPI extension warp-server uses to mark an operation private. Mirrors +# `flagValues: [x-internal: true]` in warp-server/public_api/public-openapi-filter.yaml. +INTERNAL_MARKER = "x-internal" + +# Implementation-only OpenAPI extensions that must never reach the published +# docs copy. Mirrors `stripFlags` in +# warp-server/public_api/public-openapi-filter.yaml: these keys are useful for +# server/SDK code generation (oapi-codegen, Stainless) but are stripped +# unconditionally from every remaining object, not just top-level operations. +STRIP_FLAGS: frozenset[str] = frozenset( + { + "x-internal", + "x-enum-varnames", + "x-go-type", + "x-go-type-import", + "x-go-type-skip-optional-pointer", + "x-oapi-codegen-extra-tags", + "x-stainless-deprecation-message", + "x-stainless-naming", + } +) + +# Path-item keys that are HTTP operations rather than shared path metadata. +HTTP_METHODS: frozenset[str] = frozenset( + {"get", "put", "post", "delete", "options", "head", "patch", "trace"} +) # Specific paths under otherwise-public tags that should be hidden from # the public API reference. Keep in sync with references/sync-policy.md. @@ -54,6 +98,12 @@ } ) +# Path prefixes that are private no matter how the operation is tagged. Tag +# checks alone are not enough here: some Factory operations are tagged `agent` +# upstream (for example `GET /factory/scorers/{scorer_id}/results`), so a +# tags-only rule would leak them into the public reference. +EXCLUDED_PATH_PREFIXES: tuple[str, ...] = ("/factory",) + # 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") @@ -124,15 +174,94 @@ def _path_tags(path_item: dict[str, Any]) -> set[str]: return tags +def _is_internal_operation(operation: Any) -> bool: + """Whether an operation carries warp-server's ``x-internal: true`` marker.""" + return isinstance(operation, dict) and operation.get(INTERNAL_MARKER) is True + + +def _prune_internal(node: Any) -> Any: + """Recursively drop any object marked ``x-internal: true``, then recurse + into whatever remains. + + Mirrors openapi-format's ``flagValues: [x-internal: true]`` semantics + (warp-server's ``public_api/public-openapi-filter.yaml``): the entire + marked node is deleted, not just the marker key. This catches internal + schema properties (e.g. ``factory_uid``, ``agent_type``) and internal + parameters (e.g. the ``automation_id`` query parameter) wherever they + appear in the tree — not only the top-level path operations that + ``strip_internal_operations`` inspects. Stripping only the marker key + (see ``_strip_flags``) would otherwise leave the internal object itself, + just unmarked, in the published spec. + """ + if isinstance(node, dict): + return { + key: _prune_internal(value) + for key, value in node.items() + if not _is_internal_operation(value) + } + if isinstance(node, list): + return [ + _prune_internal(item) + for item in node + if not _is_internal_operation(item) + ] + return node + + +def strip_internal_operations(path_item: dict[str, Any]) -> dict[str, Any]: + """Return ``path_item`` without any operation marked ``x-internal: true``. + + Non-operation keys (``parameters``, ``summary``, ``servers``, ...) are + preserved so a partially-internal path keeps its shared metadata. + """ + return { + key: value + for key, value in path_item.items() + if not (key.lower() in HTTP_METHODS and _is_internal_operation(value)) + } + + +def _has_public_operation(path_item: dict[str, Any]) -> bool: + """Whether a path item still declares at least one non-internal operation.""" + return any( + key.lower() in HTTP_METHODS and not _is_internal_operation(value) + for key, value in path_item.items() + ) + + def _should_keep_path(path: str, path_item: dict[str, Any]) -> bool: if path in EXCLUDED_PATHS: return False + if path.startswith(EXCLUDED_PATH_PREFIXES): + return False tags = _path_tags(path_item) if tags and tags.issubset(EXCLUDED_TAGS): return False + # A path whose every operation is marked internal has no public surface. + if not _has_public_operation(path_item): + return False return True +def _strip_flags(node: Any) -> Any: + """Recursively remove every key in ``STRIP_FLAGS`` from ``node``. + + These extensions can appear anywhere in the spec (operations, schemas, + individual properties, parameters), not only on the operation objects + that ``strip_internal_operations`` already inspects, so this walks the + entire tree rather than a fixed set of levels. + """ + if isinstance(node, dict): + return { + key: _strip_flags(value) + for key, value in node.items() + if key not in STRIP_FLAGS + } + if isinstance(node, list): + return [_strip_flags(item) for item in node] + return node + + def _collect_refs(node: Any, refs: set[str]) -> None: """Recursively collect every component schema name referenced from ``node``. @@ -223,6 +352,11 @@ def visit(node: Any, path: str) -> None: def transform(source: dict[str, Any]) -> dict[str, Any]: """Produce the docs subset of the given source spec.""" + # Drop every x-internal-marked object (schema properties, parameters, + # operations, tags, ...) before anything else, so a downstream pass never + # sees an internal node it would otherwise have to know how to filter. + source = _prune_internal(source) + out: dict[str, Any] = {} for top_key in ("openapi", "info", "servers"): @@ -240,7 +374,7 @@ def transform(source: dict[str, Any]) -> dict[str, Any]: src_paths = source.get("paths") or {} kept_paths = { - path: item + path: strip_internal_operations(item) for path, item in src_paths.items() if isinstance(item, dict) and _should_keep_path(path, item) } @@ -266,7 +400,7 @@ def transform(source: dict[str, Any]) -> dict[str, Any]: if out_components: out["components"] = out_components - return out + return _strip_flags(out) # --------------------------------------------------------------------------- @@ -382,6 +516,20 @@ def _self_test() -> int: "post": { "tags": ["agent"], "operationId": "runAgent", + "x-stainless-deprecation-message": "use /agent/runs instead", + "parameters": [ + { + "name": "conversation_id", + "in": "query", + "schema": {"type": "string"}, + }, + { + "name": "factory_uid", + "in": "query", + "x-internal": True, + "schema": {"type": "string"}, + }, + ], "requestBody": { "content": { "application/json": { @@ -429,6 +577,8 @@ def _self_test() -> int: "schemas": { "RunReq": { "type": "object", + "x-go-type": "models.RunReq", + "x-go-type-import": {"path": "warp.dev/warp-server/models"}, "properties": { "config": {"$ref": "#/components/schemas/Config"} }, @@ -446,9 +596,22 @@ def _self_test() -> int: {"type": "object"}, ] }, + "legacy_mode": { + "type": "string", + "x-go-type-skip-optional-pointer": True, + "x-oapi-codegen-extra-tags": {"json": "legacy_mode,omitempty"}, + }, + "factory_agent_type": { + "allOf": [{"$ref": "#/components/schemas/Mode"}], + "x-internal": True, + }, }, }, - "Mode": {"type": "string"}, + "Mode": { + "type": "string", + "x-enum-varnames": ["ModeFast", "ModeSlow"], + "x-stainless-naming": {"typescript": {"type": "Mode"}}, + }, "RunResp": {"type": "object"}, "MSItem": {"type": "object"}, # only referenced by dropped path "Followup": {"type": "object"}, @@ -475,6 +638,33 @@ def _self_test() -> int: ref_errors = _validate_output(out) assert not ref_errors, f"unexpected unresolved refs: {ref_errors}" + # Implementation-only extensions must never survive into the output, + # regardless of whether they sit on an operation, a schema, or a nested + # property — mirrors warp-server's `stripFlags` filter. + dumped = yaml.safe_dump(out) + for flag in STRIP_FLAGS: + assert flag not in dumped, f"{flag} leaked into the regenerated spec" + # The objects that carried those flags must otherwise survive intact. + assert out["paths"]["/agent/run"]["post"]["operationId"] == "runAgent" + assert out["components"]["schemas"]["RunReq"]["type"] == "object" + assert out["components"]["schemas"]["Config"]["properties"]["legacy_mode"][ + "type" + ] == "string" + + # An x-internal-marked object must be dropped entirely, not just have its + # marker key stripped — covers an internal query parameter and an + # internal schema property, alongside the surviving public sibling in + # each case. + run_params = { + p["name"] for p in out["paths"]["/agent/run"]["post"]["parameters"] + } + assert run_params == {"conversation_id"}, f"unexpected parameters: {run_params}" + config_props = set(out["components"]["schemas"]["Config"]["properties"].keys()) + assert "factory_agent_type" not in config_props, ( + f"internal property survived: {config_props}" + ) + assert "legacy_mode" in config_props, f"public property dropped: {config_props}" + print("self-test: OK") return 0 diff --git a/.agents/skills/sync_terminology/SKILL.md b/.agents/skills/sync_terminology/SKILL.md index 58fc91152..029c4c250 100644 --- a/.agents/skills/sync_terminology/SKILL.md +++ b/.agents/skills/sync_terminology/SKILL.md @@ -2,14 +2,14 @@ name: sync_terminology description: >- Sync the Warp terminology glossary from the Notion Dictionary to the repo. - Fetches the Notion Dictionary page, compares with .warp/references/terminology.md, + Fetches the Notion Dictionary page, compares with .agents/references/terminology.md, and opens a PR for any additions or changes. Flags repo-only terms that are missing from Notion. Use on a weekly schedule or manually when terminology changes. --- # Sync Terminology from Notion -Keep `.warp/references/terminology.md` in sync with the canonical Notion Dictionary. +Keep `.agents/references/terminology.md` in sync with the canonical Notion Dictionary. **Direction:** Notion → repo. Notion is the source of truth. If the repo has terms not in Notion, flag them for addition to Notion rather than removing them from the repo. @@ -42,7 +42,7 @@ Parse both sections. Extract each term with its: ### Step 2: Read the current terminology.md -Read `.warp/references/terminology.md` from the repo. Parse each entry, extracting: +Read `.agents/references/terminology.md` from the repo. Parse each entry, extracting: - **Name** (the bolded term) - **Definition** (the text after the em dash) - **Usage note** (the italic `*Usage note:*` line, if present) @@ -69,10 +69,19 @@ If both lists are empty, report "Terminology is in sync" and stop. Do not create If there are new or changed terms from Notion: -1. Create a new branch: +1. Check out the standing branch. This skill maintains **one** long-lived sync PR rather than one per run — see "One standing PR per automation" in `.agents/references/skill-authoring-guidelines.md`. ```bash - git checkout -b sync-terminology/YYYY-MM-DD + # Is there already an open terminology sync PR? + gh pr list --repo warpdotdev/docs --state open \ + --search 'sync terminology from Notion Dictionary in:title' \ + --json number,headRefName + + git fetch origin + # If the PR exists, continue on its branch and rebase; otherwise create it from main. + git checkout sync-terminology 2>/dev/null || git checkout -b sync-terminology origin/main + git rebase origin/main ``` + Do not create a date-suffixed branch. Terminology drift accumulates across weeks, and a dated branch per run produces a pile of PRs that all edit the same two files and conflict with each other. 2. For each **new term**, add it to the appropriate category section in `terminology.md`: - Match the category from Notion to the existing `##` sections in the file @@ -95,14 +104,16 @@ If there are new or changed terms from Notion: ### Step 6: Commit and open a PR ```bash -git add .warp/references/terminology.md AGENTS.md +git add .agents/references/terminology.md AGENTS.md git commit -m "docs: sync terminology from Notion Dictionary Co-Authored-By: Oz <oz-agent@warp.dev>" -git push origin sync-terminology/YYYY-MM-DD +git push origin sync-terminology ``` -Open a PR. Write the body to a file before creating the PR — lists of changed terms can be long and are prone to repetition-loop degeneration when passed inline: +If a PR already exists for this branch, the push updates it — do not open a second one. Append this run's terms to the existing body under its existing headings rather than adding a new dated section: `check_pr_body.py` rejects duplicate headings, so per-run copies of `## Terms added` would fail the check and block the update. Fetch the current body first and make a minimal additive edit. + +If no PR exists, open one. Write the body to a file before creating the PR — lists of changed terms can be long and are prone to repetition-loop degeneration when passed inline: ```bash # Write body to a temp file first diff --git a/.agents/skills/triage-issue-local/SKILL.md b/.agents/skills/triage-issue-local/SKILL.md index a96aeac53..3c8ad0d30 100644 --- a/.agents/skills/triage-issue-local/SKILL.md +++ b/.agents/skills/triage-issue-local/SKILL.md @@ -17,7 +17,7 @@ marks as overridable. - Distinguish between **site bugs** (the docs platform is broken — search, navigation, rendering, styling, build errors) and **content issues** (documentation is incorrect, outdated, missing, unclear, has typos, or has formatting problems). Most issues will be content issues. - When the reporter provides a `docs.warp.dev` URL, map it to the source file: `docs.warp.dev/agent-platform/capabilities/skills` → `src/content/docs/agent-platform/capabilities/skills.mdx`. - When an issue claims documentation is wrong about a feature's behavior, verify against the source repos (`warp-internal` for client/Rust, `warp-server` for server/Go) before concluding the docs are incorrect. Docs are the primary source of truth for user-facing content, but source code is essential for validating accuracy when disputed. -- Check the docs style guide (`AGENTS.md`) and terminology glossary (`.warp/references/terminology.md`) to validate that issue reports reference features by their correct names and that any proposed fixes would align with current terminology. +- Check the docs style guide (`AGENTS.md`) and terminology glossary (`.agents/references/terminology.md`) to validate that issue reports reference features by their correct names and that any proposed fixes would align with current terminology. - If the report is a support question (e.g., "How do I do X?") rather than an issue with the docs themselves, direct the reporter to the [Warp community Slack](https://go.warp.dev/join-preview) and the [docs site](https://docs.warp.dev). ## Follow-up question limit diff --git a/.agents/skills/update-changelog/SKILL.md b/.agents/skills/update-changelog/SKILL.md index 419a9ad17..2b1db3541 100644 --- a/.agents/skills/update-changelog/SKILL.md +++ b/.agents/skills/update-changelog/SKILL.md @@ -214,10 +214,32 @@ Edit `src/content/docs/changelog/{year}.mdx` (the year file determined in Step 2 ### Step 7: Create branch, commit, and open PR +Unlike the other recurring docs automations, this skill correctly opens **one PR per release** rather than one standing PR — each changelog entry describes a distinct release and should merge on its own. The "One standing PR per automation" contract in `.agents/references/skill-authoring-guidelines.md` does not apply here. + +It does still have a stacking hazard: every changelog PR inserts at the top of the same `src/content/docs/changelog/{year}.mdx` file, so two unmerged release PRs will conflict, and merging them out of order puts the entries in the wrong sequence. + +**Check for an unmerged prior changelog PR before branching:** + ```bash -# Create a new branch -git checkout -b changelog/{base_version} +gh pr list --repo warpdotdev/docs --state open \ + --search 'docs: changelog in:title' --json number,title,headRefName +``` + +If one exists, branch from it rather than `main` so the entries chain in release order instead of colliding: +```bash +git fetch origin +# No prior open changelog PR: +git checkout -b changelog/{base_version} origin/main +# Prior open changelog PR on branch changelog/{earlier_version}: +git checkout -b changelog/{base_version} origin/changelog/{earlier_version} +``` + +When you branch from a prior changelog PR, say so in the new PR body and note that the earlier PR must merge first. If more than two changelog PRs are open at once, that is a review backlog worth flagging in the PR body rather than chaining further. + +Then commit and open the PR: + +```bash # Stage and commit git add src/content/docs/changelog/ git commit -m "docs: add changelog entry for {base_version} diff --git a/.agents/skills/validate_ui_refs/SKILL.md b/.agents/skills/validate_ui_refs/SKILL.md index 35316fbb9..5d82e8458 100644 --- a/.agents/skills/validate_ui_refs/SKILL.md +++ b/.agents/skills/validate_ui_refs/SKILL.md @@ -1,11 +1,11 @@ --- name: validate_ui_refs -description: Scan Warp Astro Starlight documentation for UI menu paths and Command Palette command names, then validate them against the warp-internal codebase for accuracy. Catch and surface outdated steps automatically. +description: Scan Warp Astro Starlight documentation for UI menu paths and Command Palette command names, then validate them against the public warp client codebase for accuracy. Catch and surface outdated steps automatically. --- # Validate UI References -This skill scans Warp's Astro Starlight documentation for references to UI paths (e.g. `Settings > AI > Active AI`) and Command Palette command names (e.g. "Open Theme Picker"), then validates them against a snapshot of known-valid paths extracted from the `warp-internal` codebase. +This skill scans Warp's Astro Starlight documentation for references to UI paths (e.g. `Settings > AI > Active AI`) and Command Palette command names (e.g. "Open Theme Picker"), then validates them against a snapshot of known-valid paths extracted from the public warp client repo ([warpdotdev/warp](https://github.com/warpdotdev/warp)). ## Running the Check @@ -25,10 +25,10 @@ python3 .agents/skills/validate_ui_refs/validate_ui_refs.py --all - `--create-pr`: Create a branch and PR with auto-fixes (requires `gh` CLI) - `--slack-notify`: Post results to `#growth-docs` Slack channel when unfixed issues remain (requires `SLACK_BOT_TOKEN` env var; channel is hardcoded in the script) - `--slack-channel ID`: Override the default Slack channel (`C09BVK0PL3Y`) -- `--self-test`: Run internal sanity checks against the current snapshot and exit (no `warp-internal` needed) +- `--self-test`: Run internal sanity checks against the current snapshot and exit (no warp checkout needed) - `--include-changelog`: Include `changelog/` in the scan (excluded by default since it's a historical record) -- `--refresh-valid-paths`: Re-extract valid paths from `warp-internal` and update `valid_paths.json` -- `--warp-internal-path PATH`: Path to the `warp-internal` repo (default: `../warp-internal` relative to docs root, or `WARP_INTERNAL_PATH` env var) +- `--refresh-valid-paths`: Re-extract valid paths from the warp client repo and update `valid_paths.json` +- `--warp PATH`: Path to the public warp client repo (auto-detected as a sibling of the docs repo named `warp`, with `warp-internal` as a fallback, or the `WARP_REPO_PATH` env var). `--warp-internal-path` is a deprecated alias, and `WARP_INTERNAL_PATH` is still honored as a deprecated env var fallback. - `--output FILE`: Save results to a JSON file ### Quick path-only check: @@ -72,10 +72,10 @@ Files scanned: 174 ## Refreshing Valid Paths -The `valid_paths.json` file is a static snapshot of valid UI paths. To update it from the latest `warp-internal` source: +The `valid_paths.json` file is a static snapshot of valid UI paths. To update it from the latest warp client source: ```bash -python3 .agents/skills/validate_ui_refs/validate_ui_refs.py --refresh-valid-paths --warp-internal-path /path/to/warp-internal +python3 .agents/skills/validate_ui_refs/validate_ui_refs.py --refresh-valid-paths --warp /path/to/warp ``` This parses: @@ -157,7 +157,7 @@ python3 .agents/skills/validate_ui_refs/validate_ui_refs.py --all --slack-notify 1. A push to `master` in `warpdotdev/warp` that touches `app/src/settings_view/**` sends a `repository_dispatch` event (`settings-ui-changed`) to `warpdotdev/docs`. 2. The `refresh-ui-paths` GHA workflow fires and dispatches an Oz cloud agent to the Docs Agent environment (`K5KStCm5aYvhfBJb8cHol6`). -3. The cloud agent runs `--refresh-valid-paths` using the `warp-internal` checkout available in that environment. +3. The cloud agent runs `--refresh-valid-paths` using the `warpdotdev/warp` checkout available in that environment. 4. If the snapshot changed, the agent runs `--all --fix --create-pr --slack-notify` to validate, auto-fix, open a PR, and post to `#growth-docs` if issues remain. 5. If the snapshot is unchanged, the agent exits with no-op. @@ -181,7 +181,7 @@ To trigger the workflow manually (e.g., if the PAT expired or a migration was mi ```bash python3 .agents/skills/validate_ui_refs/validate_ui_refs.py \ --refresh-valid-paths \ - --warp-internal-path /path/to/warp-internal + --warp /path/to/warp ``` ## Dependencies @@ -189,4 +189,4 @@ python3 .agents/skills/validate_ui_refs/validate_ui_refs.py \ - Python 3.7+ - `requests` (for Slack notifications): `pip3 install requests` - `gh` CLI (for PR creation) -- Access to `warp-internal` repo (only for `--refresh-valid-paths`) +- A checkout of the public warp client repo ([warpdotdev/warp](https://github.com/warpdotdev/warp)) (only for `--refresh-valid-paths`) diff --git a/.agents/skills/validate_ui_refs/valid_paths.json b/.agents/skills/validate_ui_refs/valid_paths.json index 17d79b4fc..3cd058ca9 100644 --- a/.agents/skills/validate_ui_refs/valid_paths.json +++ b/.agents/skills/validate_ui_refs/valid_paths.json @@ -2,7 +2,6 @@ "umbrellas": { "Agents": { "subpages": [ - "Oz", "Warp Agent", "Profiles", "MCP servers", @@ -21,21 +20,24 @@ "Cloud platform": { "subpages": [ "Environments", - "Oz Cloud API Keys" + "API keys" ], + "deprecated_subpages": { + "Oz Cloud API Keys": "API keys" + }, "source_file": "app/src/settings_view/mod.rs" } }, "deprecated_sections": { "AI": { "umbrella": "Agents", - "default_subpage": "Oz", + "default_subpage": "Warp Agent", "subsection_to_subpage": { - "Active AI": "Oz", - "Input": "Oz", - "Voice": "Oz", - "Other": "Oz", - "Experimental": "Oz", + "Active AI": "Warp Agent", + "Input": "Warp Agent", + "Voice": "Warp Agent", + "Other": "Warp Agent", + "Experimental": "Warp Agent", "Usage": "Profiles", "Agents": "Profiles", "Profiles": "Profiles", @@ -69,7 +71,11 @@ }, "Platform": { "umbrella": "Cloud platform", - "default_subpage": "Oz Cloud API Keys" + "default_subpage": "API keys" + }, + "Oz Cloud API Keys": { + "umbrella": "Cloud platform", + "default_subpage": "API keys" } }, "settings_sections": { @@ -83,11 +89,6 @@ "sub_sections": [], "source_file": "app/src/settings_view/mod.rs" }, - "MCP Servers": { - "display_name": "MCP Servers", - "sub_sections": [], - "source_file": "app/src/settings_view/mcp_servers_page.rs" - }, "Billing and usage": { "display_name": "Billing and usage", "sub_sections": [], @@ -168,30 +169,6 @@ ], "source_file": "app/src/settings_view/warpify_page.rs" }, - "AI": { - "display_name": "AI", - "sub_sections": [ - "Usage", - "Active AI", - "Agents", - "Profiles", - "Input", - "MCP Servers", - "Knowledge", - "Voice", - "Other", - "Third party CLI agents", - "Agent Attribution", - "Experimental", - "Cloud Handoff", - "Custom Inference", - "API Keys", - "AWS Bedrock", - "Gemini Enterprise", - "Custom Routers" - ], - "source_file": "app/src/settings_view/ai_page.rs" - }, "Warp Agent": { "display_name": "Warp Agent", "sub_sections": [ @@ -241,14 +218,6 @@ "source_file": "app/src/settings_view/ai_page.rs", "umbrella": "Agents" }, - "Code": { - "display_name": "Code", - "sub_sections": [ - "Codebase Indexing", - "Code Editor and Review" - ], - "source_file": "app/src/settings_view/code_page.rs" - }, "Indexing and projects": { "display_name": "Indexing and projects", "sub_sections": [ @@ -271,8 +240,8 @@ "source_file": "app/src/settings_view/environments_page.rs", "umbrella": "Cloud platform" }, - "Oz Cloud API Keys": { - "display_name": "Oz Cloud API Keys", + "API keys": { + "display_name": "API keys", "sub_sections": [], "source_file": "app/src/settings_view/platform_page.rs", "umbrella": "Cloud platform" @@ -338,508 +307,860 @@ }, "command_palette_commands": [ { - "name": "terminal:alternate_terminal_paste", - "description": "Alternate terminal paste" + "name": "root_view:toggle_fullscreen", + "description": "Toggle fullscreen" }, { - "name": "terminal:warpify_subshell", - "description": "Warpify subshell" + "name": "ai_assistant_panel:focus_terminal_input", + "description": "Focus Terminal Input From Warp AI" }, { - "name": "terminal:focus_input", - "description": "Focus terminal input" + "name": "ai_assistant_panel:reset_context", + "description": "Restart Warp AI" }, { - "name": "terminal:paste", - "description": "Paste" + "name": "code_view:save_as", + "description": "Save file as" }, { - "name": "terminal:copy", - "description": "Copy" + "name": "code_view:close_all_tabs", + "description": "Close all tabs" }, { - "name": "terminal:reinput_commands", - "description": "Reinput selected commands" + "name": "code_view:close_saved_tabs", + "description": "Close saved tabs" }, { - "name": "terminal:reinput_commands_with_sudo", - "description": "Reinput selected commands as root" + "name": "find:find_next_occurrence", + "description": "Find the next occurrence of your search query" }, { - "name": "terminal:find", - "description": "Find in Terminal" + "name": "find:find_prev_occurrence", + "description": "Find the previous occurrence of your search query" }, { - "name": "terminal:select_bookmark_up", - "description": "Select the closest bookmark up" + "name": "editor_view:move_backward_one_word", + "description": "Move Backward One Word" }, { - "name": "terminal:select_bookmark_down", - "description": "Select the closest bookmark down" + "name": "editor_view:move_forward_one_word", + "description": "Move Forward One Word" }, { - "name": "terminal:jump_to_latest_agent_message", - "description": "Jump to latest agent message" + "name": "editor_view:move_forward_one_word", + "description": "Move forward one word" }, { - "name": "terminal:open_block_list_context_menu_via_keybinding", - "description": "Open block context menu" + "name": "editor_view:move_backward_one_word", + "description": "Move backward one word" }, { - "name": "terminal:toggle_teams_modal", - "description": "Toggle team workflows modal" + "name": "editor_view:up", + "description": "Move cursor up" }, { - "name": "terminal:copy_git_branch", - "description": "Copy git branch" + "name": "editor_view:down", + "description": "Move cursor down" }, { - "name": "terminal:clear_blocks", - "description": "Clear Blocks" + "name": "editor_view:left", + "description": "Move cursor left" }, { - "name": "terminal:executing_command_move_cursor_word_left", - "description": "Move cursor one word to the left within an executing command" + "name": "editor_view:right", + "description": "Move cursor right" }, { - "name": "terminal:executing_command_move_cursor_word_right", - "description": "Move cursor one word to the right within an executing command" + "name": "editor_view:move_to_line_start", + "description": "Move to line start" }, { - "name": "terminal:executing_command_move_cursor_home", - "description": "Move cursor home within an executing command" + "name": "editor_view:home", + "description": "Home" }, { - "name": "terminal:executing_command_move_cursor_end", - "description": "Move cursor end within an executing command" + "name": "editor_view:move_to_line_end", + "description": "Move to line end" }, { - "name": "terminal:executing_command_delete_word_left", - "description": "Delete word left within an executing command" + "name": "editor_view:end", + "description": "End" }, { - "name": "terminal:executing_command_delete_line_start", - "description": "Delete to line start within an executing command" + "name": "editor_view:cursor_at_buffer_start", + "description": "Cursor at buffer start" }, { - "name": "terminal:executing_command_delete_line_end", - "description": "Delete to line end within an executing command" + "name": "editor_view:cursor_at_buffer_end", + "description": "Cursor at buffer end" }, { - "name": "terminal:backward_tabulation", - "description": "Backward tabulation within an executing command" + "name": "editor_view:select_left_by_word", + "description": "Select one word to the left" }, { - "name": "terminal:open_share_block_modal", - "description": "Share selected block" + "name": "editor_view:select_right_by_word", + "description": "Select one word to the right" }, { - "name": "terminal:bookmark_selected_block", - "description": "Bookmark selected block" + "name": "editor_view:select_left", + "description": "Select one character to the left" }, { - "name": "terminal:find", - "description": "Find within selected block" + "name": "editor_view:select_right", + "description": "Select one character to the right" }, { - "name": "terminal:copy", - "description": "Copy command and output" + "name": "editor_view:select_up", + "description": "Select up" }, { - "name": "terminal:copy_outputs", - "description": "Copy command output" + "name": "editor_view:select_down", + "description": "Select down" }, { - "name": "terminal:copy_commands", - "description": "Copy command" + "name": "editor_view:select_all", + "description": "Select all" }, { - "name": "terminal:scroll_up_one_line", - "description": "Scroll terminal output up one line" + "name": "editor:select_to_line_start", + "description": "Select to start of line" }, { - "name": "terminal:scroll_down_one_line", - "description": "Scroll terminal output down one line" + "name": "editor:select_to_line_end", + "description": "Select to end of line" }, { - "name": "terminal:scroll_up_one_page", - "description": "Scroll terminal output up one page" + "name": "editor_view:select_to_line_end", + "description": "Select To Line End" }, { - "name": "terminal:scroll_down_one_page", - "description": "Scroll terminal output down one page" + "name": "editor_view:select_to_line_start", + "description": "Select To Line Start" }, { - "name": "terminal:scroll_to_top_of_selected_block", - "description": "Scroll to top of selected block" + "name": "editor_view:backspace", + "description": "Remove the previous character" }, { - "name": "terminal:scroll_to_bottom_of_selected_block", - "description": "Scroll to bottom of selected block" + "name": "editor_view:toggle_comment", + "description": "Toggle comment" }, { - "name": "terminal:select_all_blocks", - "description": "Select all blocks" + "name": "editor_view:delete", + "description": "Delete" }, { - "name": "terminal:expand_block_selection_above", - "description": "Expand selected blocks above" + "name": "editor_view:vim_scroll_half_page_down", + "description": "Scroll down half a page (vim)" }, { - "name": "terminal:expand_block_selection_below", - "description": "Expand selected blocks below" + "name": "editor_view:vim_scroll_half_page_up", + "description": "Scroll up half a page (vim)" }, { - "name": "terminal:ask_ai_assistant", - "description": "Ask Warp AI about Selection" + "name": "editor_view:cut_word_left", + "description": "Cut word left" }, { - "name": "terminal:ask_ai_assistant_last_block", - "description": "Ask Warp AI about last block" + "name": "editor:delete_word_left", + "description": "Delete word left" }, { - "name": "terminal:ask_ai_assistant", - "description": "Ask Warp AI" + "name": "editor_view:cut_word_right", + "description": "Cut word right" }, { - "name": "input:insert_command_correction", - "description": "Insert Command Correction" + "name": "editor:delete_word_right", + "description": "Delete word right" }, { - "name": "workspace:open_settings_import_page", - "description": "Import External Settings" + "name": "editor_view:cut_all_left", + "description": "Cut all left" }, { - "name": "terminal:share_current_session", - "description": "Share current session" + "name": "editor_view:delete_all_left", + "description": "Delete all left" }, { - "name": "terminal:stop_sharing_current_session", - "description": "Stop sharing current session" + "name": "editor_view:cut_all_right", + "description": "Cut all right" }, { - "name": "terminal:toggle_snackbar_in_active_pane", - "description": "Toggle Sticky Command Header in Active Pane" + "name": "editor_view:delete_all_right", + "description": "Delete all right" }, { - "name": "terminal:load_agent_mode_conversation", - "description": "Load agent mode conversation (from debug link in clipboard)" + "name": "editor_view:vim_exit_insert_mode", + "description": "Exit Vim insert mode" }, { - "name": "terminal:toggle_session_recording", - "description": "Toggle PTY Recording for Session" + "name": "code_editor:find", + "description": "Find in code editor" }, { - "name": "terminal:toggle_conversation_details_panel", - "description": "Toggle Conversation Details Panel" + "name": "editor_view:go_to_line", + "description": "Go to line" }, { - "name": "terminal:ask_ai_assistant", - "description": "Attach Selected Block as Agent Context" + "name": "code_review:save_all_unsaved_files", + "description": "Save all unsaved files in code review" }, { - "name": "terminal:ask_ai_assistant", - "description": "Attach Selected Text as Agent Context" + "name": "code_review:show_find_bar", + "description": "Show find bar in code review" }, { - "name": "workspace:write_codebase_index", - "description": "Write current codebase index snapshot" + "name": "code_review:toggle_file_navigation", + "description": "Toggle file navigation in code review" }, { - "name": "workspace:init_project_rules", - "description": "Initiate project for warp" + "name": "project_buttons:open_repository", + "description": "Open repository" }, { - "name": "workspace:add_current_dir_as_project", - "description": "Add current folder as project" + "name": "project_buttons:create_new_project", + "description": "Create new project" }, { - "name": "workspace:panic", - "description": "Trigger a panic (for testing sentry-rust)" + "name": "editor_view:clear_and_copy_lines", + "description": "Copy and clear selected lines" }, { - "name": "workspace:open_view_tree_debug_view", - "description": "Open view tree debugger" + "name": "editor_view:add_next_occurrence", + "description": "Add selection for next occurrence" }, { - "name": "workspace:sample_process", - "description": "Sample Process" + "name": "editor_view:move_to_line_start", + "description": "Move to start of line" }, { - "name": "workspace:dump_heap_profile", - "description": "Write heap profile to disk" + "name": "editor_view:move_to_line_end", + "description": "Move to end of line" }, { - "name": "workspace:increase_zoom", - "description": "Increase zoom level" + "name": "editor_view:cmd_down", + "description": "Move cursor to the bottom" }, { - "name": "workspace:decrease_zoom", - "description": "Decrease zoom level" + "name": "editor_view:cmd_up", + "description": "Move cursor to the top" }, { - "name": "workspace:reset_zoom", - "description": "Reset zoom level to default" + "name": "editor_view:move_to_and_select_buffer_start", + "description": "Select and move to the top" }, { - "name": "workspace:increase_font_size", - "description": "Increase font size" + "name": "editor_view:move_to_and_select_buffer_end", + "description": "Select and move to the bottom" }, { - "name": "workspace:decrease_font_size", - "description": "Decrease font size" + "name": "editor_view:move_to_paragraph_start", + "description": "Move to the start of the paragraph" }, { - "name": "workspace:reset_font_size", - "description": "Reset font size to default" + "name": "editor_view:move_to_paragraph_end", + "description": "Move to the end of the paragraph" }, { - "name": "workspace:show_theme_chooser", - "description": "Open theme picker" + "name": "editor_view:move_to_buffer_start", + "description": "Move to the start of the buffer" }, { - "name": "workspace:activate_first_tab", - "description": "Switch to 1st tab" + "name": "editor_view:move_to_buffer_end", + "description": "Move to the end of the buffer" }, { - "name": "workspace:activate_second_tab", - "description": "Switch to 2nd tab" + "name": "editor_view:clear_lines", + "description": "Clear selected lines" }, { - "name": "workspace:activate_third_tab", - "description": "Switch to 3rd tab" + "name": "editor_view:insert_newline", + "description": "Insert newline" }, { - "name": "workspace:activate_fourth_tab", - "description": "Switch to 4th tab" + "name": "editor_view:fold", + "description": "Fold" }, { - "name": "workspace:activate_fifth_tab", - "description": "Switch to 5th tab" + "name": "editor_view:unfold", + "description": "Unfold" }, { - "name": "workspace:activate_sixth_tab", - "description": "Switch to 6th tab" + "name": "editor_view:fold_selected_ranges", + "description": "Fold selected ranges" }, { - "name": "workspace:activate_seventh_tab", - "description": "Switch to 7th tab" + "name": "editor:insert_last_word_previous_command", + "description": "Insert last word of previous command" }, { - "name": "workspace:activate_eighth_tab", - "description": "Switch to 8th tab" + "name": "editor_view:move_backward_one_subword", + "description": "Move Backward One Subword" }, { - "name": "workspace:activate_last_tab", - "description": "Switch to last tab" + "name": "editor_view:move_forward_one_subword", + "description": "Move Forward One Subword" }, { - "name": "workspace:activate_prev_tab", - "description": "Activate previous tab" + "name": "editor_view:select_left_by_subword", + "description": "Select one subword to the left" }, { - "name": "workspace:activate_next_tab", - "description": "Activate next tab" + "name": "editor_view:select_right_by_subword", + "description": "Select one subword to the right" }, { - "name": "pane_group:navigate_prev", - "description": "Activate previous pane" + "name": "editor_view:inspect_command", + "description": "Inspect Command" }, { - "name": "pane_group:navigate_next", - "description": "Activate next pane" + "name": "editor_view:clear_buffer", + "description": "Clear command editor" }, { - "name": "workspace:toggle_keybindings_page", - "description": "Toggle keyboard shortcuts" + "name": "editor_view:add_cursor_above", + "description": "Add cursor above" }, { - "name": "workspace:show_keybinding_settings", - "description": "Open keybindings editor" + "name": "editor_view:add_cursor_below", + "description": "Add cursor below" }, { - "name": "workspace:toggle_block_snackbar", - "description": "Toggle sticky command header" + "name": "editor_view:insert_nonexpanding_space", + "description": "Insert non-expanding space" }, { - "name": "workspace:set_a11y_concise_verbosity_level", - "description": "[a11y] Set concise accessibility announcements" + "name": "Close Env Var Collection", + "description": "Close" }, { - "name": "workspace:set_a11y_verbose_verbosity_level", - "description": "[a11y] Set verbose accessibility announcements" + "name": "notebookview:increase_font_size", + "description": "Increase notebook font size" }, { - "name": "workspace:rename_active_tab", - "description": "Rename the current tab" + "name": "notebookview:decrease_font_size", + "description": "Decrease notebook font size" }, { - "name": "workspace:rename_active_pane", - "description": "Rename the current pane" + "name": "notebookview:reset_font_size", + "description": "Reset notebook font size" }, { - "name": "workspace:new_tab_group", - "description": "Create new tab group" + "name": "notebookview:focus_terminal_input", + "description": "Focus Terminal Input from Notebook" }, { - "name": "workspace:new_tab_group_from_active_or_selected_tabs", - "description": "Create tab group from active or selected tab(s)" + "name": "editor_view:deselect_command", + "description": "De-select shell commands" }, { - "name": "workspace:remove_active_or_selected_tabs_from_group", - "description": "Remove active or selected tab(s) from group" + "name": "editor_view:select_command", + "description": "Select shell command at cursor" }, { - "name": "workspace:pin_active_tab", - "description": "Pin current tab" + "name": "editor_view:select_previous_command", + "description": "Select previous command" }, { - "name": "workspace:unpin_active_tab", - "description": "Unpin current tab" + "name": "editor_view:select_next_command", + "description": "Select next command" }, { - "name": "workspace:pin_active_tab_group", - "description": "Pin current tab group" + "name": "editor_view:run_commands", + "description": "Run selected commands" }, { - "name": "workspace:unpin_active_tab_group", - "description": "Unpin current tab group" + "name": "editor_view:toggle_debug_mode", + "description": "Toggle rich-text debug mode" }, { - "name": "workspace:terminate_app", - "description": "Quit Warp" + "name": "editor_view:debug_copy_buffer", + "description": "Copy rich-text buffer" }, { - "name": "workspace:close_active_tab", - "description": "Close the current tab" + "name": "editor_view:debug_copy_selection", + "description": "Copy rich-text selection" }, { - "name": "workspace:close_other_tabs", - "description": "Close other tabs" + "name": "editor_view:log_state", + "description": "Log editor state" }, { - "name": "workspace:toggle_notifications_on", - "description": "Turn notifications on" + "name": "editor_view:move_to_paragraph_end", + "description": "Move to end of paragraph" }, { - "name": "workspace:toggle_notifications_off", - "description": "Turn notifications off" + "name": "editor:select_to_paragraph_start", + "description": "Select to start of paragraph" }, { - "name": "workspace:toggle_launch_config_palette", - "description": "Launch configuration palette" + "name": "editor:select_to_paragraph_end", + "description": "Select to end of paragraph" }, { - "name": "workspace:toggle_files_palette", - "description": "Toggle Files Palette" + "name": "editor:edit_link", + "description": "Create or edit link" }, { - "name": "workspace:open_launch_config_save_modal", - "description": "Save new launch configuration" + "name": "editor_view:inline_code", + "description": "Toggle inline code styling" }, { - "name": "workspace:update_and_relaunch", - "description": "Install update and relaunch" + "name": "editor_view:strikethrough", + "description": "Toggle strikethrough styling" }, { - "name": "workspace:check_for_updates", - "description": "Check for updates" + "name": "editor_view:underline", + "description": "Toggle underline styling" }, { - "name": "workspace:log_out", - "description": "Log out" + "name": "editor:find", + "description": "Find in Notebook" }, { - "name": "workspace:toggle_resource_center", - "description": "Toggle resource center" + "name": "editor:next_find_match", + "description": "Focus next match" }, { - "name": "workspace:export_all_warp_drive_objects", - "description": "Export all Warp Drive objects" + "name": "editor:previous_find_match", + "description": "Focus previous match" }, { - "name": "workspace:install_cli", - "description": "Install Oz CLI globally for use outside of Warp" + "name": "editor:toggle_regex_find", + "description": "Toggle regular expression search" }, { - "name": "workspace:uninstall_cli", - "description": "Undo global Oz CLI installation (oz will still work within Warp)" + "name": "editor:toggle_case_sensitive_find", + "description": "Toggle case-sensitive search" }, { - "name": "workspace:install_warpctrl", - "description": "Install Warp Control CLI globally for use outside of Warp" + "name": "notebookview:focus_terminal_input", + "description": "Focus Terminal Input from File" }, { - "name": "workspace:uninstall_warpctrl", - "description": "Undo global Warp Control CLI installation (warpctrl will still work within Warp)" + "name": "notebookview:reload_file", + "description": "Reload file" }, { - "name": "workspace:view_changelog", - "description": "View latest changelog" + "name": "pane_group:close_current_session", + "description": "Close Current Session" }, { - "name": "workspace:toggle_ai_assistant", - "description": "Toggle Warp AI" + "name": "pane_group:add_left", + "description": "Split pane left" }, { - "name": "workspace:shift_focus_left", - "description": "Switch Focus to Left Panel" + "name": "pane_group:add_up", + "description": "Split pane up" }, { - "name": "workspace:shift_focus_right", - "description": "Switch Focus to Right Panel" + "name": "pane_group:navigate_left", + "description": "Switch panes left" }, { - "name": "workspace:import_to_personal_drive", - "description": "Import To Personal Drive" + "name": "pane_group:navigate_right", + "description": "Switch panes right" + }, + { + "name": "pane_group:navigate_up", + "description": "Switch panes up" + }, + { + "name": "pane_group:navigate_down", + "description": "Switch panes down" + }, + { + "name": "pane_group:resize_left", + "description": "Resize pane > Move divider left" + }, + { + "name": "pane_group:resize_right", + "description": "Resize pane > Move divider right" + }, + { + "name": "pane_group:resize_up", + "description": "Resize pane > Move divider up" + }, + { + "name": "pane_group:resize_down", + "description": "Resize pane > Move divider down" + }, + { + "name": "pane_group:add_down", + "description": "Split pane down" + }, + { + "name": "pane_group:add_right", + "description": "Split pane right" + }, + { + "name": "workspace:new_tab", + "description": "Terminal session" + }, + { + "name": "pane:share_pane_contents", + "description": "Share pane" + }, + { + "name": "input:insert_network_logging_workflow", + "description": "Show Warp network log" + }, + { + "name": "input:clear_screen", + "description": "Clear screen" + }, + { + "name": "terminal:scroll_up_one_page", + "description": "Scroll terminal output up one page" + }, + { + "name": "terminal:scroll_down_one_page", + "description": "Scroll terminal output down one page" + }, + { + "name": "workspace:edit_prompt", + "description": "Edit Prompt" + }, + { + "name": "input:toggle_classic_completions_mode", + "description": "(Experimental) Toggle classic completions mode" + }, + { + "name": "workspace:show_command_search", + "description": "Command Search" + }, + { + "name": "input:search_command_history", + "description": "History Search" + }, + { + "name": "input:toggle_workflows", + "description": "Workflows" + }, + { + "name": "input:toggle_natural_language_command_search", + "description": "Open AI Command Suggestions" + }, + { + "name": "input:enable_auto_detection", + "description": "Trigger Auto Detection" + }, + { + "name": "input:clear_and_reset_ai_context_menu_query", + "description": "Clear and reset AI context menu query" + }, + { + "name": "terminal:alternate_terminal_paste", + "description": "Alternate terminal paste" + }, + { + "name": "terminal:warpify_subshell", + "description": "Warpify subshell" + }, + { + "name": "terminal:focus_input", + "description": "Focus terminal input" + }, + { + "name": "terminal:paste", + "description": "Paste" + }, + { + "name": "terminal:copy", + "description": "Copy" + }, + { + "name": "terminal:reinput_commands", + "description": "Reinput selected commands" + }, + { + "name": "terminal:reinput_commands_with_sudo", + "description": "Reinput selected commands as root" + }, + { + "name": "terminal:find", + "description": "Find in Terminal" + }, + { + "name": "terminal:select_bookmark_up", + "description": "Select the closest bookmark up" + }, + { + "name": "terminal:select_bookmark_down", + "description": "Select the closest bookmark down" + }, + { + "name": "terminal:jump_to_latest_agent_message", + "description": "Jump to latest agent message" + }, + { + "name": "terminal:open_block_list_context_menu_via_keybinding", + "description": "Open block context menu" + }, + { + "name": "terminal:toggle_teams_modal", + "description": "Toggle team workflows modal" + }, + { + "name": "terminal:copy_git_branch", + "description": "Copy git branch" + }, + { + "name": "terminal:clear_blocks", + "description": "Clear Blocks" + }, + { + "name": "terminal:executing_command_move_cursor_word_left", + "description": "Move cursor one word to the left within an executing command" + }, + { + "name": "terminal:executing_command_move_cursor_word_right", + "description": "Move cursor one word to the right within an executing command" + }, + { + "name": "terminal:executing_command_move_cursor_home", + "description": "Move cursor home within an executing command" + }, + { + "name": "terminal:executing_command_move_cursor_end", + "description": "Move cursor end within an executing command" + }, + { + "name": "terminal:executing_command_delete_word_left", + "description": "Delete word left within an executing command" + }, + { + "name": "terminal:executing_command_delete_line_start", + "description": "Delete to line start within an executing command" + }, + { + "name": "terminal:executing_command_delete_line_end", + "description": "Delete to line end within an executing command" + }, + { + "name": "terminal:backward_tabulation", + "description": "Backward tabulation within an executing command" + }, + { + "name": "terminal:open_share_block_modal", + "description": "Share selected block" + }, + { + "name": "terminal:bookmark_selected_block", + "description": "Bookmark selected block" + }, + { + "name": "terminal:find", + "description": "Find within selected block" + }, + { + "name": "terminal:copy", + "description": "Copy command and output" + }, + { + "name": "terminal:copy_outputs", + "description": "Copy command output" + }, + { + "name": "terminal:copy_commands", + "description": "Copy command" + }, + { + "name": "terminal:scroll_up_one_line", + "description": "Scroll terminal output up one line" + }, + { + "name": "terminal:scroll_down_one_line", + "description": "Scroll terminal output down one line" + }, + { + "name": "terminal:scroll_to_top_of_selected_block", + "description": "Scroll to top of selected block" + }, + { + "name": "terminal:scroll_to_bottom_of_selected_block", + "description": "Scroll to bottom of selected block" + }, + { + "name": "terminal:select_all_blocks", + "description": "Select all blocks" + }, + { + "name": "terminal:expand_block_selection_above", + "description": "Expand selected blocks above" + }, + { + "name": "terminal:expand_block_selection_below", + "description": "Expand selected blocks below" + }, + { + "name": "terminal:ask_ai_assistant", + "description": "Attach Selected Block as Agent Context" + }, + { + "name": "terminal:ask_ai_assistant", + "description": "Attach Selected Text as Agent Context" + }, + { + "name": "terminal:ask_ai_assistant", + "description": "Ask Warp AI about Selection" + }, + { + "name": "terminal:ask_ai_assistant_last_block", + "description": "Ask Warp AI about last block" + }, + { + "name": "terminal:ask_ai_assistant", + "description": "Ask Warp AI" + }, + { + "name": "input:insert_command_correction", + "description": "Insert Command Correction" + }, + { + "name": "workspace:open_settings_import_page", + "description": "Import External Settings" + }, + { + "name": "terminal:share_current_session", + "description": "Share current session" + }, + { + "name": "terminal:stop_sharing_current_session", + "description": "Stop sharing current session" + }, + { + "name": "terminal:toggle_snackbar_in_active_pane", + "description": "Toggle Sticky Command Header in Active Pane" + }, + { + "name": "workspace:write_codebase_index", + "description": "Write current codebase index snapshot" + }, + { + "name": "terminal:load_agent_mode_conversation", + "description": "Load agent mode conversation (from debug link in clipboard)" + }, + { + "name": "terminal:toggle_session_recording", + "description": "Toggle PTY Recording for Session" + }, + { + "name": "workspace:init_project_rules", + "description": "Initiate project for warp" + }, + { + "name": "workspace:add_current_dir_as_project", + "description": "Add current folder as project" + }, + { + "name": "terminal:toggle_conversation_details_panel", + "description": "Toggle Conversation Details Panel" + }, + { + "name": "app:reopen_closed_session", + "description": "Reopen closed session" + }, + { + "name": "workflowview:save", + "description": "Save workflow" + }, + { + "name": "workspace:panic", + "description": "Trigger a panic (for testing sentry-rust)" + }, + { + "name": "workspace:open_view_tree_debug_view", + "description": "Open view tree debugger" + }, + { + "name": "workspace:sample_process", + "description": "Sample Process" + }, + { + "name": "workspace:dump_heap_profile", + "description": "Write heap profile to disk" + }, + { + "name": "workspace:increase_zoom", + "description": "Increase zoom level" + }, + { + "name": "workspace:decrease_zoom", + "description": "Decrease zoom level" + }, + { + "name": "workspace:reset_zoom", + "description": "Reset zoom level to default" + }, + { + "name": "workspace:increase_font_size", + "description": "Increase font size" + }, + { + "name": "workspace:decrease_font_size", + "description": "Decrease font size" + }, + { + "name": "workspace:reset_font_size", + "description": "Reset font size to default" + }, + { + "name": "workspace:show_theme_chooser", + "description": "Open theme picker" + }, + { + "name": "workspace:activate_first_tab", + "description": "Switch to 1st tab" }, { - "name": "workspace:import_to_team_drive", - "description": "Import To Team Drive" + "name": "workspace:activate_second_tab", + "description": "Switch to 2nd tab" }, { - "name": "workspace:copy_access_token_to_clipboard", - "description": "Copy access token to clipboard" + "name": "workspace:activate_third_tab", + "description": "Switch to 3rd tab" }, { - "name": "workspace:jump_to_latest_toast", - "description": "Jump to latest agent task" + "name": "workspace:activate_fourth_tab", + "description": "Switch to 4th tab" }, { - "name": "workspace:toggle_agent_management_view", - "description": "Toggle the agent management view" + "name": "workspace:activate_fifth_tab", + "description": "Switch to 5th tab" }, { - "name": "workspace:show_settings_account_page", - "description": "Open Settings: Account" + "name": "workspace:activate_sixth_tab", + "description": "Switch to 6th tab" }, { - "name": "workspace:show_settings_features_page", - "description": "Open Settings: Features" + "name": "workspace:activate_seventh_tab", + "description": "Switch to 7th tab" }, { - "name": "workspace:open_settings_file", - "description": "Open settings file" + "name": "workspace:activate_eighth_tab", + "description": "Switch to 8th tab" }, { - "name": "workspace:show_invite_modal", - "description": "Invite People..." + "name": "workspace:activate_last_tab", + "description": "Switch to last tab" }, { - "name": "workspace:link_to_slack", - "description": "Join our Slack community (opens external link)" + "name": "workspace:activate_prev_tab", + "description": "Activate previous tab" }, { - "name": "workspace:link_to_user_docs", - "description": "View user docs (opens external link)" + "name": "workspace:activate_next_tab", + "description": "Activate next tab" }, { - "name": "workspace:view_logs", - "description": "View Warp logs" + "name": "pane_group:navigate_prev", + "description": "Activate previous pane" }, { - "name": "workspace:link_to_privacy_policy", - "description": "View privacy policy (opens external link)" + "name": "pane_group:navigate_next", + "description": "Activate next pane" }, { "name": "workspace:create_team_notebook", @@ -889,18 +1210,154 @@ "name": "workspace:move_tab_right", "description": "Move tab right" }, + { + "name": "workspace:toggle_keybindings_page", + "description": "Toggle keyboard shortcuts" + }, + { + "name": "workspace:show_keybinding_settings", + "description": "Open keybindings editor" + }, + { + "name": "workspace:toggle_block_snackbar", + "description": "Toggle sticky command header" + }, + { + "name": "workspace:set_a11y_concise_verbosity_level", + "description": "[a11y] Set concise accessibility announcements" + }, + { + "name": "workspace:set_a11y_verbose_verbosity_level", + "description": "[a11y] Set verbose accessibility announcements" + }, + { + "name": "workspace:rename_active_tab", + "description": "Rename the current tab" + }, + { + "name": "workspace:rename_active_pane", + "description": "Rename the current pane" + }, + { + "name": "workspace:cycle_active_tab_color", + "description": "Cycle current tab color" + }, + { + "name": "workspace:new_tab_group", + "description": "Create new tab group" + }, + { + "name": "workspace:new_tab_group_from_active_or_selected_tabs", + "description": "Create tab group from active or selected tab(s)" + }, + { + "name": "workspace:remove_active_or_selected_tabs_from_group", + "description": "Remove active or selected tab(s) from group" + }, + { + "name": "workspace:pin_active_tab", + "description": "Pin current tab" + }, + { + "name": "workspace:unpin_active_tab", + "description": "Unpin current tab" + }, + { + "name": "workspace:pin_active_tab_group", + "description": "Pin current tab group" + }, + { + "name": "workspace:unpin_active_tab_group", + "description": "Unpin current tab group" + }, + { + "name": "workspace:terminate_app", + "description": "Quit Warp" + }, { "name": "workspace:close_window", "description": "Close Window" }, + { + "name": "workspace:close_active_tab", + "description": "Close the current tab" + }, + { + "name": "workspace:close_other_tabs", + "description": "Close other tabs" + }, { "name": "workspace:close_tabs_right_active_tab", "description": "Close tabs to the right" }, + { + "name": "workspace:toggle_notifications_on", + "description": "Turn notifications on" + }, + { + "name": "workspace:toggle_notifications_off", + "description": "Turn notifications off" + }, { "name": "workspace:toggle_navigation_palette", "description": "Toggle navigation palette" }, + { + "name": "workspace:toggle_launch_config_palette", + "description": "Launch configuration palette" + }, + { + "name": "workspace:toggle_files_palette", + "description": "Toggle Files Palette" + }, + { + "name": "workspace:open_launch_config_save_modal", + "description": "Save new launch configuration" + }, + { + "name": "workspace:update_and_relaunch", + "description": "Install update and relaunch" + }, + { + "name": "workspace:check_for_updates", + "description": "Check for updates" + }, + { + "name": "workspace:log_out", + "description": "Log out" + }, + { + "name": "workspace:toggle_resource_center", + "description": "Toggle resource center" + }, + { + "name": "workspace:export_all_warp_drive_objects", + "description": "Export all Warp Drive objects" + }, + { + "name": "workspace:install_cli", + "description": "Install Oz CLI globally for use outside of Warp" + }, + { + "name": "workspace:uninstall_cli", + "description": "Undo global Oz CLI installation (oz will still work within Warp)" + }, + { + "name": "workspace:install_warpctrl", + "description": "Install Warp Control CLI globally for use outside of Warp" + }, + { + "name": "workspace:uninstall_warpctrl", + "description": "Undo global Warp Control CLI installation (warpctrl will still work within Warp)" + }, + { + "name": "workspace:view_changelog", + "description": "View latest changelog" + }, + { + "name": "workspace:toggle_ai_assistant", + "description": "Toggle Warp AI" + }, { "name": "workspace:create_team_env_vars", "description": "Create new team environment variables" @@ -918,12 +1375,28 @@ "description": "Create a new team prompt" }, { - "name": "workspace:copy_current_path", - "description": "Copy current path" + "name": "workspace:shift_focus_left", + "description": "Switch Focus to Left Panel" }, { - "name": "workspace:open_repository", - "description": "Open repository" + "name": "workspace:shift_focus_right", + "description": "Switch Focus to Right Panel" + }, + { + "name": "workspace:import_to_personal_drive", + "description": "Import To Personal Drive" + }, + { + "name": "workspace:import_to_team_drive", + "description": "Import To Team Drive" + }, + { + "name": "workspace:copy_access_token_to_clipboard", + "description": "Copy access token to clipboard" + }, + { + "name": "workspace:copy_current_path", + "description": "Copy current path" }, { "name": "workspace:open_ai_fact_collection", @@ -933,14 +1406,30 @@ "name": "workspace:open_mcp_servers", "description": "Open MCP Servers" }, + { + "name": "workspace:jump_to_latest_toast", + "description": "Jump to latest agent task" + }, + { + "name": "workspace:toggle_agent_management_view", + "description": "Toggle the agent management view" + }, { "name": "workspace:show_settings", "description": "Open Settings" }, + { + "name": "workspace:show_settings_account_page", + "description": "Open Settings: Account" + }, { "name": "workspace:show_settings_appearance_page", "description": "Open Settings: Appearance" }, + { + "name": "workspace:show_settings_features_page", + "description": "Open Settings: Features" + }, { "name": "workspace:show_settings_shared_blocks_page", "description": "Open Settings: Shared Blocks" @@ -989,10 +1478,50 @@ "name": "workspace:show_mcp_servers_settings_page", "description": "Open Settings: MCP Servers" }, + { + "name": "workspace:open_settings_file", + "description": "Open settings file" + }, + { + "name": "workspace:show_invite_modal", + "description": "Invite People..." + }, + { + "name": "workspace:link_to_slack", + "description": "Join our Slack community (opens external link)" + }, + { + "name": "workspace:link_to_user_docs", + "description": "View user docs (opens external link)" + }, { "name": "workspace:send_feedback", "description": "Send feedback (opens external link)" + }, + { + "name": "workspace:view_logs", + "description": "View Warp logs" + }, + { + "name": "workspace:link_to_privacy_policy", + "description": "View privacy policy (opens external link)" + }, + { + "name": "workspace:disable_terminal_input_syncing", + "description": "Stop Synchronizing Any Panes" + }, + { + "name": "workspace:toggle_sync_terminal_inputs_in_tab", + "description": "Toggle Synchronizing All Panes in Current Tab" + }, + { + "name": "workspace:toggle_sync_all_terminal_inputs_in_all_tabs", + "description": "Toggle Synchronizing All Panes in All Tabs" + }, + { + "name": "workspace:toggle_maximize_code_review_panel", + "description": "Toggle Maximize Code Review Panel" } ], - "generated_at": "2026-07-23T18:48:57.057380+00:00" -} \ No newline at end of file + "generated_at": "2026-08-21T20:34:56.380949+00:00" +} diff --git a/.agents/skills/validate_ui_refs/validate_ui_refs.py b/.agents/skills/validate_ui_refs/validate_ui_refs.py index 21c773045..ca03390e5 100644 --- a/.agents/skills/validate_ui_refs/validate_ui_refs.py +++ b/.agents/skills/validate_ui_refs/validate_ui_refs.py @@ -3,14 +3,14 @@ Scans markdown files for references to Warp UI paths (Settings > ..., File > ..., etc.) and Command Palette command names, then validates them against a snapshot of known-valid -paths extracted from the warp-internal codebase. +paths extracted from the public warp client repo (warpdotdev/warp). Usage: python3 validate_ui_refs.py --all python3 validate_ui_refs.py --check-paths python3 validate_ui_refs.py --check-commands python3 validate_ui_refs.py --all --fix --create-pr --slack-notify - python3 validate_ui_refs.py --refresh-valid-paths --warp-internal-path /path/to/warp-internal + python3 validate_ui_refs.py --refresh-valid-paths --warp /path/to/warp """ from __future__ import annotations @@ -35,6 +35,10 @@ DEFAULT_DOCS_DIR = SCRIPT_DIR.parents[2] / "src" / "content" / "docs" DEFAULT_SLACK_CHANNEL = "C09BVK0PL3Y" # #growth-docs +# Sibling directory names tried when auto-detecting the warp client checkout. +# Prefer the public warpdotdev/warp repo; `warp-internal` is a legacy fallback. +WARP_REPO_SIBLING_NAMES = ("warp", "warp-internal") + # Known Warp UI roots — paths starting with these are Warp UI paths WARP_UI_ROOTS = {"Settings", "File", "View", "Warp", "Warp Drive", "Personal"} @@ -256,6 +260,27 @@ def extract_ui_paths(file_path: Path) -> List[Dict[str, Any]]: re.IGNORECASE, ) +# Opening/self-closing HTML or JSX tag on a single line, e.g. +# <DemoVideo src="..." label="Block Divider Demo" /> +# <figure style={{ maxWidth: "375px" }}> +# Quoted strings *inside* such a tag are component props or CSS values, never +# Command Palette commands. Matching the tag span (rather than sniffing for a +# `word=` prefix) keeps legitimate prose like `Palette: "Open theme picker"` +# from being suppressed. +_RE_HTML_JSX_TAG = re.compile(r"<[A-Za-z][^<>]*>") + +# Markdown fenced code block delimiter. Fenced blocks hold prompt and CLI +# examples (e.g. an agent prompt that happens to quote a UI label), which are +# illustrative text rather than live references to Warp's Command Palette. +_RE_CODE_FENCE = re.compile(r"^\s*(?:```|~~~)") + + +def _is_inside_jsx_tag(line: str, index: int) -> bool: + """Return True if `index` falls within an HTML/JSX tag on `line`.""" + return any( + m.start() <= index < m.end() for m in _RE_HTML_JSX_TAG.finditer(line) + ) + def _is_plausible_command_name(name: str) -> bool: """Filter false positives for command palette names.""" @@ -317,6 +342,11 @@ def _is_plausible_command_name(name: str) -> bool: "tab indicators", "show sticky command header", "settings sync", "empty session", "secret redaction", "sticky command header", "vim keybindings", + # Mouse reporting is a Settings > Features toggle. The Command Palette + # does surface it, but with a state-dependent label ("Enable ..." / + # "Disable ..."), and it is registered as a settings row rather than an + # EditableBinding, so it never appears in the extracted snapshot. + "mouse reporting", "enable mouse reporting", "disable mouse reporting", } if name_lower in _settings_toggle_phrases: return False @@ -335,7 +365,16 @@ def extract_command_palette_refs(file_path: Path) -> List[Dict[str, Any]]: return results lines = text.splitlines() + in_code_fence = False for line_num, line in enumerate(lines, start=1): + # Skip fenced code blocks — they contain prompt/CLI examples, not + # live UI references. + if _RE_CODE_FENCE.match(line): + in_code_fence = not in_code_fence + continue + if in_code_fence: + continue + # Check if "Command Palette" is mentioned nearby (within 2 lines) context_start = max(0, line_num - 3) context_end = min(len(lines), line_num + 1) @@ -364,6 +403,10 @@ def extract_command_palette_refs(file_path: Path) -> List[Dict[str, Any]]: prefix = line[:match.start()] if _RE_UI_LABEL_PREFIX.search(prefix): continue + # Skip component props and CSS values inside JSX/HTML tags + # (e.g. `label="..."`, `title="..."`, `maxWidth: "375px"`) + if _is_inside_jsx_tag(line, match.start()): + continue # Skip if already captured by arrow pattern if not any( r["line"] == line_num and r["name"] == name @@ -407,7 +450,7 @@ def _suggest_migration_for_deprecated_section( Handles patterns like: Settings > AI > Input -> Settings > Agents > Oz > Input Settings > AI > Knowledge -> Settings > Agents > Knowledge - Settings > Platform -> Settings > Cloud platform > Oz Cloud API Keys + Settings > Platform -> Settings > Cloud platform > API keys Settings > Environments -> Settings > Cloud platform > Environments Settings > MCP Servers -> Settings > Agents > MCP servers """ @@ -422,7 +465,7 @@ def _suggest_migration_for_deprecated_section( subsection_map = info.get("subsection_to_subpage", {}) if len(segments) == 2: - # Settings > Platform -> Settings > Cloud platform > Oz Cloud API Keys + # Settings > Platform -> Settings > Cloud platform > API keys new_path = ["Settings", umbrella, default_subpage] return { "valid": False, @@ -517,6 +560,26 @@ def validate_ui_path(path: str, valid_paths: Dict[str, Any]) -> Dict[str, Any]: } subpage = segments[2] if subpage not in subpages: + # A subpage may itself have been renamed within the same + # umbrella (e.g. "Oz Cloud API Keys" -> "API keys" under + # "Cloud platform"). Check this deterministic alias map before + # falling through to case-insensitive/fuzzy matching, so a + # historical full path resolves to an exact migration instead + # of an unfixed fuzzy suggestion. + deprecated_subpages = umbrella_data.get("deprecated_subpages", {}) + if subpage in deprecated_subpages: + mapped_subpage = deprecated_subpages[subpage] + new_path = ["Settings", section, mapped_subpage] + segments[3:] + return { + "valid": False, + "issue": ( + f"\"{subpage}\" was renamed to \"{mapped_subpage}\" " + f"under the \"{section}\" umbrella" + ), + "suggestion": " > ".join(new_path), + "confidence": 0.95, + "fix_type": "deprecated_section", + } ci_match = next( (s for s in subpages if s.lower() == subpage.lower()), None ) @@ -1358,11 +1421,38 @@ def notify_slack( # --------------------------------------------------------------------------- -# Refresh valid_paths.json from warp-internal +# Refresh valid_paths.json from the warp client repo # --------------------------------------------------------------------------- -def refresh_valid_paths(warp_internal_path: Path, output_path: Path) -> None: - """Re-extract valid paths from warp-internal Rust sources and save to JSON. +def resolve_warp_repo(explicit_path: Optional[str]) -> Path: + """Resolve the warp client repo checkout used for snapshot extraction. + + Resolution order: + 1. An explicit `--warp PATH` (or the deprecated `--warp-internal-path`). + 2. The `WARP_REPO_PATH` env var, or the deprecated `WARP_INTERNAL_PATH`. + 3. A sibling of the docs repo named `warp` (the public warpdotdev/warp + checkout), falling back to a legacy `warp-internal` sibling. + + When nothing is found, returns the preferred sibling path so the caller + can report a useful "not found" error. + """ + if explicit_path: + return Path(explicit_path) + + env_path = os.environ.get("WARP_REPO_PATH") or os.environ.get("WARP_INTERNAL_PATH") + if env_path: + return Path(env_path) + + siblings_root = SCRIPT_DIR.parents[2].parent + for name in WARP_REPO_SIBLING_NAMES: + candidate = siblings_root / name + if candidate.exists(): + return candidate + return siblings_root / WARP_REPO_SIBLING_NAMES[0] + + +def refresh_valid_paths(warp_repo_path: Path, output_path: Path) -> None: + """Re-extract valid paths from the warp client repo's Rust sources and save to JSON. Preserves hand-maintained lists (macos_menu_bar, warp_drive, umbrellas, deprecated_sections, top_level_sidebar) from the existing snapshot. @@ -1378,10 +1468,10 @@ def refresh_valid_paths(warp_internal_path: Path, output_path: Path) -> None: other's sub_sections. Any sub_sections value curated in the existing snapshot is treated as authoritative and is not overwritten. """ - print(f"Refreshing valid_paths.json from {warp_internal_path}...") + print(f"Refreshing valid_paths.json from {warp_repo_path}...") - settings_sections = _extract_settings_sections(warp_internal_path) - command_palette = _extract_command_palette_commands(warp_internal_path) + settings_sections = _extract_settings_sections(warp_repo_path) + command_palette = _extract_command_palette_commands(warp_repo_path) # Load existing for menu bar, warp drive, umbrellas, deprecated_sections, # and top_level_sidebar (all manually maintained lists). @@ -1394,7 +1484,7 @@ def refresh_valid_paths(warp_internal_path: Path, output_path: Path) -> None: # Best-effort: pull umbrellas from `SettingsUmbrella::new(...)` calls in mod.rs # and merge into the existing snapshot (existing entries win on conflict). try: - extracted_umbrellas = _extract_umbrellas(warp_internal_path) + extracted_umbrellas = _extract_umbrellas(warp_repo_path) except Exception as e: # pragma: no cover - defensive, parser errors print(f" Warning: umbrella extraction failed: {e}", file=sys.stderr) extracted_umbrellas = {} @@ -1445,14 +1535,14 @@ def refresh_valid_paths(warp_internal_path: Path, output_path: Path) -> None: ) -def _extract_umbrellas(warp_internal: Path) -> Dict[str, Any]: +def _extract_umbrellas(warp_repo: Path) -> Dict[str, Any]: """Parse SettingsUmbrella::new("Label", vec![...]) calls from mod.rs. Maps each umbrella label to its ordered list of subpage **display names** (resolved via the `Display for SettingsSection` impl). Returns a dict shaped like the `umbrellas` field in valid_paths.json. """ - mod_rs = warp_internal / "app" / "src" / "settings_view" / "mod.rs" + mod_rs = warp_repo / "app" / "src" / "settings_view" / "mod.rs" umbrellas: Dict[str, Any] = {} try: mod_text = mod_rs.read_text(encoding="utf-8") @@ -1512,9 +1602,9 @@ def _display(variant: str) -> str: return umbrellas -def _extract_settings_sections(warp_internal: Path) -> Dict[str, Any]: +def _extract_settings_sections(warp_repo: Path) -> Dict[str, Any]: """Parse SettingsSection enum and sub-sections from Rust source files.""" - mod_rs = warp_internal / "app" / "src" / "settings_view" / "mod.rs" + mod_rs = warp_repo / "app" / "src" / "settings_view" / "mod.rs" sections = {} # Parse Display impl for section display names @@ -1590,7 +1680,7 @@ def _extract_settings_sections(warp_internal: Path) -> Dict[str, Any]: "Privacy": "privacy_page.rs", } - settings_dir = warp_internal / "app" / "src" / "settings_view" + settings_dir = warp_repo / "app" / "src" / "settings_view" for variant, display_name in display_map.items(): source_file = page_files.get(variant, "mod.rs") @@ -1622,43 +1712,62 @@ def _extract_settings_sections(warp_internal: Path) -> Dict[str, Any]: return sections -def _extract_command_palette_commands(warp_internal: Path) -> List[Dict[str, str]]: +# `EditableBinding::new("action", "Description", ...)` and the +# `BindingDescription::new("Description")` variant. +_RE_EDITABLE_BINDING = re.compile( + r'EditableBinding::new\(\s*"([^"]+)",\s*' + r'(?:BindingDescription::new\(\s*"([^"]+)"|"([^"]+)")' +) + + +def _iter_binding_source_files(warp_repo: Path): + """Yield Rust files under `app/src` that may register command bindings. + + Walks the whole desktop app tree rather than a hand-picked file list: + bindings are registered across many view modules (for example + `pane_group/pane/view/mod.rs` registers "Share pane"), and hardcoding + files silently drops any command defined elsewhere. + + Excluded: + - test modules, whose fixture bindings are not real commands + - `crates/warp_tui`, which is the headless TUI front-end and does not + share the desktop Command Palette + + Traversal is sorted so the generated snapshot is deterministic. + """ + app_src = warp_repo / "app" / "src" + if not app_src.exists(): + return + for root, dirs, filenames in os.walk(app_src): + dirs[:] = sorted(d for d in dirs if d not in {"tests", "target"}) + for filename in sorted(filenames): + if not filename.endswith(".rs"): + continue + if filename.endswith(("_tests.rs", "_test.rs")) or filename == "mod_test.rs": + continue + yield Path(root) / filename + + +def _extract_command_palette_commands(warp_repo: Path) -> List[Dict[str, str]]: """Parse EditableBinding registrations to extract command palette commands.""" commands = [] seen_descriptions = set() - source_files = [ - warp_internal / "app" / "src" / "terminal" / "view" / "init.rs", - warp_internal / "app" / "src" / "workspace" / "mod.rs", - ] - - for source_file in source_files: - if not source_file.exists(): - continue + for source_file in _iter_binding_source_files(warp_repo): try: text = source_file.read_text(encoding="utf-8") - except OSError: + except (OSError, UnicodeDecodeError): continue - # Pattern: EditableBinding::new("name", "description", ...) - for m in re.finditer( - r'EditableBinding::new\(\s*"([^"]+)",\s*"([^"]+)"', - text, - ): - name, desc = m.group(1), m.group(2) - if desc not in seen_descriptions and not desc.startswith("[Debug]"): - commands.append({"name": name, "description": desc}) - seen_descriptions.add(desc) - - # Pattern: EditableBinding::new("name", BindingDescription::new("description"), ...) - for m in re.finditer( - r'EditableBinding::new\(\s*"([^"]+)",\s*BindingDescription::new\("([^"]+)"\)', - text, - ): - name, desc = m.group(1), m.group(2) - if desc not in seen_descriptions and not desc.startswith("[Debug]"): - commands.append({"name": name, "description": desc}) - seen_descriptions.add(desc) + for m in _RE_EDITABLE_BINDING.finditer(text): + name = m.group(1) + # group(2) is the BindingDescription::new(...) form, group(3) the + # plain string literal form; exactly one of them matches. + desc = m.group(2) or m.group(3) + if not desc or desc in seen_descriptions or desc.startswith("[Debug]"): + continue + commands.append({"name": name, "description": desc}) + seen_descriptions.add(desc) return commands @@ -1787,7 +1896,7 @@ def generate_report( SettingsSection::CodeIndexing => write!(f, "Indexing and projects"), SettingsSection::EditorAndCodeReview => write!(f, "Editor and Code Review"), SettingsSection::CloudEnvironments => write!(f, "Environments"), - SettingsSection::OzCloudAPIKeys => write!(f, "Oz Cloud API Keys"), + SettingsSection::OzCloudAPIKeys => write!(f, "API keys"), _ => write!(f, "{self:?}"), } } @@ -1832,8 +1941,10 @@ def _run_self_test(valid_paths_path: Path) -> int: 2. `_is_external_path()` no longer suppresses `Settings > MCP Servers` in a sentence containing GitHub / Linear mentions (previous bug). 3. `refresh_valid_paths()` preserves umbrellas + deprecated_sections when - run against a synthetic warp-internal with the new enum, and populates + run against a synthetic warp checkout with the new enum, and populates the new subpage entries. + 4. `resolve_warp_repo()` honors the explicit path, the `WARP_REPO_PATH` env + var, and the deprecated `WARP_INTERNAL_PATH` fallback in that order. """ import textwrap @@ -1872,8 +1983,8 @@ def _run_self_test(valid_paths_path: Path) -> int: # --- 3. refresh_valid_paths preservation + extraction with tempfile.TemporaryDirectory() as td: - wi_root = Path(td) / "warp-internal" - mod_rs = wi_root / "app" / "src" / "settings_view" / "mod.rs" + warp_root = Path(td) / "warp" + mod_rs = warp_root / "app" / "src" / "settings_view" / "mod.rs" mod_rs.parent.mkdir(parents=True) mod_rs.write_text(textwrap.dedent(_SYNTHETIC_MOD_RS)) @@ -1881,7 +1992,7 @@ def _run_self_test(valid_paths_path: Path) -> int: snap_path = Path(td) / "valid_paths.json" snap_path.write_text(valid_paths_path.read_text()) - refresh_valid_paths(wi_root, snap_path) + refresh_valid_paths(warp_root, snap_path) refreshed = load_valid_paths(snap_path) @@ -1893,7 +2004,7 @@ def _run_self_test(valid_paths_path: Path) -> int: failures.append("refresh lost the Agents umbrella") # The extractor should have picked up the synthetic umbrellas too. - extracted = _extract_umbrellas(wi_root) + extracted = _extract_umbrellas(warp_root) for expected in ("Agents", "Code", "Cloud platform"): if expected not in extracted: failures.append( @@ -1910,13 +2021,105 @@ def _run_self_test(valid_paths_path: Path) -> int: "Indexing and projects", "Editor and Code Review", "Environments", - "Oz Cloud API Keys", + "API keys", ): if expected_subpage not in refreshed.get("settings_sections", {}): failures.append( f"settings_sections missing subpage `{expected_subpage}` after refresh" ) + # --- 4. resolve_warp_repo precedence (explicit > WARP_REPO_PATH > + # deprecated WARP_INTERNAL_PATH > sibling auto-detect) + saved_env = { + key: os.environ.get(key) for key in ("WARP_REPO_PATH", "WARP_INTERNAL_PATH") + } + try: + os.environ["WARP_REPO_PATH"] = "/tmp/from-warp-repo-path" + os.environ["WARP_INTERNAL_PATH"] = "/tmp/from-warp-internal-path" + + if resolve_warp_repo("/tmp/explicit") != Path("/tmp/explicit"): + failures.append("resolve_warp_repo() ignored the explicit --warp path") + if resolve_warp_repo(None) != Path("/tmp/from-warp-repo-path"): + failures.append("resolve_warp_repo() did not prefer WARP_REPO_PATH") + + del os.environ["WARP_REPO_PATH"] + if resolve_warp_repo(None) != Path("/tmp/from-warp-internal-path"): + failures.append( + "resolve_warp_repo() dropped the deprecated WARP_INTERNAL_PATH fallback" + ) + finally: + for key, value in saved_env.items(): + if value is None: + os.environ.pop(key, None) + else: + os.environ[key] = value + + # --- 5. Command Palette extraction ignores JSX attributes and code fences + with tempfile.TemporaryDirectory() as td: + sample = Path(td) / "sample.mdx" + sample.write_text(textwrap.dedent("""\ + Open the Command Palette and search for "Open theme picker". + + <DemoVideo src="/assets/x.mp4" label="Block Divider Demo" /> + <VideoEmbed url="https://example.com/v" title="Command Palette Demo" /> + <figure style={{ maxWidth: "375px" }}> + + Example prompt for the command palette: + ```text + Walk through the entire "New run" creation flow end to end. + ``` + + In the Command Palette, search for "Warpify SSH Session". + """)) + + found = {r["name"] for r in extract_command_palette_refs(sample)} + + # JSX component props and CSS values must not be treated as commands. + for bogus in ( + "Block Divider Demo", + "Command Palette Demo", + "375px", + ): + if bogus in found: + failures.append( + f"extract_command_palette_refs() captured JSX attribute {bogus!r}" + ) + + # Quoted labels inside fenced code blocks are examples, not references. + if "New run" in found: + failures.append( + "extract_command_palette_refs() captured a name inside a code fence" + ) + + # Genuine prose references must still be captured. + for expected in ("Open theme picker", "Warpify SSH Session"): + if expected not in found: + failures.append( + f"extract_command_palette_refs() missed prose reference {expected!r}" + ) + + # --- 6. "Oz Cloud API Keys" -> "API keys" migration, both legacy forms. + # The label was renamed twice over: first the whole page moved under the + # "Cloud platform" umbrella (as the bare top-level "Oz Cloud API Keys" + # section), then the subpage itself was renamed to "API keys". Both + # historical spellings must resolve to the same current path. + expected_suggestion = "Settings > Cloud platform > API keys" + bare_legacy = validate_ui_path("Settings > Oz Cloud API Keys", data) + if bare_legacy["valid"] or bare_legacy.get("suggestion") != expected_suggestion: + failures.append( + "validate_ui_path() did not migrate the bare legacy " + f"\"Settings > Oz Cloud API Keys\" path: {bare_legacy}" + ) + full_legacy = validate_ui_path( + "Settings > Cloud platform > Oz Cloud API Keys", data + ) + if full_legacy["valid"] or full_legacy.get("suggestion") != expected_suggestion: + failures.append( + "validate_ui_path() did not migrate the full legacy " + "\"Settings > Cloud platform > Oz Cloud API Keys\" path " + f"(deprecated_subpages regression): {full_legacy}" + ) + if failures: print("SELF-TEST FAILED:") for f in failures: @@ -1944,11 +2147,18 @@ def main() -> int: parser.add_argument("--slack-notify", action="store_true", help="Post results to Slack") parser.add_argument("--slack-channel", default=DEFAULT_SLACK_CHANNEL, help="Slack channel ID") parser.add_argument("--include-changelog", action="store_true", help="Include changelog/ in scan") - parser.add_argument("--refresh-valid-paths", action="store_true", help="Re-extract from warp-internal") + parser.add_argument("--refresh-valid-paths", action="store_true", help="Re-extract from the warp client repo") + parser.add_argument( + "--warp", + dest="warp_repo_path", + help="Path to the public warp client repo (auto-detected as a sibling " + "of the docs repo named 'warp', with 'warp-internal' as fallback; " + "also reads the WARP_REPO_PATH env var)", + ) parser.add_argument( "--warp-internal-path", - default=os.environ.get("WARP_INTERNAL_PATH", str(SCRIPT_DIR.parents[2].parent / "warp-internal")), - help="Path to warp-internal repo", + dest="warp_repo_path", + help="Deprecated alias for --warp", ) parser.add_argument("--valid-paths", default=str(DEFAULT_VALID_PATHS_FILE), help="Path to valid_paths.json") parser.add_argument("--docs-dir", default=str(DEFAULT_DOCS_DIR), help="Path to docs directory") @@ -1966,14 +2176,18 @@ def main() -> int: args.all = True valid_paths_file = Path(args.valid_paths) - warp_internal = Path(args.warp_internal_path) + warp_repo = resolve_warp_repo(args.warp_repo_path) # Refresh valid paths if requested if args.refresh_valid_paths: - if not warp_internal.exists(): - print(f"Error: warp-internal not found at {warp_internal}", file=sys.stderr) + if not warp_repo.exists(): + print( + f"Error: warp client repo not found at {warp_repo}. Pass --warp PATH " + "or set WARP_REPO_PATH.", + file=sys.stderr, + ) return 1 - refresh_valid_paths(warp_internal, valid_paths_file) + refresh_valid_paths(warp_repo, valid_paths_file) if not args.all and not args.check_paths and not args.check_commands: return 0 diff --git a/.agents/skills/weekly-404-monitor/SKILL.md b/.agents/skills/weekly-404-monitor/SKILL.md index 501005040..7fe01625a 100644 --- a/.agents/skills/weekly-404-monitor/SKILL.md +++ b/.agents/skills/weekly-404-monitor/SKILL.md @@ -12,8 +12,9 @@ Runs every Monday at 9am PT. Leads with the overall 404 volume trend, surfaces t The following environment secrets must be set in the Oz cloud agent environment: - `METABASE_API_KEY` — Metabase API key for BigQuery queries. If unavailable, the run must fail fast with a clear error. -- `SLACK_BOT_TOKEN` — Slack bot token for posting to the docs channel. If unavailable, write a no-post report to the run output instead. -- `GROWTH_DOCS_SLACK_CHANNEL_ID` — Slack channel ID for **`#growth-docs`**. Find it in Slack by right-clicking the channel → Copy link (the ID begins with `C`). There is no fallback — the run will skip Slack posting if this is unset. +- `BUZZ_SLACK_TOKEN` — Slack bot token for posting to the docs channel. If unavailable, write a no-post report to the run output instead. + +The `#growth-docs` Slack channel ID is `C09BVK0PL3Y`. Use this value directly when posting — it does not need to be an environment variable. Do NOT print, log, or include secret values in reports, commits, or Slack messages. @@ -56,11 +57,22 @@ Compare this week's uncovered gaps against last week's uncovered gaps (from step - **Significant gaps** = uncovered URLs with `hits_this_week >= REPORT_MIN_HITS`. These are worth a redirect and belong in the headline. - **Long-tail noise** = uncovered URLs below the threshold. Because the monitor is only weeks old (low sample), most broken URLs are hit once by bots, crawlers, or stale bookmarks, so the raw uncovered and "new gap" counts churn heavily week-over-week and overstate the problem. Roll these up into a single count — never list them individually or put them in the headline. -### 5. Post Slack summary +### 5. Determine whether the run is actionable + +This agent posts **at most one message per run**, and only when the run is actionable. Follow the actionable-only rule in `.agents/references/skill-authoring-guidelines.md`. + +Decide here; send later. The order for the rest of the run is: write the CSV (step 6), run Phase 2, then send one combined message if this step marked the run actionable **or** Phase 2 produced redirect results. + +The run is actionable when any of these is true: +- `significant_uncovered_count` is 1 or more (at least one gap at or above `REPORT_MIN_HITS`). +- Phase 2 found at least one HIGH-confidence redirect, or produced MEDIUM-confidence suggestions needing human review. +- The run was blocked by a failure (Metabase error, missing `docs_404` data, truncated `vercel.json`). + +Stay silent when the only findings are long-tail URLs below the threshold. That is the normal steady state once redirect coverage is healthy, and posting it weekly is what trains the channel to ignore this report. The run log entry and the CSV artifact remain the record of every run. -Post a Slack message using the Block Kit format defined in the "Slack message format" section below. +**Do not send the message from this step.** Because Phase 2 can add HIGH-confidence redirects and MEDIUM-confidence suggestions to the same report, defer the send until Phase 2 completes, then send one combined message. Two messages per run for a single report is exactly the noise this removes. -If `SLACK_BOT_TOKEN` is unavailable, write the full Slack message body to the run output instead and note that Slack posting was skipped. +If `BUZZ_SLACK_TOKEN` is unavailable, write the full message body to the run output instead and note that Slack posting was skipped. ### 6. Write CSV artifact @@ -91,13 +103,19 @@ Use Slack Block Kit. The message should be scannable in under 30 seconds. _+{long_tail_count} other uncovered URLs under {report_min_hits} hits each (mostly bots/old links) — see CSV._ *{resolved_count} resolved since last week* (redirect added or traffic stopped) +🔀 *Redirect drafter:* {N} HIGH-confidence redirects → {PR URL, or "none found this week"} +{MEDIUM-confidence suggestions needing review, if any:} +{path} → {suggested destination} [{reason}] + → Add redirects for the gaps above: `vercel.json` › `redirects` array (PR against `main`) → Full breakdown: {oz_run_url} ``` +The redirect-drafter line is part of this single message, not a separate post. Omit the line entirely when Phase 2 found nothing and the message is being sent because of significant gaps alone. + Build `{oz_run_url}` at runtime — never hard-code the Oz host (for example `app.warp.dev` or `oz.warp.dev`). This agent may run on staging or production, and a hard-coded host resolves to the wrong environment (or a generic Runs page). Resolve the environment-correct link from your current run, substituting the run ID this agent is executing as: ```bash -oz-dev run get "<your run ID>" --output-format json | jq -r '.session_link' +oz run get "<your run ID>" --output-format json | jq -r '.session_link' ``` If the command fails or returns an empty value, omit the `→ Full breakdown` line rather than posting a hard-coded or broken URL. @@ -111,7 +129,9 @@ Rules: ## Phase 2: Redirect drafter -After the Slack summary is posted and the CSV artifact is written, continue with Phase 2. Phase 2 proposes redirect entries for high-confidence uncovered 404 gaps, reducing the manual work required from the docs team. +After the CSV artifact is written, continue with Phase 2. Phase 2 proposes redirect entries for high-confidence uncovered 404 gaps, reducing the manual work required from the docs team. + +Phase 2 runs **before** the Slack message is sent, so its results can be folded into that single message (see step 5). ### Threshold and confidence scoring @@ -132,13 +152,23 @@ For each qualifying uncovered URL, attempt to find a redirect target using these ### PR requirements -Open a draft PR only when at least 1 HIGH-confidence redirect is found. +Open a **draft** PR only when at least 1 HIGH-confidence redirect is found. Always pass `--draft` to `gh pr create`. + +This skill follows the "One standing PR per automation" contract in `.agents/references/skill-authoring-guidelines.md`. Every redirect PR edits the same `redirects` array in `vercel.json`, so a dated PR per week would guarantee conflicts. -PR title: +Use the stable branch `docs/404-redirects` and a title with no date: ```text -docs: add redirects for top uncovered 404 paths — YYYY-MM-DD +docs: add redirects for top uncovered 404 paths ``` +Look for an existing open PR before creating one: +```bash +gh pr list --repo warpdotdev/docs --state open \ + --search 'add redirects for top uncovered 404 paths in:title' \ + --json number,headRefName +``` +If one exists, check out `docs/404-redirects`, rebase on the latest `origin/main`, add this week's redirects, push, and append them to the existing PR body under its existing headings. Do not add a duplicate heading per week — `check_pr_body.py` rejects those. If none exists, create the branch from the latest `origin/main`. + For each proposed redirect, add an entry to the `redirects` array in `vercel.json`: ```json {"source": "/old/path", "destination": "/new/path", "statusCode": 308} @@ -151,21 +181,13 @@ PR body must include: Run `python3 .agents/skills/check_for_broken_links/check_links.py --internal-only` after editing `vercel.json` to catch any malformed destinations. -### Slack update +### Handing results to the Slack message -Append to the existing Slack message (or post a follow-up in the same thread): -``` -🔀 *Redirect drafter results* -HIGH-confidence PRs: N redirects → [PR URL] -MEDIUM-confidence suggestions: N paths (listed below for human review) -{path} → {suggested destination} [{reason}] -... -``` +Do not post a separate redirect-drafter message. Pass these values into the single Phase 1 message described in "Slack message format": +- The count of HIGH-confidence redirects and the PR URL, if a PR was opened or updated. +- Any MEDIUM-confidence suggestions, each with its proposed target and confidence reason, for human review. -If no gaps meet the threshold or no HIGH-confidence matches are found, post: -``` -🔀 *Redirect drafter*: No high-confidence redirects found this week. -``` +If no gaps meet the threshold and no HIGH-confidence matches are found, contribute nothing to the message and omit the redirect-drafter line. If that leaves the run with no significant gaps either, the run is a no-op: post nothing at all and let the run log record it. ### Threshold calibration note @@ -235,14 +257,17 @@ Check: Vercel project env vars include `PUBLIC_RUDDERSTACK_WRITE_KEY` and `PUBLI This skill is designed for an Oz scheduled agent with a weekly cron trigger: every Monday at 9am PT (`0 17 * * 1` in UTC). -To deploy: +To deploy (one-time setup): 1. Push this skill to `main` in the docs repo. -2. Verify the **`buzz`** Oz environment (in the Oz web app → Environments) has these secrets set: +2. Verify the **Docs Agent** Oz environment (`K5KStCm5aYvhfBJb8cHol6`) has these secrets set: - `METABASE_API_KEY` — Metabase API key for BigQuery - - `SLACK_BOT_TOKEN` — Slack bot token - - `GROWTH_DOCS_SLACK_CHANNEL_ID` — ID for `#growth-docs` (right-click channel in Slack → Copy link; the ID starts with `C`) -3. In the Oz web app, create a new scheduled agent: - - **Skill**: `weekly-404-monitor` from `warpdotdev/docs` - - **Schedule**: `0 17 * * 1` (UTC) = 9am PT (Mondays) - - **Environment**: `buzz` (already has `warpdotdev/docs` checked out) - - **Branch**: `main` + - `BUZZ_SLACK_TOKEN` — Slack bot token (already provisioned; used by other doc agents in this environment) +3. Register the schedule via the Oz CLI: + ```sh + oz schedule create \ + --name "weekly-404-monitor" \ + --cron "0 17 * * 1" \ + --environment K5KStCm5aYvhfBJb8cHol6 \ + --prompt "You are running in the warpdotdev/docs repo. Read and follow the instructions in .agents/skills/weekly-404-monitor/SKILL.md." + ``` + This will make the schedule visible in oz.warp.dev under Schedules and ensure runs open PRs under the @oz-by-warp bot account. diff --git a/.agents/templates/conceptual.md b/.agents/templates/conceptual.md index 998030500..b162b6e95 100644 --- a/.agents/templates/conceptual.md +++ b/.agents/templates/conceptual.md @@ -2,8 +2,10 @@ title: [Feature or concept name — sentence case. Title convention: noun or "About [subject]". The title field renders as the page H1; do not add a separate H1 in the body. Use {{TOKEN}} syntax for any product names in src/data/vars.ts.] description: >- - [1-2 sentences: what the concept/feature is + why it matters. - Write as a standalone summary for search results. Lead with user benefit. + [One sentence, 50-160 characters: what the concept is and why it matters. + Start with the subject, not "Learn about" or "This page covers." + Example: "Environments give cloud agents the same toolchain and setup on every run, no matter what triggers them." + See AGENTS.md > Frontmatter > Descriptions by content type for the full rules. Use {{TOKEN}} syntax for any product names in src/data/vars.ts.] --- [VARS: Add this line immediately after the closing --- above if this page references any product names from src/data/vars.ts. Then use {VARS.KEY} for those names in the prose below. @@ -13,10 +15,12 @@ See AGENTS.md → Content variables for the full variable list and usage rules.] [Opening paragraph: What this feature/concept is and its primary benefit. 1-3 sentences. Lead with what the user gains from understanding this.] -## [Key concepts or components — sentence case. Rename to match the subject] +[BREVITY: Delete any section below you don't need for this page — a short page is a finished page. See AGENTS.md → Voice & tone → Cut again.] + +## [Key concepts or components — sentence case, specific to the subject. Not "Overview", "More details", or "Other"] [Explain the main ideas, components, or building blocks the reader needs -to understand. Use bulleted lists with bold term + dash + description.] +to understand. Use `*` bulleted lists with bold term + hyphen + description.] * **Concept A** - What it is and why it matters. * **Concept B** - What it is and why it matters. @@ -37,8 +41,9 @@ Help the reader decide if this is the right tool for their situation.] ## Related pages -[Cross-references to related features, procedural guides, and deeper references. -Use descriptive link text.] +[Required on new conceptual pages so the page does not dead-end. +Cross-reference related features, procedural guides, and deeper references. +Use descriptive link text that names the destination — not "here" or "this page".] * [Related feature](path/to/page.md) * [How to configure X](path/to/procedural-page.md) diff --git a/.agents/templates/faq.md b/.agents/templates/faq.md index 428a8d8b7..e6942f36e 100644 --- a/.agents/templates/faq.md +++ b/.agents/templates/faq.md @@ -1,7 +1,9 @@ --- description: >- - [1-2 sentences: what topic area these FAQs cover. - Example: "Answers to common questions about cloud agents, billing, and environments." + [One sentence, 50-160 characters: name the topic area these questions cover. + Don't just say "Frequently asked questions." + Example: "Answers to common questions about cloud agent billing, credits, and plan limits." + See AGENTS.md > Frontmatter > Descriptions by content type for the full rules. Use {{TOKEN}} syntax for any product names in src/data/vars.ts.] --- [VARS: Add this line immediately after the closing --- above if this page references any product names from src/data/vars.ts. Then use {VARS.KEY} for those names in the prose below. @@ -13,6 +15,8 @@ See AGENTS.md → Content variables for the full variable list and usage rules.] [Opening paragraph: Brief context about what this FAQ covers and who it's for. 1-2 sentences.] +[BREVITY: Delete any section below you don't need — a short page is a finished page. See AGENTS.md → Voice & tone → Cut again.] + ## [Theme group — sentence case. e.g., "General", "Billing", "Configuration"] [Group questions by theme so readers can scan for their topic.] diff --git a/.agents/templates/feature-doc.md b/.agents/templates/feature-doc.md index 4f3d24cac..60f088918 100644 --- a/.agents/templates/feature-doc.md +++ b/.agents/templates/feature-doc.md @@ -1,9 +1,10 @@ --- description: >- - [1-2 sentences: what the feature does + primary user benefit. - Lead with the benefit, include key terms for SEO. - Use {{TOKEN}} syntax here for any product names that have a var in src/data/vars.ts. - Example: "Use the {{WARP_AGENT_CLI}} to run agents."] + [One sentence, 50-160 characters: what the feature does and its primary benefit. + Start with the verb or the feature, not "Documentation for." + Example: "Control what the agent can do with permission cards, auto-approve, and execution profiles." + See AGENTS.md > Frontmatter > Descriptions by content type for the full rules. + Use {{TOKEN}} syntax here for any product names that have a var in src/data/vars.ts.] --- [VARS: Add this line immediately after the closing --- above if this page references any product names from src/data/vars.ts. Then use {VARS.KEY} for those names in the prose below. `import { VARS } from '@data/vars';` @@ -14,6 +15,8 @@ See AGENTS.md → Content variables for the full variable list and usage rules.] [Opening paragraph: What this feature does and its primary benefit. 1-3 sentences. Lead with what the user can accomplish.] +[BREVITY: Delete any section below you don't need — a short page is a finished page. See AGENTS.md → Voice & tone → Cut again.] + :::note [Optional: Key context the reader needs upfront, e.g., when they DON'T need this feature, or a prerequisite they should know about. @@ -23,7 +26,8 @@ Remove this callout if not needed.] ## Key features [Bulleted list. Bold term + dash + description for each. -Focus on what each capability means for the user.] +Focus on what each capability means for the user. +If one capability is a genuine differentiator (e.g., an agent- or API-driven alternative to the default UI flow), give it real visual weight here or in its own callout near the top of the relevant section — don't bury it as a footnote after the primary flow is already documented.] * **Feature A** - What it does and why it matters to the user. * **Feature B** - What it does and why it matters to the user. @@ -34,20 +38,33 @@ Focus on what each capability means for the user.] Explain "what" and "why" before "how." Define new terms when they first appear. IMPORTANT: Do NOT include step-by-step procedures in this section. -Keep the conceptual and procedural sections clearly separated.] +Keep the conceptual and procedural sections clearly separated. +State platform, plan, preview, or interactive-only limits next to the behavior they constrain. +Do not invent internal tool names or implementation details the reader cannot act on. +Do not cite exact counts of tools, steps, or subcomponents (e.g., "ten tools") if they could change — describe the capability instead; a stale number is worse than no number. +Do NOT embed full error messages here — put failures in Troubleshooting at the end.] + +[SCREENSHOTS: If this feature has a distinctive visual surface (statusline, tab bar, side pane, multi-control layout), place a screenshot immediately after the paragraph that introduces that surface. Use descriptive alt text. Skip screenshots for purely textual CLI behavior.] ## [Usage/configuration section — sentence case. Rename to match the feature, e.g., "Creating environments", "Configuring integrations"] [PROCEDURAL section: step-by-step instructions. +Order sections for the reader: Prerequisites → setup/config → day-to-day usage → advanced options. Apply all procedural rules from AGENTS.md: - Motivate steps before giving instructions - Include expected outcomes after key steps -- Group related actions when they share the same UI context] +- Group related actions when they share the same UI context +- Name the app before the first Settings path or CLI command on this page +- Verify every UI label, Settings path, and CLI flag against source or the live product before publishing. If you cannot verify one, omit it or mark it with an inline `{/* VERIFY: ... */}` comment and report it per step 9.5 of the draft_docs skill +- Prefer durable actions and outcomes over ephemeral chrome (glyph colors, pure layout narration) +- Lead instructional sentences with the action or goal, then the control (✅ "To open the selector, press `Ctrl+E`." ❌ "To change either value, press `Ctrl+E`.") +- Disambiguate conditionals and multi-clause sentences so only one reading remains] ### Prerequisites [Bulleted list with inline context for each prerequisite. -Include: what the thing is, where to get it, link to full reference.] +Include: what the thing is, where to get it, link to full reference. +For integrations and team features, include admin requirements, who gains access after install, and any per-user auth steps.] ### [Task name — sentence case. e.g., "Create an environment with the CLI"] @@ -58,12 +75,22 @@ Include: what the thing is, where to get it, link to full reference.] ## [Additional sections as needed — sentence case. e.g., "Managing X", "Advanced usage"] [Repeat the conceptual or procedural pattern as appropriate. -Keep sections clearly delineated by type.] +Keep sections clearly delineated by type. +Avoid stacking multiple callouts; prefer short prose unless a caveat is easy to miss.] + +## Troubleshooting + +[Optional but recommended when the feature has common failures, permission errors, or exact platform error strings. +Place this section near the end of the page, before Related pages. +Format each item as: bold symptom or exact error message, then cause, then fix. +Do not scatter the same error callouts through earlier sections.] ## Related pages -[Cross-references to related features, next steps, deeper references. -Use descriptive link text.] +[Required on new feature and integration pages so the page does not dead-end. +Cross-reference related features, sibling integrations, next steps, and deeper references. +Use descriptive link text that names the destination — not "here" or "this page". +Include at least one sibling or overview link and one next-step workflow link.] * [Related feature](path/to/page.md) * [Deeper guide](path/to/page.md) diff --git a/.agents/templates/guide-page.md b/.agents/templates/guide-page.md index 31c93e133..dc99e9a30 100644 --- a/.agents/templates/guide-page.md +++ b/.agents/templates/guide-page.md @@ -1,19 +1,24 @@ --- title: [Task-oriented title in sentence case — reads like a search query. Capture the non-branded query a developer would actually search for, not "How to do X in Warp." The title field renders as the page H1; do not add a separate H1 in the body.] description: >- - [1-2 sentence summary of what this guide covers and what the reader will - achieve. Keep under 160 characters for SEO.] + [One sentence, 50-160 characters: what the reader will build or accomplish, + using the non-branded phrasing they would actually search for. + Example: "Set up Claude Code and run your first agentic coding session from the terminal." + See AGENTS.md > Frontmatter > Descriptions by content type for the full rules.] --- [One sentence: what you'll accomplish by following this guide. Mention Warp by name. Include a time estimate if possible (e.g., "takes about 10 minutes").] +[BREVITY: Delete any section below you don't need — a short page is a finished page. See AGENTS.md → Voice & tone → Cut again.] + [AEO GUIDANCE: If this guide is based on Peec, answer-engine prompts, search-query data, or AEO goals, create an AEO brief first using `.agents/skills/aeo_brief/SKILL.md`. Use the brief to preserve high-intent vocabulary naturally, translate awkward source-data phrasing into developer-friendly docs language, and decide whether this should be a new guide or an update to an existing page.] import VideoEmbed from '@components/VideoEmbed.astro'; {/* VARS: Also add the line below if this guide references product names from src/data/vars.ts. Then use {VARS.KEY} in prose. Use {{TOKEN}} in frontmatter YAML values above. See AGENTS.md → Content variables. */} {/* import { VARS } from '@data/vars'; */} -<VideoEmbed url="[YouTube or Loom URL — remove this block if no video]" /> +{/* VIDEO: Always include a specific title prop naming the workflow/feature shown. Remove the entire VideoEmbed block if there is no video. */} +<VideoEmbed url="[YouTube or Loom URL]" title="[Specific title: integration, workflow, or task shown — not generic 'video' or 'demo']" /> ## Prerequisites diff --git a/.agents/templates/procedural.md b/.agents/templates/procedural.md index d74281967..67fcd2ef3 100644 --- a/.agents/templates/procedural.md +++ b/.agents/templates/procedural.md @@ -1,7 +1,9 @@ --- description: >- - [1-2 sentences: what the reader will accomplish. - Task-oriented: "Create and manage X" or "Configure Y for Z." + [One sentence, 50-160 characters: the task the reader will complete. + Start with an imperative verb, not "This page explains." + Example: "Connect Slack to Oz so mentions and channel messages can trigger cloud agent runs." + See AGENTS.md > Frontmatter > Descriptions by content type for the full rules. Use {{TOKEN}} syntax here for any product names that have a var in src/data/vars.ts.] --- [VARS: Add this line immediately after the closing --- above if this page references any product names from src/data/vars.ts. Then use {VARS.KEY} for those names in the prose below. @@ -13,6 +15,8 @@ See AGENTS.md → Content variables for the full variable list and usage rules.] [Opening paragraph: What the reader will accomplish and why. 1-2 sentences. Focus on the goal, not the tool.] +[BREVITY: Delete any section below you don't need for this task — a short page is a finished page. See AGENTS.md → Voice & tone → Cut again.] + [AEO GUIDANCE: If this procedure is based on Peec, answer-engine prompts, search-query data, or AEO goals, create an AEO brief first using `.agents/skills/aeo_brief/SKILL.md`. Use the brief to translate source-data vocabulary into precise, natural docs language and confirm whether this belongs in a new page or an existing page.] ## Prerequisites @@ -22,7 +26,7 @@ Each item should include: what it is (1 short clause), where to get or create it, and a link to the full reference. Example: * **A Warp API key** - Authenticate API requests with a key from - **Settings** > **Cloud platform** > **Oz Cloud API Keys** in the Warp app. See [API Keys](path) for details.] + **Settings** > **Cloud platform** > **API keys** in the Warp app. See [API Keys](path) for details.] ## [Primary task name — sentence case. e.g., "Creating API keys"] diff --git a/.agents/templates/quickstart.md b/.agents/templates/quickstart.md index 771b52dab..f44cbb848 100644 --- a/.agents/templates/quickstart.md +++ b/.agents/templates/quickstart.md @@ -1,7 +1,9 @@ --- description: >- - [1-2 sentences: what the reader will accomplish + time estimate. - Example: "Learn how to run your first cloud agent in ~10 minutes." + [One sentence, 50-160 characters: what the reader ends up with, plus the time budget. + Start with an imperative verb, not "Learn how to" or "Get started with." + Example: "Install the {{WARP_AGENT_CLI}}, log in, and run your first agent conversation in about five minutes." + See AGENTS.md > Frontmatter > Descriptions by content type for the full rules. Use {{TOKEN}} syntax here for any product names that have a var in src/data/vars.ts.] --- [VARS: Add this line immediately after the closing --- above if this page references any product names from src/data/vars.ts. Then use {VARS.KEY} for those names in the prose below. diff --git a/.agents/templates/reference.md b/.agents/templates/reference.md index 86205039b..56d5ba8cf 100644 --- a/.agents/templates/reference.md +++ b/.agents/templates/reference.md @@ -1,19 +1,23 @@ --- description: >- - [1-2 sentences: what is documented and how to use this reference. - Example: "Use the {{WARP_AGENT_CLI}} to run, configure, and manage agents from the terminal." + [One sentence, 50-160 characters: what the reader can look up here. + Name the artifacts (flags, endpoints, shortcuts), not the genre. + Example: "Look up {{WARP_AGENT_CLI}} flags, environment variables, slash commands, and keyboard shortcuts." + See AGENTS.md > Frontmatter > Descriptions by content type for the full rules. Use {{TOKEN}} syntax for any product names in src/data/vars.ts.] --- [VARS: Add this line immediately after the closing --- above if this page references any product names from src/data/vars.ts. Then use {VARS.KEY} for those names in the prose below. `import { VARS } from '@data/vars';` See AGENTS.md → Content variables for the full variable list and usage rules.] -# [Title — sentence case. Title convention: noun describing contents, e.g., "CLI commands", "Keyboard shortcuts"] +# [Title — sentence case. Title convention: noun describing contents, e.g., "CLI commands", "Keyboard shortcuts". Not a bare "Overview" or "Reference".] [Brief intro: what this reference covers and how to use it. 1-2 sentences. This is for lookup, not learning.] -## [Section name — sentence case. e.g., "Installing the CLI", "Authentication"] +[BREVITY: Delete any section below you don't need — a short page is a finished page. See AGENTS.md → Voice & tone → Cut again.] + +## [Section name — sentence case and specific. e.g., "Installing the CLI", "Authentication". Not "More details".] [Introductory sentence or conceptual context for this section.] diff --git a/.agents/templates/troubleshooting.md b/.agents/templates/troubleshooting.md index 573d1b178..519427f58 100644 --- a/.agents/templates/troubleshooting.md +++ b/.agents/templates/troubleshooting.md @@ -1,7 +1,8 @@ --- description: >- - [1-2 sentences describing common issues covered on this page. - Example: "Solutions for common issues with cloud agents, environments, and integrations." + [One sentence, 50-160 characters: name the symptoms covered, not the act of troubleshooting. + Example: "Fix sign-in failures, failed conversation resumes, and update problems in the {{WARP_AGENT_CLI}}." + See AGENTS.md > Frontmatter > Descriptions by content type for the full rules. Use {{TOKEN}} syntax for any product names in src/data/vars.ts.] --- [VARS: Add this line immediately after the closing --- above if this page references any product names from src/data/vars.ts. Then use {VARS.KEY} for those names in the prose below. @@ -10,6 +11,8 @@ See AGENTS.md → Content variables for the full variable list and usage rules.] # [Title — sentence case. Title convention: "Troubleshooting [feature]" or "Known issues with [feature]"] +[BREVITY: Delete any section below you don't need — a short page is a finished page. See AGENTS.md → Voice & tone → Cut again.] + :::note [Optional: link to GitHub issues page, support channels, or related resources.] For a complete list of issues and feature requests, visit our [GitHub issues page](https://github.com/warpdotdev/Warp/issues). diff --git a/.env.example b/.env.example index 02af3a50d..ed587847d 100644 --- a/.env.example +++ b/.env.example @@ -4,11 +4,19 @@ # Values below are PUBLIC (they're shipped to the browser by Astro's # `envField`, and live behind rate limiting / allow-lists on the vendor side). -# Kapa Custom Frontend integration ID for the "Ask AI" button in the header. -# If unset, the Ask AI button is hidden and the site still runs normally. -# Get yours at: https://app.kapa.ai/admin +# Kapa Website Widget integration ID for the "Ask AI" button in the sidebar. +# If unset, docs falls back to the shared widget integration ID used in preview/prod. +# Get yours at: https://app.kapa.ai/admin (Integrations → Widget → Copy integration ID). +# The same value is passed to the widget as `data-website-id`. +# PUBLIC_KAPA_INTEGRATION_ID=f31c5644-dd65-4f49-9762-bf580062afa8 PUBLIC_KAPA_INTEGRATION_ID= +# Optional Kapa project ID used to build internal conversation links in +# "Create ticket" email drafts: +# https://app.kapa.ai/<PROJECT_ID>/conversations/<THREAD_ID> +# You can find this in the Kapa dashboard URL while viewing the project. +PUBLIC_KAPA_PROJECT_ID= + # RudderStack analytics — required for docs_404 event tracking and page analytics. # Without these, no analytics events are sent and the weekly 404 monitor will # report zero data. Set both in the Vercel project environment (all environments). @@ -21,3 +29,12 @@ PUBLIC_KAPA_INTEGRATION_ID= # directive in vercel.json (a mismatch silently blocks all events in the browser). PUBLIC_RUDDERSTACK_WRITE_KEY= PUBLIC_RUDDERSTACK_DATA_PLANE_URL= + +# Server-side handoff forwarding endpoint used by /api/support-handoff. +# This should point at the DevX service endpoint that creates Front +# conversations from docs chat handoff requests. +SUPPORT_HANDOFF_ENDPOINT_URL= + +# Required when SUPPORT_HANDOFF_ENDPOINT_URL is set. Docs forwards this only +# to the DevX service as the `?secret=` query parameter, not as a bearer token. +SUPPORT_HANDOFF_SHARED_SECRET= diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 32daedc6f..6e005713d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,7 +48,7 @@ jobs: python3 .agents/skills/missing_docs/scripts/test_audit_docs.py # Validate the validate_ui_refs snapshot and script invariants. Uses - # a synthetic warp-internal fixture internally — no checkout required. + # a synthetic warp client fixture internally — no checkout required. - name: Self-test validate_ui_refs skill run: python3 .agents/skills/validate_ui_refs/validate_ui_refs.py --self-test diff --git a/.github/workflows/refresh-ui-paths.yml b/.github/workflows/refresh-ui-paths.yml index 592b0f9af..96e5c03d7 100644 --- a/.github/workflows/refresh-ui-paths.yml +++ b/.github/workflows/refresh-ui-paths.yml @@ -1,6 +1,6 @@ name: Refresh UI paths snapshot -# Triggered automatically when warp-internal's Settings UI files change +# Triggered automatically when the warp client's Settings UI files change # (via repository_dispatch from warpdotdev/warp) or manually via # workflow_dispatch as a fallback. on: @@ -9,7 +9,7 @@ on: - settings-ui-changed workflow_dispatch: -# Only WARP_API_KEY is needed here — warp-internal access and Slack +# Only WARP_API_KEY is needed here — warpdotdev/warp access and Slack # notifications are handled by the Oz cloud agent environment. permissions: contents: read @@ -49,7 +49,7 @@ jobs: Then run: python3 .agents/skills/validate_ui_refs/validate_ui_refs.py \\ --refresh-valid-paths \\ - --warp-internal-path /workspace/warp + --warp /workspace/warp 2. Compare valid_paths.json before and after (strip generated_at from both, then diff). If unchanged, exit — no PR needed. 3. If the snapshot changed, run: diff --git a/AGENTS.md b/AGENTS.md index 757975d9c..ba3fb9d74 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,8 +11,77 @@ This guide establishes standards for writing Warp documentation. It covers voice ### Voice & tone - **Professional yet approachable**: Write with authority but remain accessible to developers of all skill levels - **Direct and action-oriented**: Lead with what users can accomplish, not just what features exist -- **User-focused**: Use second person ("you can", "allows you to") rather than passive voice +- **User-focused**: Use second person ("you") and active voice - **Confident without jargon**: Explain technical concepts clearly without oversimplifying +- **Plain over polished**: Prefer the short word and the declarative sentence. A page should read like a capable colleague explaining something, not like a spec or a launch post. + +Our reference points are the GitHub and Vercel docs: short declarative sentences, concrete examples, restrained formatting, and no selling. + +#### Define, show, link +Introduce a concept in one to three plain sentences, give a concrete example, then link out for depth. Repeat that pattern instead of front-loading the page with context. +- ✅ "A workflow is an automated process that runs one or more jobs. For example, a workflow can label new issues automatically. For more information, see [Writing workflows](...)." +- ❌ "Before diving into the components, it helps to align on a few terms:" followed by a glossary of everything the page explains later anyway. + +#### Document the user-visible model, not our architecture +Describe what the reader sees and does. Internal components get at most one sentence, and only when the reader can act on them. GitHub Actions runs on an orchestrator and a control plane; its docs never mention either. They describe workflows, events, jobs, and runners, because those are what users touch. +- ✅ "Warp tracks every run. Check its status from the CLI, the API, or the dashboard." +- ❌ "The orchestration layer runs on Warp's servers (cloud control plane), creates tasks when triggers fire, and tracks lifecycle state (created → running → completed/failed)." + +This is the voice-level version of "Don't over-specify counts or internals that will drift" (see General guidance): internals aren't just a staleness risk, they're noise between the reader and the task. + +When a page carries real information in the wrong register (provenance, pinned versions, maintainer process), relocate it to the surface whose audience needs it: a reference page, a script docstring, a code comment. Leave a pointer if the reader might follow the thread. Cutting for tone must not lose facts; it changes where they live. + +#### Every sentence earns its place +Cut sentences that narrate the page, restate what the reader just read, or explain the obvious consequence of the previous sentence. +- **No meta-openers** - Never open with "This page covers/explains/walks through...". The title and description already frame the page; state the thing itself. + - ✅ "Run agents directly in your GitHub Actions workflows using `oz-agent-action`." + - ❌ "This page covers how the integration works, how to set it up, and common automation patterns for development teams." +- **No restated cause-and-effect** - Don't follow a fact with a sentence explaining why that fact is good. + - ✅ "The container is destroyed after each run, so every run starts clean." + - ❌ "The container is destroyed after each run. This process ensures every run starts from the same baseline, making results reproducible and debugging straightforward." +- **No recap lines** - Don't end a section by summarizing it ("In practice: triggers create tasks; tasks produce outputs."). +- **Say it once** - Don't repeat a caveat or definition across multiple sections of the same page. Put it where it matters most. The same goes for sibling pages: boilerplate like validation steps or shared prerequisites lives once on the parent or reference page, linked from the rest. + +#### Words to avoid +These words are the strongest tell of an AI-generated draft and rarely add meaning. Replace them with the specific fact they're hiding, or delete them. +- **Marketing adjectives** - seamless(ly), powerful, robust, comprehensive, effortless, cutting-edge, game-changing, supercharged +- **Inflated verbs** - leverage (→ use), streamline (→ remove steps), empower (→ let), unlock (→ name the capability, or delete), delve into (→ cover), elevate, harness +- **Filler frames** - "designed to", "ensures that", "allows you to", "it's important to note", "it's worth noting", "in order to" (→ to) +- **Abstract dramatics** - landscape, realm, journey, tapestry, testament to + +**Examples:** +- ✅ "The agent runs in your CI pipeline. It can review code, triage issues, and fix failing checks." +- ❌ "The agent integrates seamlessly into your CI pipeline, automating tasks like code review, issue triage, bug fixing, and maintenance." + +If the claim is true, the reader notices without the adjective. If it isn't, the adjective won't save it. + +#### Structural patterns to avoid +AI-drafted pages share a rhythm. Break it. +- **Rule-of-three padding** - Triplets of adjectives or clauses used for cadence rather than information ("scalable, autonomous, and auditable"). Keep the items that carry weight and cut the rest. +- **Rhetorical question openers** - Don't open a section with a question you immediately answer. Use a descriptive header and a declarative first sentence. +- **Hedging stacks** - Chains of "typically", "often", "generally", "where supported", and "as applicable" read as evasive. State what happens, then note the exception if there is one. +- **Bold-everything** - Bolding several phrases per paragraph kills emphasis. Reserve bold for UI elements and lead terms of list items (see Emphasis). +- **Bullets as a substitute for prose** - Bullets are for short, parallel, scannable items. If every bullet is a full paragraph, or the bullets tell a story in order, write prose. +- **Slashed shorthand** - Write "mentions and assignments", not "mention/assignment", and "4 vCPU / 8 GB", not "4/8". Slashed pairs and bare number pairs read as notes, not prose. +- **Callout spam** - Callouts follow the same restraint: never consecutive, at most one per section (see Callouts and hints). + +#### Keep the author out of it +The reader came for the product, not the writer's presence in the page. +- **No self-commentary** - Don't narrate authorial intent: "deliberately unremarkable", "each prompt is worth reading", "that is the point of this example". State the fact and let it stand. +- **State rules calmly, once** - Defensive phrasing ("Do not describe or imply otherwise", "CI green is not the bar") argues with an imagined reader. Write the rule once, plainly, and give a reason only when the reason changes what the reader does. +- **Describe the present** - Write how the product works now. Renames and history belong in time-boxed transition notes or the changelog, not woven through pages ("the built-in harness is the Warp Agent harness", not "Oz is retired product language"). + +#### The read-aloud test +Read the paragraph aloud. If it doesn't sound like something you'd say to a colleague, rewrite it plainly. This catches over-explained cause-and-effect, hedging, and repeated rhetorical patterns faster than any checklist. + +#### Cut again +A plain-language rewrite still under-cuts on the first pass. Follow it with a deletion-only pass that removes: +- Framing lines that describe the docs instead of the product ("Each example demonstrates one concept"). +- Explanations of command output that the command already prints, or that a linked page already owns. +- Recaps and comparison sections that restate what the reader just read. +- Justifications for rules and defaults that don't change what the reader does. + +Expect the second pass to find real deletions even after a careful first one; review feedback on past copy passes has consistently asked for more cutting, not less. ### Language guidelines - Use consistent terminology throughout (see [Terminology standards](#terminology-standards) and the full glossary in `.agents/references/terminology.md`) @@ -59,7 +128,7 @@ Avoid words that are ambiguous between singular and plural. - **Serial comma**: Always use it. "Environments, integrations, and schedules" — not "Environments, integrations and schedules." - **Contractions**: Allowed and encouraged to match our approachable tone. Use "you're," "don't," "it's," "can't." Exception: avoid contractions in error messages or formal warnings. - **Tense**: Use present tense to describe how things work ("Warp indexes your codebase"). Use imperative for instructions ("Configure your environment"). -- **Person**: Use second person ("you") for instructions. Avoid first person plural ("we") in procedural content. First person is acceptable in conceptual or narrative text when referring to Warp as a company ("We designed Oz to..."). +- **Person**: Use second person ("you") for instructions. Avoid first person plural ("we") in procedural content. First person is acceptable in conceptual or narrative text when referring to Warp as a company ("We designed the Automation Platform to..."). ### Inclusive language - Use gender-neutral pronouns ("they/them") for unknown users @@ -94,16 +163,48 @@ Every page must include YAML frontmatter with a `description` field. ```yaml --- description: >- - A concise 1-2 sentence summary that explains what the page covers and - what value it provides to the reader. + One sentence, 50-160 characters, stating what the reader gets from this page. --- ``` -Write descriptions as standalone summaries that would make sense in a search result. Lead with the user benefit, include key terms for the topic. -- ✅ `description: Environments ensure your cloud agents run with consistent toolchains across all triggers. Learn when to use environments and how to configure them.` +The `description` field is the meta description in search results and the snippet AI engines read before deciding whether to cite the page. Write it as a standalone summary for someone who has never seen the page. +- ✅ `description: Environments give cloud agents the same toolchain and setup on every run, no matter what triggers them.` - ❌ `description: This page describes environments.` -The `description` field is used as the meta description in search results — write it as a summary that would make someone click. +#### Description rules +These apply to every page, regardless of content type. +- **One sentence, 50-160 characters.** Search engines truncate past roughly 160. Two sentences almost always overshoot the budget, so prefer one that earns its length. +- **Cut filler openers.** "Learn about," "This page covers," "A guide to," and "Documentation for" spend characters without adding meaning. Start with the verb or the subject instead. +- **Describe what the reader gets, not what the page is.** "This page explains X" is always weaker than explaining X. +- **Lead with the primary keyword** when it reads naturally, ideally within the first few words. +- **Match the page's actual scope.** A description that promises more than the page delivers reads as a bait-and-switch in search results. + +#### Descriptions by content type +Every description answers "what will I get from this page?" The shape of that answer depends on the type. +- **Conceptual** - Say what the thing is and why it matters. Start with the subject. + - ✅ `Environments give cloud agents the same toolchain and setup on every run, no matter what triggers them.` + - ❌ `Learn about environments and why they are useful.` +- **Procedural** - Say what task the reader will complete. Start with an imperative verb. + - ✅ `Connect Slack to the Automation Platform so mentions and channel messages can trigger cloud agent runs.` + - ❌ `This page explains the Slack integration setup process.` +- **Quickstart** - Say what the reader ends up with, plus the time budget. Start with an imperative verb. + - ✅ `Install the Warp Agent CLI, log in, and run your first agent conversation in about five minutes.` + - ❌ `Get started with the Warp Agent CLI.` +- **Reference** - Say what the reader can look up. Name the artifacts rather than the genre. + - ✅ `Look up Warp Agent CLI flags, environment variables, slash commands, and keyboard shortcuts.` + - ❌ `Reference documentation for the Warp Agent CLI.` +- **Troubleshooting** - Name the symptoms covered, not the act of troubleshooting. + - ✅ `Fix sign-in failures, failed conversation resumes, and update problems in the Warp Agent CLI.` + - ❌ `Troubleshooting information for common problems.` +- **FAQ** - Name the topic area the questions cover. + - ✅ `Answers to common questions about cloud agent billing, credits, and plan limits.` + - ❌ `Frequently asked questions.` +- **Feature documentation** - Say what the feature does and its primary benefit. + - ✅ `Control what the agent can do with permission cards, auto-approve, and execution profiles.` + - ❌ `Documentation for permissions and profiles.` +- **Guide** - Say what the reader will build or accomplish, using the non-branded phrasing they would search for. + - ✅ `Set up Claude Code and run your first agentic coding session from the terminal.` + - ❌ `A guide to using Claude Code with Warp.` ### Headers - Use sentence case for all headers (not title case) @@ -126,7 +227,7 @@ Clean, descriptive URLs rank better in search and are more shareable. ### Page length and scannability - Aim for scannable pages. Use clear section headers, short paragraphs (2-4 sentences), and bulleted lists. -- If a page exceeds ~1500 words, consider breaking it into sub-pages or using clear anchor links. +- **Cut first, split only if it's still long.** A page over ~1500 words is usually carrying framing, restated cause-and-effect, or boilerplate a parent page already owns — run the deletion-only "Cut again" pass (see Voice & tone → Cut again) before reaching for sub-pages or anchor links. Splitting a bloated page produces two bloated pages; only split once the content itself, not the padding, still doesn't fit on one page. - Avoid thin pages with only a sentence or two — consolidate with related content instead. When two pages cover nearly the same topic, merge them. ### Opening paragraphs @@ -196,15 +297,17 @@ Use screenshots to clarify product surfaces, configuration points, or visual sta Use consistent screenshot widths so docs pages feel visually balanced. Crop unnecessary empty space before resizing, then choose the closest standard size. **Standard widths:** -- **Large screenshots: default content width** — Use normal `<figure>` or Markdown image rendering for full-window, full-pane, or broad product-surface screenshots where the surrounding layout matters. In legacy GitBook screenshots, this was usually `563px`. +- **Full content width: 736px** — Use for wide screenshots whose content cannot be cropped narrower without clipping, such as full-width terminal strips, wide status bars, and wide tables. `736px` equals the content column (`46rem`, set on `.main-pane .sl-container` in `src/styles/custom.css`), so it renders the same as omitting `maxWidth`. Set it explicitly anyway: it records that the width is deliberate rather than forgotten, and the style lint treats a missing width as an error. Reach for this tier only when a narrower size would make text illegible. +- **Large screenshots: 563px** — The default for full-window, full-pane, or broad product-surface screenshots where the surrounding layout matters. This was the usual width in legacy GitBook screenshots. Prefer this over `736px` unless the content genuinely needs the extra room. - **Medium screenshots: ~375px** — Use for narrow UI surfaces such as popovers, command menus, side panes, dropdowns, and focused interaction flows. This is the preferred constrained size for most small Warp UI screenshots. - **Small screenshots: ~300-350px** — Use for tightly cropped controls, chips, buttons, tooltips, and small menus. Use a smaller width only when the UI remains legible and the crop is intentionally compact. **Rules:** - **Avoid arbitrary widths** — Choose the nearest standard size instead of one-off values. If a screenshot needs a different size, the reason should be clear from the UI being shown. - **Keep sequences consistent** — Screenshots in the same section or step sequence should use the same width unless they show meaningfully different UI surfaces. -- **Preserve legibility** — Text in the screenshot must remain readable at the chosen size on the docs page. -- **Prefer the default figure size for large screenshots** — Only constrain width when the screenshot is a narrow UI element that looks oversized at full content width. +- **Preserve legibility** — Text in the screenshot must remain readable at the chosen size on the docs page. This rule outranks the preference for a smaller tier: if text is unreadable at `563px`, move up to `736px` rather than shipping an illegible image. +- **Crop before widening** — Widening is the last resort. First crop out empty space and anything that is not the subject, and re-capture at a narrower terminal or window size if you can. Only step up a tier when the content itself sets the floor, as with a status bar that clips instead of reflowing. +- **Prefer the default figure size for large screenshots** — Only constrain width below `563px` when the screenshot is a narrow UI element that looks oversized at full content width. #### Image caption guidelines Captions orient the reader — they identify what the image shows so the reader knows where to look. They are not a place for instructions, marketing language, or exhaustive descriptions. @@ -271,7 +374,12 @@ For important caveats, limitations, or things to watch out for ::: ``` -Use callouts sparingly. A page with 5+ callouts loses its visual impact. +Use callouts sparingly: +- Never place two callouts back to back, and keep to at most one per section. +- Keep callouts to a sentence or two. Information that needs a list or several sentences belongs in the body under a header. +- A caveat that applies to one step belongs in that step's prose, not in a callout. + +Callouts interrupt the reader. Each one spends attention the page can't get back. ### Placeholders and dynamic text - Use ALL_CAPS for placeholder values in commands: `git clone REPO_URL` @@ -377,8 +485,13 @@ These rules apply regardless of content type: - **Provide inline context for first references**: Assume the reader arrived directly at this page, not from a parent page. When a prerequisite, concept, or tool is mentioned for the first time, include: what the thing is (1 short clause), where to get or create it, and a link to the full reference. - ✅ "**A Warp API key** - Authenticate API requests with a key from **Settings** > **Platform** in the Warp app. See the API Keys reference for details." - ❌ "**An API key** - Create one in **Settings** > **Platform**." (what kind of key? Settings where?) -- **Include practical examples**: Show real-world scenarios, not just toy examples. Concrete examples help the reader understand when and why to use a feature. +- **Include practical examples**: Show real-world scenarios, not just toy examples. Concrete examples help the reader understand when and why to use a feature. For enterprise or infrastructure-heavy features, prefer a complete example (a full config file, a linked sample repository) over a fragment — abstract features are hardest to trust without something concrete to point at. - **Cross-reference related pages**: Link to related features, next steps, and deeper references so the reader can continue learning. +- **Sequence basics before jargon**: Explain what something is in plain language before introducing internal-sounding framing, deep lifecycle terminology, or advanced configuration. A reader who doesn't know the concept yet should never hit unexplained jargon in the first few paragraphs. Save advanced or self-referential concepts (e.g., a system that improves itself) for after the reader understands the basic flow. +- **Avoid appendix-style content**: Don't add a bullet list or table whose only job is to restate content already covered elsewhere on the page, such as an exhaustive index of tabs or settings that duplicates the dedicated sections below it. Weave supplementary details into the section they relate to instead of bolting them onto the end under a generic heading like "Good to know." +- **Don't over-specify counts or internals that will drift**: Describe a capability rather than naming an exact count of tools, steps, or subcomponents behind it (e.g., "a small set of tools" instead of "ten tools"). Precise counts go stale the moment the implementation changes, and a stale number is worse than no number. +- **Feature real differentiators structurally**: If a capability is a genuine advantage over the default path (an agent- or API-driven alternative to a UI flow, for example), give it real visual weight — a clear callout near the top of the relevant section, not a footnote after the primary steps are already done. Where something sits on the page communicates how important it is. +- **Verify claims against the live product, not just prior drafts**: Terminology, UI labels, and calculated values drift between rounds of review. Confirm names, labels, and metric definitions against the actual app, API, or codebase before publishing — especially for pages describing metrics or anything computed. ### Conceptual @@ -427,6 +540,7 @@ These rules apply regardless of content type: - Include expected outcomes after key steps so the reader can confirm they're on track. - Test all instructions for accuracy. - 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` @@ -597,7 +711,7 @@ Use these terms consistently throughout all documentation. For the full canonica Product feature names retain their standard capitalization. Match the exact casing shown in the UI. - **Warp** (not "Warp Terminal" unless specifically distinguishing) -- **Agent** or **Agents** (capitalized when referring to Warp's AI agents) +- **agent** / **agents** (lowercase) - the generic concept, covering any agent on any surface. See [Capitalizing "agent"](#capitalizing-agent) for the full rule. - **Agent Mode** (not "agent mode" or "Agent-mode") - **Terminal and Agent modes** - The two distinct modes in Warp: terminal mode (for shell commands) and Agent Mode (for multi-turn agent conversations). Use "Terminal and Agent modes" on first reference; use "terminal mode" or "Agent Mode" individually in subsequent references. Do not use "agent modality" or "Agent Modality" — this was an internal name that is not user-facing. - **Cloud Agents** (capitalized as a product section/feature name; lowercase "cloud agents" in most contexts) @@ -605,26 +719,57 @@ Product feature names retain their standard capitalization. Match the exact casi - **Codebase Context** - Warp indexes your Git-tracked codebase to help Agents understand your code. - **Admin Panel** - Team management surface for controlling members, roles, and billing. - **Agent Management Panel** - Interface for viewing and managing running agents (not "agent dashboard" or "agent manager"). -- **Agent Memory** - Persistent, cross-harness memory layer for Oz agents that captures durable facts, decisions, and outcomes across conversations (currently in research preview). Capitalize as a feature name; use lowercase "memory store" for individual stores. +- **Agent Memory** - Persistent, cross-harness memory layer for cloud agents that captures durable facts, decisions, and outcomes across conversations (currently in research preview). Capitalize as a feature name; use lowercase "memory store" for individual stores. - **Handoff** - Feature for moving agent work between a local Warp session and the cloud, or continuing a finished cloud run; supports local-to-cloud, cloud-to-cloud, and cloud-to-local. Capitalize as a feature name; lowercase "hand off" only as a verb. -### Oz terminology +### Capitalizing "agent" + +This is the single most drifted term in the docs, so the rule is narrow on purpose. + +- **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. + +❌ **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: + +- Referring to the built-in harness → "the Warp Agent" +- Referring to agents generally → "agents" or "agents in Warp" +- Referring to the server-side runtime → "the Warp Agent harness" + +✅ "The Warp Agent can run commands and edit files." (the built-in harness) +✅ "Profiles control how agents behave." (generic) +❌ "Profiles control how Warp's agents behave." (ambiguous) +❌ "Warp's agent can run commands." (ambiguous) + +### Automation Platform terminology + +Renamed from "Oz" on 2026-08-18. The `oz` CLI binary and the Oz v1 web app at `oz.warp.dev` keep the Oz name until 2026-09-15 and are not stale in the meantime. See `.agents/references/terminology.md` → "What still says Oz" for the full holdout list. -#### Warp Agent vs Oz +#### The article rule +"Oz" was a proper noun and read correctly bare. "Automation Platform" is a common-noun phrase, so it needs a definite article in referential positions. This is the most common mistake when writing about the platform. + +- **Referential** (subject, object, possessor) takes "the": "with the Automation Platform", "The Automation Platform provides", "the Automation Platform's backend". +- **Attributive** (modifying a following noun) stays bare: "Automation Platform settings", "Automation Platform-hosted", "Automation Platform overview". + +Write the name as `{VARS.WARP_AUTOMATION_PLATFORM}` in body prose or `{{WARP_AUTOMATION_PLATFORM}}` in frontmatter, never as a literal string, and keep the article outside the token. `style_lint` enforces both halves: `hardcoded-var` catches the literal, `platform-determiner` catches the missing article. + +#### Warp Agent vs the Automation Platform - **Warp Agent** — Warp's built-in agent harness. Use "Warp Agent" when specifically referring to the built-in harness, especially when contrasting with third-party agents (Claude Code, Codex, etc.), or when referencing the Settings label (**Settings** > **Agents** > **Warp Agent**). -- **Oz** — Warp's programmable platform for running and coordinating agents at scale -- There is typically one Warp environment per user session. Oz can run many agents concurrently, across machines, repos, and teams. +- **The Automation Platform is the platform, not the agent.** Never introduce it as "Warp's agent" or equate the two. The Automation Platform runs and coordinates agents; the Warp Agent is the agent. +- **Automation Platform** — Warp's programmable platform for running and coordinating agents at scale +- There is typically one Warp environment per user session. The Automation Platform can run many agents concurrently, across machines, repos, and teams. #### Core terms - **agent** - A combination of agent instructions (skill or prompt), trigger (cron, webhook, manual), environment (local, cloud), profile, and host. Agents can be local or cloud. Use lowercase "agent" in most contexts; use "Warp Agent" only when referring specifically to the built-in Warp harness. - **cloud agent** - An agent running in the cloud, from a trigger, schedule, or started from someone's local machine - **subagent** - A child agent created by a parent agent to parallelize or delegate work - **conversation** - An interactive execution lifecycle within the Warp Terminal, regardless of whether it's local or in the cloud -- **Oz** - Warp's programmable platform for running and coordinating agents at scale -- **Oz run** - A single execution lifecycle of an agent, including actions, outputs, and logs. Always cloud-based. +- **Automation Platform** - Warp's programmable platform for running and coordinating agents at scale +- **cloud agent run** - A single execution lifecycle of an agent, including actions, outputs, and logs. Always cloud-based. Use `{VARS.PLATFORM_RUN}`. On factory-specific pages, write "factory run" directly. - **Environment** - The execution context for an agent, including repo access, dependencies, secrets, compute, and runtime configuration -- **Oz dashboard** - The app surface to manage all Oz runs, unified across the Warp app and web -- **Oz web app** - The web app for configuring agents and managing runs +- **cloud agent dashboard** - The app surface to manage all runs, unified across the Warp app and web. Use `{VARS.DASHBOARD}`. On factory-specific pages, write "factory dashboard" directly. +- **Oz web app** - The web app for configuring agents and managing runs. Holds the Oz name until 2026-09-15; use `{VARS.WEB_APP}`. #### Oz CLI commands - `oz agent run` - Run a local agent @@ -636,9 +781,12 @@ Product feature names retain their standard capitalization. Match the exact casi - `oz run list/get` - Get info on cloud agent runs #### Preferred phrases -- ✅ "Ask Oz to..." -- ✅ "Oz can help you..." -- ✅ "What would you like Oz to do?" +The platform is not something you address — it runs and coordinates agents, and the agent is what you ask. The older "Ask Oz to..." phrasings worked only because "Oz" was doing double duty as both platform and assistant, which the rename ended. + +- ✅ "Ask the agent to..." +- ✅ "Run an agent on the Automation Platform" +- ✅ "The Automation Platform can run this on a schedule" +- ❌ "Ask the Automation Platform to..." — you ask an agent, not a platform #### Terms to avoid - ❌ "Oz agent" / "Oz agents" → Use "agent" / "agents" (or "Warp Agent" / "Warp Agents" when referring to the built-in harness) @@ -653,6 +801,23 @@ Product feature names retain their standard capitalization. Match the exact casi - ❌ "Ambient Agents" / "ambient agents" → Use "Cloud Agents" / "cloud agents" ("ambient" is no longer a product term) - ❌ "Agent Modality" or "agent modality" → Use "Terminal and Agent modes" (this was an internal name, not user-facing) - ❌ "agent identity" / "agent identities" → Use "agent," "agents," or "cloud agent(s)" in user-facing copy. Use legacy API names such as `agent_identity_uid` or `/agent/identities` only when documenting the exact field, path, or compatibility behavior. +- ❌ A bare "Automation Platform" in a referential position → Add "the". See [The article rule](#the-article-rule). +- ❌ The literal string "Automation Platform" in prose → Use `{VARS.WARP_AUTOMATION_PLATFORM}` / `{{WARP_AUTOMATION_PLATFORM}}`. + +### Warp Factories terminology + +This works like GitHub Actions. **Warp Factories** is the product and is always written in full. An individual **factory** is a common noun and is always lowercase. A bare capitalized **Factory** is never a proper noun. + +- ✅ "Warp Factories is in Early Access" (the product) +- ✅ "your factory", "each factory's agents", "factory dashboard", "factory run", "factory agents" +- ❌ "the Factory", "your Factory", "Factory runs", "Factory metrics" +- ❌ "Factories" on its own to mean the product → write "Warp Factories" + +Sentence-initial capitals are positional, not proper nouns — a heading or sidebar label may begin "Factory agents" for the same reason it would begin "Cloud agents." The rule governs mid-sentence prose. `style_lint` enforces it with the `factory-proper-noun` check. + +**Exceptions, quoted as they ship:** **Factory MCP** is the feature's own name (the server registers as `warp-factory`). Verbatim UI strings — **Factory name**, **Foreman name**, **Factory integrations**, **Add your Factory to your team**, "Factory running!", and the **Factory definition** sidebar label — are quoted as the app renders them. + +See `.agents/references/terminology.md` → "Warp Factories terminology" for the full glossary. ### Technical terms - **AI** (not "A.I.") @@ -715,8 +880,9 @@ Add the key-value pair to `src/data/vars.ts` only. Both Option A (TypeScript imp All documentation should be written with search discoverability in mind — both for traditional search engines (Google) and AI engines (ChatGPT, Gemini, Perplexity, Copilot). ### Frontmatter descriptions -- Every page must have a `description` in frontmatter. Write it as a standalone summary (50-160 characters) that includes the primary keyword naturally. +- Every page must have a `description` in frontmatter. Write it as a standalone summary (one sentence, 50-160 characters) that includes the primary keyword naturally. - Descriptions appear in search results and AI citations. Write for humans, but include the key terms a developer would search for. +- For the full rules and per-content-type patterns with examples, see [Frontmatter](#frontmatter) under Content structure. That section is the source of truth. ### Title framing - For guides and educational content: capture the **non-branded query** when possible. Write the title a developer would actually search for. @@ -731,7 +897,7 @@ When creating or updating content, use SEO and AEO data to inform titles, descri Before publishing any documentation, verify: -- [ ] Frontmatter includes a clear, 1-2 sentence description written as a standalone summary +- [ ] Frontmatter includes a one-sentence description (50-160 chars) written as a standalone summary, with no filler opener - [ ] Content type is identified and the page follows the structure for that type (see `.warp/templates/`) - [ ] Headers use sentence case (with proper feature name capitalization) - [ ] Lists use bold term + dash + explanation format @@ -745,6 +911,9 @@ Before publishing any documentation, verify: - [ ] Instructions include expected outcomes after key steps - [ ] First references to prerequisites, tools, or surfaces include inline context - [ ] Content is scannable with clear headers and lists +- [ ] Prose passes the tone rules: no marketing buzzwords, no meta-openers ("This page covers..."), no restated cause-and-effect or recap lines, and it reads naturally aloud (see Voice & tone) +- [ ] Callouts are sparse (usually 0-2 per page), never consecutive, and not a substitute for body prose +- [ ] A deletion-only "Cut again" pass removed framing lines, self-commentary, and boilerplate a parent page already covers (see Voice & tone → Cut again) before splitting a long page into sub-pages - [ ] Images have descriptive alt text (not "screenshot" or empty) - [ ] File name is lowercase, hyphenated, and descriptive (it becomes the URL slug) - [ ] Frontmatter description includes the primary keyword naturally (50-160 chars) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 375209421..6094b32f4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,7 +44,7 @@ npm run dev Open [http://localhost:4321](http://localhost:4321) to preview the docs site. -The site runs without local environment variables. To enable optional integrations like the Ask AI button and the "Was this helpful?" widget, copy `.env.example` to `.env` and fill in the public values: +The site runs without local environment variables. To enable optional integrations like the Ask AI button, copy `.env.example` to `.env` and fill in the public values: ```bash cp .env.example .env diff --git a/README.md b/README.md index 342f87a87..792bf4480 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Open [http://localhost:4321](http://localhost:4321) to preview the docs site loc ## Environment variables -The site runs without local environment variables. To enable optional integrations like the Ask AI button and the "Was this helpful?" widget, copy `.env.example` to `.env` and fill in the public values: +The site runs without local environment variables. To enable optional integrations like the Ask AI button, copy `.env.example` to `.env` and fill in the public values: ```bash cp .env.example .env diff --git a/astro.config.mjs b/astro.config.mjs index c579201c9..6abfa9129 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,6 +1,7 @@ // @ts-check import { defineConfig, envField } from 'astro/config'; import remarkGfm from 'remark-gfm'; +import mermaid from 'astro-mermaid'; import react from '@astrojs/react'; import sitemap from '@astrojs/sitemap'; import starlight from '@astrojs/starlight'; @@ -28,6 +29,11 @@ export default defineConfig({ access: 'public', optional: true, }), + PUBLIC_KAPA_PROJECT_ID: envField.string({ + context: 'client', + access: 'public', + optional: true, + }), PUBLIC_RUDDERSTACK_WRITE_KEY: envField.string({ context: 'client', access: 'public', @@ -43,9 +49,32 @@ export default defineConfig({ access: 'public', optional: true, }), + SUPPORT_HANDOFF_ENDPOINT_URL: envField.string({ + context: 'server', + access: 'secret', + optional: true, + }), + SUPPORT_HANDOFF_SHARED_SECRET: envField.string({ + context: 'server', + access: 'secret', + optional: true, + }), }, }, integrations: [ + mermaid({ + autoTheme: true, + enableLog: false, + mermaidConfig: { + fontFamily: "'Inter', 'Inter Fallback', sans-serif", + themeVariables: { + fontFamily: "'Inter', 'Inter Fallback', sans-serif", + primaryBorderColor: '#51a6ec', + nodeBorder: '#51a6ec', + lineColor: '#51a6ec', + }, + }, + }), react(), sitemap(), starlight({ @@ -61,15 +90,24 @@ export default defineConfig({ baseUrl: 'https://github.com/warpdotdev/docs/edit/main/', }, lastUpdated: true, - // Soft-wrap long lines by default. Expressive Code defaults to - // `overflow-x: auto` for `<pre>`, which combined with macOS's - // auto-hidden scrollbars made wide lines silently truncate. - // `wrap: true` adds the `.wrap` class so EC's `white-space: pre-wrap` - // kicks in; leading indents are preserved via its `span.indent` rule. + // Keep long lines unwrapped so code blocks use horizontal scrolling. + // This aligns docs behavior with the side chat renderer and preserves + // exact line shape for commands and snippets. expressiveCode: { defaultProps: { - wrap: true, + wrap: false, }, + // IMPORTANT: Expressive Code's Vite plugin rewrites Shiki's bundled + // theme registry (shiki/dist/themes.mjs) and strips every theme not + // listed as a *string* in its `themes` config. Starlight passes its + // themes as objects, so the registry is emptied for the entire Vite + // module graph — including the Kapa side-chat island, whose runtime + // createHighlighter(['github-light', 'github-dark']) then throws + // "theme is not included in this bundle" and falls back to plaintext. + // Keeping the registry intact restores chat code block highlighting. + // Only the requested themes are ever fetched at runtime (lazy chunks), + // so this does not bloat the pages served to visitors. + removeUnusedThemes: false, // Map languages Shiki doesn't bundle to a safe fallback. PromQL // blocks live in platform/self-hosting/monitoring.mdx; // without this alias every build emits noisy "language could not be @@ -162,17 +200,23 @@ export default defineConfig({ // llms-small.txt; our patch (patches/starlight-llms-txt+0.8.1.patch) // extends it to llms-full.txt and custom sets as well. exclude: ['support-and-community/community/open-source-licenses'], + // This string is the first thing an AI engine reads about Warp, so it + // carries the product lineup. Kept in sync with the rename and with + // launches: it said "the Oz platform" until the 8/18 rename, which + // left the most-consumed AI-facing artifact on the old name. description: - 'Documentation for Warp, the agentic development environment, and Oz, Warp\'s programmable agent for running and coordinating agents at scale.', + 'Documentation for Warp, the agentic development environment. Covers the Warp terminal, Warp agents, the Automation Platform for cloud agents and orchestration at scale, and Warp Factories for running software factories.', customSets: [ { label: 'Terminal', description: 'Warp Terminal features and configuration.', paths: ['terminal/**'] }, - { label: 'Agent Platform', description: 'Warp\'s Agent Platform: capabilities, local agents, and CLI agents.', paths: ['agent-platform/**'] }, - { label: 'Oz Platform', description: 'Warp\'s Oz platform: cloud agents, orchestration, triggers, integrations, environments, harnesses, and self-hosting.', paths: ['platform/**'] }, + { label: 'Agents', description: 'Agents in Warp: capabilities, local agents, and CLI agents.', paths: ['agents/**'] }, + { label: 'Factories', description: 'Warp Factories documentation for setup, agent roles, definitions as code, integrations, measurement, and infrastructure.', paths: ['factories/**'] }, + { label: 'Warp Agent CLI', description: 'The Warp Agent CLI: agent conversations, shell commands, permissions, and configuration in any terminal.', paths: ['agents/cli/**'] }, + { label: 'Automation Platform', description: 'The Automation Platform: cloud agents, orchestration, triggers, integrations, environments, harnesses, and self-hosting.', paths: ['platform/**'] }, { label: 'Code', description: 'Code editor, code review, and Git worktrees.', paths: ['code/**'] }, { 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: 'Reference', description: 'CLI and API reference.', paths: ['reference/**'] }, + { 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. diff --git a/developers/agent-api-openapi.yaml b/developers/agent-api-openapi.yaml index 870bee047..0d50c00dd 100644 --- a/developers/agent-api-openapi.yaml +++ b/developers/agent-api-openapi.yaml @@ -2,25 +2,21 @@ openapi: 3.0.0 info: title: Oz Agent API version: 1.0.0 - description: | - API for creating, managing, and querying Oz cloud agent runs. - - These endpoints allow users to programmatically spawn agents, list runs, - and retrieve detailed run information. + description: "API for creating, managing, and querying Oz cloud agent runs.\n\nThese endpoints allow users to programmatically spawn agents, list runs, \nand retrieve detailed run information.\n" contact: name: Warp Support - url: 'https://docs.warp.dev' + url: https://docs.warp.dev email: support@warp.dev license: name: Proprietary servers: - - url: 'https://app.warp.dev/api/v1' - description: Warp Server +- url: https://app.warp.dev/api/v1 + description: Warp Server tags: - - name: agent - description: Operations for running and managing cloud agents - - name: schedules - description: Operations for creating and managing scheduled agents +- name: agent + description: Operations for running and managing cloud agents +- name: schedules + description: Operations for creating and managing scheduled agents paths: /agent: get: @@ -30,49 +26,49 @@ paths: Agents are discovered from environments or a specific repository. operationId: listAgents tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: repo - in: query - description: | - Optional repository specification to list agents from (format: "owner/repo"). - If not provided, lists agents from all accessible environments. - required: false - schema: - type: string - - name: refresh - in: query - description: | - When true, clears the agent list cache before fetching. - Use this to force a refresh of the available agents. - required: false - schema: - type: boolean - default: false - - name: sort_by - in: query - description: | - Sort order for the returned agents. - - "name": Sort alphabetically by name (default) - - "last_run": Sort by most recently used - required: false - schema: - type: string - enum: - - name - - last_run - - name: include_malformed_skills - in: query - description: | - When true, includes skills whose SKILL.md file exists but is - malformed. These variants will have a non-empty `error` field - describing the parse failure. Defaults to false. - required: false - schema: - type: boolean - default: false + - name: repo + in: query + description: | + Optional repository specification to list agents from (format: "owner/repo"). + If not provided, lists agents from all accessible environments. + required: false + schema: + type: string + - name: refresh + in: query + description: | + When true, clears the agent list cache before fetching. + Use this to force a refresh of the available agents. + required: false + schema: + type: boolean + default: false + - name: sort_by + in: query + description: | + Sort order for the returned agents. + - "name": Sort alphabetically by name (default) + - "last_run": Sort by most recently used + required: false + schema: + type: string + enum: + - name + - last_run + - name: include_malformed_skills + in: query + description: | + When true, includes skills whose SKILL.md file exists but is + malformed. These variants will have a non-empty `error` field + describing the parse failure. Defaults to false. + required: false + schema: + type: boolean + default: false responses: '200': description: List of available agents @@ -94,9 +90,9 @@ paths: Worker presence is derived from worker websocket heartbeats and may be briefly stale. operationId: listConnectedSelfHostedWorkers tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] responses: '200': description: List of currently connected self-hosted workers @@ -116,7 +112,7 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/agent/runs/{runId}/transcript': + /agent/runs/{runId}/transcript: get: summary: Get run transcript description: | @@ -124,16 +120,16 @@ paths: Returns a 302 redirect to a time-limited download URL for the transcript. operationId: getRunTranscript tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: runId - in: path - description: The unique identifier of the run - required: true - schema: - type: string + - name: runId + in: path + description: The unique identifier of the run + required: true + schema: + type: string responses: '302': description: Redirect to a download URL for the transcript @@ -182,9 +178,9 @@ paths: operationId: runAgent deprecated: true tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] requestBody: required: true content: @@ -213,7 +209,7 @@ paths: schema: $ref: '#/components/schemas/RunAgentResponse' '400': - description: 'Invalid request (missing prompt, invalid config)' + description: Invalid request (missing prompt, invalid config) content: application/json: schema: @@ -225,7 +221,7 @@ paths: schema: $ref: '#/components/schemas/Error' '403': - description: 'No permission to access referenced resources (environment, MCP servers)' + description: No permission to access referenced resources (environment, MCP servers) content: application/json: schema: @@ -238,9 +234,9 @@ paths: The agent will be queued for execution and assigned a unique run ID. operationId: createRun tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] requestBody: required: true content: @@ -255,7 +251,7 @@ paths: schema: $ref: '#/components/schemas/RunAgentResponse' '400': - description: 'Invalid request (missing prompt, invalid config)' + description: Invalid request (missing prompt, invalid config) content: application/json: schema: @@ -267,7 +263,7 @@ paths: schema: $ref: '#/components/schemas/Error' '403': - description: 'No permission to access referenced resources (environment, MCP servers)' + description: No permission to access referenced resources (environment, MCP servers) content: application/json: schema: @@ -279,171 +275,194 @@ paths: Results default to `sort_by=updated_at` and `sort_order=desc`. operationId: listRuns tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: limit - in: query - description: Maximum number of runs to return - required: false - schema: - type: integer - minimum: 1 - maximum: 500 - default: 20 - - name: cursor - in: query - description: Pagination cursor from previous response - required: false - schema: - type: string - - name: sort_by - in: query - description: | - Sort field for results. - - `updated_at`: Sort by last update timestamp (default) - - `created_at`: Sort by creation timestamp - - `title`: Sort alphabetically by run title - - `agent`: Sort alphabetically by skill. Runs without a skill are grouped last. - required: false - schema: - type: string - enum: - - updated_at - - created_at - - title - - agent - default: updated_at - - name: sort_order - in: query - description: Sort direction - required: false - schema: - type: string - enum: - - asc - - desc - default: desc - - name: state - in: query - description: | - Filter by run state. Can be specified multiple times to match any of the given states. - required: false - schema: - type: array - items: - $ref: '#/components/schemas/RunState' - style: form - explode: true - - name: name - in: query - description: Filter by agent config name - required: false - schema: - type: string - - name: model_id - in: query - description: Filter by model ID - required: false - schema: - type: string - - name: creator - in: query - description: Filter by creator UID (user or service account) - required: false - schema: - type: string - - name: executor - in: query - description: | - Filter by the user or agent that executed the run. This will often be the - same as the creator, but not always: users may delegate tasks to agents. - required: false - schema: - type: string - - name: source - in: query - description: Filter by run source type - required: false - schema: - $ref: '#/components/schemas/RunSourceType' - - name: execution_location - in: query - description: Filter by where the run executed - required: false - schema: - $ref: '#/components/schemas/RunExecutionLocation' - - name: created_after - in: query - description: Filter runs created after this timestamp (RFC3339 format) - required: false - schema: - type: string - format: date-time - - name: created_before - in: query - description: Filter runs created before this timestamp (RFC3339 format) - required: false - schema: - type: string - format: date-time - - name: updated_after - in: query - description: Filter runs updated after this timestamp (RFC3339 format) - required: false - schema: - type: string - format: date-time - - name: environment_id - in: query - description: Filter runs by environment ID - required: false - schema: - type: string - - name: skill - in: query - description: | - Filter runs by skill spec (e.g., "owner/repo:path/to/SKILL.md"). - Alias for skill_spec. - required: false - schema: - type: string - - name: skill_spec - in: query - description: 'Filter runs by skill spec (e.g., "owner/repo:path/to/SKILL.md")' - required: false - schema: - type: string - - name: schedule_id - in: query - description: Filter runs by the scheduled agent ID that created them - required: false - schema: - type: string - - name: ancestor_run_id - in: query - description: Filter runs by ancestor run ID. The referenced run must exist and be accessible to the caller. - required: false - schema: - type: string - - name: artifact_type - in: query - description: Filter runs by artifact type - required: false - schema: - type: string - enum: - - PLAN - - PULL_REQUEST - - SCREENSHOT - - FILE - - name: q - in: query - description: 'Fuzzy search query across run title, prompt, and skill_spec' - required: false - schema: + - name: limit + in: query + description: Maximum number of runs to return + required: false + schema: + type: integer + minimum: 1 + maximum: 500 + default: 20 + - name: cursor + in: query + description: Pagination cursor from previous response + required: false + schema: + type: string + - name: sort_by + in: query + description: | + Sort field for results. + - `updated_at`: Sort by last update timestamp (default) + - `created_at`: Sort by creation timestamp + - `title`: Sort alphabetically by run title + - `agent`: Sort alphabetically by skill. Runs without a skill are grouped last. + required: false + schema: + type: string + enum: + - updated_at + - created_at + - title + - agent + default: updated_at + - name: sort_order + in: query + description: Sort direction + required: false + schema: + type: string + enum: + - asc + - desc + default: desc + - name: state + in: query + description: | + Filter by run state. Can be specified multiple times to match any of the given states. + required: false + schema: + type: array + items: + $ref: '#/components/schemas/RunState' + style: form + explode: true + - name: name + in: query + description: Filter by agent config name + required: false + schema: + type: string + - name: model_id + in: query + description: Filter by model ID + required: false + schema: + type: string + - name: creator + in: query + description: Filter by creator UID (user or service account) + required: false + schema: + type: string + - name: executor + in: query + description: | + Filter by the user or agent that executed the run. This will often be the + same as the creator, but not always: users may delegate tasks to agents. + required: false + schema: + type: string + - name: source + in: query + description: Filter by run source type + required: false + schema: + $ref: '#/components/schemas/RunSourceType' + - name: execution_location + in: query + description: Filter by where the run executed + required: false + schema: + $ref: '#/components/schemas/RunExecutionLocation' + - name: created_after + in: query + description: Filter runs created after this timestamp (RFC3339 format) + required: false + schema: + type: string + format: date-time + - name: created_before + in: query + description: Filter runs created before this timestamp (RFC3339 format) + required: false + schema: + type: string + format: date-time + - name: updated_after + in: query + description: Filter runs updated after this timestamp (RFC3339 format) + required: false + schema: + type: string + format: date-time + - name: environment_id + in: query + description: | + Filter runs by environment ID. Passing the literal value + `empty-environment` matches runs with no environment configured, + rather than omitting the parameter, which applies no environment + filter at all. `empty-environment` can never collide with a real + environment ID: every environment ID is exactly 22 characters + drawn from `[A-Za-z0-9]`, while this sentinel contains a hyphen + and is a different length. + required: false + schema: + type: string + - name: skill + in: query + description: | + Filter runs by skill spec (e.g., "owner/repo:path/to/SKILL.md"). + Alias for skill_spec. + required: false + schema: + type: string + - name: skill_spec + in: query + description: Filter runs by skill spec (e.g., "owner/repo:path/to/SKILL.md") + required: false + schema: + type: string + - name: schedule_id + in: query + description: Filter runs by the scheduled agent ID that created them + required: false + schema: + type: string + - name: ancestor_run_id + in: query + description: Filter runs by ancestor run ID. The referenced run must exist and be accessible to the caller. + required: false + schema: + type: string + - name: metadata + in: query + description: | + Filter by exact metadata key/value pairs using object notation (e.g. + `metadata[ticket_id]=VIS-238`). Multiple pairs combine with AND semantics. + At most 5 pairs per request. Returns `feature_not_available` when metadata + filtering is not enabled. + required: false + schema: + type: object + maxProperties: 5 + additionalProperties: type: string + style: deepObject + explode: true + - name: artifact_type + in: query + description: Filter runs by artifact type + required: false + schema: + type: string + enum: + - PLAN + - PULL_REQUEST + - SCREENSHOT + - FILE + - EXTERNAL_REFERENCE + - name: q + in: query + description: Fuzzy search query across run title, prompt, and skill_spec + required: false + schema: + type: string responses: '200': description: List of runs @@ -463,24 +482,81 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/agent/runs/{runId}': + '403': + description: Metadata filtering is not enabled for this environment + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /agent/run-by-external-reference: get: - summary: Get run details + summary: Find the run that produced a given external reference URL description: | - Retrieve detailed information about a specific agent run, - including the full prompt, session link, and resolved configuration. + Reverse-looks up the agent run that created an EXTERNAL_REFERENCE artifact + with the given URL. The URL is matched against the canonical locator stored + when the artifact was reported via POST /harness-support/report-artifact + with artifact_type EXTERNAL_REFERENCE. Returns 404 when no matching run + exists or when the caller lacks access, to avoid leaking run existence. + operationId: getRunByExternalReferenceURL + tags: + - agent + security: + - bearerAuth: [] + parameters: + - name: url + in: query + required: true + description: The canonical URL of the external reference artifact to look up. + schema: + type: string + maxLength: 2048 + responses: + '200': + description: Run found + content: + application/json: + schema: + $ref: '#/components/schemas/RunByExternalReferenceResponse' + '400': + description: url query parameter is missing + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Authentication required + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: No run found with the given external reference URL, or caller lacks access + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /agent/runs/{runId}: + get: + summary: Get run details + description: "Retrieve detailed information about a specific agent run, \nincluding the full prompt, session link, and resolved configuration.\n" operationId: getRun tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: runId - in: path - description: The unique identifier of the run - required: true - schema: - type: string + - name: runId + in: path + description: The unique identifier of the run + required: true + schema: + type: string responses: '200': description: Run details @@ -512,23 +588,23 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/agent/runs/{runId}/timeline': + /agent/runs/{runId}/timeline: get: summary: Get run timeline description: | Retrieve chronological setup and lifecycle timeline events for an agent run. operationId: getRunTimeline tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: runId - in: path - description: The unique identifier of the run - required: true - schema: - type: string + - name: runId + in: path + description: The unique identifier of the run + required: true + schema: + type: string responses: '200': description: Run timeline events @@ -560,7 +636,7 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/agent/runs/{runId}/conversation': + /agent/runs/{runId}/conversation: get: summary: Get normalized run conversation description: | @@ -570,16 +646,16 @@ paths: structured blocks. operationId: getRunConversation tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: runId - in: path - description: The unique identifier of the run - required: true - schema: - type: string + - name: runId + in: path + description: The unique identifier of the run + required: true + schema: + type: string responses: '200': description: Normalized conversation @@ -606,7 +682,7 @@ paths: schema: $ref: '#/components/schemas/Error' '404': - description: 'Run not found, or the run has no conversation' + description: Run not found, or the run has no conversation content: application/json: schema: @@ -619,7 +695,7 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/agent/runs/{runId}/cancel': + /agent/runs/{runId}/cancel: post: summary: Cancel a run description: | @@ -632,16 +708,16 @@ paths: and GitHub Action runs return 422. operationId: cancelRun tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: runId - in: path - description: The unique identifier of the run to cancel - required: true - schema: - type: string + - name: runId + in: path + description: The unique identifier of the run to cancel + required: true + schema: + type: string responses: '200': description: Run cancelled successfully @@ -693,7 +769,7 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/agent/runs/{runId}/followups': + /agent/runs/{runId}/followups: post: summary: Submit a follow-up message for a run description: | @@ -704,16 +780,16 @@ paths: `GET /agent/runs/{runId}`. operationId: submitRunFollowup tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: runId - in: path - description: The unique identifier of the run - required: true - schema: - type: string + - name: runId + in: path + description: The unique identifier of the run + required: true + schema: + type: string requestBody: required: true content: @@ -760,7 +836,7 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/agent/conversations/{conversation_id}': + /agent/conversations/{conversation_id}: get: summary: Get normalized conversation description: | @@ -768,16 +844,16 @@ paths: normalized task/message format. operationId: getConversation tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: conversation_id - in: path - description: The unique identifier of the conversation - required: true - schema: - type: string + - name: conversation_id + in: path + description: The unique identifier of the conversation + required: true + schema: + type: string responses: '200': description: Normalized conversation @@ -825,9 +901,9 @@ paths: The agent will be triggered automatically based on the cron expression. operationId: createScheduledAgent tags: - - schedules + - schedules security: - - bearerAuth: [] + - bearerAuth: [] requestBody: required: true content: @@ -859,7 +935,7 @@ paths: schema: $ref: '#/components/schemas/ScheduledAgentItem' '400': - description: 'Invalid request (missing required fields, invalid cron expression)' + description: Invalid request (missing required fields, invalid cron expression) content: application/json: schema: @@ -883,9 +959,9 @@ paths: Results are sorted alphabetically by name. operationId: listScheduledAgents tags: - - schedules + - schedules security: - - bearerAuth: [] + - bearerAuth: [] responses: '200': description: List of scheduled agents @@ -905,7 +981,7 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/agent/schedules/{scheduleId}': + /agent/schedules/{scheduleId}: get: summary: Get scheduled agent details description: | @@ -913,16 +989,16 @@ paths: including its configuration, history, and next scheduled run time. operationId: getScheduledAgent tags: - - schedules + - schedules security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: scheduleId - in: path - description: The unique identifier of the scheduled agent - required: true - schema: - type: string + - name: scheduleId + in: path + description: The unique identifier of the scheduled agent + required: true + schema: + type: string responses: '200': description: Scheduled agent details @@ -961,16 +1037,16 @@ paths: All fields except agent_config are required. operationId: updateScheduledAgent tags: - - schedules + - schedules security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: scheduleId - in: path - description: The unique identifier of the scheduled agent - required: true - schema: - type: string + - name: scheduleId + in: path + description: The unique identifier of the scheduled agent + required: true + schema: + type: string requestBody: required: true content: @@ -1014,16 +1090,16 @@ paths: Delete a scheduled agent. This will stop all future scheduled runs. operationId: deleteScheduledAgent tags: - - schedules + - schedules security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: scheduleId - in: path - description: The unique identifier of the scheduled agent - required: true - schema: - type: string + - name: scheduleId + in: path + description: The unique identifier of the scheduled agent + required: true + schema: + type: string responses: '200': description: Scheduled agent deleted successfully @@ -1055,23 +1131,23 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/agent/schedules/{scheduleId}/pause': + /agent/schedules/{scheduleId}/pause: post: summary: Pause a scheduled agent description: | Pause a scheduled agent. The agent will not run until resumed. operationId: pauseScheduledAgent tags: - - schedules + - schedules security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: scheduleId - in: path - description: The unique identifier of the scheduled agent - required: true - schema: - type: string + - name: scheduleId + in: path + description: The unique identifier of the scheduled agent + required: true + schema: + type: string responses: '200': description: Scheduled agent paused successfully @@ -1103,7 +1179,7 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/agent/schedules/{scheduleId}/resume': + /agent/schedules/{scheduleId}/resume: post: summary: Resume a scheduled agent description: | @@ -1111,16 +1187,16 @@ paths: according to its cron schedule. operationId: resumeScheduledAgent tags: - - schedules + - schedules security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: scheduleId - in: path - description: The unique identifier of the scheduled agent - required: true - schema: - type: string + - name: scheduleId + in: path + description: The unique identifier of the scheduled agent + required: true + schema: + type: string responses: '200': description: Scheduled agent resumed successfully @@ -1161,23 +1237,23 @@ paths: or has accessed via link sharing. operationId: listEnvironments tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: sort_by - in: query - required: false - description: | - Sort order for the returned environments. - - `name`: alphabetical by environment name - - `last_updated`: most recently updated first (default) - schema: - type: string - enum: - - name - - last_updated - default: last_updated + - name: sort_by + in: query + required: false + description: | + Sort order for the returned environments. + - `name`: alphabetical by environment name + - `last_updated`: most recently updated first (default) + schema: + type: string + enum: + - name + - last_updated + default: last_updated responses: '200': description: List of accessible environments @@ -1207,9 +1283,9 @@ paths: currently disabled (and why). operationId: listModels tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] responses: '200': description: List of available models @@ -1229,25 +1305,30 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/agent/artifacts/{artifactUid}': + /agent/artifacts/{artifactUid}: get: summary: Get artifact details description: | Retrieve an artifact by its UUID. For downloadable file-like artifacts, returns a time-limited signed download URL. For plan artifacts, returns the current plan content inline. + + Public artifacts can be read without authentication; private artifacts + require the caller to be authenticated and authorized. Anonymous reads + of public file artifacts omit the `filepath` field. operationId: getArtifact tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] + - {} parameters: - - name: artifactUid - in: path - description: The unique identifier (UUID) of the artifact - required: true - schema: - type: string + - name: artifactUid + in: path + description: The unique identifier (UUID) of the artifact + required: true + schema: + type: string responses: '200': description: Artifact details with download information @@ -1262,13 +1343,13 @@ paths: schema: $ref: '#/components/schemas/Error' '401': - description: Authentication required + description: Authentication required for private artifacts content: application/json: schema: $ref: '#/components/schemas/Error' '403': - description: No permission to access artifact + description: No permission to access private artifact content: application/json: schema: @@ -1279,50 +1360,63 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - /harness-support/transcript: + /agent/artifacts/{artifactUid}/download: get: - summary: Download the raw third-party harness transcript + summary: Download an artifact description: | - Redirects to a signed download URL for the raw third-party harness transcript - (e.g. `claude_code.json`) of the current task's conversation. Only supported - for conversations produced by non-Oz harnesses; Oz conversations 400. - - This may only be called from within a cloud agent execution environment whose - task already has an associated conversation (e.g. on a resumed run). - operationId: getTranscriptDownload + Redirect to a temporary signed download URL for a downloadable artifact. + Public artifacts can be downloaded without authentication; private + artifacts require the caller to be authenticated and authorized. + operationId: downloadArtifact tags: - - harness-support + - agent security: - - bearerAuth: [] + - bearerAuth: [] + - {} + parameters: + - name: artifactUid + in: path + description: The unique identifier (UUID) of the artifact + required: true + schema: + type: string responses: - '307': - description: Redirect to a signed download URL for the transcript + '302': + description: Redirect to a temporary signed artifact download URL + headers: + Location: + description: Temporary signed download URL + schema: + type: string + format: uri + Cache-Control: + description: Cache directive for the redirect response + schema: + type: string + X-Content-Type-Options: + description: Browser content sniffing protection + schema: + type: string '400': - description: 'Task has no conversation, or conversation format does not support transcript downloads' + description: Missing artifact UID content: application/json: schema: $ref: '#/components/schemas/Error' '401': - description: Authentication required + description: Authentication required for private artifacts content: application/json: schema: $ref: '#/components/schemas/Error' '403': - description: No permission to access the conversation + description: No permission to access private artifact content: application/json: schema: $ref: '#/components/schemas/Error' '404': - description: Conversation or transcript not found - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '500': - description: Internal server error + description: Artifact not found or unsupported artifact type content: application/json: schema: @@ -1335,9 +1429,9 @@ paths: Agents can be used as the execution principal for team-owned runs. operationId: createAgent tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] requestBody: required: true content: @@ -1352,7 +1446,7 @@ paths: schema: $ref: '#/components/schemas/AgentResponse' '400': - description: 'Invalid request (empty name, user on multiple teams, or on no team)' + description: Invalid request (empty name, user on multiple teams, or on no team) content: application/json: schema: @@ -1364,7 +1458,7 @@ paths: schema: $ref: '#/components/schemas/Error' '403': - description: 'Only human users can manage agents, or plan limit exceeded' + description: Only human users can manage agents, or plan limit exceeded content: application/json: schema: @@ -1383,9 +1477,10 @@ paths: and may be used for runs. operationId: listAgents tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] + parameters: [] responses: '200': description: List of agents @@ -1394,7 +1489,7 @@ paths: schema: $ref: '#/components/schemas/ListAgentIdentitiesResponse' '400': - description: 'User on multiple teams, or on no team' + description: User on multiple teams, or on no team content: application/json: schema: @@ -1417,7 +1512,65 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/agent/identities/{uid}': + /agent/runs/{runId}/scores: + post: + summary: Report evaluation scores for a run + description: | + Report one or more evaluation verdicts for a run. Called by the judge run + that was dispatched to score this run, authenticating with that judge + run's API key. Each verdict is processed independently: the response + reports per-verdict acceptance, and a rejected verdict does not block the + others. Reporting a subset of the run's evaluations is valid. + operationId: reportRunScores + tags: + - agent + security: + - bearerAuth: [] + parameters: + - name: runId + in: path + description: The run being scored + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ReportRunScoresRequest' + responses: + '200': + description: Every reported verdict was accepted + content: + application/json: + schema: + $ref: '#/components/schemas/ReportRunScoresResponse' + '206': + description: The request was well-formed but at least one verdict was rejected; inspect each result's status and error before deciding whether to resubmit + content: + application/json: + schema: + $ref: '#/components/schemas/ReportRunScoresResponse' + '400': + description: Malformed request body + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Authentication required + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /agent/identities/{uid}: get: summary: Retrieve an agent description: | @@ -1426,16 +1579,16 @@ paths: is within the team's plan limit and may be used for runs. operationId: getAgent tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: uid - in: path - description: The unique identifier of the agent - required: true - schema: - type: string + - name: uid + in: path + description: The unique identifier of the agent + required: true + schema: + type: string responses: '200': description: Agent details @@ -1467,16 +1620,16 @@ paths: Update an existing agent. operationId: updateAgent tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: uid - in: path - description: The unique identifier of the agent - required: true - schema: - type: string + - name: uid + in: path + description: The unique identifier of the agent + required: true + schema: + type: string requestBody: required: true content: @@ -1503,7 +1656,7 @@ paths: schema: $ref: '#/components/schemas/Error' '403': - description: 'Only human users can manage agents, or plan limit exceeded' + description: Only human users can manage agents, or plan limit exceeded content: application/json: schema: @@ -1527,16 +1680,16 @@ paths: agent are deleted atomically. operationId: deleteAgent tags: - - agent + - agent security: - - bearerAuth: [] + - bearerAuth: [] parameters: - - name: uid - in: path - description: The unique identifier of the agent - required: true - schema: - type: string + - name: uid + in: path + description: The unique identifier of the agent + required: true + schema: + type: string responses: '204': description: Agent deleted successfully @@ -1621,7 +1774,16 @@ components: type: string description: | Optional agent identity UID to use as the execution principal for the run. - This is only valid for runs that are team owned. + This is only valid for runs that are team owned. + on_behalf_of: + type: string + description: | + Optional email address or user ID of a Warp user to attribute the run to. + When set, the resolved user becomes the run's creator instead of the caller. + Only agent API keys may use this field, and the calling agent must have + on_behalf_of enabled in its configuration (`on_behalf_of_enabled`), which a + team admin must intentionally turn on per agent. The target user must be an + active member of the run's owner team. Only valid for team-owned runs. conversation_id: type: string description: | @@ -1639,17 +1801,35 @@ components: description: | Optional run ID of the parent that spawned this run. Used for orchestration hierarchies. + The parent run must exist and be visible to the caller; otherwise the + request is rejected with a 400. Child runs are also subject to the + server's maximum orchestration depth, and requests that would exceed + it are rejected with a 400. interactive: type: boolean description: | Whether the run should be interactive. If not set, defaults to false. + metadata: + $ref: '#/components/schemas/RunMetadata' + RunMetadata: + type: object + additionalProperties: + type: string + description: | + Custom key/value metadata attached to a run at creation time and immutable afterward. + At most 20 keys. Keys are 1-64 bytes matching [a-zA-Z0-9._-]+ (case-sensitive); + values are 0-256 bytes of UTF-8 and cannot contain NUL characters. + Requests with invalid metadata are rejected. + A run's effective metadata is merged per key at creation: explicit request keys + override keys inherited from the parent run, which override automatic keys + (ticket_id and ticket_source on Linear- and Jira-triggered runs). RunAgentResponse: type: object required: - - run_id - - task_id - - state + - run_id + - task_id + - state properties: run_id: type: string @@ -1671,15 +1851,15 @@ components: - plan: Planning Mode. The agent researches and creates a plan, then waits for approval before execution. - orchestrate: Orchestration Mode. The agent proposes an orchestration plan and must not start child agents until approved. enum: - - normal - - plan - - orchestrate + - normal + - plan + - orchestrate default: normal ListRunsResponse: type: object required: - - runs - - page_info + - runs + - page_info properties: runs: type: array @@ -1690,13 +1870,13 @@ components: RunItem: type: object required: - - run_id - - task_id - - title - - state - - prompt - - created_at - - updated_at + - run_id + - task_id + - title + - state + - prompt + - created_at + - updated_at properties: run_id: type: string @@ -1726,7 +1906,7 @@ components: run_time: type: string format: duration - description: 'Total runtime as an ISO 8601 duration (e.g. "PT2M30S"), computed server-side from run executions.' + description: Total runtime as an ISO 8601 duration (e.g. "PT2M30S"), computed server-side from run executions. started_at: type: string format: date-time @@ -1748,7 +1928,7 @@ components: trigger_url: type: string format: uri - description: 'URL to the run trigger (e.g. Slack thread, Linear issue, schedule)' + description: URL to the run trigger (e.g. Slack thread, Linear issue, schedule) creator: $ref: '#/components/schemas/RunCreatorInfo' executor: @@ -1763,14 +1943,22 @@ components: parent_run_id: type: string description: UUID of the parent run that spawned this run + metadata: + $ref: '#/components/schemas/RunMetadata' is_sandbox_running: type: boolean description: Whether the sandbox environment is currently running + is_run_type_cancellable: + type: boolean + description: | + Whether the run's type is eligible for cancellation via the API. State-independent: + false for GitHub Action and local runs; true for all other run types (including + self-hosted). Clients should still gate the control on the run's current state. artifacts: type: array items: $ref: '#/components/schemas/ArtifactItem' - description: 'Artifacts created during the run (plans, pull requests, etc.)' + description: Artifacts created during the run (plans, pull requests, etc.) agent_skill: $ref: '#/components/schemas/AgentSkill' scope: @@ -1779,7 +1967,7 @@ components: type: object description: Response body for listing run timeline events. required: - - events + - events properties: events: type: array @@ -1789,10 +1977,10 @@ components: type: object description: A setup or lifecycle event recorded for an agent run. required: - - event_uuid - - run_id - - event_type - - occurred_at + - event_uuid + - run_id + - event_type + - occurred_at properties: event_uuid: type: string @@ -1803,7 +1991,7 @@ components: execution_id: type: integer format: int64 - description: 'Run execution associated with this event, when available.' + description: Run execution associated with this event, when available. event_type: $ref: '#/components/schemas/AIRunTimelineEventType' occurred_at: @@ -1818,18 +2006,22 @@ components: type: string description: Type of timeline event recorded for a run. enum: - - oz_run_created - - oz_run_claimed - - worker_container_ready - - shared_session_started - - agent_started - - oz_run_finished - - oz_run_failure + - oz_run_created + - oz_run_claimed + - worker_container_ready + - shared_session_started + - agent_started + - oz_run_done + - oz_run_blocked + - oz_run_cancelled + - oz_run_failed + - oz_run_errored + - vm_shutdown ConversationResponse: type: object required: - - conversation_id - - steps + - conversation_id + - steps properties: conversation_id: type: string @@ -1842,9 +2034,9 @@ components: ConversationStep: type: object required: - - id - - messages - - steps + - id + - messages + - steps properties: id: type: string @@ -1876,8 +2068,8 @@ components: ConversationMessage: type: object required: - - role - - content + - role + - content properties: message_ids: type: array @@ -1886,7 +2078,7 @@ components: type: string request_id: type: string - description: 'Request identifier shared by transcript messages from the same request, when available' + description: Request identifier shared by transcript messages from the same request, when available role: $ref: '#/components/schemas/ConversationMessageRole' timestamp: @@ -1901,16 +2093,16 @@ components: type: string description: Role of the normalized message enum: - - user - - assistant - - tool - - system + - user + - assistant + - tool + - system ConversationContentBlock: oneOf: - - $ref: '#/components/schemas/TextContentBlock' - - $ref: '#/components/schemas/ActionContentBlock' - - $ref: '#/components/schemas/ActionResultContentBlock' - - $ref: '#/components/schemas/EventContentBlock' + - $ref: '#/components/schemas/TextContentBlock' + - $ref: '#/components/schemas/ActionContentBlock' + - $ref: '#/components/schemas/ActionResultContentBlock' + - $ref: '#/components/schemas/EventContentBlock' discriminator: propertyName: type mapping: @@ -1921,16 +2113,16 @@ components: TextContentBlock: type: object required: - - type - - text + - type + - text properties: type: type: string enum: - - text + - text message_id: type: string - description: 'Underlying transcript message ID that produced this content block, when available' + description: Underlying transcript message ID that produced this content block, when available text: type: string description: Plain text content @@ -1938,38 +2130,38 @@ components: type: string description: High-level category of an action performed during the conversation enum: - - command - - files - - search - - integration - - documents - - computer - - review - - skill + - command + - files + - search + - integration + - documents + - computer + - review + - skill ActionState: type: string description: State of an action result enum: - - running - - completed - - failed - - denied + - running + - completed + - failed + - denied ActionContentBlock: type: object required: - - type - - id - - category - - name - - input + - type + - id + - category + - name + - input properties: type: type: string enum: - - action + - action message_id: type: string - description: 'Underlying transcript message ID that produced this content block, when available' + description: Underlying transcript message ID that produced this content block, when available id: type: string description: Unique identifier for the action @@ -1977,7 +2169,7 @@ components: $ref: '#/components/schemas/ActionCategory' name: type: string - description: 'Public action name, such as run_command or edit_files' + description: Public action name, such as run_command or edit_files input: type: object additionalProperties: true @@ -1985,20 +2177,20 @@ components: ActionResultContentBlock: type: object required: - - type - - action_id - - category - - name - - state - - output + - type + - action_id + - category + - name + - state + - output properties: type: type: string enum: - - action_result + - action_result message_id: type: string - description: 'Underlying transcript message ID that produced this content block, when available' + description: Underlying transcript message ID that produced this content block, when available action_id: type: string description: Identifier of the corresponding action @@ -2016,17 +2208,17 @@ components: EventContentBlock: type: object required: - - type - - name - - data + - type + - name + - data properties: type: type: string enum: - - event + - event message_id: type: string - description: 'Underlying transcript message ID that produced this content block, when available' + description: Underlying transcript message ID that produced this content block, when available name: type: string description: Event type for intentionally exposed non-core transcript events @@ -2036,10 +2228,11 @@ components: description: Minimal structured metadata for the event ArtifactItem: oneOf: - - $ref: '#/components/schemas/PlanArtifact' - - $ref: '#/components/schemas/PullRequestArtifact' - - $ref: '#/components/schemas/ScreenshotArtifact' - - $ref: '#/components/schemas/FileArtifact' + - $ref: '#/components/schemas/PlanArtifact' + - $ref: '#/components/schemas/PullRequestArtifact' + - $ref: '#/components/schemas/ScreenshotArtifact' + - $ref: '#/components/schemas/FileArtifact' + - $ref: '#/components/schemas/ExternalReferenceArtifact' discriminator: propertyName: artifact_type mapping: @@ -2047,17 +2240,36 @@ components: PULL_REQUEST: '#/components/schemas/PullRequestArtifact' SCREENSHOT: '#/components/schemas/ScreenshotArtifact' FILE: '#/components/schemas/FileArtifact' + EXTERNAL_REFERENCE: '#/components/schemas/ExternalReferenceArtifact' + ExternalReferenceArtifact: + type: object + required: + - artifact_type + - created_at + - data + properties: + artifact_type: + type: string + enum: + - EXTERNAL_REFERENCE + description: Type of the artifact + created_at: + type: string + format: date-time + description: Timestamp when the artifact was created (RFC3339) + data: + $ref: '#/components/schemas/ExternalReferenceArtifactData' PlanArtifact: type: object required: - - artifact_type - - created_at - - data + - artifact_type + - created_at + - data properties: artifact_type: type: string enum: - - PLAN + - PLAN description: Type of the artifact created_at: type: string @@ -2068,14 +2280,14 @@ components: PullRequestArtifact: type: object required: - - artifact_type - - created_at - - data + - artifact_type + - created_at + - data properties: artifact_type: type: string enum: - - PULL_REQUEST + - PULL_REQUEST description: Type of the artifact created_at: type: string @@ -2086,14 +2298,14 @@ components: ScreenshotArtifact: type: object required: - - artifact_type - - created_at - - data + - artifact_type + - created_at + - data properties: artifact_type: type: string enum: - - SCREENSHOT + - SCREENSHOT description: Type of the artifact created_at: type: string @@ -2104,14 +2316,14 @@ components: FileArtifact: type: object required: - - artifact_type - - created_at - - data + - artifact_type + - created_at + - data properties: artifact_type: type: string enum: - - FILE + - FILE description: Type of the artifact created_at: type: string @@ -2122,11 +2334,11 @@ components: PlanArtifactData: type: object required: - - document_uid + - document_uid properties: artifact_uid: type: string - description: 'Unique identifier for the plan artifact, usable with the artifact retrieval endpoint' + description: Unique identifier for the plan artifact, usable with the artifact retrieval endpoint document_uid: type: string description: Unique identifier for the plan document @@ -2143,8 +2355,8 @@ components: PullRequestArtifactData: type: object required: - - url - - branch + - url + - branch properties: url: type: string @@ -2156,8 +2368,8 @@ components: ScreenshotArtifactData: type: object required: - - artifact_uid - - mime_type + - artifact_uid + - mime_type properties: artifact_uid: type: string @@ -2171,10 +2383,10 @@ components: FileArtifactData: type: object required: - - artifact_uid - - filepath - - filename - - mime_type + - artifact_uid + - filepath + - filename + - mime_type properties: artifact_uid: type: string @@ -2185,6 +2397,12 @@ components: filename: type: string description: Last path component of filepath + title: + type: string + description: | + Short, badge-visible label for the artifact. For recording artifacts, + this is the agent-authored title shown in Oz web and blocklist badges. + Distinct from description, which is longer and shown in detail views. description: type: string description: Optional description of the file @@ -2199,9 +2417,9 @@ components: type: object description: Information about the schedule that triggered this run (only present for scheduled runs) required: - - schedule_id - - schedule_name - - cron_schedule + - schedule_id + - schedule_name + - cron_schedule properties: schedule_id: type: string @@ -2215,7 +2433,7 @@ components: PageInfo: type: object required: - - has_next_page + - has_next_page properties: has_next_page: type: boolean @@ -2229,7 +2447,7 @@ components: Status message for a run. For terminal error states, includes structured error code and retryability info from the platform error catalog. required: - - message + - message properties: message: type: string @@ -2242,6 +2460,17 @@ components: Whether the error is transient and the client may retry by submitting a new run. Only present on terminal error states. When false, retrying without addressing the underlying cause will not succeed. + session_debug_until: + type: string + format: date-time + description: | + When a failed run's shared session stops being held open for debugging. + Only present while that window is open. + + The window is an idle window owned by the agent process: activity in the + session pushes this deadline out. The agent republishes it periodically + rather than on every keystroke, so the value can lag the true deadline by + up to a throttle interval, and always in the conservative direction. RequestUsage: type: object description: Resource usage information for the run @@ -2249,23 +2478,41 @@ components: inference_cost: type: number format: double - description: Cost of LLM inference for the run + description: Credits consumed by LLM inference for the run compute_cost: type: number format: double - description: Cost of compute resources for the run + description: Credits consumed by compute resources for the run platform_cost: type: number format: double - description: Cost of platform usage for the run + description: Credits consumed by platform usage for the run + inference_cost_usd: + type: number + format: double + description: | + inference_cost in US dollars, converted at a fixed rate. An + approximate cost, not a billed amount. + compute_cost_usd: + type: number + format: double + description: | + compute_cost in US dollars, converted at a fixed rate. An + approximate cost, not a billed amount. + platform_cost_usd: + type: number + format: double + description: | + platform_cost in US dollars, converted at a fixed rate. An + approximate cost, not a billed amount. RunCreatorInfo: type: object properties: type: type: string enum: - - user - - service_account + - user + - service_account description: Type of the creator principal uid: type: string @@ -2283,15 +2530,15 @@ components: RunState: type: string enum: - - QUEUED - - PENDING - - CLAIMED - - INPROGRESS - - SUCCEEDED - - FAILED - - BLOCKED - - ERROR - - CANCELLED + - QUEUED + - PENDING + - CLAIMED + - INPROGRESS + - SUCCEEDED + - FAILED + - BLOCKED + - ERROR + - CANCELLED description: | Current state of the run: - QUEUED: Run is waiting to be picked up @@ -2306,15 +2553,22 @@ components: RunSourceType: type: string enum: - - LINEAR - - API - - SLACK - - LOCAL - - SCHEDULED_AGENT - - WEB_APP - - GITHUB_ACTION - - CLOUD_MODE - - CLI + - LINEAR + - API + - SLACK + - LOCAL + - SCHEDULED_AGENT + - WEB_APP + - GITHUB_ACTION + - CLOUD_MODE + - CLI + - JIRA + - SELF_IMPROVEMENT + - GITHUB_WEBHOOK + - GITLAB_WEBHOOK + - AUTOFIX + - RUN_SCORER + - ORCHESTRATION description: | Source that created the run: - LINEAR: Created from Linear integration @@ -2326,11 +2580,18 @@ components: - GITHUB_ACTION: Created from a GitHub action - CLOUD_MODE: Created from a Cloud Mode - CLI: Created from the CLI + - JIRA: Created from Jira integration + - SELF_IMPROVEMENT: Created by Warp's self-improvement pipeline + - GITHUB_WEBHOOK: Created from a GitHub webhook event + - GITLAB_WEBHOOK: Created from a GitLab webhook event + - AUTOFIX: Created by Warp's autofix pipeline + - RUN_SCORER: Created by Warp's run-scoring judge + - ORCHESTRATION: Created as a child run by the orchestration layer (parent_run_id set) RunExecutionLocation: type: string enum: - - LOCAL - - REMOTE + - LOCAL + - REMOTE description: | Where the run executed: - LOCAL: Executed in the user's local Oz environment @@ -2355,6 +2616,14 @@ components: environment_id: type: string description: UID of the environment to run the agent in + runner_id: + type: string + description: | + UID of the runner providing the run's compute (platform, instance + shape, and setup commands). When omitted on a request, the runner is + resolved at run creation from the agent's default runner, then the + environment's default runner, and the resolved UID is recorded on + the run. skill_spec: type: string description: | @@ -2382,7 +2651,7 @@ components: type: boolean description: | Controls whether computer use is enabled for this agent. - If not set, defaults to false. + If not set, defaults to true. idle_timeout_minutes: type: integer format: int32 @@ -2410,11 +2679,30 @@ components: description: Memory stores to attach to this run. inference_providers: allOf: - - $ref: '#/components/schemas/InferenceProvidersConfig' + - $ref: '#/components/schemas/InferenceProvidersConfig' description: | Optional inference provider settings for this run. Run-level config takes precedence over the agent's stored config and the workspace's admin-configured defaults. + credential_strategy: + type: string + nullable: true + enum: + - CREATOR + - EXECUTOR + description: | + Controls which principal's credentials are used when the platform mints + tokens (e.g. GitHub or GitLab OAuth tokens) on behalf of this run. + - EXECUTOR (default when unset): credentials are sourced from the run's + execution principal. For agent principals this produces a + GitHub App installation token; for user principals this produces their + personal OAuth token. + - CREATOR: credentials are always sourced from the run creator, + regardless of the execution principal. Useful when a service account + executes the run but Git operations should authenticate as the human + who triggered it. + When unset, behavior is identical to EXECUTOR and no additional + pre-flight validation is performed. SessionSharingConfig: type: object description: | @@ -2428,8 +2716,8 @@ components: public_access: type: string enum: - - VIEWER - - EDITOR + - VIEWER + - EDITOR description: | Grants anyone-with-link access at the specified level to the run's shared session and backing conversation. @@ -2442,20 +2730,37 @@ components: description: | Specifies which execution harness to use for the agent run. Default (nil/empty) uses Warp's built-in harness. + When stored as a named agent's default (create/update agent identity), + this field replaces the deprecated base_harness/base_model pair: a + non-oz type here requires the agent's base_model to be empty, since + the two describe mutually exclusive default models. properties: type: type: string enum: - - oz - - claude - - gemini - - codex + - oz + - claude + - gemini + - codex description: | The harness type identifier. - oz: Warp's built-in harness (default) - claude: Claude Code harness - gemini: Gemini CLI harness - codex: Codex CLI harness + model_id: + type: string + description: | + Model to use with a third-party harness (e.g. "claude-haiku-4-5"). + Only applies when type is a non-oz harness; the top-level config + model_id targets the built-in Oz harness instead. When omitted or + empty, the harness uses its own default model. + reasoning_level: + type: string + description: | + Reasoning effort for harnesses that support it (e.g. Codex). + Only applies when type is a non-oz harness. Ignored by harnesses + that do not support reasoning levels. HarnessAuthSecrets: type: object description: | @@ -2481,7 +2786,10 @@ components: properties: warp_id: type: string - description: Reference to a Warp shared MCP server by UUID + description: | + Reference to a Warp shared MCP server by UUID, or a well-known + integration MCP id (e.g. "linear") backed by the team's integration + connection. command: type: string description: Stdio transport - command to run @@ -2514,10 +2822,10 @@ components: Additional extension members (e.g., `auth_url`, `provider`) may be present depending on the error code. required: - - type - - title - - status - - error + - type + - title + - status + - error properties: type: type: string @@ -2528,7 +2836,7 @@ components: See PlatformErrorCode for the list of possible error codes. title: type: string - description: 'A short, human-readable summary of the problem type (RFC 7807)' + description: A short, human-readable summary of the problem type (RFC 7807) status: type: integer description: The HTTP status code for this occurrence of the problem (RFC 7807) @@ -2552,11 +2860,18 @@ components: trace_id: type: string description: OpenTelemetry trace ID for debugging and support requests + provider: + type: string + description: External provider that requires authorization, such as `linear`. + auth_url: + type: string + format: uri + description: URL where the caller can reconnect the external provider. ArtifactResponse: oneOf: - - $ref: '#/components/schemas/PlanArtifactResponse' - - $ref: '#/components/schemas/ScreenshotArtifactResponse' - - $ref: '#/components/schemas/FileArtifactResponse' + - $ref: '#/components/schemas/PlanArtifactResponse' + - $ref: '#/components/schemas/ScreenshotArtifactResponse' + - $ref: '#/components/schemas/FileArtifactResponse' discriminator: propertyName: artifact_type mapping: @@ -2567,10 +2882,10 @@ components: type: object description: Response for retrieving a plan artifact. required: - - artifact_uid - - artifact_type - - created_at - - data + - artifact_uid + - artifact_type + - created_at + - data properties: artifact_uid: type: string @@ -2578,7 +2893,7 @@ components: artifact_type: type: string enum: - - PLAN + - PLAN description: Type of the artifact created_at: type: string @@ -2588,12 +2903,12 @@ components: $ref: '#/components/schemas/PlanArtifactResponseData' PlanArtifactResponseData: type: object - description: 'Response data for a plan artifact, including current markdown content.' + description: Response data for a plan artifact, including current markdown content. required: - - document_uid - - notebook_uid - - content - - content_type + - document_uid + - notebook_uid + - content + - content_type properties: document_uid: type: string @@ -2618,10 +2933,10 @@ components: type: object description: Response for retrieving a screenshot artifact. required: - - artifact_uid - - artifact_type - - created_at - - data + - artifact_uid + - artifact_type + - created_at + - data properties: artifact_uid: type: string @@ -2629,7 +2944,7 @@ components: artifact_type: type: string enum: - - SCREENSHOT + - SCREENSHOT description: Type of the artifact created_at: type: string @@ -2639,11 +2954,11 @@ components: $ref: '#/components/schemas/ScreenshotArtifactResponseData' ScreenshotArtifactResponseData: type: object - description: 'Response data for a screenshot artifact, including a signed download URL.' + description: Response data for a screenshot artifact, including a signed download URL. required: - - download_url - - expires_at - - content_type + - download_url + - expires_at + - content_type properties: download_url: type: string @@ -2655,7 +2970,7 @@ components: description: Timestamp when the download URL expires (RFC3339) content_type: type: string - description: 'MIME type of the screenshot (e.g., image/png)' + description: MIME type of the screenshot (e.g., image/png) description: type: string description: Optional description of the screenshot @@ -2663,10 +2978,10 @@ components: type: object description: Response for retrieving a file artifact. required: - - artifact_uid - - artifact_type - - created_at - - data + - artifact_uid + - artifact_type + - created_at + - data properties: artifact_uid: type: string @@ -2674,7 +2989,7 @@ components: artifact_type: type: string enum: - - FILE + - FILE description: Type of the artifact created_at: type: string @@ -2684,13 +2999,12 @@ components: $ref: '#/components/schemas/FileArtifactResponseData' FileArtifactResponseData: type: object - description: 'Response data for a file artifact, including a signed download URL.' + description: Response data for a file artifact, including a signed download URL. required: - - download_url - - expires_at - - content_type - - filepath - - filename + - download_url + - expires_at + - content_type + - filename properties: download_url: type: string @@ -2705,10 +3019,18 @@ components: description: MIME type of the uploaded file filepath: type: string - description: Conversation-relative filepath for the uploaded file + description: | + Conversation-relative filepath for the uploaded file. Omitted for + anonymous reads of public artifacts. filename: type: string description: Last path component of filepath + title: + type: string + description: | + Short, badge-visible label for the artifact. For recording artifacts, + this is the agent-authored title shown in Oz web and blocklist badges. + Distinct from description, which is longer and shown in detail views. description: type: string description: Optional description of the file @@ -2720,9 +3042,9 @@ components: type: object description: A base64-encoded file attachment to include with the prompt required: - - file_name - - mime_type - - data + - file_name + - mime_type + - data properties: file_name: type: string @@ -2739,13 +3061,13 @@ components: ScheduledAgentItem: type: object required: - - id - - name - - cron_schedule - - enabled - - prompt - - created_at - - updated_at + - id + - name + - cron_schedule + - enabled + - prompt + - created_at + - updated_at properties: id: type: string @@ -2755,7 +3077,7 @@ components: description: Human-readable name for the schedule cron_schedule: type: string - description: 'Cron expression defining when the agent runs (e.g., "0 9 * * *" for daily at 9am UTC)' + description: Cron expression defining when the agent runs (e.g., "0 9 * * *" for daily at 9am UTC) enabled: type: boolean description: Whether the schedule is currently active @@ -2765,16 +3087,20 @@ components: last_spawn_error: type: string nullable: true - description: 'Error message from the last failed spawn attempt, if any' + description: Error message from the last failed spawn attempt, if any agent_config: $ref: '#/components/schemas/AmbientAgentConfig' agent_uid: type: string format: uuid description: UID of the agent that this schedule runs as + metadata: + allOf: + - $ref: '#/components/schemas/RunMetadata' + description: Custom metadata stamped onto every run spawned by this schedule environment: allOf: - - $ref: '#/components/schemas/CloudEnvironmentConfig' + - $ref: '#/components/schemas/CloudEnvironmentConfig' description: Resolved environment configuration (if agent_config references an environment_id) created_at: type: string @@ -2812,15 +3138,15 @@ components: Request body for creating a new scheduled agent. Either prompt or agent_config.skill_spec or agent_config.skills is required. required: - - name - - cron_schedule + - name + - cron_schedule properties: name: type: string description: Human-readable name for the schedule cron_schedule: type: string - description: 'Cron expression defining when the agent runs (e.g., "0 9 * * *" for daily at 9am UTC)' + description: Cron expression defining when the agent runs (e.g., "0 9 * * *" for daily at 9am UTC) prompt: type: string description: | @@ -2849,15 +3175,21 @@ components: description: | Whether to create a team-owned schedule. Defaults to true for users on a single team. + metadata: + allOf: + - $ref: '#/components/schemas/RunMetadata' + description: | + Custom metadata stamped onto every run spawned by this schedule as the run's + explicit metadata layer. UpdateScheduledAgentRequest: type: object description: | Request body for updating a scheduled agent. Either prompt or agent_config.skill_spec or agent_config.skills is required. required: - - name - - cron_schedule - - enabled + - name + - cron_schedule + - enabled properties: name: type: string @@ -2887,10 +3219,17 @@ components: Only valid for team-owned schedules. agent_config: $ref: '#/components/schemas/AmbientAgentConfig' + metadata: + allOf: + - $ref: '#/components/schemas/RunMetadata' + description: | + Custom metadata stamped onto every run spawned by this schedule. + Updates follow full-replacement PUT semantics: omitting this field + clears the schedule's metadata. Changes apply only to future runs. ListScheduledAgentsResponse: type: object required: - - schedules + - schedules properties: schedules: type: array @@ -2900,7 +3239,7 @@ components: DeleteScheduledAgentResponse: type: object required: - - success + - success properties: success: type: boolean @@ -2918,7 +3257,7 @@ components: description: Optional description of the environment docker_image: type: string - description: 'Docker image to use (e.g., "ubuntu:latest" or "registry/repo:tag")' + description: Docker image to use (e.g., "ubuntu:latest" or "registry/repo:tag") github_repos: type: array items: @@ -2931,6 +3270,24 @@ components: description: Shell commands to run during environment setup providers: $ref: '#/components/schemas/ProvidersConfig' + failure_session_retention_minutes: + type: integer + nullable: true + minimum: 1 + maximum: 60 + description: | + When set (1–60 minutes), a failed run using this environment keeps its session open + for this many minutes so it can be inspected. null or absent means immediate teardown + (disabled by default). + + The window is an idle window held open by the agent process itself: working in the + session pushes the deadline out, so a session in active use is not torn down + mid-debug. It ends early if the run's sandbox reaches its own deadline first. + + This policy applies to future failures of runs using this environment; it does not + change the window a currently-failed run was already started with. Opting in keeps + injected environment data (including secrets) alive and incurs compute usage for as + long as the session is held open. ProvidersConfig: type: object description: Optional cloud provider configurations for automatic auth @@ -2949,12 +3306,12 @@ components: type: object description: GCP Workload Identity Federation settings required: - - project_number - - workload_identity_federation_pool_id - - workload_identity_federation_provider_id + - project_number + - workload_identity_federation_pool_id + - workload_identity_federation_provider_id externalDocs: description: Google documentation on Workload Identity Federation - url: 'https://docs.cloud.google.com/iam/docs/workload-identity-federation' + url: https://docs.cloud.google.com/iam/docs/workload-identity-federation properties: project_number: type: string @@ -2973,9 +3330,9 @@ components: description: AWS IAM role assumption settings externalDocs: description: AWS documentation on IAM OIDC federation - url: 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html' + url: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html required: - - role_arn + - role_arn properties: role_arn: type: string @@ -2987,11 +3344,11 @@ components: agent or run. externalDocs: description: AWS documentation on IAM OIDC federation - url: 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html' + url: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html properties: disabled: type: boolean - description: 'If true, opt out of Bedrock at this layer.' + description: If true, opt out of Bedrock at this layer. role_arn: type: string description: IAM role ARN to assume when calling Bedrock. @@ -3001,8 +3358,8 @@ components: GitHubRepo: type: object required: - - owner - - repo + - owner + - repo properties: owner: type: string @@ -3013,7 +3370,7 @@ components: ListAgentsResponse: type: object required: - - agents + - agents properties: agents: type: array @@ -3023,7 +3380,7 @@ components: ListConnectedSelfHostedWorkersResponse: type: object required: - - workers + - workers properties: workers: type: array @@ -3033,10 +3390,10 @@ components: ConnectedSelfHostedWorker: type: object required: - - worker_host - - connection_count - - connected_at - - last_seen_at + - worker_host + - connection_count + - connected_at + - last_seen_at properties: worker_host: type: string @@ -3055,8 +3412,8 @@ components: AgentListItem: type: object required: - - name - - variants + - name + - variants properties: name: type: string @@ -3069,11 +3426,11 @@ components: AgentListVariant: type: object required: - - id - - description - - base_prompt - - source - - environments + - id + - description + - base_prompt + - source + - environments properties: id: type: string @@ -3108,9 +3465,9 @@ components: AgentListSource: type: object required: - - owner - - name - - skill_path + - owner + - name + - skill_path properties: owner: type: string @@ -3130,8 +3487,8 @@ components: AgentListEnvironment: type: object required: - - uid - - name + - uid + - name properties: uid: type: string @@ -3143,14 +3500,14 @@ components: type: object description: Ownership scope for a resource (team or personal) required: - - type + - type properties: type: type: string enum: - - User - - Team - description: 'Type of ownership ("User" for personal, "Team" for team-owned)' + - User + - Team + description: Type of ownership ("User" for personal, "Team" for team-owned) uid: type: string description: UID of the owning user or team @@ -3181,22 +3538,22 @@ components: - `resource_unavailable` — Transient infrastructure issue (retryable) - `internal_error` — Unexpected server-side error (retryable) enum: - - insufficient_credits - - feature_not_available - - external_authentication_required - - not_authorized - - invalid_request - - resource_not_found - - budget_exceeded - - integration_disabled - - integration_not_configured - - operation_not_supported - - environment_setup_failed - - content_policy_violation - - conflict - - authentication_required - - resource_unavailable - - internal_error + - insufficient_credits + - feature_not_available + - external_authentication_required + - not_authorized + - invalid_request + - resource_not_found + - budget_exceeded + - integration_disabled + - integration_not_configured + - operation_not_supported + - environment_setup_failed + - content_policy_violation + - conflict + - authentication_required + - resource_unavailable + - internal_error RunFollowupRequest: type: object description: Request body for submitting a follow-up message to an existing run. @@ -3213,8 +3570,8 @@ components: ListModelsResponse: type: object required: - - default_model_id - - models + - default_model_id + - models properties: default_model_id: type: string @@ -3227,10 +3584,10 @@ components: ModelInfo: type: object required: - - id - - display_name - - provider - - vision_supported + - id + - display_name + - provider + - vision_supported properties: id: type: string @@ -3241,10 +3598,10 @@ components: provider: type: string enum: - - OPENAI - - ANTHROPIC - - GOOGLE - - UNKNOWN + - OPENAI + - ANTHROPIC + - GOOGLE + - UNKNOWN description: The LLM provider vision_supported: type: boolean @@ -3254,15 +3611,50 @@ components: description: Optional extra descriptor for the model reasoning_level: type: string - description: 'Reasoning level descriptor, if any (e.g. "low", "medium", "high")' + description: Reasoning level descriptor, if any (e.g. "low", "medium", "high") disable_reason: type: string enum: - - PROVIDER_OUTAGE - - OUT_OF_REQUESTS - - ADMIN_DISABLED - - REQUIRES_UPGRADE - description: 'If set, the model is currently unavailable for the given reason' + - PROVIDER_OUTAGE + - OUT_OF_REQUESTS + - ADMIN_DISABLED + - REQUIRES_UPGRADE + description: If set, the model is currently unavailable for the given reason + ExternalReferenceArtifactData: + type: object + description: Data for a generic external reference artifact. + required: + - reference_type + - url + properties: + reference_type: + type: string + maxLength: 256 + description: | + Free-form category identifier for this reference (e.g. "linear_issue", + "spec_link", "jira_ticket"). Used for filtering and display. + url: + type: string + maxLength: 2048 + description: | + Canonical URL for the reference. Used as the key for reverse lookups + ("which run produced this URL?"). + title: + type: string + description: Optional human-readable label for the reference. + metadata: + type: object + additionalProperties: true + description: Optional category-specific extra fields. + RunByExternalReferenceResponse: + type: object + description: Response for a run reverse-lookup by external reference URL. + required: + - run_id + properties: + run_id: + type: string + description: The ID of the run that produced the external reference. AgentSkill: type: object description: | @@ -3284,7 +3676,7 @@ components: ListEnvironmentsResponse: type: object required: - - environments + - environments properties: environments: type: array @@ -3295,10 +3687,10 @@ components: type: object description: A cloud environment for running agents required: - - uid - - config - - last_updated - - setup_failed + - uid + - config + - last_updated + - setup_failed properties: uid: type: string @@ -3330,7 +3722,7 @@ components: description: | Reference to a managed secret by name. required: - - name + - name properties: name: type: string @@ -3339,9 +3731,9 @@ components: type: object description: Reference to a memory store to attach to an agent. required: - - uid - - access - - instructions + - uid + - access + - instructions properties: uid: type: string @@ -3349,16 +3741,187 @@ components: access: type: string enum: - - read_write - - read_only + - read_write + - read_only description: Access level for the store. instructions: type: string description: Instructions for how the agent should use this memory store. Must not be empty. + MemoryStoreAttachmentResponse: + type: object + description: Memory store attached to an agent. + required: + - uid + - access + - instructions + - owner_type + - owner_uid + properties: + uid: + type: string + description: UID of the memory store. + access: + type: string + enum: + - read_write + - read_only + description: Access level for the store. + instructions: + type: string + description: Instructions for how the agent should use this memory store. + owner_type: + type: string + description: Public owner type. + enum: + - user + - service_account + - team + owner_uid: + type: string + description: Public UID of the user, service account, or team that owns the memory store. + description: + type: string + description: Optional description for the memory store. + AgentAutoMemoryCreateConfig: + type: object + description: Auto-memory settings for creating an agent. + properties: + enabled: + type: boolean + description: | + Whether to create and attach a default service-account-owned memory store for this agent. + Defaults to true when omitted. + AgentMemoryCreateConfig: + type: object + description: Memory settings for creating an agent. + properties: + auto_memory: + allOf: + - $ref: '#/components/schemas/AgentAutoMemoryCreateConfig' + description: Agent-owned memory settings. Defaults to enabled when omitted. + attached_stores: + type: array + items: + $ref: '#/components/schemas/MemoryStoreRef' + description: | + Existing team memory stores to attach to the agent. + Duplicate UIDs within a single request are rejected. + AgentMemoryUpdateConfig: + type: object + description: Memory settings for updating an agent. + properties: + attached_stores: + type: array + nullable: true + items: + $ref: '#/components/schemas/MemoryStoreRef' + description: | + Replacement list of attached team memory stores. Omit to leave unchanged, + pass an empty array to clear, or pass a non-empty array to replace. + AgentAutoMemoryResponse: + type: object + description: Auto-memory state for an agent. + required: + - enabled + properties: + enabled: + type: boolean + description: Whether this agent has an agent-owned memory store. + store: + $ref: '#/components/schemas/MemoryStoreAttachmentResponse' + AgentMemoryResponse: + type: object + description: Memory settings for an agent. + required: + - auto_memory + - attached_stores + properties: + auto_memory: + $ref: '#/components/schemas/AgentAutoMemoryResponse' + attached_stores: + type: array + items: + $ref: '#/components/schemas/MemoryStoreRef' + description: Team memory stores attached to the agent. + AgentCredentialStrategy: + type: string + description: | + Default credential strategy for runs executed by a named agent. + - EXECUTOR: runs authenticate with the named agent's own credentials + (e.g. a GitHub App installation token for the agent's team). + - CREATOR: runs authenticate with the credentials of the principal + that created the run. + Unlike the factory default, an agent may leave this unset. The + strategy applied to a run is resolved in this order: the run's + config.credential_strategy, then the agent's default, then the + factory's default for factory-seeded agents, and finally EXECUTOR. + The inherited strategy is validated at run creation time (the required + credential must be mintable), like an explicit run-level value. + enum: + - CREATOR + - EXECUTOR + ReportedRunScore: + type: object + required: + - scorer_id + properties: + scorer_id: + type: integer + description: The evaluation this verdict belongs to + classification: + type: string + description: | + The chosen classification. Must exactly match one of the allowed + label values captured when the evaluation was dispatched. Ignored + when `failed` is true. + reason: + type: string + description: | + Optional judge reasoning. Stored outside the database and truncated + beyond 8KB; a storage failure does not reject the verdict. + failed: + type: boolean + description: | + True when the judge could not evaluate this evaluation. Failed + verdicts are accepted but record no score. + ReportRunScoresRequest: + type: object + required: + - results + properties: + results: + type: array + minItems: 1 + items: + $ref: '#/components/schemas/ReportedRunScore' + ReportedRunScoreOutcome: + type: object + required: + - scorer_id + - status + properties: + scorer_id: + type: integer + description: The evaluation this outcome belongs to + status: + type: string + description: 'Whether the verdict was recorded: "accepted" or "rejected"' + error: + type: string + description: Why the verdict was rejected; absent when accepted + ReportRunScoresResponse: + type: object + required: + - results + properties: + results: + type: array + items: + $ref: '#/components/schemas/ReportedRunScoreOutcome' CreateAgentRequest: type: object required: - - name + - name properties: name: type: string @@ -3378,6 +3941,14 @@ components: description: | Optional default cloud environment ID for runs executed by this agent. The environment must be owned by the same team as the agent. + default_runner_uid: + type: string + nullable: true + description: | + Optional default runner UID for runs executed by this agent. When set, + it overrides the selected environment's default runner for runs that + do not specify their own `runner_id`. The editor must have View + permission on the referenced runner. secrets: type: array items: @@ -3402,31 +3973,72 @@ components: Optional base model for runs executed by this agent. inference_providers: allOf: - - $ref: '#/components/schemas/InferenceProvidersConfig' + - $ref: '#/components/schemas/InferenceProvidersConfig' description: | Optional inference provider settings for this agent. Agent-level config takes precedence over the workspace's admin-configured defaults. - memory_stores: - type: array - items: - $ref: '#/components/schemas/MemoryStoreRef' + memory: + allOf: + - $ref: '#/components/schemas/AgentMemoryCreateConfig' + description: Optional memory settings for the agent. + mcp_servers: + type: object + additionalProperties: + $ref: '#/components/schemas/MCPServerConfig' description: | - Optional list of memory stores to attach to the agent. - Each store must be team-owned by the same team as the agent. - Duplicate UIDs within a single request are rejected. + Optional map of MCP server configurations by name to attach to runs executed by this agent. + Run-level MCP config takes precedence over this agent-level default. base_harness: type: string nullable: true + deprecated: true description: | Optional default harness for runs executed by this agent. + Deprecated - use harness instead. Kept for backward compatibility; + when both are sent, harness is authoritative and a conflicting + type is rejected with invalid_request. + harness: + allOf: + - $ref: '#/components/schemas/Harness' + description: | + Optional default harness for runs executed by this agent. + Omission or an empty object stores no harness default. + credential_strategy: + allOf: + - $ref: '#/components/schemas/AgentCredentialStrategy' + nullable: true + description: | + Optional default credential strategy for runs executed by this + agent. When omitted or null, the agent has no opinion and runs fall + back to the factory default (for factory-seeded agents) and then to + EXECUTOR. harness_auth_secrets: allOf: - - $ref: '#/components/schemas/HarnessAuthSecrets' + - $ref: '#/components/schemas/HarnessAuthSecrets' description: | Optional per-harness authentication secrets for this agent. Each field names a managed secret for the corresponding harness. Secrets are resolved at execution time from the agent's team scope. + on_behalf_of_enabled: + type: boolean + description: | + Whether runs created with this agent's API key may use the on_behalf_of + field to attribute runs to another team member. Defaults to false. + Only team admins may set this field. + worker_host: + type: string + nullable: true + description: | + Optional default worker host for runs executed by this agent. + Omission, null, or an empty value stores no Agent default, in which + case the workspace default applies. A non-empty value is trimmed + and stored; use "warp" to force Warp-hosted execution over a + self-hosted workspace default. The precedence order for worker + host resolution is: + 1. The host specified on the run itself + 2. The agent's default host + 3. The workspace default host UpdateAgentRequest: type: object description: | @@ -3454,6 +4066,13 @@ components: description: | Replacement default cloud environment ID. Omit or pass `null` to leave unchanged, or pass an empty string to clear. + default_runner_uid: + type: string + nullable: true + description: | + Replacement default runner UID. Omit or pass `null` to leave unchanged, + or pass an empty string to clear. A non-empty value must reference a + runner the editor can View. secrets: type: array nullable: true @@ -3477,18 +4096,24 @@ components: description: | Replacement base model. Omit or pass `null` to leave unchanged, or pass an empty string to clear. - memory_stores: - type: array + memory: + allOf: + - $ref: '#/components/schemas/AgentMemoryUpdateConfig' nullable: true - items: - $ref: '#/components/schemas/MemoryStoreRef' + description: Replacement memory settings for this agent. + mcp_servers: + type: object + additionalProperties: + $ref: '#/components/schemas/MCPServerConfig' description: | - Replacement list of memory stores. Omit to leave unchanged, pass an empty array - to clear, or pass a non-empty array to replace. + Replacement map of MCP server configurations by name. Omit to leave + unchanged, pass an empty object to clear, or pass a non-empty object + to replace. Run-level MCP config takes precedence over this agent-level + default. inference_providers: type: object allOf: - - $ref: '#/components/schemas/InferenceProvidersConfig' + - $ref: '#/components/schemas/InferenceProvidersConfig' nullable: true description: | Replacement inference provider settings for this agent. @@ -3498,27 +4123,67 @@ components: base_harness: type: string nullable: true + deprecated: true description: | Replacement default harness. Omit or pass `null` to leave unchanged, or pass an empty string to clear. + Deprecated - use harness instead. Kept for backward compatibility; + when both are sent, harness is authoritative and a conflicting + type is rejected with invalid_request. + harness: + allOf: + - $ref: '#/components/schemas/Harness' + nullable: true + description: | + Replacement default harness for runs executed by this agent. Omit + or pass `null` to leave unchanged, pass `{}` to clear the stored + default, or pass a populated object to replace it wholesale. + credential_strategy: + allOf: + - $ref: '#/components/schemas/AgentCredentialStrategy' + nullable: true + description: | + Replacement default credential strategy. Omit or pass `null` to + leave unchanged, or pass an empty string to clear the agent's + default. An agent belonging to a file-managed factory cannot clear + it: its agent file expresses the strategy by declaring it, and a + file that declares none keeps the strategy already projected, so a + clear is rejected with a 400. harness_auth_secrets: allOf: - - $ref: '#/components/schemas/HarnessAuthSecrets' + - $ref: '#/components/schemas/HarnessAuthSecrets' nullable: true description: | Replacement per-harness authentication secrets. Omit or pass `null` to leave unchanged, or pass an empty object to clear all secrets. + on_behalf_of_enabled: + type: boolean + nullable: true + description: | + Whether runs created with this agent's API key may use the on_behalf_of + field to attribute runs to another team member. Omit or pass `null` to + leave unchanged. Only team admins may set this field. + worker_host: + type: string + nullable: true + description: | + Replacement default worker host. Omit or pass `null` to leave + unchanged, or pass an empty string to clear (the workspace default + then applies). A non-empty value is trimmed and replaces the + stored default; use "warp" to force Warp-hosted execution over a + self-hosted workspace default. AgentResponse: type: object required: - - uid - - name - - available - - created_at - - updated_at - - secrets - - skills - - memory_stores + - uid + - name + - available + - created_at + - updated_at + - secrets + - skills + - memory + - default_runner_uid properties: uid: type: string @@ -3542,6 +4207,17 @@ components: 1. The environment specified on the run itself 2. The agent's default environment 3. An empty environment + default_runner_uid: + type: string + description: | + Default runner UID for runs executed by this agent. When set, it overrides the + selected environment's default runner for runs that do not specify their own + `runner_id`. The precedence order for runner resolution is: + 1. The runner specified on the run itself + 2. The agent's default runner + 3. The selected environment's default runner + 4. The environment's legacy inline compute fields + 5. System defaults available: type: boolean description: Whether this agent is within the team's plan limit and can be used for runs @@ -3575,36 +4251,77 @@ components: 3. The team's default model inference_providers: allOf: - - $ref: '#/components/schemas/InferenceProvidersConfig' + - $ref: '#/components/schemas/InferenceProvidersConfig' description: | The agent's stored inference provider settings. May be overridden by run-level config; if empty, falls back to the workspace's admin-configured defaults. - memory_stores: - type: array - items: - $ref: '#/components/schemas/MemoryStoreRef' + memory: + allOf: + - $ref: '#/components/schemas/AgentMemoryResponse' description: | - Memory stores attached to this agent. - Always present; empty when no stores are attached. + Memory settings for this agent. + Always present; attached_stores is empty when no team stores are attached. + mcp_servers: + type: object + additionalProperties: + $ref: '#/components/schemas/MCPServerConfig' + description: | + MCP server configurations attached to this agent by default. + Run-level MCP config takes precedence over this agent-level default. base_harness: type: string + deprecated: true description: | Default harness for runs executed by this agent. The precedence order for harness resolution is: 1. The harness specified on the run itself 2. The agent's base harness 3. Oz + Deprecated - use harness instead, which carries the full + {type, model_id, reasoning_level} default. + harness: + allOf: + - $ref: '#/components/schemas/Harness' + description: | + Default harness for runs executed by this agent. Absent when the + agent has no harness default. A stored model_id/reasoning_level + pair is still returned even if the model has since left the + harness's catalog. + credential_strategy: + allOf: + - $ref: '#/components/schemas/AgentCredentialStrategy' + description: | + Default credential strategy for runs executed by this agent. + Absent when the agent has no default. The precedence order for + credential strategy resolution is: + 1. The strategy specified on the run itself + 2. The agent's default strategy + 3. The factory's default strategy, for factory-seeded agents + 4. EXECUTOR harness_auth_secrets: allOf: - - $ref: '#/components/schemas/HarnessAuthSecrets' + - $ref: '#/components/schemas/HarnessAuthSecrets' description: | Per-harness authentication secrets configured on this agent. Each field names a managed secret for the corresponding harness. Secrets can be overridden per run. + on_behalf_of_enabled: + type: boolean + description: | + Whether runs created with this agent's API key may use the on_behalf_of + field to attribute runs to another team member. + worker_host: + type: string + description: | + Default worker host for runs executed by this agent, or empty when + unset. The precedence order for worker host resolution is: + 1. The host specified on the run itself + 2. The agent's default host + 3. The workspace default host ListAgentIdentitiesResponse: type: object required: - - agents + - agents properties: agents: type: array @@ -3614,11 +4331,11 @@ components: type: object description: Summary of the most recently created task for an environment required: - - id - - title - - state - - created_at - - updated_at + - id + - title + - state + - created_at + - updated_at properties: id: type: string @@ -3640,4 +4357,4 @@ components: type: string format: date-time nullable: true - description: 'When the task started running (RFC3339), null if not yet started' + description: When the task started running (RFC3339), null if not yet started diff --git a/package-lock.json b/package-lock.json index 9a09f9ea6..9221b4fa3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@astrojs/react": "^5.0.3", + "@astrojs/react": "^6.0.2", "@astrojs/rss": "^4.0.19", "@astrojs/sitemap": "^3.7.2", "@astrojs/starlight": "^0.41.4", @@ -20,8 +20,10 @@ "@vercel/analytics": "^2.0.1", "@vercel/speed-insights": "^2.0.0", "astro": "^7.1.3", + "astro-mermaid": "^2.1.0", "keymatch": "^1.0.5", "linkedom": "^0.18.12", + "mermaid": "^11.16.1", "react": "^19.2.4", "react-dom": "^19.2.4", "react-icons": "^5.6.0", @@ -30,6 +32,7 @@ "sharp": "^0.35.3", "starlight-llms-txt": "^0.11.0", "starlight-sidebar-topics": "^0.7.1", + "svg-toolbelt": "^0.7.0", "turndown": "^7.2.2", "turndown-plugin-gfm": "^1.0.2", "yaml": "^2.8.3" @@ -43,6 +46,19 @@ "node": "^20.19.0 || ^22.12.0 || ^24" } }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@astrojs/check": { "version": "0.9.8", "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.8.tgz", @@ -392,12 +408,19 @@ } }, "node_modules/@astrojs/internal-helpers": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.8.0.tgz", - "integrity": "sha512-J56GrhEiV+4dmrGLPNOl2pZjpHXAndWVyiVDYGDuw6MWKpBSEMLdFxHzeM/6sqaknw9M+HFfHZAcvi3OfT3D/w==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.2.tgz", + "integrity": "sha512-yt7fMgPYqSM4Tmr+taTW6Per+hjJ8Pk6lA1PAcDyqzOt8HzJ6Kje5WzCxA2Sd+9wsUW7uhkLeoTMK0cXPwH9rQ==", "license": "MIT", "dependencies": { - "picomatch": "^4.0.3" + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.3.0", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" } }, "node_modules/@astrojs/language-server": { @@ -681,16 +704,16 @@ } }, "node_modules/@astrojs/react": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-5.0.3.tgz", - "integrity": "sha512-z6JXjgADH4/7e0hqcRj+dO9UQlrKmsm2ZJoVT1GzOTYY0ThQ3Znpfr8tY8XKlEHWSTUlT9LP5u4v6QpEJwLz5A==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-6.0.2.tgz", + "integrity": "sha512-Fvv2UqS7ajFL2Yjd5s4s5PcCBCSSfks4r04rbCHZO5z4pUPwCygV2ketI+iC+1P/sdHANLV3tgDL1wjzty4cJg==", "license": "MIT", "dependencies": { - "@astrojs/internal-helpers": "0.8.0", + "@astrojs/internal-helpers": "0.10.2", "@vitejs/plugin-react": "^5.2.0", - "devalue": "^5.6.4", + "devalue": "^5.8.1", "ultrahtml": "^1.6.0", - "vite": "^7.3.1" + "vite": "^8.0.13" }, "engines": { "node": ">=22.12.0" @@ -1334,6 +1357,12 @@ "node": ">=6.9.0" } }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", + "license": "MIT" + }, "node_modules/@bruits/satteri-darwin-arm64": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.5.tgz", @@ -1479,6 +1508,12 @@ "node": ">=18" } }, + "node_modules/@chevrotain/types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", + "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", + "license": "Apache-2.0" + }, "node_modules/@clack/core": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.1.0.tgz", @@ -1570,14 +1605,25 @@ "license": "MIT" }, "node_modules/@emnapi/core": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", - "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", "license": "MIT", "optional": true, "peer": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, @@ -2147,6 +2193,23 @@ "react-dom": ">= 16.3.0" } }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.4.tgz", + "integrity": "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "import-meta-resolve": "^4.2.0" + } + }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", @@ -2695,14 +2758,14 @@ } }, "node_modules/@kapaai/react-sdk": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@kapaai/react-sdk/-/react-sdk-0.9.2.tgz", - "integrity": "sha512-PeqgKL6d0yIkkmPn+1O8TBjH7KGx5HNiH7fhGl0FEV2MfJZBzWNvAOdOm/34VLdpb2Nawe3H1gSURdJ0DG6z7Q==", + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@kapaai/react-sdk/-/react-sdk-0.9.10.tgz", + "integrity": "sha512-osQyFgBJmhNM207MpB0aZbjs2kjNHjEJbNc5YEReJuyFE72Iydn9CoZGxox2GYRgMIlQ7wljHCzgQqkvR8lXqA==", "license": "MIT", "dependencies": { "@fingerprintjs/fingerprintjs-pro-react": "^2.7.0", + "@fingerprintjs/fingerprintjs-pro-spa": "^1.3.0", "@hcaptcha/react-hcaptcha": "^1.12.0", - "@tanstack/react-query": "^5.74.3", "js-cookie": "^3.0.5", "tldts": "^7.0.7" }, @@ -2769,6 +2832,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/@mermaid-js/parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.2.0.tgz", + "integrity": "sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA==", + "license": "MIT", + "dependencies": { + "@chevrotain/types": "~11.1.2" + } + }, "node_modules/@mixmark-io/domino": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", @@ -3633,566 +3705,443 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", - "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", - "cpu": [ - "arm" - ], + "node_modules/@shikijs/core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.1.tgz", + "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true + "dependencies": { + "@shikijs/primitive": "4.3.1", + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", - "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", - "cpu": [ - "arm64" - ], + "node_modules/@shikijs/core/node_modules/@shikijs/primitive": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.1.tgz", + "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", - "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", - "cpu": [ - "arm64" - ], + "node_modules/@shikijs/engine-javascript": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.1.tgz", + "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", - "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", - "cpu": [ - "x64" - ], + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.1.tgz", + "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", - "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", - "cpu": [ - "arm64" - ], + "node_modules/@shikijs/langs": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.1.tgz", + "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true + "dependencies": { + "@shikijs/types": "4.3.1" + }, + "engines": { + "node": ">=20" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", - "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", - "cpu": [ - "x64" - ], + "node_modules/@shikijs/primitive": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.0.tgz", + "integrity": "sha512-CPkz64PTa5diRW1ggzMZH9VM/du4RNChYgVtgqrFcgruvIybmCvySv8GkiHSczUHXYuuR8TdKEwFx+UnZMpgdg==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true + "dependencies": { + "@shikijs/types": "4.3.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", - "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", - "cpu": [ - "arm" - ], + "node_modules/@shikijs/primitive/node_modules/@shikijs/types": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.0.tgz", + "integrity": "sha512-oc8b9U2SYvofKZk8e/737nIX0qwf6eV2vHFATeObAu7r+mUVpLs8Re0BmVkIjAWAYgkmG/CzLNo7rzuBzRu/wQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", - "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", - "cpu": [ - "arm" - ], + "node_modules/@shikijs/themes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.1.tgz", + "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "dependencies": { + "@shikijs/types": "4.3.1" + }, + "engines": { + "node": ">=20" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", - "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", - "cpu": [ - "arm64" - ], + "node_modules/@shikijs/types": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz", + "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", - "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", - "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", - "cpu": [ - "loong64" - ], + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "peer": true + "dependencies": { + "tslib": "^2.4.0" + } }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", - "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", - "cpu": [ - "loong64" - ], + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", - "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", - "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "dependencies": { + "@babel/types": "^7.0.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", - "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", - "cpu": [ - "riscv64" - ], + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", - "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", - "cpu": [ - "riscv64" - ], + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "dependencies": { + "@babel/types": "^7.28.2" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", - "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "node_modules/@types/braces": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.5.tgz", + "integrity": "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w==", + "license": "MIT" }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", - "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", - "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", - "cpu": [ - "x64" - ], + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "dependencies": { + "@types/d3-selection": "*" + } }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", - "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", - "cpu": [ - "x64" - ], + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true + "dependencies": { + "@types/d3-selection": "*" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", - "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "peer": true + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", - "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", - "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", - "cpu": [ - "ia32" - ], + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", - "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", - "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" }, - "node_modules/@shikijs/core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.1.tgz", - "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==", + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", "license": "MIT", "dependencies": { - "@shikijs/primitive": "4.3.1", - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.5" - }, - "engines": { - "node": ">=20" + "@types/d3-selection": "*" } }, - "node_modules/@shikijs/core/node_modules/@shikijs/primitive": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.1.tgz", - "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==", + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" + "@types/d3-dsv": "*" } }, - "node_modules/@shikijs/engine-javascript": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.1.tgz", - "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==", + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.6" - }, - "engines": { - "node": ">=20" + "@types/geojson": "*" } }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.1.tgz", - "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==", + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1", - "@shikijs/vscode-textmate": "^10.0.2" - }, - "engines": { - "node": ">=20" + "@types/d3-color": "*" } }, - "node_modules/@shikijs/langs": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.1.tgz", - "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==", + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz", + "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.1" - }, - "engines": { - "node": ">=20" + "@types/d3-time": "*" } }, - "node_modules/@shikijs/primitive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.0.tgz", - "integrity": "sha512-CPkz64PTa5diRW1ggzMZH9VM/du4RNChYgVtgqrFcgruvIybmCvySv8GkiHSczUHXYuuR8TdKEwFx+UnZMpgdg==", + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/primitive/node_modules/@shikijs/types": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.0.tgz", - "integrity": "sha512-oc8b9U2SYvofKZk8e/737nIX0qwf6eV2vHFATeObAu7r+mUVpLs8Re0BmVkIjAWAYgkmG/CzLNo7rzuBzRu/wQ==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/themes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.1.tgz", - "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.3.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz", - "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" + "@types/d3-path": "*" } }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", "license": "MIT" }, - "node_modules/@tanstack/query-core": { - "version": "5.90.20", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.20.tgz", - "integrity": "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.90.21", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.21.tgz", - "integrity": "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.90.20" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@types/d3-selection": "*" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" } }, - "node_modules/@types/braces": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.5.tgz", - "integrity": "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w==", - "license": "MIT" - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -4223,6 +4172,12 @@ "integrity": "sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==", "license": "MIT" }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -4321,6 +4276,13 @@ "@types/node": "*" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -4333,6 +4295,16 @@ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, + "node_modules/@upsetjs/venn.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", + "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", + "license": "MIT", + "optionalDependencies": { + "d3-selection": "^3.0.0", + "d3-transition": "^3.0.1" + } + }, "node_modules/@vercel/analytics": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-2.0.1.tgz", @@ -4384,1163 +4356,1707 @@ "@vercel/oidc": "3.2.0" }, "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@aws-sdk/credential-provider-web-identity": "*" + "node": ">= 20" + }, + "peerDependencies": { + "@aws-sdk/credential-provider-web-identity": "*" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-provider-web-identity": { + "optional": true + } + } + }, + "node_modules/@vercel/nft": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.5.0.tgz", + "integrity": "sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA==", + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^13.0.0", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vercel/nft/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vercel/nft/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vercel/nft/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vercel/nft/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vercel/oidc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz", + "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@vercel/routing-utils": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@vercel/routing-utils/-/routing-utils-5.3.3.tgz", + "integrity": "sha512-KYm2sLNUD48gDScv8ob4ejc3Gww2jcJyW80hTdYlenAPz/5BQar1Gyh38xrUuZ532TUwSb5mV1uRbAuiykq0EQ==", + "license": "Apache-2.0", + "dependencies": { + "path-to-regexp": "6.1.0", + "path-to-regexp-updated": "npm:path-to-regexp@6.3.0" + }, + "optionalDependencies": { + "ajv": "^6.12.3" + } + }, + "node_modules/@vercel/speed-insights": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-2.0.0.tgz", + "integrity": "sha512-jwkNcrTeafWxjmWq4AHBaptSqZiJkYU5adLC9QBSqeim0GcqDMgN5Ievh8OG1rJ6W3A4l1oiP7qr9CWxGuzu3w==", + "license": "Apache-2.0", + "peerDependencies": { + "@sveltejs/kit": "^1 || ^2", + "next": ">= 13", + "nuxt": ">= 3", + "react": "^18 || ^19 || ^19.0.0-rc", + "svelte": ">= 4", + "vue": "^3", + "vue-router": "^4" + }, + "peerDependenciesMeta": { + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "nuxt": { + "optional": true + }, + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-router": { + "optional": true + } + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "license": "MIT" + }, + "node_modules/@volar/kit": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.28.tgz", + "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "typesafe-path": "^0.2.2", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/language-server": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.28.tgz", + "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "path-browserify": "^1.0.1", + "request-light": "^0.7.0", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/language-service": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.28.tgz", + "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/emmet-helper": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", + "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "emmet": "^2.4.3", + "jsonc-parser": "^2.3.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/am-i-vibing": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", + "integrity": "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==", + "license": "MIT", + "dependencies": { + "process-ancestry": "^0.1.0" + }, + "bin": { + "am-i-vibing": "dist/cli.mjs" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/astro": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/astro/-/astro-7.1.3.tgz", + "integrity": "sha512-4dhPyAAXthf3xLEYnG8SeL7yr/nTPPABfY7e9YF0yuO+vK9Xp+8Q5j4xzsmL3GueukQv4oNwGNTBepLOiDGeJA==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler-rs": "^0.3.1", + "@astrojs/internal-helpers": "0.10.1", + "@astrojs/markdown-satteri": "0.3.4", + "@astrojs/telemetry": "3.3.3", + "@capsizecss/unpack": "^4.0.0", + "@clack/prompts": "^1.1.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "am-i-vibing": "^0.4.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "ci-info": "^4.4.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^2.0.0", + "cookie": "^2.0.1", + "devalue": "^5.8.1", + "diff": "^8.0.3", + "dset": "^3.1.4", + "es-module-lexer": "^2.0.0", + "esbuild": "^0.28.0", + "flattie": "^1.1.1", + "fontace": "~0.4.1", + "get-tsconfig": "5.0.0-beta.4", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "js-yaml": "^4.1.1", + "jsonc-parser": "^3.3.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.2", + "mrmime": "^2.0.1", + "neotraverse": "^1.0.1", + "obug": "^2.1.1", + "p-limit": "^7.3.0", + "p-queue": "^9.1.0", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.4", + "semver": "^7.7.4", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "svgo": "^4.0.1", + "tinyclip": "^0.1.12", + "tinyexec": "^1.0.4", + "tinyglobby": "^0.2.15", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.4", + "unstorage": "^1.17.5", + "vite": "^8.0.13", + "vitefu": "^1.1.2", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^22.0.0", + "zod": "^4.3.6" + }, + "bin": { + "astro": "bin/astro.mjs" + }, + "engines": { + "node": ">=22.12.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0 || ^0.35.0" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "7.2.1" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } + } + }, + "node_modules/astro-expressive-code": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.44.1.tgz", + "integrity": "sha512-DT1LnCqbHasBKlvzJ3m6LR4VI94wwx3W9EV/YbP1te4rqjOHsvsezHYuqb5MeLWLftXms/1FA9QBbwCo43DnJQ==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.44.1", + "url-extras": "^0.1.0" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" + } + }, + "node_modules/astro-mermaid": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/astro-mermaid/-/astro-mermaid-2.1.0.tgz", + "integrity": "sha512-fFRUN0BTZh+DZhDiLyblXoO26XqJ1Rr+qK3JGgSu7OBspKHDm59jkztg/aHsrdo1vO/tIq/+xhP/vgT8Mp92XA==", + "license": "MIT", + "dependencies": { + "import-meta-resolve": "^4.2.0", + "mdast-util-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "peerDependencies": { + "@mermaid-js/layout-elk": "^0.2.0", + "astro": ">=4", + "mermaid": "^10.0.0 || ^11.0.0" + }, + "peerDependenciesMeta": { + "@mermaid-js/layout-elk": { + "optional": true + } + } + }, + "node_modules/astro/node_modules/@astrojs/internal-helpers": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.1.tgz", + "integrity": "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.1.1", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, + "node_modules/astro/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "license": "MIT" + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.40", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", + "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" }, - "peerDependenciesMeta": { - "@aws-sdk/credential-provider-web-identity": { - "optional": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@vercel/nft": { + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bindings": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.5.0.tgz", - "integrity": "sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA==", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "license": "MIT", "dependencies": { - "@mapbox/node-pre-gyp": "^2.0.0", - "@rollup/pluginutils": "^5.1.3", - "acorn": "^8.6.0", - "acorn-import-attributes": "^1.9.5", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^13.0.0", - "graceful-fs": "^4.2.9", - "node-gyp-build": "^4.2.2", - "picomatch": "^4.0.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "nft": "out/cli.js" - }, - "engines": { - "node": ">=20" + "file-uri-to-path": "1.0.0" } }, - "node_modules/@vercel/nft/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" }, - "node_modules/@vercel/nft/node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "license": "BlueOak-1.0.0", + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "license": "MIT", "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" + "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "20 || >=22" } }, - "node_modules/@vercel/nft/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { - "brace-expansion": "^5.0.5" + "fill-range": "^7.1.1" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", + "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.38", + "caniuse-lite": "^1.0.30001799", + "electron-to-chromium": "^1.5.376", + "node-releases": "^2.0.48", + "update-browserslist-db": "^1.2.3" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@vercel/nft/node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "license": "BlueOak-1.0.0", + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@vercel/oidc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz", - "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", - "license": "Apache-2.0", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, "engines": { - "node": ">= 20" + "node": ">= 0.4" } }, - "node_modules/@vercel/routing-utils": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@vercel/routing-utils/-/routing-utils-5.3.3.tgz", - "integrity": "sha512-KYm2sLNUD48gDScv8ob4ejc3Gww2jcJyW80hTdYlenAPz/5BQar1Gyh38xrUuZ532TUwSb5mV1uRbAuiykq0EQ==", - "license": "Apache-2.0", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", "dependencies": { - "path-to-regexp": "6.1.0", - "path-to-regexp-updated": "npm:path-to-regexp@6.3.0" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, - "optionalDependencies": { - "ajv": "^6.12.3" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@vercel/speed-insights": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-2.0.0.tgz", - "integrity": "sha512-jwkNcrTeafWxjmWq4AHBaptSqZiJkYU5adLC9QBSqeim0GcqDMgN5Ievh8OG1rJ6W3A4l1oiP7qr9CWxGuzu3w==", - "license": "Apache-2.0", - "peerDependencies": { - "@sveltejs/kit": "^1 || ^2", - "next": ">= 13", - "nuxt": ">= 3", - "react": "^18 || ^19 || ^19.0.0-rc", - "svelte": ">= 4", - "vue": "^3", - "vue-router": "^4" - }, - "peerDependenciesMeta": { - "@sveltejs/kit": { - "optional": true - }, - "next": { - "optional": true - }, - "nuxt": { - "optional": true - }, - "react": { - "optional": true - }, - "svelte": { - "optional": true + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "vue": { - "optional": true + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, - "vue-router": { - "optional": true + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@vitejs/plugin-react": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", - "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.29.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-rc.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.18.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=10" }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vitejs/plugin-react/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", - "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", - "license": "MIT" - }, - "node_modules/@volar/kit": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.28.tgz", - "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==", + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-service": "2.4.28", - "@volar/typescript": "2.4.28", - "typesafe-path": "^0.2.2", - "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.8" + "color-convert": "^2.0.1" }, - "peerDependencies": { - "typescript": "*" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@volar/language-core": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", - "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.28" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@volar/language-server": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.28.tgz", - "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==", - "dev": true, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.28", - "@volar/language-service": "2.4.28", - "@volar/typescript": "2.4.28", - "path-browserify": "^1.0.1", - "request-light": "^0.7.0", - "vscode-languageserver": "^9.0.1", - "vscode-languageserver-protocol": "^3.17.5", - "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@volar/language-service": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.28.tgz", - "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==", - "dev": true, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.28", - "vscode-languageserver-protocol": "^3.17.5", - "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@volar/source-map": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", - "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", - "dev": true, - "license": "MIT" + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/@volar/typescript": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", - "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", - "dev": true, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.28", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@vscode/emmet-helper": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", - "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", - "dev": true, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "emmet": "^2.4.3", - "jsonc-parser": "^2.3.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "^3.15.1", - "vscode-uri": "^3.0.8" + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@vscode/l10n": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", - "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", - "license": "ISC", + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18" } }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", - "peerDependencies": { - "acorn": "^8" + "engines": { + "node": ">=6" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">= 14" + "node": ">=7.0.0" } }, - "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "license": "MIT", - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", "funding": { "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/am-i-vibing": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", - "integrity": "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==", + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "license": "MIT", - "dependencies": { - "process-ancestry": "^0.1.0" - }, - "bin": { - "am-i-vibing": "dist/cli.mjs" + "engines": { + "node": ">= 10" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "node_modules/common-ancestor-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", + "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 8" + "node": ">= 18" } }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, - "node_modules/argparse": { + "node_modules/cookie": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==", "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, "engines": { - "node": ">=10" + "node": ">=22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } + "node_modules/cookie-es": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", + "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", + "license": "MIT" }, - "node_modules/array-iterate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", - "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "layout-base": "^1.0.0" } }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", - "bin": { - "astring": "bin/astring" + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/astro": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/astro/-/astro-7.1.3.tgz", - "integrity": "sha512-4dhPyAAXthf3xLEYnG8SeL7yr/nTPPABfY7e9YF0yuO+vK9Xp+8Q5j4xzsmL3GueukQv4oNwGNTBepLOiDGeJA==", - "license": "MIT", + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", "dependencies": { - "@astrojs/compiler-rs": "^0.3.1", - "@astrojs/internal-helpers": "0.10.1", - "@astrojs/markdown-satteri": "0.3.4", - "@astrojs/telemetry": "3.3.3", - "@capsizecss/unpack": "^4.0.0", - "@clack/prompts": "^1.1.0", - "@oslojs/encoding": "^1.1.0", - "@rollup/pluginutils": "^5.3.0", - "am-i-vibing": "^0.4.0", - "aria-query": "^5.3.2", - "axobject-query": "^4.1.0", - "ci-info": "^4.4.0", - "clsx": "^2.1.1", - "common-ancestor-path": "^2.0.0", - "cookie": "^2.0.1", - "devalue": "^5.8.1", - "diff": "^8.0.3", - "dset": "^3.1.4", - "es-module-lexer": "^2.0.0", - "esbuild": "^0.28.0", - "flattie": "^1.1.1", - "fontace": "~0.4.1", - "get-tsconfig": "5.0.0-beta.4", - "github-slugger": "^2.0.0", - "html-escaper": "3.0.3", - "http-cache-semantics": "^4.2.0", - "js-yaml": "^4.1.1", - "jsonc-parser": "^3.3.1", - "magic-string": "^0.30.21", - "magicast": "^0.5.2", - "mrmime": "^2.0.1", - "neotraverse": "^1.0.1", - "obug": "^2.1.1", - "p-limit": "^7.3.0", - "p-queue": "^9.1.0", - "package-manager-detector": "^1.6.0", - "piccolore": "^0.1.3", - "picomatch": "^4.0.4", - "semver": "^7.7.4", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "svgo": "^4.0.1", - "tinyclip": "^0.1.12", - "tinyexec": "^1.0.4", - "tinyglobby": "^0.2.15", - "ultrahtml": "^1.6.0", - "unifont": "~0.7.4", - "unstorage": "^1.17.5", - "vite": "^8.0.13", - "vitefu": "^1.1.2", - "xxhash-wasm": "^1.1.0", - "yargs-parser": "^22.0.0", - "zod": "^4.3.6" + "isexe": "^2.0.0" }, "bin": { - "astro": "bin/astro.mjs" + "node-which": "bin/node-which" }, "engines": { - "node": ">=22.12.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/astrodotbuild" - }, - "optionalDependencies": { - "sharp": "^0.34.0 || ^0.35.0" - }, - "peerDependencies": { - "@astrojs/markdown-remark": "7.2.1" - }, - "peerDependenciesMeta": { - "@astrojs/markdown-remark": { - "optional": true - } + "node": ">= 8" } }, - "node_modules/astro-expressive-code": { - "version": "0.44.1", - "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.44.1.tgz", - "integrity": "sha512-DT1LnCqbHasBKlvzJ3m6LR4VI94wwx3W9EV/YbP1te4rqjOHsvsezHYuqb5MeLWLftXms/1FA9QBbwCo43DnJQ==", + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", "license": "MIT", "dependencies": { - "rehype-expressive-code": "^0.44.1", - "url-extras": "^0.1.0" - }, - "peerDependencies": { - "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" + "uncrypto": "^0.1.3" } }, - "node_modules/astro/node_modules/@astrojs/internal-helpers": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.1.tgz", - "integrity": "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q==", - "license": "MIT", + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", "dependencies": { - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "js-yaml": "^4.1.1", - "picomatch": "^4.0.4", - "retext-smartypants": "^6.2.0", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "unified": "^11.0.5" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/astro/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "license": "MIT" - }, - "node_modules/async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], "license": "MIT" }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "license": "Apache-2.0", + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, "engines": { - "node": ">= 0.4" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.40", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", - "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", - "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.cjs" + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "node_modules/bcp-47": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", - "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "license": "MIT", "dependencies": { - "is-alphabetical": "^2.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0" + "css-tree": "~2.2.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/bcp-47-match": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", - "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "license": "MIT", "dependencies": { - "file-uri-to-path": "1.0.0" + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" }, - "node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT", + "peer": true + }, + "node_modules/cytoscape": { + "version": "3.34.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.1.tgz", + "integrity": "sha512-Lr0RvH9H75y9ar8h9Toy6u4lxRSCcxUq+hHcQ26sVWo6BnaQp1gwEZOYqwuYTZhyW7npyKnNLP8oJ2p1/3OZ7g==", "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, "engines": { - "node": "18 || 20 || >=22" + "node": ">=0.10" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "cose-base": "^1.0.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "cytoscape": "^3.2.0" } }, - "node_modules/browserslist": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.38", - "caniuse-lite": "^1.0.30001799", - "electron-to-chromium": "^1.5.376", - "node-releases": "^2.0.48", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" + "cose-base": "^2.2.0" }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "peerDependencies": { + "cytoscape": "^3.2.0" } }, - "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - "dev": true, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "layout-base": "^2.0.0" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" }, "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "internmap": "1 - 2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "d3-path": "1 - 3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=12" } }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", "dependencies": { - "color-convert": "^2.0.1" + "d3-array": "^3.2.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=12" } }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", "dependencies": { - "has-flag": "^4.0.0" + "delaunator": "5" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" } }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" } }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" } }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "license": "MIT", + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", "dependencies": { - "readdirp": "^5.0.0" + "d3-dsv": "1 - 3" }, "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=12" } }, - "node_modules/chownr": { + "node_modules/d3-force": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { - "color-name": "~1.1.4" + "d3-color": "1 - 3" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" } }, - "node_modules/common-ancestor-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", - "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", - "license": "BlueOak-1.0.0", + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", "engines": { - "node": ">= 18" + "node": ">=12" } }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "license": "MIT", + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", "engines": { - "node": "^14.18.0 || >=16.10.0" + "node": ">=12" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", - "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==", - "license": "MIT", + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", "engines": { - "node": ">=22" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=12" } }, - "node_modules/cookie-es": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", - "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", - "license": "MIT" + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" } }, - "node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", "license": "ISC" }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "license": "ISC", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" }, "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/crossws": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", - "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", - "license": "MIT", + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", "dependencies": { - "uncrypto": "^0.1.3" + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "d3-path": "^3.1.0" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=12" } }, - "node_modules/css-selector-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", - "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "license": "MIT", + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" + "d3-array": "2 - 3" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">=12" } }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=12" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "license": "MIT", + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", "dependencies": { - "css-tree": "~2.2.0" + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" } }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "license": "MIT", + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=12" } }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "license": "CC0-1.0" + "node_modules/dagre-d3-es": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", + "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "node_modules/dayjs": { + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", "license": "MIT" }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT", - "peer": true - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -5595,6 +6111,15 @@ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -5719,6 +6244,15 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.13.tgz", + "integrity": "sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/domutils": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", @@ -5840,6 +6374,17 @@ "node": ">= 0.4" } }, + "node_modules/es-toolkit": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", + "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks", + "tests/types" + ] + }, "node_modules/esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", @@ -6063,9 +6608,9 @@ "optional": true }, "node_modules/fast-uri": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", - "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "dev": true, "funding": [ { @@ -6354,6 +6899,12 @@ "uncrypto": "^0.1.3" } }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6908,6 +7459,18 @@ } } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/import-meta-resolve": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", @@ -6924,6 +7487,15 @@ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", "license": "MIT" }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/iron-webcrypto": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", @@ -7039,9 +7611,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "funding": [ { "type": "github", @@ -7148,12 +7720,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/katex": { + "version": "0.16.47", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", + "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/keymatch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/keymatch/-/keymatch-1.0.5.tgz", "integrity": "sha512-QBoXs/fUlNgdHBEnIyWUTeI7p+ooY6Ul8JAJ8pGVfEYUvVZJO6yj67zOau2DYiQbPznskpymks2TLY6nOwHwzg==", "license": "MIT" }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, "node_modules/klaw-sync": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", @@ -7183,6 +7785,12 @@ "node": ">= 8" } }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, "node_modules/lightningcss": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", @@ -7456,6 +8064,12 @@ } } }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -7517,6 +8131,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -7856,6 +8482,35 @@ "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "license": "CC0-1.0" }, + "node_modules/mermaid": { + "version": "11.16.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.16.1.tgz", + "integrity": "sha512-TQsq6u22fAn3rek5VOubrhKPo1g5hwC3FXUN9hiyupTckcYiGuuKGkNQrKYwGJkXUxZdojwRG46gsSCFZMDp4g==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.2", + "@iconify/utils": "^3.0.2", + "@mermaid-js/parser": "^1.2.0", + "@types/d3": "^7.4.3", + "@upsetjs/venn.js": "^2.0.0", + "cytoscape": "^3.33.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.14", + "dayjs": "^1.11.20", + "dompurify": "^3.3.3", + "es-toolkit": "^1.45.1", + "katex": "^0.16.45", + "khroma": "^2.1.0", + "marked": "^16.3.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" + } + }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -8671,9 +9326,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "funding": [ { "type": "github", @@ -9083,6 +9738,12 @@ "dev": true, "license": "MIT" }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, "node_modules/path-expression-matcher": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", @@ -9145,6 +9806,22 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, "node_modules/postcss": { "version": "8.5.23", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", @@ -9857,6 +10534,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, "node_modules/rolldown": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", @@ -9890,52 +10573,30 @@ "@rolldown/binding-win32-x64-msvc": "1.1.5" } }, - "node_modules/rollup": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", - "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.2", - "@rollup/rollup-android-arm64": "4.60.2", - "@rollup/rollup-darwin-arm64": "4.60.2", - "@rollup/rollup-darwin-x64": "4.60.2", - "@rollup/rollup-freebsd-arm64": "4.60.2", - "@rollup/rollup-freebsd-x64": "4.60.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", - "@rollup/rollup-linux-arm-musleabihf": "4.60.2", - "@rollup/rollup-linux-arm64-gnu": "4.60.2", - "@rollup/rollup-linux-arm64-musl": "4.60.2", - "@rollup/rollup-linux-loong64-gnu": "4.60.2", - "@rollup/rollup-linux-loong64-musl": "4.60.2", - "@rollup/rollup-linux-ppc64-gnu": "4.60.2", - "@rollup/rollup-linux-ppc64-musl": "4.60.2", - "@rollup/rollup-linux-riscv64-gnu": "4.60.2", - "@rollup/rollup-linux-riscv64-musl": "4.60.2", - "@rollup/rollup-linux-s390x-gnu": "4.60.2", - "@rollup/rollup-linux-x64-gnu": "4.60.2", - "@rollup/rollup-linux-x64-musl": "4.60.2", - "@rollup/rollup-openbsd-x64": "4.60.2", - "@rollup/rollup-openharmony-arm64": "4.60.2", - "@rollup/rollup-win32-arm64-msvc": "4.60.2", - "@rollup/rollup-win32-ia32-msvc": "4.60.2", - "@rollup/rollup-win32-x64-gnu": "4.60.2", - "@rollup/rollup-win32-x64-msvc": "4.60.2", - "fsevents": "~2.3.2" + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/satteri": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.5.tgz", @@ -10249,6 +10910,21 @@ "inline-style-parser": "0.2.7" } }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, + "node_modules/svg-toolbelt": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/svg-toolbelt/-/svg-toolbelt-0.7.0.tgz", + "integrity": "sha512-EK5IYUc7Tk4H4d5QcJ7C6t9Qu1YAqpKECYABxUf2GAyGyNWKdy/+T5AJ0oKBmsbv3snCi/Zaev6tLQOqoxRJHw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/svgo": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.2.tgz", @@ -10415,6 +11091,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-dedent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz", + "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -10885,6 +11570,19 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/uuid": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", diff --git a/package.json b/package.json index 960a0c0ea..02bf766aa 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "node": "^20.19.0 || ^22.12.0 || ^24" }, "dependencies": { - "@astrojs/react": "^5.0.3", + "@astrojs/react": "^6.0.2", "@astrojs/rss": "^4.0.19", "@astrojs/sitemap": "^3.7.2", "@astrojs/starlight": "^0.41.4", @@ -31,8 +31,10 @@ "@vercel/analytics": "^2.0.1", "@vercel/speed-insights": "^2.0.0", "astro": "^7.1.3", + "astro-mermaid": "^2.1.0", "keymatch": "^1.0.5", "linkedom": "^0.18.12", + "mermaid": "^11.16.1", "react": "^19.2.4", "react-dom": "^19.2.4", "react-icons": "^5.6.0", @@ -41,18 +43,21 @@ "sharp": "^0.35.3", "starlight-llms-txt": "^0.11.0", "starlight-sidebar-topics": "^0.7.1", + "svg-toolbelt": "^0.7.0", "turndown": "^7.2.2", "turndown-plugin-gfm": "^1.0.2", "yaml": "^2.8.3" }, "overrides": { - "js-yaml": "^4.3.0", + "brace-expansion": ">=5.0.9", + "js-yaml": "^4.3.1", "path-to-regexp": "^6.3.0", "esbuild": "^0.28.1", "vite": "^8.0.13", "@babel/core": ">=7.29.6", "@astrojs/markdown-remark": "^7.2.0", - "tar": "^7.5.16" + "tar": "^7.5.16", + "nanoid": "^3.3.17" }, "devDependencies": { "@astrojs/check": "^0.9.8", diff --git a/scripts/generate_rename_redirects.py b/scripts/generate_rename_redirects.py new file mode 100644 index 000000000..adc889760 --- /dev/null +++ b/scripts/generate_rename_redirects.py @@ -0,0 +1,38 @@ +"""Generate redirects for agent-platform → agents rename and insert into vercel.json.""" +import json +import os + +agents_dir = "src/content/docs/agents" +redirects = [] + +for root, dirs, files in os.walk(agents_dir): + for f in files: + if not f.endswith(".mdx"): + continue + path = os.path.join(root, f) + rel = os.path.relpath(path, agents_dir) + slug = rel.replace("/index.mdx", "").replace(".mdx", "") + if slug == "index": + old_url = "/agent-platform/" + new_url = "/agents/" + else: + old_url = f"/agent-platform/{slug}/" + new_url = f"/agents/{slug}/" + redirects.append({"source": old_url, "destination": new_url, "statusCode": 308}) + +redirects.sort(key=lambda r: r["source"]) +print(f"Generated {len(redirects)} redirects") + +with open("vercel.json", "r") as fh: + data = json.load(fh) + +existing_sources = {r["source"] for r in data.get("redirects", [])} +new_redirects = [r for r in redirects if r["source"] not in existing_sources] +skipped = len(redirects) - len(new_redirects) +print(f"{len(new_redirects)} new redirects to add (skipping {skipped} duplicates)") + +data["redirects"] = new_redirects + data["redirects"] + +with open("vercel.json", "w") as fh: + json.dump(data, fh, indent=2) +print("vercel.json updated") diff --git a/src/assets/agent-platform/admin-panel-pr-artifact-attachments.png b/src/assets/agent-platform/admin-panel-pr-artifact-attachments.png new file mode 100644 index 000000000..b1f3e9b1d Binary files /dev/null and b/src/assets/agent-platform/admin-panel-pr-artifact-attachments.png differ diff --git a/src/assets/agent-platform/most-flexible-platform-for-building-with-agents.png b/src/assets/agent-platform/most-flexible-platform-for-building-with-agents.png index 794a0e017..c427b30e6 100644 Binary files a/src/assets/agent-platform/most-flexible-platform-for-building-with-agents.png and b/src/assets/agent-platform/most-flexible-platform-for-building-with-agents.png differ diff --git a/src/assets/agent-platform/oz-diagram.png b/src/assets/agent-platform/oz-diagram.png deleted file mode 100644 index f1793268f..000000000 Binary files a/src/assets/agent-platform/oz-diagram.png and /dev/null differ diff --git a/src/assets/agent-platform/platform-architecture.png b/src/assets/agent-platform/platform-architecture.png new file mode 100644 index 000000000..d7c399e59 Binary files /dev/null and b/src/assets/agent-platform/platform-architecture.png differ diff --git a/src/assets/agents/cli/tui-agents-tab-bar.png b/src/assets/agents/cli/tui-agents-tab-bar.png new file mode 100644 index 000000000..b9f9ac45f Binary files /dev/null and b/src/assets/agents/cli/tui-agents-tab-bar.png differ diff --git a/src/assets/agents/cli/tui-statusline.png b/src/assets/agents/cli/tui-statusline.png new file mode 100644 index 000000000..57a057bec Binary files /dev/null and b/src/assets/agents/cli/tui-statusline.png differ diff --git a/src/assets/factories/factories-concept-loop.png b/src/assets/factories/factories-concept-loop.png new file mode 100644 index 000000000..c27067462 Binary files /dev/null and b/src/assets/factories/factories-concept-loop.png differ diff --git a/src/assets/factories/factory-agent-settings.png b/src/assets/factories/factory-agent-settings.png new file mode 100644 index 000000000..7c347bd50 Binary files /dev/null and b/src/assets/factories/factory-agent-settings.png differ diff --git a/src/assets/factories/factory-agents-list.png b/src/assets/factories/factory-agents-list.png new file mode 100644 index 000000000..051a3d1a1 Binary files /dev/null and b/src/assets/factories/factory-agents-list.png differ diff --git a/src/assets/factories/factory-dashboard-activity-filters.png b/src/assets/factories/factory-dashboard-activity-filters.png new file mode 100644 index 000000000..79e86e4cd Binary files /dev/null and b/src/assets/factories/factory-dashboard-activity-filters.png differ diff --git a/src/assets/factories/factory-dashboard-activity.png b/src/assets/factories/factory-dashboard-activity.png new file mode 100644 index 000000000..9803a4ab8 Binary files /dev/null and b/src/assets/factories/factory-dashboard-activity.png differ diff --git a/src/assets/factories/factory-dashboard-metrics.png b/src/assets/factories/factory-dashboard-metrics.png new file mode 100644 index 000000000..61b63c204 Binary files /dev/null and b/src/assets/factories/factory-dashboard-metrics.png differ diff --git a/src/assets/factories/quickstart-connect-organization.png b/src/assets/factories/quickstart-connect-organization.png new file mode 100644 index 000000000..734ffc0ed Binary files /dev/null and b/src/assets/factories/quickstart-connect-organization.png differ diff --git a/src/assets/factories/quickstart-name-factory.png b/src/assets/factories/quickstart-name-factory.png new file mode 100644 index 000000000..39df71d0e Binary files /dev/null and b/src/assets/factories/quickstart-name-factory.png differ diff --git a/src/assets/factories/quickstart-open-setup-wizard.png b/src/assets/factories/quickstart-open-setup-wizard.png new file mode 100644 index 000000000..134f266a4 Binary files /dev/null and b/src/assets/factories/quickstart-open-setup-wizard.png differ diff --git a/src/assets/factories/quickstart-pick-agents.png b/src/assets/factories/quickstart-pick-agents.png new file mode 100644 index 000000000..50bd325aa Binary files /dev/null and b/src/assets/factories/quickstart-pick-agents.png differ diff --git a/src/assets/factories/quickstart-select-repos.png b/src/assets/factories/quickstart-select-repos.png new file mode 100644 index 000000000..95d0f8c68 Binary files /dev/null and b/src/assets/factories/quickstart-select-repos.png differ diff --git a/src/assets/factories/slack-factory-thread-reply.png b/src/assets/factories/slack-factory-thread-reply.png new file mode 100644 index 000000000..065a5d947 Binary files /dev/null and b/src/assets/factories/slack-factory-thread-reply.png differ diff --git a/src/assets/terminal/warp-factories-welcome.png b/src/assets/terminal/warp-factories-welcome.png new file mode 100644 index 000000000..1a2d5fcea Binary files /dev/null and b/src/assets/terminal/warp-factories-welcome.png differ diff --git a/src/assets/terminal/warp-oz-welcome.png b/src/assets/terminal/warp-oz-welcome.png deleted file mode 100644 index 6224a456c..000000000 Binary files a/src/assets/terminal/warp-oz-welcome.png and /dev/null differ diff --git a/src/components/ArticleImageLightbox.astro b/src/components/ArticleImageLightbox.astro new file mode 100644 index 000000000..8f96660e8 --- /dev/null +++ b/src/components/ArticleImageLightbox.astro @@ -0,0 +1,235 @@ +--- +// A singleton, delegated lightbox for article content and explicit chat image +// triggers. Event delegation keeps it active for future Starlight client-side +// swaps without wrapping article images in buttons or changing their layout. +--- + +<script> + const cleanupKey = '__warpDocsArticleImageLightboxCleanup'; + type LightboxWindow = Window & { + __warpDocsArticleImageLightboxCleanup?: () => void; + }; + + function installArticleImageLightbox() { + const lightboxWindow = window as LightboxWindow; + lightboxWindow[cleanupKey]?.(); + + const lightbox = document.createElement('dialog'); + lightbox.className = 'docs-image-lightbox'; + lightbox.hidden = true; + lightbox.setAttribute('role', 'dialog'); + lightbox.setAttribute('aria-modal', 'true'); + lightbox.setAttribute('aria-labelledby', 'docs-image-lightbox-title'); + + const content = document.createElement('div'); + content.className = 'docs-image-lightbox__content'; + const title = document.createElement('span'); + title.id = 'docs-image-lightbox-title'; + title.className = 'sr-only'; + const closeButton = document.createElement('button'); + closeButton.type = 'button'; + closeButton.className = 'docs-image-lightbox__close'; + closeButton.setAttribute('aria-label', 'Close expanded image'); + closeButton.innerHTML = + '<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m6 6 12 12M18 6 6 18"/></svg>'; + const expandedImage = document.createElement('img'); + expandedImage.className = 'docs-image-lightbox__image'; + expandedImage.decoding = 'async'; + expandedImage.loading = 'eager'; + expandedImage.referrerPolicy = 'no-referrer'; + const fallback = document.createElement('span'); + fallback.className = 'docs-image-lightbox__fallback'; + fallback.setAttribute('role', 'img'); + fallback.textContent = 'Image unavailable'; + fallback.hidden = true; + + content.append(title, closeButton, expandedImage, fallback); + lightbox.append(content); + document.body.append(lightbox); + + let activeTrigger: HTMLElement | null = null; + + const isEligibleArticleImage = (image: HTMLImageElement) => + image.matches('main .sl-markdown-content img') && + !image.closest('.not-content, #sl-kapa-panel, [data-no-lightbox]'); + const isEligibleKapaImage = (image: HTMLImageElement, trigger: HTMLElement) => + trigger.matches('.sl-kapa-answer-image-button') && + image.matches('.sl-kapa-answer-image') && + image.closest('#sl-kapa-panel') !== null; + + const isImageOnlyLink = (link: HTMLAnchorElement, image: HTMLImageElement) => + link.textContent?.trim() === '' && + link.children.length === 1 && + link.firstElementChild?.contains(image); + + const getImageTarget = (target: EventTarget | null) => { + if (!(target instanceof Element)) return null; + const trigger = target.closest<HTMLElement>('[data-warp-image-lightbox-trigger="true"]'); + if (!trigger) return null; + const image = + trigger instanceof HTMLImageElement ? trigger : trigger.querySelector('img'); + if (!(image instanceof HTMLImageElement)) return null; + + return isEligibleArticleImage(image) || isEligibleKapaImage(image, trigger) + ? { image, trigger } + : null; + }; + + const imageLabel = (image: HTMLImageElement) => + image.alt.trim() || 'Documentation image'; + + const enhanceImages = () => { + document + .querySelectorAll<HTMLImageElement>('main .sl-markdown-content img') + .forEach((image) => { + if (!isEligibleArticleImage(image)) return; + const link = image.closest('a'); + if (link instanceof HTMLAnchorElement) { + if (!isImageOnlyLink(link, image)) return; + image.dataset.docsImageLightboxImage = 'true'; + link.dataset.warpImageLightboxTrigger = 'true'; + link.setAttribute('role', 'button'); + link.setAttribute('aria-haspopup', 'dialog'); + link.setAttribute('aria-label', `Expand image: ${imageLabel(image)}`); + return; + } + + image.dataset.docsImageLightboxImage = 'true'; + image.dataset.warpImageLightboxTrigger = 'true'; + image.tabIndex = 0; + image.setAttribute('role', 'button'); + image.setAttribute('aria-haspopup', 'dialog'); + image.setAttribute('aria-label', `Expand image: ${imageLabel(image)}`); + }); + }; + + const close = ({ restoreFocus = true } = {}) => { + if (lightbox.hidden) return; + if (lightbox.open) { + lightbox.close(); + } + lightbox.hidden = true; + expandedImage.removeAttribute('src'); + document.documentElement.classList.remove('docs-image-lightbox-open'); + document.body.classList.remove('docs-image-lightbox-open'); + const trigger = activeTrigger; + activeTrigger = null; + if (restoreFocus) { + window.requestAnimationFrame(() => trigger?.focus()); + } + }; + + const open = (image: HTMLImageElement, trigger: HTMLElement) => { + const source = image.currentSrc || image.src; + if (!source) return; + + const label = imageLabel(image); + activeTrigger = trigger; + title.textContent = `Expanded image: ${label}`; + expandedImage.alt = label; + expandedImage.src = source; + expandedImage.hidden = false; + fallback.hidden = true; + fallback.setAttribute('aria-label', `${label} unavailable`); + lightbox.hidden = false; + if (!lightbox.open) { + lightbox.showModal(); + } + document.documentElement.classList.add('docs-image-lightbox-open'); + document.body.classList.add('docs-image-lightbox-open'); + window.requestAnimationFrame(() => closeButton.focus()); + }; + + const onDocumentClick = (event: MouseEvent) => { + const target = getImageTarget(event.target); + if (!target) return; + event.preventDefault(); + event.stopPropagation(); + open(target.image, target.trigger); + }; + + const onDocumentKeyDown = (event: KeyboardEvent) => { + if (!lightbox.hidden) { + event.stopPropagation(); + if (event.key === 'Escape') { + event.preventDefault(); + event.stopPropagation(); + close(); + return; + } + if (event.key === 'Tab') { + event.preventDefault(); + closeButton.focus(); + } + return; + } + + if (event.key !== 'Enter' && event.key !== ' ') return; + const target = getImageTarget(event.target); + if (!target) return; + event.preventDefault(); + open(target.image, target.trigger); + }; + + const onLightboxClick = (event: MouseEvent) => { + // The content wrapper fills the dialog, so its empty top and bottom + // areas are visually backdrop even though they are not the dialog + // element itself. Only the image, close control, and fallback count + // as lightbox content that must not dismiss the dialog. + const path = event.composedPath(); + const clickedLightboxContent = path.some( + (target) => + target === expandedImage || target === closeButton || target === fallback + ); + if (!clickedLightboxContent) close(); + }; + const onLightboxCancel = (event: Event) => { + event.preventDefault(); + close(); + }; + + const onImageError = () => { + expandedImage.hidden = true; + fallback.hidden = false; + }; + + const onPageSwap = () => { + close({ restoreFocus: false }); + if (!document.body.contains(lightbox)) { + document.body.append(lightbox); + } + enhanceImages(); + }; + + const onCloseButtonClick = () => close(); + closeButton.addEventListener('click', onCloseButtonClick); + expandedImage.addEventListener('error', onImageError); + lightbox.addEventListener('click', onLightboxClick); + lightbox.addEventListener('cancel', onLightboxCancel); + document.addEventListener('click', onDocumentClick); + document.addEventListener('keydown', onDocumentKeyDown, true); + document.addEventListener('astro:after-swap', onPageSwap); + document.addEventListener('astro:page-load', onPageSwap); + enhanceImages(); + + lightboxWindow[cleanupKey] = () => { + close({ restoreFocus: false }); + closeButton.removeEventListener('click', onCloseButtonClick); + expandedImage.removeEventListener('error', onImageError); + lightbox.removeEventListener('click', onLightboxClick); + lightbox.removeEventListener('cancel', onLightboxCancel); + document.removeEventListener('click', onDocumentClick); + document.removeEventListener('keydown', onDocumentKeyDown, true); + document.removeEventListener('astro:after-swap', onPageSwap); + document.removeEventListener('astro:page-load', onPageSwap); + lightbox.remove(); + delete lightboxWindow[cleanupKey]; + }; + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', installArticleImageLightbox, { once: true }); + } else { + installArticleImageLightbox(); + } +</script> diff --git a/src/components/CopyPageButton.astro b/src/components/CopyPageButton.astro index b892b0f41..56d5b8a3b 100644 --- a/src/components/CopyPageButton.astro +++ b/src/components/CopyPageButton.astro @@ -1,11 +1,27 @@ --- /** * CopyPageButton — Scalar-style dropdown with: - * - Copy page (copies raw MDX body as markdown) + * - Copy page (copies the MDX body as markdown, with imports stripped and + * product-name variables resolved -- see resolveMdxSource below) * - Copy agent prompt (copies a context-appropriate prompt for the page type) * - View as Markdown (opens .md URL in new tab) * - Export as PDF (window.print) */ +import { VARS } from '@data/vars'; + +// Not global, and applied line by line from the top of the file rather than +// across the whole body: an MDX component import only ever appears in the +// leading block, while a code sample can legitimately contain the same shape. +// A global replace ate `import OpenAI from "openai";` out of the Node example +// in guides/external-tools/how-to-set-up-ollama.mdx, so the copied snippet no +// longer ran. +const IMPORT_LINE = /^import\s+[^\n]*?from\s+['"][^'"]+['"];?\s*$/; +// The optional leading `$` matters: MDX authors write `{VARS.KEY}` in prose but +// `${VARS.KEY}` inside JSX template literals, e.g. href={`${VARS.WEB_APP_URL}/runs`}. +// Matching only the braces leaves the dollar behind and yields `$https://...`. +const PROSE_TOKEN = /\$?\{VARS\.([A-Z0-9_]+)\}/g; +const FRONTMATTER_TOKEN = /\{\{([A-Z0-9_]+)\}\}/g; + interface Props { body: string; title: string; @@ -13,7 +29,48 @@ interface Props { agentPrompt?: string; } const { body, title, agentPrompt } = Astro.props; -const markdownContent = `# ${title}\n\n${body}`; + +/** + * `body` arrives as raw MDX source, so it still carries authoring scaffolding: + * `import` statements at the top and unsubstituted `{VARS.KEY}` / `{{KEY}}` + * product-name tokens throughout. + * + * That matters more than it looks. This payload is what "Copy page as Markdown + * for LLMs" puts on the clipboard, so without this an assistant reading the + * copied text sees the literal string `{VARS.WARP_AUTOMATION_PLATFORM}` instead + * of the product name -- worse than the stale name it replaced. + * + * The sibling `.md` route does not have this problem because + * `docs-markdown-integration.js` derives those files from the *rendered* HTML + * after the build, by which point Astro has resolved everything. This component + * runs during render and only has the source, so it repeats the two cleanups. + * + * Known gap: raw JSX (`<VideoEmbed />`) and directive syntax (`:::note`) still + * pass through here, where the `.md` route renders them properly. The durable + * fix is for this button to fetch the page's own `.md` URL on click rather than + * carry a second copy of the content. + */ +/** Drops the leading `import` block, stopping at the first line of content. */ +function stripLeadingImports(source: string): string { + const lines = source.split('\n'); + let start = 0; + while ( + start < lines.length && + (lines[start].trim() === '' || IMPORT_LINE.test(lines[start])) + ) { + start++; + } + return lines.slice(start).join('\n'); +} + +function resolveMdxSource(source: string): string { + const vars = VARS as unknown as Record<string, string>; + return stripLeadingImports(source) + .replace(PROSE_TOKEN, (match, key) => vars[key] ?? match) + .replace(FRONTMATTER_TOKEN, (match, key) => vars[key] ?? match); +} + +const markdownContent = `# ${title}\n\n${resolveMdxSource(body)}`; const pageUrl = Astro.url.href; const pathname = Astro.url.pathname; diff --git a/src/components/CustomHead.astro b/src/components/CustomHead.astro index e8bd21f19..3f52967cf 100644 --- a/src/components/CustomHead.astro +++ b/src/components/CustomHead.astro @@ -3,6 +3,7 @@ import Default from '@astrojs/starlight/components/Head.astro'; import Analytics from '@vercel/analytics/astro'; import SpeedInsights from '@vercel/speed-insights/astro'; import RudderStackAnalytics from './RudderStackAnalytics.astro'; +import ArticleImageLightbox from './ArticleImageLightbox.astro'; // Note: `<ClientRouter />` (Astro View Transitions) is intentionally NOT // enabled here. Starlight's sidebar scroll persistence relies on the browser @@ -154,6 +155,7 @@ const fontsHref = onload="this.media='all'" /> <RudderStackAnalytics /> +<ArticleImageLightbox /> <Analytics /> <SpeedInsights /> diff --git a/src/components/CustomSidebar.astro b/src/components/CustomSidebar.astro index 1a5027aef..aebda24a1 100644 --- a/src/components/CustomSidebar.astro +++ b/src/components/CustomSidebar.astro @@ -62,24 +62,30 @@ import KapaLauncher from './KapaLauncher.astro'; // Mirrors the top-level sidebar topic labels (see src/sidebar.ts) so // the breadcrumb's first segment reads as the user-facing topic name // rather than the URL slug. Unmapped segments fall back to a humanized - // version (e.g. "agent-platform" → "Agents", "foo-bar" → "Foo bar"). + // version (e.g. "agents" → "Agents", "foo-bar" → "Foo bar"). var TOPIC_LABELS = { 'terminal': 'Terminal', 'code': 'Code', 'getting-started': 'Getting started', 'knowledge-and-collaboration': 'Knowledge & collaboration', - 'agent-platform': 'Agents', - 'reference': 'Reference', + 'agents': 'Agents', + 'factories': 'Factories', + // The slug stayed `platform` through the 8/18 rename, so without an + // entry here every result under it breadcrumbed as "Platform". + 'platform': 'Automation Platform', + 'reference': 'API & Reference', 'changelog': 'Changelog', 'support-and-community': 'Support', 'enterprise': 'Enterprise', 'guides': 'Guides', + // No longer a top-level tab (folded into API & Reference at the 8/18 + // launch), but /api is still a route, so results still need a label. 'api': 'API', }; - // Detect Apple platforms once so the Ask AI kbd reads ⌘+I on Macs and - // Ctrl+I elsewhere. Mirrors KapaChatLauncher.tsx which binds the same - // shortcut via keymatch's `CmdOrCtrl+I`. +// Detect Apple platforms once so the Ask AI kbd reads ⌘+I on Macs and + // Ctrl+I elsewhere. Mirrors KapaLauncher.astro which binds the same + // shortcut for opening the Kapa Website Widget. var isMac = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform || ''); var modKey = isMac ? '\u2318' : 'Ctrl'; @@ -143,9 +149,9 @@ import KapaLauncher from './KapaLauncher.astro'; + '</svg>' + '<span class="warp-search-ask-ai-row__label">Ask AI</span>' + '<kbd class="warp-search-ask-ai-row__kbd" aria-hidden="true">' + modKey + '<span class="warp-search-ask-ai-row__kbd-plus">+</span>I</kbd>'; - askAi.addEventListener('click', function () { - // openPanel() in KapaChatLauncher reads the live search input and - // closes the search dialog itself, so we just route the click. +askAi.addEventListener('click', function () { + // KapaLauncher reads the live search input and closes the search + // dialog itself, then opens the widget with that query prefilled. var kapaBtn = document.querySelector('.warp-kapa-button'); if (kapaBtn) kapaBtn.click(); }); diff --git a/src/components/DocsFeedbackLinks.astro b/src/components/DocsFeedbackLinks.astro new file mode 100644 index 000000000..19c666b94 --- /dev/null +++ b/src/components/DocsFeedbackLinks.astro @@ -0,0 +1,62 @@ +--- +/** + * Invites readers to fix or report a problem with a page directly on + * GitHub, in place of the "Was this helpful?" PushFeedback widget removed + * in #100 (see `FeedbackFooter.astro`). Warp Docs is open source (MIT, + * warpdotdev/docs), so every page can point straight at: + * - an "Edit this page" GitHub edit-in-place flow (opens a PR), and + * - a pre-filled "Docs content issue" template + * (.github/ISSUE_TEMPLATE/CONTENT.yml) with the page URL already in + * the "Page or pages affected" field. + * + * `editUrl` is optional: pages that don't map to a single editable source + * file can omit it and render only the issue link. Pages backed by a + * non-MDX source, such as the generated /api reference, can instead pass + * that source's own GitHub edit URL explicitly (see `pages/api.astro`). + */ +interface Props { + /** Absolute GitHub URL to edit the page's source file (opens a PR). */ + editUrl?: string; + /** Absolute URL of the current page, pre-filled into the issue template. */ + pageUrl: string; + /** Extra class(es) so callers can control placement (e.g. fixed position on /api). */ + class?: string; +} + +const { editUrl, pageUrl, class: className } = Astro.props; + +const issueUrl = new URL('https://github.com/warpdotdev/docs/issues/new'); +issueUrl.searchParams.set('template', 'CONTENT.yml'); +issueUrl.searchParams.set('pages', pageUrl); +--- + +<p class:list={['docs-feedback-links', className]}> + { + editUrl ? ( + <> + See something wrong? <a href={editUrl}>Edit this page</a> or{' '} + <a href={issueUrl.toString()}>open an issue</a>. + </> + ) : ( + <> + See something wrong? <a href={issueUrl.toString()}>Open an issue</a>. + </> + ) + } +</p> + +<style> + @layer starlight.core { + .docs-feedback-links { + margin: 0; + color: var(--sl-color-gray-3); + font-size: var(--sl-text-sm); + } + .docs-feedback-links a { + color: var(--sl-color-gray-2); + } + .docs-feedback-links a:hover { + color: var(--sl-color-white); + } + } +</style> diff --git a/src/components/FeedbackFooter.astro b/src/components/FeedbackFooter.astro index 8c085df12..e67786b46 100644 --- a/src/components/FeedbackFooter.astro +++ b/src/components/FeedbackFooter.astro @@ -1,11 +1,23 @@ --- -// Custom footer: drops EditLink + LastUpdated from Starlight's default -// footer and keeps Pagination + the Starlight credits link. +// Custom footer: drops Starlight's default EditLink + LastUpdated, replacing +// EditLink with DocsFeedbackLinks (an "Edit this page" / "open an issue" +// CTA, since Warp Docs is open source) and keeps Pagination + the Starlight +// credits link. import Pagination from 'virtual:starlight/components/Pagination'; import config from 'virtual:starlight/user-config'; +import DocsFeedbackLinks from './DocsFeedbackLinks.astro'; +import MermaidControls from './MermaidControls.astro'; + +// `starlightRoute.editUrl` is typed as `URL | undefined`; DocsFeedbackLinks +// expects a plain string so it can pass the same value through untouched +// for both Starlight and non-Starlight (e.g. /api) callers. +const { editUrl } = Astro.locals.starlightRoute; +const pageUrl = Astro.url.href; --- +<MermaidControls /> <footer class="sl-flex"> + <DocsFeedbackLinks editUrl={editUrl?.toString()} pageUrl={pageUrl} /> <Pagination /> { @@ -22,7 +34,20 @@ import config from 'virtual:starlight/user-config'; footer { flex-direction: column; gap: 1.25rem; - margin-top: 2rem; + /* Hairline marking the end of page content, so the CTA below reads as + footer chrome rather than a trailing sentence of the article. + Matches the divider treatment on the "On this page" panel footer + (`CustomPageSidebar.astro`). + + Spacing above the rule is NOT set here: this footer is a sibling of + `.sl-markdown-content` inside Starlight's ContentPanel, whose + `.sl-container > * + *` rule (specificity 0,1,1) already applies + `margin-top: 1.5rem` and outranks a bare `footer` selector (0,0,1). + A `margin-top: 2rem` previously declared here never took effect; + padding is used instead so the space below the rule is ours to set + and matches the 1.5rem gap above it. */ + padding-top: 1.5rem; + border-top: 1px solid var(--sl-color-hairline-light); } .kudos { align-items: center; diff --git a/src/components/KapaChatLauncher.css b/src/components/KapaChatLauncher.css index 3aca6dc6c..fd70b9fd4 100644 --- a/src/components/KapaChatLauncher.css +++ b/src/components/KapaChatLauncher.css @@ -47,6 +47,188 @@ align-items: center; gap: 0.5rem; } +.sl-kapa-mcp-connect__trigger { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.375rem; + min-height: 2rem; + padding: 0.375rem 0.625rem; + border: 1px solid color-mix(in srgb, var(--sl-color-text-accent), var(--warp-control-border) 48%); + border-radius: var(--sl-radius-sm); + background: color-mix(in srgb, var(--sl-color-text-accent), var(--warp-control-bg) 88%); + color: var(--sl-color-text-accent); + font: inherit; + font-size: var(--sl-text-xs); + font-weight: 600; + line-height: 1.2; + white-space: nowrap; + cursor: pointer; + transition: + border-color 0.15s ease, + background-color 0.15s ease, + color 0.15s ease; +} + +.sl-kapa-mcp-connect__trigger svg { + width: 0.875rem; + height: 0.875rem; + flex: none; +} + +.sl-kapa-mcp-connect__trigger:hover, +.sl-kapa-mcp-connect__trigger[data-state='open'] { + border-color: var(--sl-color-text-accent); + background: color-mix(in srgb, var(--sl-color-text-accent), var(--warp-control-bg) 78%); + color: var(--sl-color-white); +} + +.sl-kapa-mcp-connect__trigger:focus-visible, +.sl-kapa-mcp-connect__action:focus-visible { + outline: 2px solid var(--sl-color-accent-high); + outline-offset: 2px; +} + +.sl-kapa-mcp-connect { + width: min(24rem, calc(100vw - 1.5rem)); + max-width: var(--radix-popover-content-available-width); + max-height: var(--radix-popover-content-available-height); + padding: 0.875rem; + border: 1px solid var(--sl-color-gray-5); + border-radius: var(--sl-radius-lg); + background: color-mix(in srgb, var(--sl-color-black), var(--sl-color-gray-6) 18%); + box-shadow: var(--sl-shadow-lg); + color: var(--sl-color-gray-2); + overflow-y: auto; + z-index: 20; +} + +.sl-kapa-mcp-connect__header { + display: flex; + align-items: flex-start; + gap: 0.625rem; +} + +.sl-kapa-mcp-connect__header > svg { + width: 1.125rem; + height: 1.125rem; + margin-top: 0.125rem; + color: var(--sl-color-text-accent); + flex: none; +} + +.sl-kapa-mcp-connect__title, +.sl-kapa-mcp-connect__description, +.sl-kapa-mcp-connect__eyebrow, +.sl-kapa-mcp-connect__instructions { + margin: 0; +} + +.sl-kapa-mcp-connect__title { + color: var(--sl-color-white); + font-size: var(--sl-text-sm); + font-weight: 700; + line-height: 1.35; +} + +.sl-kapa-mcp-connect__description, +.sl-kapa-mcp-connect__instructions { + margin-top: 0.25rem; + font-size: var(--sl-text-xs); + line-height: 1.45; +} + +.sl-kapa-mcp-connect__section { + display: flex; + flex-direction: column; + align-items: stretch; + gap: 0.5rem; + margin-top: 0.875rem; + padding-top: 0.875rem; + border-top: 1px solid var(--sl-color-gray-5); +} + +.sl-kapa-mcp-connect__eyebrow { + color: var(--sl-color-gray-3); + font-size: var(--sl-text-2xs); + font-weight: 700; + letter-spacing: 0.08em; + line-height: 1.2; + text-transform: uppercase; +} + +.sl-kapa-mcp-connect__instructions strong { + color: var(--sl-color-gray-1); +} + +.sl-kapa-mcp-connect__config { + box-sizing: border-box; + width: 100%; + padding: 0.5rem 0.625rem; + border: 1px solid var(--sl-color-gray-5); + border-radius: var(--sl-radius-sm); + background: color-mix(in srgb, var(--sl-color-black), var(--sl-color-gray-6) 32%); + color: var(--sl-color-gray-1); + font-family: var(--__sl-font-mono, 'JetBrains Mono', 'SFMono-Regular', monospace); + font-size: var(--sl-text-2xs); + line-height: 1.5; + overflow-wrap: anywhere; +} + +.sl-kapa-mcp-connect__config { + white-space: pre-wrap; +} + + +.sl-kapa-mcp-connect__action { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.375rem; + min-height: 2rem; + padding: 0.375rem 0.625rem; + border: 1px solid var(--warp-control-border); + border-radius: var(--sl-radius-sm); + background: var(--warp-control-bg); + color: var(--warp-control-text-hover); + font: inherit; + font-size: var(--sl-text-xs); + font-weight: 600; + line-height: 1.2; + cursor: pointer; + transition: + border-color 0.15s ease, + background-color 0.15s ease, + color 0.15s ease; +} + +.sl-kapa-mcp-connect__action:hover { + border-color: var(--warp-control-border-hover); + background: var(--warp-control-bg-hover); + color: var(--sl-color-white); +} + +.sl-kapa-mcp-connect__action--primary { + border-color: var(--sl-color-text-accent); + background: var(--sl-color-text-accent); + color: var(--sl-color-black); +} + +.sl-kapa-mcp-connect__action--primary:hover { + border-color: color-mix(in srgb, var(--sl-color-text-accent), var(--sl-color-white) 18%); + background: color-mix(in srgb, var(--sl-color-text-accent), var(--sl-color-white) 8%); + color: var(--sl-color-black); +} + +.sl-kapa-mcp-connect__action svg { + width: 0.875rem; + height: 0.875rem; + flex: none; +} + +.sl-kapa-mcp-connect__arrow { + fill: color-mix(in srgb, var(--sl-color-black), var(--sl-color-gray-6) 18%); +} .sl-kapa-icon-button, .sl-kapa-feedback__button { @@ -199,6 +381,208 @@ border-radius: var(--sl-radius-sm); padding: 0.1rem 0.3rem; } +.sl-kapa-answer-image-button { + position: relative; + display: block; + box-sizing: border-box; + max-width: 100%; + margin: 0.875rem 0; + padding: 0; + border: 1px solid var(--sl-color-gray-5); + border-radius: var(--sl-radius-md); + background: var(--sl-color-black); + cursor: zoom-in; + overflow: hidden; +} + +.sl-kapa-answer-image { + display: block; + box-sizing: border-box; + max-width: 100%; + height: auto; + background: var(--sl-color-black); + object-fit: contain; + box-shadow: 0 0.25rem 0.75rem rgb(0 0 0 / 0.18); +} +.sl-kapa-answer-image-button__overlay { + position: absolute; + inset: auto 0 0; + padding: 1.25rem 0.75rem 0.5rem; + background: linear-gradient(transparent, rgb(0 0 0 / 0.7)); + color: var(--sl-color-white); + font-size: var(--sl-text-xs); + font-weight: 600; + line-height: 1.2; + opacity: 0; + transform: translateY(0.25rem); + transition: + opacity 0.15s ease, + transform 0.15s ease; + pointer-events: none; +} + +.sl-kapa-answer-image-button:hover .sl-kapa-answer-image-button__overlay, +.sl-kapa-answer-image-button:focus-visible .sl-kapa-answer-image-button__overlay { + opacity: 1; + transform: translateY(0); +} + +.sl-kapa-answer-image-button:focus-visible { + outline: 2px solid var(--sl-color-accent-high); + outline-offset: 2px; +} + +.sl-kapa-answer-image-fallback { + display: flex; + box-sizing: border-box; + align-items: center; + min-height: 3rem; + max-width: 100%; + margin: 0.875rem 0; + padding: 0.625rem 0.75rem; + border: 1px dashed var(--sl-color-gray-4); + border-radius: var(--sl-radius-md); + background: color-mix(in srgb, var(--sl-color-black), var(--sl-color-gray-6) 30%); + color: var(--sl-color-gray-3); + font-size: var(--sl-text-xs); + line-height: 1.4; + overflow-wrap: anywhere; +} + +:root[data-theme='light'] .sl-kapa-answer-image { + background: var(--sl-color-white); + box-shadow: 0 0.25rem 0.75rem rgb(0 0 0 / 0.1); +} +:root[data-theme='light'] .sl-kapa-answer-image-button { + border-color: color-mix(in srgb, var(--sl-color-gray-5), var(--sl-color-black) 15%); + background: var(--sl-color-white); +} + +:root[data-theme='light'] .sl-kapa-answer-image-fallback { + border-color: color-mix(in srgb, var(--sl-color-gray-4), var(--sl-color-black) 25%); + background: color-mix(in srgb, var(--sl-color-white), var(--sl-color-gray-6) 10%); + color: var(--sl-color-gray-3); +} + +.sl-kapa-codeblock { + position: relative; + margin: 0.85rem 0; + max-width: 100%; +} + +/* Chat-only copy control. Deliberately avoids EC's `.copy` class so EC CSS + (`button::after` mask) and EC JS never attach a second icon/handler. Visual + tokens match docs frosted-glass copy buttons in warp-components.css §2. */ +.sl-kapa-codeblock__copy-wrap { + position: absolute; + inset-block-start: 0.5rem; + inset-inline-end: 0.5rem; + z-index: 2; + display: flex; + align-items: center; + gap: 0.25rem; + pointer-events: none; +} + +.sl-kapa-codeblock__copy { + pointer-events: auto; + position: relative; + box-sizing: border-box; + width: 2rem; + height: 2rem; + margin: 0; + padding: 0; + border-radius: var(--sl-radius-sm); + border: 1px solid rgba(255, 255, 255, 0.1); + background: rgba(255, 255, 255, 0.08); + backdrop-filter: blur(8px); + cursor: pointer; + opacity: 0.4; + transition: + opacity 0.15s ease, + background-color 0.15s ease, + border-color 0.15s ease; +} + +.sl-kapa-codeblock:hover .sl-kapa-codeblock__copy, +.sl-kapa-codeblock:focus-within .sl-kapa-codeblock__copy { + opacity: 0.75; +} + +.sl-kapa-codeblock__copy:hover, +.sl-kapa-codeblock__copy:focus-visible { + opacity: 1; + background: rgba(255, 255, 255, 0.16); + border-color: rgba(255, 255, 255, 0.18); +} + +.sl-kapa-codeblock__copy:focus-visible { + outline: 2px solid var(--sl-color-accent-high); + outline-offset: 2px; +} + +.sl-kapa-codeblock__copy-icon { + position: absolute; + inset: 0.475rem; + background-color: var(--sl-color-white, #f9f8f6); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.75'%3E%3Cpath d='M3 19a2 2 0 0 1-1-2V2a2 2 0 0 1 1-1h13a2 2 0 0 1 2 1'/%3E%3Crect x='6' y='5' width='16' height='18' rx='1.5' ry='1.5'/%3E%3C/svg%3E"); + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.75'%3E%3Cpath d='M3 19a2 2 0 0 1-1-2V2a2 2 0 0 1 1-1h13a2 2 0 0 1 2 1'/%3E%3Crect x='6' y='5' width='16' height='18' rx='1.5' ry='1.5'/%3E%3C/svg%3E"); + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-position: center; + -webkit-mask-size: contain; + mask-size: contain; +} + +.sl-kapa-codeblock__copy-feedback { + pointer-events: none; + user-select: none; + font-size: var(--sl-text-2xs); + line-height: 1.2; + padding: 0.2rem 0.4rem; + border-radius: var(--sl-radius-sm); + background: color-mix(in srgb, var(--sl-color-accent) 85%, black); + color: var(--sl-color-white); + white-space: nowrap; +} + +:root[data-theme='light'] .sl-kapa-codeblock__copy { + background: rgba(0, 0, 0, 0.04); + border: 1px solid rgba(0, 0, 0, 0.08); + opacity: 0.6; +} + +:root[data-theme='light'] .sl-kapa-codeblock__copy:hover, +:root[data-theme='light'] .sl-kapa-codeblock__copy:focus-visible { + background: rgba(0, 0, 0, 0.08); + border-color: rgba(0, 0, 0, 0.12); + opacity: 1; +} + +:root[data-theme='light'] .sl-kapa-codeblock__copy-icon { + background-color: var(--sl-color-white, #0a0d12); +} + +.sl-kapa-codeblock pre { + margin: 0; + padding: var(--ec-codePadBlk) var(--ec-codePadInl); + overflow-x: auto; + overflow-y: hidden; + white-space: pre; +} + +.sl-kapa-codeblock code { + font-family: var(--__sl-font-mono, 'JetBrains Mono', 'SFMono-Regular', monospace); + display: block; + min-width: max-content; +} + +/* Shiki separates `.line` spans with literal newline characters, which + `white-space: pre` (set on the pre above) already renders as line + breaks. The spans must stay inline — giving them `display: block` + would add a second break per line and double-space the code. */ + .sl-kapa-thinking { display: flex; @@ -249,18 +633,73 @@ .sl-kapa-feedback { display: flex; + flex-wrap: wrap; + align-items: center; gap: 0.5rem; margin-top: 0.875rem; } +.sl-kapa-feedback__handoff { + display: inline-flex; + align-items: center; + justify-content: center; + height: 2.25rem; + padding: 0 0.75rem; + border: 1px solid var(--sl-color-gray-5); + border-radius: var(--sl-radius-sm); + background: var(--sl-color-black); + color: var(--sl-color-gray-1); + font: inherit; + font-size: var(--sl-text-xs); + font-weight: 500; + cursor: pointer; + transition: + border-color 0.15s ease, + background-color 0.15s ease, + color 0.15s ease; +} + +.sl-kapa-feedback__handoff:hover { + border-color: var(--warp-control-border-hover); + background: var(--warp-control-bg-hover); + color: var(--sl-color-white); +} + +.sl-kapa-feedback__handoff:focus-visible { + outline: 2px solid var(--sl-color-accent-high); + outline-offset: 2px; +} +.sl-kapa-feedback__handoff--submit { + background: var(--sl-color-text-accent); + border-color: var(--sl-color-text-accent); + color: var(--sl-color-black); +} + +.sl-kapa-feedback__handoff--submit:hover:not(:disabled) { + border-color: color-mix(in srgb, var(--sl-color-text-accent), var(--sl-color-white) 18%); + background: color-mix(in srgb, var(--sl-color-text-accent), var(--sl-color-white) 8%); + color: var(--sl-color-black); +} + +.sl-kapa-feedback__handoff--ghost { + background: transparent; +} .sl-kapa-error { - border: 1px solid color-mix(in srgb, #ef4444, var(--sl-color-black) 35%); - background: rgb(127 29 29 / 0.2); - color: #fecaca; + border: 1px solid rgb(248 113 113 / 0.8); + background: rgb(254 226 226 / 0.9); + color: #991b1b; border-radius: var(--sl-radius-lg); padding: 0.875rem 1rem; } +@media (prefers-color-scheme: dark) { + .sl-kapa-error { + border: 1px solid color-mix(in srgb, #ef4444, var(--sl-color-black) 35%); + background: rgb(127 29 29 / 0.2); + color: #fecaca; + } +} + .sl-kapa-panel__footer { position: relative; padding: 1rem; @@ -337,6 +776,228 @@ opacity: 0.5; cursor: not-allowed; } +.sl-kapa-handoff-inline { + margin-top: 0.75rem; + padding-top: 0.75rem; + border-top: 1px solid var(--sl-color-gray-5); + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.sl-kapa-handoff-inline label { + font-size: var(--sl-text-xs); + font-weight: 600; + color: var(--sl-color-gray-2); +} + +.sl-kapa-handoff-inline__row { + display: grid; + grid-template-columns: minmax(0, 1fr) auto auto; + gap: 0.5rem; +} + +.sl-kapa-handoff-inline input { + width: 100%; + min-width: 0; + height: 2.25rem; + border: 1px solid var(--sl-color-gray-5); + border-radius: var(--sl-radius-sm); + background: var(--sl-color-black); + color: var(--sl-color-white); + padding: 0 0.625rem; + font: inherit; + font-size: var(--sl-text-sm); +} + +.sl-kapa-handoff-inline input::placeholder { + color: var(--sl-color-gray-3); +} + +.sl-kapa-handoff-inline input:focus-visible { + outline: 2px solid var(--sl-color-accent-high); + outline-offset: 2px; +} + +.sl-kapa-handoff-inline__status { + margin: 0; + font-size: var(--sl-text-xs); + line-height: 1.4; +} + +.sl-kapa-handoff-inline__status--success { + color: #14532d; + background: rgb(220 252 231 / 0.9); + border: 1px solid rgb(74 222 128 / 0.7); + padding: 0.375rem 0.5rem; + border-radius: var(--sl-radius-sm); +} + +.sl-kapa-handoff-inline__status--error { + color: #b91c1c; + background: rgb(254 226 226 / 0.9); + border: 1px solid rgb(248 113 113 / 0.8); + padding: 0.375rem 0.5rem; + border-radius: var(--sl-radius-sm); +} + +.sl-kapa-handoff-inline__status a { + color: inherit; + text-decoration: underline; +} + +@media (prefers-color-scheme: dark) { + .sl-kapa-handoff-inline__status--success { + color: #86efac; + background: rgb(20 83 45 / 0.35); + border-color: rgb(74 222 128 / 0.45); + } + .sl-kapa-handoff-inline__status--error { + color: #fecaca; + background: rgb(127 29 29 / 0.3); + border-color: rgb(248 113 113 / 0.5); + } +} + +.sl-kapa-handoff { + margin-top: 0.75rem; + display: flex; + flex-direction: column; + gap: 0.625rem; +} + +.sl-kapa-handoff__toggle { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + width: 100%; + height: 2.5rem; + padding: 0 0.875rem; + border: 1px solid var(--sl-color-gray-5); + border-radius: var(--sl-radius-sm); + background: var(--sl-color-black); + color: var(--sl-color-gray-1); + font: inherit; + font-size: var(--sl-text-sm); + font-weight: 500; + cursor: pointer; + transition: + border-color 0.15s ease, + background-color 0.15s ease, + color 0.15s ease; +} + +.sl-kapa-handoff__toggle svg { + width: 0.95rem; + height: 0.95rem; + flex: none; +} + +.sl-kapa-handoff__toggle:hover { + border-color: var(--warp-control-border-hover); + background: var(--warp-control-bg-hover); + color: var(--sl-color-white); +} + +.sl-kapa-handoff__toggle:focus-visible { + outline: 2px solid var(--sl-color-accent-high); + outline-offset: 2px; +} + +.sl-kapa-handoff__form { + display: flex; + flex-direction: column; + gap: 0.5rem; + padding: 0.75rem; + border: 1px solid var(--sl-color-gray-5); + border-radius: var(--sl-radius-lg); + background: color-mix(in srgb, var(--sl-color-black), var(--sl-color-gray-6) 28%); +} + +.sl-kapa-handoff__form label { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.sl-kapa-handoff__form label span { + font-size: var(--sl-text-2xs); + color: var(--sl-color-gray-3); +} + +.sl-kapa-handoff__form input, +.sl-kapa-handoff__form textarea { + width: 100%; + border: 1px solid var(--sl-color-gray-5); + border-radius: var(--sl-radius-sm); + background: var(--sl-color-black); + color: var(--sl-color-white); + padding: 0.5rem 0.625rem; + font: inherit; + font-size: var(--sl-text-sm); +} + +.sl-kapa-handoff__form textarea { + resize: vertical; + min-height: 4rem; +} + +.sl-kapa-handoff__form input::placeholder, +.sl-kapa-handoff__form textarea::placeholder { + color: var(--sl-color-gray-3); +} + +.sl-kapa-handoff__form input:focus-visible, +.sl-kapa-handoff__form textarea:focus-visible { + outline: 2px solid var(--sl-color-accent-high); + outline-offset: 2px; +} + +.sl-kapa-handoff__submit { + margin-top: 0.25rem; + height: 2.5rem; + border: 1px solid var(--sl-color-text-accent); + border-radius: var(--sl-radius-sm); + background: var(--sl-color-text-accent); + color: var(--sl-color-black); + font: inherit; + font-size: var(--sl-text-sm); + font-weight: 600; + cursor: pointer; + transition: + border-color 0.15s ease, + background-color 0.15s ease; +} + +.sl-kapa-handoff__submit:hover:not(:disabled) { + border-color: color-mix(in srgb, var(--sl-color-text-accent), var(--sl-color-white) 18%); + background: color-mix(in srgb, var(--sl-color-text-accent), var(--sl-color-white) 8%); +} + +.sl-kapa-handoff__submit:focus-visible { + outline: 2px solid var(--sl-color-accent-high); + outline-offset: 2px; +} + +.sl-kapa-handoff__submit:disabled { + opacity: 0.55; + cursor: not-allowed; +} + +.sl-kapa-handoff__status { + margin: 0; + font-size: var(--sl-text-xs); + line-height: 1.4; +} + +.sl-kapa-handoff__status--success { + color: #86efac; +} + +.sl-kapa-handoff__status--error { + color: #fecaca; +} /* Hide the reCAPTCHA badge */ .grecaptcha-badge { @@ -431,6 +1092,37 @@ flex-direction: column; align-items: flex-start; } + + .sl-kapa-panel__header { + padding-inline: 0.75rem; + } + + .sl-kapa-panel__header-actions { + gap: 0.25rem; + } + + .sl-kapa-mcp-connect__trigger { + padding-inline: 0.5rem; + } +} + +@media (max-width: 22rem) { + .sl-kapa-mcp-connect__trigger span { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; + } + + .sl-kapa-mcp-connect__trigger { + width: 2rem; + padding: 0; + } } @keyframes sl-kapa-spin { diff --git a/src/components/KapaChatLauncher.mount.tsx b/src/components/KapaChatLauncher.mount.tsx deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/components/KapaChatLauncher.tsx b/src/components/KapaChatLauncher.tsx index d4e1bcb9b..816f333a5 100644 --- a/src/components/KapaChatLauncher.tsx +++ b/src/components/KapaChatLauncher.tsx @@ -1,14 +1,24 @@ -import type { FormEvent, MouseEvent } from 'react'; +import type { FormEvent, MouseEvent, ReactElement, ReactNode } from 'react'; import * as Popover from '@radix-ui/react-popover'; -import { useEffect, useMemo, useRef, useState } from 'react'; -import { KapaProvider, useChat } from '@kapaai/react-sdk'; -import { PUBLIC_KAPA_INTEGRATION_ID } from 'astro:env/client'; +import { + Children, + isValidElement, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import { CaptchaAction, KapaProvider, useCaptcha, useChat } from '@kapaai/react-sdk'; +import { PUBLIC_KAPA_INTEGRATION_ID, PUBLIC_KAPA_PROJECT_ID } from 'astro:env/client'; import { isMac, keymatch } from 'keymatch'; import ReactMarkdown from 'react-markdown'; import { LuExternalLink, + LuCheck, + LuCopy, LuLoaderCircle, LuMessageSquare, + LuPlug, LuSend, LuSquarePen, LuThumbsDown, @@ -18,10 +28,496 @@ import { import './KapaChatLauncher.css'; const integrationId = PUBLIC_KAPA_INTEGRATION_ID; +const projectId = PUBLIC_KAPA_PROJECT_ID?.trim() || ''; const title = 'Ask Warp'; const welcomeMessage = 'What do you want to know about Warp?'; +const uncertaintyThreshold = 0.15; +const conversationLengthThreshold = 3; +const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; +const warpDocsMcpUrl = 'https://warp.mcp.kapa.ai'; +const warpDocsMcpConfig = JSON.stringify( + { + 'Warp Docs': { + url: warpDocsMcpUrl, + }, + }, + null, + 2 +); type FeedbackReaction = 'upvote' | 'downvote'; +type McpCopyTarget = 'config' | 'url'; +type GenericRecord = Record<string, unknown>; +type HandoffApiSuccess = { + message?: string; +}; + +function isObject(value: unknown): value is GenericRecord { + return typeof value === 'object' && value !== null; +} + +function readNumberField(record: GenericRecord, key: string) { + const value = record[key]; + if (typeof value === 'number' && Number.isFinite(value)) return value; + if (typeof value === 'string') { + const parsed = Number(value); + if (Number.isFinite(parsed)) return parsed; + } + return null; +} + +function readBooleanField(record: GenericRecord, key: string) { + const value = record[key]; + if (typeof value === 'boolean') return value; + if (typeof value === 'string') { + const normalized = value.trim().toLowerCase(); + if (normalized === 'true') return true; + if (normalized === 'false') return false; + } + return null; +} + +function getUncertaintyScore(metadata: unknown) { + if (!isObject(metadata)) return null; + return ( + readNumberField(metadata, 'uncertainty') ?? + readNumberField(metadata, 'uncertainty_score') ?? + readNumberField(metadata, 'uncertaintyScore') + ); +} + +function isAnswerUncertain(metadata: unknown) { + if (!isObject(metadata)) return false; + const flag = + readBooleanField(metadata, 'is_uncertain') ?? + readBooleanField(metadata, 'isUncertain'); + if (flag === true) return true; + const score = getUncertaintyScore(metadata); + return score !== null ? score >= uncertaintyThreshold : false; +} + +function isValidEmailAddress(value: string) { + return emailPattern.test(value.trim()); +} +function getChatErrorMessage(error: unknown) { + const message = typeof error === 'string' ? error : String(error ?? ''); + const normalized = message.toLowerCase(); + const looksLikeBlockedNetworkError = + normalized.includes('network error while fetching answer') || + normalized.includes('failed to fetch') || + normalized.includes('err_blocked_by_client'); + if (looksLikeBlockedNetworkError) { + return "Couldn't reach the chat service. If you use an ad blocker or privacy extension, allow kapa.ai and proxy.kapa.ai, then try again."; + } + return message; +} + +const CHAT_LANGUAGE_ALIASES: Record<string, string> = { + shell: 'bash', + zsh: 'bash', + pwsh: 'powershell', + plaintext: 'text', +}; + +function normalizeChatLanguage(language: string): string { + return CHAT_LANGUAGE_ALIASES[language.toLowerCase()] ?? language.toLowerCase(); +} + +function inferLanguageFromCode(codeText: string, fallbackLanguage: string): string { + if (fallbackLanguage !== 'text') return fallbackLanguage; + const sample = codeText.trim(); + if (!sample) return fallbackLanguage; + const commandLikePattern = + /^(sudo|apt|apt-get|dnf|yum|zypper|pacman|curl|wget|git|npm|pnpm|yarn|cargo|python|node|brew|sh|bash)\b/m; + if (commandLikePattern.test(sample)) return 'bash'; + return fallbackLanguage; +} + +function escapeHtml(value: string): string { + return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); +} + +async function copyTextToClipboard(text: string): Promise<boolean> { + try { + if (navigator.clipboard?.writeText) { + await navigator.clipboard.writeText(text); + return true; + } + } catch { + // Fall through to execCommand fallback. + } + try { + const pre = document.createElement('pre'); + Object.assign(pre.style, { + opacity: '0', + pointerEvents: 'none', + position: 'absolute', + overflow: 'hidden', + left: '0', + top: '0', + width: '20px', + height: '20px', + webkitUserSelect: 'auto', + userSelect: 'all', + }); + pre.setAttribute('aria-hidden', 'true'); + pre.textContent = text; + document.body.appendChild(pre); + const range = document.createRange(); + range.selectNode(pre); + const selection = window.getSelection(); + if (!selection) { + document.body.removeChild(pre); + return false; + } + selection.removeAllRanges(); + selection.addRange(range); + const ok = document.execCommand('copy'); + selection.removeAllRanges(); + document.body.removeChild(pre); + return ok; + } catch { + return false; + } +} + +type MarkdownCodeProps = { className?: string; children?: ReactNode }; + +// react-markdown v9+ no longer passes an `inline` flag to the `code` +// component. The reliable way to tell fenced blocks apart from inline +// code is nesting: fenced blocks are always rendered as <pre><code>, so +// we intercept `pre` (block) and leave bare `code` (inline) untouched. +function extractCodeElement(children: ReactNode): ReactElement<MarkdownCodeProps> | null { + const items = Array.isArray(children) ? children : [children]; + for (const item of items) { + if (isValidElement<MarkdownCodeProps>(item)) return item; + } + return null; +} + +function markdownChildrenToText(children: ReactNode): string { + return (Array.isArray(children) ? children.join('') : String(children ?? '')).replace(/\n$/, ''); +} +type ChatMarkdownImageProps = { + alt?: string; + src?: string; + title?: string; +}; + +function isImageOnlyMarkdownLink(children: ReactNode) { + const items = Children.toArray(children).filter( + (child) => typeof child !== 'string' || child.trim().length > 0 + ); + return ( + items.length === 1 && + isValidElement(items[0]) && + items[0].type === ChatMarkdownImage + ); +} + +function ChatMarkdownLink({ + children, + href, + title, +}: { + children?: ReactNode; + href?: string; + title?: string; +}) { + // Kapa sometimes wraps an image in its source link. Keep ordinary links, + // but remove the image-only wrapper so the thumbnail can be a real button. + if (isImageOnlyMarkdownLink(children)) { + return <>{children}</>; + } + + return ( + <a href={href} title={title}> + {children} + </a> + ); +} + +function ChatMarkdownImage({ alt, src, title }: ChatMarkdownImageProps) { + const [hasFailed, setHasFailed] = useState(false); + const imageAlt = alt?.trim() || 'Image from Kapa answer'; + + useEffect(() => { + setHasFailed(false); + }, [src]); + + if (!src || hasFailed) { + return ( + <span + className="sl-kapa-answer-image-fallback" + role="img" + aria-label={`${imageAlt} unavailable`} + > + Image unavailable + </span> + ); + } + + // `src` has already passed react-markdown's default safe URL transformation. + // Image-only Markdown links are unwrapped above to avoid nesting this button + // inside an anchor. Ordinary text links retain their original behavior. + const image = ( + <img + className="sl-kapa-answer-image" + src={src} + alt={imageAlt} + title={title} + loading="lazy" + decoding="async" + referrerPolicy="no-referrer" + style={{ maxWidth: '100%', height: 'auto' }} + onError={() => setHasFailed(true)} + /> + ); + + return ( + <button + type="button" + className="sl-kapa-answer-image-button" + data-warp-image-lightbox-trigger="true" + aria-label={`Expand image: ${imageAlt}`} + aria-haspopup="dialog" + > + {image} + <span className="sl-kapa-answer-image-button__overlay" aria-hidden="true"> + Expand image + </span> + </button> + ); +} +const highlightCache = new Map<string, string | null>(); +const highlightInFlight = new Map<string, Promise<string | null>>(); +let highlightRequestQueue: Promise<void> = Promise.resolve(); +type ShikiModule = typeof import('shiki'); +type ShikiHighlighter = Awaited<ReturnType<ShikiModule['createHighlighter']>>; +let shikiHighlighterPromise: Promise<ShikiHighlighter> | null = null; +const SHIKI_LANGUAGES = new Set([ + 'bash', + 'powershell', + 'json', + 'javascript', + 'typescript', + 'tsx', + 'jsx', + 'python', + 'go', + 'rust', + 'yaml', + 'markdown', + 'html', + 'css', + 'text', +]); + +async function getShikiHighlighter(): Promise<ShikiHighlighter> { + if (!shikiHighlighterPromise) { + shikiHighlighterPromise = import('shiki/bundle/full').then(({ createHighlighter }) => + createHighlighter({ + themes: ['github-light', 'github-dark'], + langs: [...SHIKI_LANGUAGES], + }) + ); + } + return shikiHighlighterPromise; +} + +async function requestHighlightedPre({ + code, + language, + theme, +}: { + code: string; + language: string; + theme: 'dark' | 'light'; +}): Promise<string | null> { + const cacheKey = `${theme}:${language}:${code}`; + if (highlightCache.has(cacheKey)) { + return highlightCache.get(cacheKey) ?? null; + } + const existing = highlightInFlight.get(cacheKey); + if (existing) return existing; + + const requestPromise = new Promise<string | null>((resolve, reject) => { + const run = async () => { + try { + const highlighter = await getShikiHighlighter(); + const shikiLanguage = SHIKI_LANGUAGES.has(language) ? language : 'text'; + const html = highlighter.codeToHtml(code, { + lang: shikiLanguage, + theme: theme === 'light' ? 'github-light' : 'github-dark', + }); + const preMatch = html.match(/<pre[^>]*>[\s\S]*?<\/pre>/i); + const preHtml = preMatch?.[0] ?? null; + highlightCache.set(cacheKey, preHtml); + resolve(preHtml); + } catch (error) { + reject(error); + } + }; + + highlightRequestQueue = highlightRequestQueue + .then(run) + .catch(() => run()) + .then(() => undefined, () => undefined); + }); + + highlightInFlight.set(cacheKey, requestPromise); + requestPromise.then( + () => { + highlightInFlight.delete(cacheKey); + }, + () => { + highlightInFlight.delete(cacheKey); + } + ); + return requestPromise; +} + +function ChatCodeBlock({ + className, + codeText, + deferHighlight, +}: { + className?: string; + codeText: string; + deferHighlight?: boolean; +}) { + const language = className?.replace('language-', '') ?? 'text'; + const normalizedLanguage = inferLanguageFromCode( + codeText, + normalizeChatLanguage(language) + ); + const isTerminalLanguage = ['bash', 'sh', 'shell', 'zsh', 'powershell'].includes(normalizedLanguage); + const [highlighted, setHighlighted] = useState<{ key: string; preHtml: string } | null>(null); + const [isDarkTheme, setIsDarkTheme] = useState(true); + const [isCopied, setIsCopied] = useState(false); + const copiedResetRef = useRef<number | null>(null); + + useEffect(() => { + const root = document.documentElement; + const updateTheme = () => { + const explicitTheme = root.dataset.theme; + if (explicitTheme === 'light') { + setIsDarkTheme(false); + return; + } + if (explicitTheme === 'dark') { + setIsDarkTheme(true); + return; + } + setIsDarkTheme(window.matchMedia('(prefers-color-scheme: dark)').matches); + }; + + updateTheme(); + const observer = new MutationObserver(updateTheme); + observer.observe(root, { attributes: true, attributeFilter: ['data-theme'] }); + return () => observer.disconnect(); + }, []); + + useEffect(() => { + return () => { + if (copiedResetRef.current !== null) { + window.clearTimeout(copiedResetRef.current); + } + }; + }, []); + + const theme = isDarkTheme ? 'dark' : 'light'; + const highlightKey = `${theme}:${normalizedLanguage}:${codeText}`; + + useEffect(() => { + // While the answer is still streaming, the code text changes on every + // token. Requesting a highlight per token causes the block to churn + // between plaintext and highlighted DOM (visible flicker), so wait + // until streaming settles and highlight the final text once. + if (deferHighlight) return; + const controller = new AbortController(); + (async (): Promise<void> => { + try { + const preHtml = await requestHighlightedPre({ + code: codeText, + language: normalizedLanguage, + theme, + }); + if (!controller.signal.aborted && preHtml) { + setHighlighted({ key: `${theme}:${normalizedLanguage}:${codeText}`, preHtml }); + } + } catch (error) { + if (!controller.signal.aborted) { + console.warn('[kapa-chat] code highlighting failed; using plaintext fallback', error); + } + } + })(); + + return () => { + controller.abort(); + }; + }, [codeText, deferHighlight, theme, normalizedLanguage]); + + // Only use highlighted HTML that matches the *current* code text and + // theme; otherwise render the plaintext fallback. This prevents stale + // highlighted content from flashing while new text is streaming in. + const highlightedPreHtml = highlighted?.key === highlightKey ? highlighted.preHtml : null; + + const onCopy = async () => { + const ok = await copyTextToClipboard(codeText); + if (!ok) return; + setIsCopied(true); + if (copiedResetRef.current !== null) { + window.clearTimeout(copiedResetRef.current); + } + copiedResetRef.current = window.setTimeout(() => { + setIsCopied(false); + copiedResetRef.current = null; + }, 1500); + }; + + return ( + <div className="expressive-code sl-kapa-codeblock"> + <figure className={`frame not-content${isTerminalLanguage ? ' is-terminal' : ''}`}> + <figcaption className="header"> + <span className="title" /> + {isTerminalLanguage ? <span className="sr-only">Terminal window</span> : null} + </figcaption> + {highlightedPreHtml ? ( + <div + className="sl-kapa-codeblock__shiki" + dangerouslySetInnerHTML={{ __html: highlightedPreHtml }} + /> + ) : ( + <pre data-language={language}> + <code className={className} dangerouslySetInnerHTML={{ __html: escapeHtml(codeText) }} /> + </pre> + )} + {/* Dedicated chat copy control — intentionally NOT EC's `.copy` + class. Reusing EC markup stacked EC's CSS mask icon on top of + any residual SVG and produced a double clipboard. One button, + one icon (CSS mask), one click handler. */} + <div className="sl-kapa-codeblock__copy-wrap"> + <span className="sr-only" aria-live="polite"> + {isCopied ? 'Copied!' : ''} + </span> + {isCopied ? <span className="sl-kapa-codeblock__copy-feedback">Copied!</span> : null} + <button + type="button" + className="sl-kapa-codeblock__copy" + onClick={() => { + void onCopy(); + }} + title={isCopied ? 'Copied!' : 'Copy to clipboard'} + aria-label={isCopied ? 'Code copied' : 'Copy code block'} + > + <span className="sl-kapa-codeblock__copy-icon" aria-hidden="true" /> + </button> + </div> + </figure> + </div> + ); +} function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversation }: { title: string; @@ -33,11 +529,20 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio const [query, setQuery] = useState(''); const [hasStartedConversation, setHasStartedConversation] = useState(false); const [isAppleDevice, setIsAppleDevice] = useState(false); + const [storedThreadId, setStoredThreadId] = useState<string | null>(null); + const [downvotedAnswerIds, setDownvotedAnswerIds] = useState<Record<string, true>>({}); + const [handoffEmailInput, setHandoffEmailInput] = useState(''); + const [handoffQaId, setHandoffQaId] = useState<string | null>(null); + const [handoffErrorMessage, setHandoffErrorMessage] = useState<string | null>(null); + const [handoffSuccessMessage, setHandoffSuccessMessage] = useState<string | null>(null); + const [isSubmittingHandoff, setIsSubmittingHandoff] = useState(false); + const [copiedMcpValue, setCopiedMcpValue] = useState<McpCopyTarget | null>(null); const messagesRef = useRef<HTMLDivElement | null>(null); const dialogRef = useRef<HTMLDialogElement | null>(null); const triggerRef = useRef<HTMLButtonElement | null>(null); const closeButtonRef = useRef<HTMLButtonElement | null>(null); const inputRef = useRef<HTMLInputElement | null>(null); + const mcpCopyResetRef = useRef<number | null>(null); const { addFeedback, conversation, @@ -45,16 +550,62 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio isGeneratingAnswer, isPreparingAnswer, submitQuery, + threadId, } = useChat(); + const { executeCaptcha } = useCaptcha(); + useEffect(() => { setIsAppleDevice(isMac()); }, []); + useEffect(() => { + return () => { + if (mcpCopyResetRef.current !== null) { + window.clearTimeout(mcpCopyResetRef.current); + } + }; + }, []); + + useEffect(() => { + const savedThreadId = localStorage.getItem('warp_docs_kapa_thread_id'); + if (savedThreadId) { + setStoredThreadId(savedThreadId); + } + }, []); + + useEffect(() => { + if (!threadId) return; + setStoredThreadId(threadId); + localStorage.setItem('warp_docs_kapa_thread_id', threadId); + }, [threadId]); useEffect(() => { if (!isOpen || !messagesRef.current) return; messagesRef.current.scrollTop = messagesRef.current.scrollHeight; }, [conversation.length, isOpen]); + useEffect(() => { + if (!isOpen || !messagesRef.current) return; + if (!isGeneratingAnswer && !isPreparingAnswer) return; + messagesRef.current.scrollTop = messagesRef.current.scrollHeight; + }, [conversation, isGeneratingAnswer, isOpen, isPreparingAnswer]); + + useEffect(() => { + if (!handoffQaId || !isOpen) return; + const frame = window.requestAnimationFrame(() => { + const inlineForm = document.getElementById(`sl-kapa-handoff-inline-${handoffQaId}`); + if (!inlineForm) return; + inlineForm.scrollIntoView({ + behavior: 'smooth', + block: 'nearest', + }); + const emailInput = inlineForm.querySelector<HTMLInputElement>('input[type="email"]'); + emailInput?.focus(); + }); + return () => { + window.cancelAnimationFrame(frame); + }; + }, [handoffQaId, isOpen, conversation.length]); + useEffect(() => { const dialog = dialogRef.current; if (!dialog) return; @@ -107,6 +658,7 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio const submit = () => { const value = query.trim(); if (!value || isBusy) return; + closeHandoffForm(); submitQuery(value); setHasStartedConversation(true); setQuery(''); @@ -119,6 +671,123 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio const feedback = (questionAnswerId: string, reaction: FeedbackReaction) => { addFeedback(questionAnswerId, reaction); + if (reaction === 'downvote') { + setDownvotedAnswerIds((current) => ({ ...current, [questionAnswerId]: true })); + } + }; + + const isDownvoted = (qaId: string | null | undefined, reaction: string | null | undefined) => { + if (!qaId) return false; + return reaction === 'downvote' || downvotedAnswerIds[qaId] === true; + }; + + const shouldShowHandoffForAnswer = (qa: { + id?: string | null; + answer?: string | null; + metadata?: unknown; + reaction?: string | null; + }) => { + if (!qa.answer?.trim()) return false; + const conversationLengthTriggered = conversation.length >= conversationLengthThreshold; + const downvoteTriggered = isDownvoted(qa.id ?? null, qa.reaction ?? null); + const uncertaintyTriggered = isAnswerUncertain(qa.metadata); + return conversationLengthTriggered || downvoteTriggered || uncertaintyTriggered; + }; + + const buildConversationTranscript = () => { + if (!conversation.length) return 'No conversation history yet.'; + return conversation + .map((qa, index) => { + const sources = qa.sources?.length + ? `\nSources:\n${qa.sources.map((source) => `- ${source.title}: ${source.source_url}`).join('\n')}` + : ''; + return `Q${index + 1}: ${qa.question}\nA${index + 1}: ${qa.answer || '(no answer generated yet)'}${sources}`; + }) + .join('\n\n'); + }; + + const buildConversationLink = (currentThreadId: string | null) => { + if (!projectId || !currentThreadId) return null; + return `https://app.kapa.ai/${projectId}/conversations/${currentThreadId}`; + }; + + const openHandoffForm = (qaId: string) => { + setHandoffQaId(qaId); + setHandoffErrorMessage(null); + setHandoffSuccessMessage(null); + }; + + const closeHandoffForm = () => { + setHandoffQaId(null); + setHandoffErrorMessage(null); + setHandoffSuccessMessage(null); + }; + + const submitSupportHandoff = async (qa: { id?: string | null; question?: string }) => { + if (isSubmittingHandoff) return; + const userEmail = handoffEmailInput.trim().toLowerCase(); + if (!isValidEmailAddress(userEmail)) { + setHandoffErrorMessage('Enter a valid email address to continue.'); + return; + } + const localStorageThreadId = localStorage.getItem('warp_docs_kapa_thread_id'); + const activeThreadId = threadId || storedThreadId || localStorageThreadId; + if (!activeThreadId) { + setHandoffErrorMessage('Missing Kapa thread context; please send another message and try again.'); + return; + } + + const question = qa.question?.trim(); + if (!question) { + setHandoffErrorMessage('Missing question context for handoff.'); + return; + } + + const conversationLink = buildConversationLink(activeThreadId); + + setIsSubmittingHandoff(true); + setHandoffErrorMessage(null); + setHandoffSuccessMessage(null); + try { + let captcha; + try { + captcha = await executeCaptcha(CaptchaAction.FeedbackSubmit); + } catch { + setHandoffErrorMessage('Captcha verification could not be completed. Please try again.'); + return; + } + if (!captcha?.token || !captcha?.key) { + setHandoffErrorMessage('Captcha verification did not return a token. Please try again.'); + return; + } + const response = await fetch('/api/support-handoff', { + method: 'POST', + headers: { + 'content-type': 'application/json', + }, + body: JSON.stringify({ + user_email: userEmail, + question, + page_url: window.location.href, + conversation_transcript: buildConversationTranscript(), + kapa_project_id: projectId || null, + kapa_thread_id: activeThreadId, + kapa_conversation_url: conversationLink || null, + captcha_token: captcha.token, + captcha_header: captcha.key, + }), + }); + const payload: HandoffApiSuccess & { message?: string } = await response.json().catch(() => ({})); + if (!response.ok) { + setHandoffErrorMessage(payload.message || 'Could not create support ticket. Please try again.'); + return; + } + setHandoffSuccessMessage(payload.message || 'Support ticket created successfully.'); + } catch { + setHandoffErrorMessage('Could not reach support handoff service. Please try again.'); + } finally { + setIsSubmittingHandoff(false); + } }; const openPanel = () => { @@ -137,9 +806,10 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio // Legacy fallback: earlier callers stashed the query on window before // triggering us. Kept as a belt-and-braces guard in case any path // still uses it. - if (!pendingQuery && (window as any).__warpAskAiQuery) { - pendingQuery = (window as any).__warpAskAiQuery; - delete (window as any).__warpAskAiQuery; + const windowWithAskQuery = window as Window & { __warpAskAiQuery?: string }; + if (!pendingQuery && windowWithAskQuery.__warpAskAiQuery) { + pendingQuery = windowWithAskQuery.__warpAskAiQuery; + delete windowWithAskQuery.__warpAskAiQuery; } setIsOpen(true); @@ -155,6 +825,19 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio const closePanel = () => { dialogRef.current?.close(); }; + const copyMcpValue = async (target: McpCopyTarget) => { + const value = target === 'config' ? warpDocsMcpConfig : warpDocsMcpUrl; + const copied = await copyTextToClipboard(value); + if (!copied) return; + setCopiedMcpValue(target); + if (mcpCopyResetRef.current !== null) { + window.clearTimeout(mcpCopyResetRef.current); + } + mcpCopyResetRef.current = window.setTimeout(() => { + setCopiedMcpValue(null); + mcpCopyResetRef.current = null; + }, 1500); + }; const restoreFocus = () => { window.requestAnimationFrame(() => { @@ -198,8 +881,8 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio onClose={onDialogClose} onClick={onDialogClick} > - <div className="sl-kapa-panel"> - <header className="sl-kapa-panel__header"> + <div className="sl-kapa-panel"> + <header className="sl-kapa-panel__header"> <button type="button" className="sl-kapa-icon-button sl-kapa-icon-button--ghost" @@ -211,6 +894,96 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio <LuSquarePen aria-hidden="true" /> </button> <div className="sl-kapa-panel__header-actions"> + <Popover.Root> + <Popover.Trigger asChild> + <button + type="button" + className="sl-kapa-mcp-connect__trigger" + aria-label="Connect to Warp Docs with MCP" + > + <LuPlug aria-hidden="true" /> + <span>Connect with MCP</span> + </button> + </Popover.Trigger> + <Popover.Content + className="sl-kapa-mcp-connect" + side="bottom" + align="end" + sideOffset={8} + collisionPadding={12} + > + <div className="sl-kapa-mcp-connect__header"> + <LuPlug aria-hidden="true" /> + <div> + <p className="sl-kapa-mcp-connect__title">Connect to Warp Docs</p> + <p className="sl-kapa-mcp-connect__description"> + Give agents direct access to Warp's official documentation through MCP. + </p> + </div> + </div> + <div className="sl-kapa-mcp-connect__section"> + <p className="sl-kapa-mcp-connect__eyebrow">Use in Warp</p> + <p className="sl-kapa-mcp-connect__instructions"> + In Warp, go to <strong>Settings</strong> > <strong>Agents</strong> >{' '} + <strong>MCP servers</strong>, click <strong>+ Add</strong>, and paste the + configuration. + </p> + <code className="sl-kapa-mcp-connect__config">{warpDocsMcpConfig}</code> + <button + type="button" + className="sl-kapa-mcp-connect__action sl-kapa-mcp-connect__action--primary" + onClick={() => { + void copyMcpValue('config'); + }} + aria-label={ + copiedMcpValue === 'config' + ? 'Warp Docs MCP configuration copied' + : 'Copy Warp Docs MCP configuration' + } + > + {copiedMcpValue === 'config' ? ( + <LuCheck aria-hidden="true" /> + ) : ( + <LuCopy aria-hidden="true" /> + )} + <span>{copiedMcpValue === 'config' ? 'Copied' : 'Copy Warp config'}</span> + </button> + </div> + <div className="sl-kapa-mcp-connect__section"> + <p className="sl-kapa-mcp-connect__eyebrow">Use in another MCP client</p> + <p className="sl-kapa-mcp-connect__instructions"> + Copy the official MCP URL for Claude, ChatGPT, and other compatible clients. + </p> + <button + type="button" + className="sl-kapa-mcp-connect__action" + onClick={() => { + void copyMcpValue('url'); + }} + aria-label={ + copiedMcpValue === 'url' + ? 'Warp Docs MCP URL copied' + : 'Copy Warp Docs MCP URL' + } + > + {copiedMcpValue === 'url' ? ( + <LuCheck aria-hidden="true" /> + ) : ( + <LuCopy aria-hidden="true" /> + )} + <span>{copiedMcpValue === 'url' ? 'Copied' : 'Copy MCP URL'}</span> + </button> + </div> + <span className="sr-only" aria-live="polite"> + {copiedMcpValue === 'config' + ? 'Warp Docs MCP configuration copied to clipboard.' + : copiedMcpValue === 'url' + ? 'Warp Docs MCP URL copied to clipboard.' + : ''} + </span> + <Popover.Arrow className="sl-kapa-mcp-connect__arrow" /> + </Popover.Content> + </Popover.Root> <button type="button" ref={closeButtonRef} @@ -221,9 +994,9 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio <LuX aria-hidden="true" /> </button> </div> - </header> + </header> - <div className="sl-kapa-panel__body" ref={messagesRef}> + <div className="sl-kapa-panel__body" ref={messagesRef}> {!hasConversation && ( <div className="sl-kapa-empty-state"> <p className="sl-kapa-empty-state__title">Ask a question</p> @@ -236,7 +1009,40 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio <div className="sl-kapa-message sl-kapa-message--user">{qa.question}</div> <div className="sl-kapa-message sl-kapa-message--assistant"> {qa.answer ? ( - <ReactMarkdown>{qa.answer}</ReactMarkdown> + <ReactMarkdown + components={{ + a: ChatMarkdownLink, + img: ChatMarkdownImage, + // Fenced code blocks arrive as <pre><code>; inline code + // arrives as a bare <code>. react-markdown v9+ removed the + // `inline` prop, so nesting is the only reliable signal. + pre({ children }) { + const codeElement = extractCodeElement(children); + if (!codeElement) { + return <pre>{children}</pre>; + } + const codeClassName = + typeof codeElement.props.className === 'string' + ? codeElement.props.className + : undefined; + const codeText = markdownChildrenToText(codeElement.props.children); + const isStreamingAnswer = + isBusy && conversation[conversation.length - 1]?.id === qa.id; + return ( + <ChatCodeBlock + className={codeClassName} + codeText={codeText} + deferHighlight={isStreamingAnswer} + /> + ); + }, + code({ className, children }) { + return <code className={className}>{children}</code>; + }, + }} + > + {qa.answer} + </ReactMarkdown> ) : ( <div className="sl-kapa-thinking"> <LuLoaderCircle className="sl-kapa-spinner" aria-hidden="true" /> @@ -278,15 +1084,75 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio > <LuThumbsDown aria-hidden="true" /> </button> + {shouldShowHandoffForAnswer(qa) ? ( + <button + type="button" + className="sl-kapa-feedback__handoff" + onClick={() => openHandoffForm(qa.id as string)} + > + Create ticket + </button> + ) : null} + </div> + ) : null} + {handoffQaId === qa.id && !isBusy && shouldShowHandoffForAnswer(qa) ? ( + <div + className="sl-kapa-handoff-inline" + id={`sl-kapa-handoff-inline-${qa.id}`} + > + <label htmlFor={`sl-kapa-handoff-email-${qa.id}`}> + Your Warp account email + </label> + <form + className="sl-kapa-handoff-inline__row" + onSubmit={(event) => { + event.preventDefault(); + void submitSupportHandoff(qa); + }} + > + <input + id={`sl-kapa-handoff-email-${qa.id}`} + type="email" + placeholder="you@company.com" + value={handoffEmailInput} + onChange={(event) => setHandoffEmailInput(event.target.value)} + required + /> + <button + type="submit" + className="sl-kapa-feedback__handoff sl-kapa-feedback__handoff--submit" + disabled={isSubmittingHandoff} + > + {isSubmittingHandoff ? 'Submitting…' : 'Submit'} + </button> + <button + type="button" + className="sl-kapa-feedback__handoff sl-kapa-feedback__handoff--ghost" + onClick={closeHandoffForm} + disabled={isSubmittingHandoff} + > + Cancel + </button> + </form> + {handoffErrorMessage ? ( + <p className="sl-kapa-handoff-inline__status sl-kapa-handoff-inline__status--error"> + {handoffErrorMessage} + </p> + ) : null} + {handoffSuccessMessage ? ( + <p className="sl-kapa-handoff-inline__status sl-kapa-handoff-inline__status--success"> + {handoffSuccessMessage} + </p> + ) : null} </div> ) : null} </div> </div> ))} - {error ? <div className="sl-kapa-error">{error}</div> : null} - </div> - <footer className="sl-kapa-panel__footer"> + {error ? <div className="sl-kapa-error">{getChatErrorMessage(error)}</div> : null} + </div> + <footer className="sl-kapa-panel__footer"> <form className="sl-kapa-form" onSubmit={onSubmit}> <input ref={inputRef} @@ -341,8 +1207,8 @@ function ChatSurface({ title, welcomeMessage, autoOpen = false, onNewConversatio </Popover.Content> </Popover.Root> </div> - </footer> - </div> + </footer> + </div> </dialog> </div> ); @@ -353,7 +1219,13 @@ export default function KapaChatLauncher({ autoOpen = false }: { autoOpen?: bool const [sessionAutoOpen, setSessionAutoOpen] = useState(autoOpen); const callbacks = useMemo( () => ({ - askAI: {}, + askAI: { + onAnswerGenerationCompleted: (data: { threadId?: string | null }) => { + if (data.threadId) { + localStorage.setItem('warp_docs_kapa_thread_id', data.threadId); + } + }, + }, }), [] ); @@ -372,7 +1244,10 @@ export default function KapaChatLauncher({ autoOpen = false }: { autoOpen?: bool key={chatSessionKey} integrationId={integrationId} callbacks={callbacks} - userTrackingMode="none" + // Anonymous first-party cookie (`kapa_web_id`). Default in the Kapa + // React SDK; set explicitly so we do not accidentally ship `none` again. + // https://docs.kapa.ai/dev/sdk/components/KapaProvider#user-tracking-mode + userTrackingMode="cookie" > <ChatSurface title={title} diff --git a/src/components/KapaLauncher.astro b/src/components/KapaLauncher.astro index 028bc96f5..a978012c4 100644 --- a/src/components/KapaLauncher.astro +++ b/src/components/KapaLauncher.astro @@ -2,7 +2,17 @@ // The button sits to the right of the sidebar search pill (see // CustomSidebar.astro), rendering as `[icon] Ask` at one type-scale step // smaller than search so it reads as the secondary affordance. +import { Code } from 'astro-expressive-code/components'; import KapaChatLauncher from './KapaChatLauncher'; --- <KapaChatLauncher client:idle /> + +{/* + Hidden Expressive Code block so EC frame CSS variables/assets exist on + every page. Chat copy buttons are owned by KapaChatLauncher (not EC's + `.copy` markup) to avoid double icons. +*/} +<div hidden aria-hidden="true"> + <Code code="# Preloads Expressive Code assets for the Kapa chat panel" lang="text" /> +</div> diff --git a/src/components/MermaidControls.astro b/src/components/MermaidControls.astro new file mode 100644 index 000000000..ab93eef39 --- /dev/null +++ b/src/components/MermaidControls.astro @@ -0,0 +1,54 @@ +<script> + import { SvgToolbelt } from 'svg-toolbelt'; + import 'svg-toolbelt/dist/svg-toolbelt.css'; + + const enhanced = new WeakMap<Element, SvgToolbelt>(); + + const FULLSCREEN_ICON = + '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3H5a2 2 0 0 0-2 2v3"/><path d="M21 8V5a2 2 0 0 0-2-2h-3"/><path d="M3 16v3a2 2 0 0 0 2 2h3"/><path d="M16 21h3a2 2 0 0 0 2-2v-3"/></svg>'; + + function enhanceDiagrams() { + document.querySelectorAll('pre.mermaid[data-processed]').forEach((pre) => { + // Check `.svg-toolbelt-controls`, not `.svg-toolbelt-wrapper` (never created here). + if (!pre.querySelector('svg') || pre.querySelector('.svg-toolbelt-controls')) return; + + enhanced.get(pre)?.destroy(); + const instance = new SvgToolbelt(pre as HTMLElement, { + controlsPosition: 'top-right', + minScale: 0.5, + maxScale: 4, + }); + instance.init(); + enhanced.set(pre, instance); + + const fsBtn = pre.querySelector<HTMLButtonElement>('.svg-toolbelt-controls button[title="Toggle Fullscreen"]'); + if (fsBtn) fsBtn.innerHTML = FULLSCREEN_ICON; + }); + } + + function init() { + enhanceDiagrams(); + + const observer = new MutationObserver(() => enhanceDiagrams()); + observer.observe(document.body, { + attributes: true, + attributeFilter: ['data-processed'], + subtree: true, + }); + + let attempts = 0; + const poll = setInterval(() => { + attempts += 1; + enhanceDiagrams(); + if (document.querySelector('pre.mermaid[data-processed] svg') || attempts > 20) { + clearInterval(poll); + } + }, 250); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } +</script> diff --git a/src/components/WarpTopicNav.astro b/src/components/WarpTopicNav.astro index d36cf094c..d3bc29508 100644 --- a/src/components/WarpTopicNav.astro +++ b/src/components/WarpTopicNav.astro @@ -5,9 +5,8 @@ // Reference, etc.) as an inline-flex row with a small icon + label. The list // is sourced from `starlight-sidebar-topics`'s middleware, which exposes // `Astro.locals.starlightSidebarTopics.topics` on every Starlight route. -// Each topic carries `{ link, label, icon, badge, isCurrent }`; we consume -// `link`/`label`/`icon`/`isCurrent` and ignore `badge` for now (none of our -// topics ship one). The plugin's per-topic sidebar filtering lives in its +// Each topic carries `{ link, label, icon, badge, isCurrent }`. The plugin's +// per-topic sidebar filtering lives in its // middleware (it rewrites `starlightRoute.sidebar`), so removing the topic // list from the sidebar markup does NOT break that filtering — the same // filtered nav still renders below this row in the page sidebar. @@ -26,6 +25,11 @@ // underline share `--sl-color-text-accent`, which auto-adapts to dark // and light themes. // - No surrounding chip / box / bg — just type + icon +// - Topic badge (e.g. Factories "Early Access"): rendered as a plain span +// styled as a compact brand pill (Inter, 11px/600, accent tint, fully +// rounded) instead of Starlight's `<Badge>`, whose monospace bordered +// box clashed with the nav type and was wide enough to wrap the nav +// onto a second row at common laptop widths. import { Icon } from '@astrojs/starlight/components'; const { topics } = Astro.locals.starlightSidebarTopics; @@ -33,14 +37,12 @@ const { topics } = Astro.locals.starlightSidebarTopics; // Per-topic icon overrides for topics where Starlight's icon registry doesn't // ship the right glyph (only 22 generic UI icons available; no robot/AI). The // `sidebar.ts` config keeps the closest Starlight name (e.g. `puzzle` for -// Agents, `seti:json` for API) so the mobile drawer falls back gracefully; -// this map points to a custom inline SVG that we render here in the header -// instead. +// Agents) so the mobile drawer falls back gracefully; this map points to a +// custom inline SVG that we render here in the header instead. const CUSTOM_TOPIC_ICONS: Record<string, true> = { Agents: true, - API: true, Enterprise: true, - Oz: true, + 'Automation Platform': true, }; --- @@ -60,22 +62,7 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = { this and the Starlight-rendered icons to a single uniform size. `currentColor` so each icon inherits the link's text color and picks up the active-state accent. */} - {topic.label === 'API' ? ( - /* `</>` brackets — the conventional dev-API glyph. - Two chevrons mirrored across center, stroke weight - matched to the other topic icons. */ - <svg - viewBox="0 0 24 24" - fill="none" - stroke="currentColor" - stroke-width="2" - stroke-linecap="round" - stroke-linejoin="round" - > - <path d="M16 18l6-6-6-6" /> - <path d="M8 6l-6 6 6 6" /> - </svg> - ) : topic.label === 'Enterprise' ? ( + {topic.label === 'Enterprise' ? ( /* Office building — simple outline: tall rectangle with window grid and entrance, stroke weight matched to the other topic icons. */ @@ -96,7 +83,7 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = { <line x1="15" y1="14" x2="15" y2="14.01" /> <path d="M10 22v-4h4v4" /> </svg> - ) : topic.label === 'Oz' ? ( + ) : topic.label === 'Automation Platform' ? ( /* Cloud icon — Feather-style cloud outline, stroke weight matched to the other topic icons. */ <svg @@ -139,6 +126,9 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = { </span> ) : null} <span class="warp-topic-nav__label">{topic.label}</span> + {topic.badge && ( + <span class="warp-topic-nav__badge">{topic.badge.text}</span> + )} </a> </li> ))} @@ -149,13 +139,14 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = { <style> .warp-topic-nav { /* Sits between SiteTitle and the right control group inside `.header`. - `align-self: stretch` keeps the nav at full header height so its - row(s) of tabs center vertically; `align-items: center` centers the - tab list within that height — important once the list wraps to a - second row on crowded widths. */ + The whole chain (nav → ul → li → a) stretches to the header's full + content height so each tab is a full-height hit target and the + active underline can drop onto the header's bottom divider (see the + `::after` rule below). Tab content stays vertically centered by the + link's own flex centering. */ align-self: stretch; display: flex; - align-items: center; + align-items: stretch; min-width: 0; } @@ -165,29 +156,32 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = { padding: 0; display: flex; flex-wrap: wrap; - align-items: center; + align-items: stretch; /* Row gap applies only once the nav wraps to a second row on crowded - mid-width viewports; column gap keeps the single-row spacing. */ + mid-width viewports (each row then shares the stretched height); + column gap keeps the single-row spacing. */ gap: 0.25rem 1.25rem; min-width: 0; } li { display: flex; - align-items: center; + align-items: stretch; } a { - /* The link hugs its own content (icon + label) plus a little vertical - padding, so the active-state `::after` underline sits just under the - tab in both single-row and wrapped (two-row) layouts. Vertical - centering of the row(s) is handled by the parent nav/ul rather than - by stretching each link to the full header height. */ + /* Full-height tab (stretched via the nav → ul → li chain) with its + icon + label centered by the link's own flex alignment. Full height + matters for the active-state `::after`: the link's bottom edge ends + at the header's inner content box, a known `--sl-nav-pad-y` above + the header's bottom divider, so the underline can be offset onto + the divider itself. Horizontal padding only — vertical height comes + from the stretch. */ position: relative; display: flex; align-items: center; gap: 0.5rem; - padding: 0.4rem 0.25rem; + padding: 0 0.25rem; font-size: var(--sl-text-sm); font-weight: 500; /* `1.25` is just enough to clear Inter's natural ascent + descent @@ -212,7 +206,10 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = { a:focus-visible { outline: 2px solid var(--sl-color-accent-high); - outline-offset: 4px; + /* Inset ring: the links now span the header's full content height, so + an outward offset would collide with the header's top edge and + bottom divider. */ + outline-offset: -4px; border-radius: var(--sl-radius-xs); } @@ -227,18 +224,42 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = { color: var(--sl-color-text-accent); font-weight: 600; } + /* Compact brand pill for topic badges (currently only Factories "Early + Access"). Deliberately quiet: one step smaller than the 14px label, + tinted with the accent ramp rather than boxed in a border, and fully + rounded to match the site's pill language (search, guide filters). + `--sl-color-accent-low` + `--sl-color-text-accent` adapt to dark and + light themes on their own. Font family inherits Inter from the link — + no monospace. */ + .warp-topic-nav__badge { + display: inline-flex; + align-items: center; + padding: 0.125rem 0.5rem; + border-radius: 9999px; + background: var(--sl-color-accent-low); + color: var(--sl-color-text-accent); + font-size: 0.6875rem; /* 11px against the 14px label */ + font-weight: 600; + line-height: 1.2; + letter-spacing: 0.015em; + } - /* 2px accent underline under the active tab, anchored to the link's own - bottom edge so it hugs the tab. It previously dropped down to the - header's bottom hairline (Scalar pattern), but once the nav can wrap to - a second row that pushed the line into the row below — `bottom: 0` keeps - it attached to the active tab in every layout. */ + /* 2px accent underline for the active tab, sitting ON the header's + bottom divider (Cursor/Devin/Mintlify docs pattern) rather than + hugging the tab label mid-header. Geometry: the stretched link's + bottom edge is the header's inner content box, which sits exactly + `--sl-nav-pad-y` above the 1px `border-bottom` divider drawn by + Starlight's `header.header` (PageFrame) — so offsetting by that + padding rests the line flush on the divider. In the crowded band + (≤80rem) where the list may wrap to two rows, the media query below + reverts to `bottom: 0` so a row-one tab's underline doesn't float + between rows. */ a[aria-current='page']::after { content: ''; position: absolute; left: 0; right: 0; - bottom: 0; + bottom: calc(-1 * var(--sl-nav-pad-y)); height: 2px; background: var(--sl-color-text-accent); } @@ -278,11 +299,16 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = { display: inline-block; } - /* Mid-width fallback. Below ~80rem (~1280px) the topic items + logo + - right-group start to crowd. Drop the per-item icons first so the labels - keep room. The mobile drawer (rendered separately) takes over below - 50rem where this nav is hidden entirely. */ - @media (max-width: 80rem) { + /* Mid-width fallbacks, tuned so the nav holds a single row through the + common laptop range instead of wrapping "Guides" onto a second line. + Measured on this branch's ten-topic nav (Chromium, Inter loaded): + with icons + badge the row needs a ~1460px viewport; without icons it + needs ~1280px; hiding the badge too buys roughly another 95px. + So: drop the per-item icons first (labels keep the room), then the + Factories badge at the tightest widths. Wrapping remains the graceful + fallback below ~1160px, and the mobile drawer (rendered separately) + takes over below 50rem where this nav is hidden entirely. */ + @media (max-width: 94rem) { ul { gap: 0.25rem 1rem; } @@ -290,4 +316,18 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = { display: none; } } + + @media (max-width: 80rem) { + .warp-topic-nav__badge { + display: none; + } + /* Crowded band: the list can wrap to two rows here (the header also + reserves extra height for this range — warp-components.css §5), so + anchor the underline back to the tab's own bottom edge instead of + the header divider, where a wrapped row-one tab would leave the + line stranded between rows. */ + a[aria-current='page']::after { + bottom: 0; + } + } </style> diff --git a/src/content.config.ts b/src/content.config.ts index 592ef93de..ec72b9dd6 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -3,6 +3,7 @@ import { docsLoader } from '@astrojs/starlight/loaders'; import { docsSchema } from '@astrojs/starlight/schema'; import { topicSchema } from 'starlight-sidebar-topics/schema'; import { z } from 'astro/zod'; +import { substituteVars } from './plugins/vars-transform.js'; export const collections = { // `topicSchema` adds a `topic` frontmatter field used by @@ -14,13 +15,32 @@ export const collections = { // - `featured`: marks guides for the curated "Featured" section docs: defineCollection({ loader: docsLoader(), - schema: docsSchema({ - extend: topicSchema.merge( - z.object({ - tags: z.array(z.string()).optional(), - featured: z.boolean().optional().default(false), - }), - ), - }), + schema: (context) => + docsSchema({ + extend: topicSchema.merge( + z.object({ + tags: z.array(z.string()).optional(), + featured: z.boolean().optional().default(false), + }), + ), + })(context).transform((data) => { + // Starlight's docs collection reads frontmatter through Astro's + // content-layer glob() loader, which never runs the `warp-vars-transform` + // Vite plugin (see src/plugins/vars-transform.ts). Substituting + // `{{TOKEN}}` here, on the parsed schema data, is what actually + // resolves those placeholders in title/description/sidebar.label. + return { + ...data, + title: substituteVars(data.title, `frontmatter title of ${data.title}`), + description: + data.description !== undefined + ? substituteVars(data.description, `frontmatter description of ${data.title}`) + : data.description, + sidebar: + data.sidebar?.label !== undefined + ? { ...data.sidebar, label: substituteVars(data.sidebar.label, `frontmatter sidebar.label of ${data.title}`) } + : data.sidebar, + }; + }), }), }; diff --git a/src/content/docs/agent-platform/capabilities/computer-use.mdx b/src/content/docs/agent-platform/capabilities/computer-use.mdx deleted file mode 100644 index 276383663..000000000 --- a/src/content/docs/agent-platform/capabilities/computer-use.mdx +++ /dev/null @@ -1,153 +0,0 @@ ---- -title: Computer use for agents -sidebar: - label: "Computer use" -description: >- - Let agents interact with desktop GUIs in sandboxed cloud environments for - automated UI testing and validation. ---- - -Computer Use is an experimental feature that enables Warp's agents to interact with desktop environments. The agent can see what's displayed on screen, click and drag, type text, use keyboard shortcuts, and perform other GUI interactions—all within a secure, isolated sandbox. - -A key use case is **testing UI changes** with a self-contained feedback loop, where the agent can verify that your code changes produce the expected visual and behavioral results without requiring manual testing. - -## Overview - -With Computer Use, agents can: - -* **Take screenshots** - Capture and analyze the current display -* **Interact with applications** - Click buttons, fill forms, navigate interfaces -* **Type and control keyboard** - Enter text and use keyboard shortcuts -* **Automate testing workflows** - Test UI changes end-to-end without manual intervention -* **Work with browser-based interfaces** - Test web apps and navigate the web - -Computer Use is only available in Warp's sandboxed cloud environments, not in local interactive terminal sessions. - ---- - -## Enabling Computer Use - -Computer Use is **opt-in** and disabled by default. You can enable it through several entry points: - -### Warp app settings - -To enable Computer Use for [Cloud Agents](/platform/), navigate to **Settings** > **Agents** > **Warp Agent** > **Experimental** > **Computer use in Cloud Agents** and toggle to enable. - -### CLI - -When running agents in the cloud via the [CLI](/reference/cli/), use flags to control Computer Use per run: - -```bash -oz agent run-cloud --computer-use --prompt "<task>" -oz agent run-cloud --no-computer-use --prompt "<task>" -``` - -### API - -When calling the Warp API to create agent runs, include the `computer_use_enabled` field in your request: - -```json -{ - "prompt": "Build a button component that matches this design, then test it in the browser", - "computer_use_enabled": true, - "environment_id": "optional-environment-id" -} -``` - -For full API documentation, see the [Oz API & SDK](/reference/api-and-sdk/) reference. - -### Web App - -In the Warp web app, you can enable or disable Computer Use for: - -* **New agent runs** - Configure Computer Use when starting a new agent run from the web app -* **Scheduled agent runs** - Enable Computer Use for scheduled agents managed from the web app -* **Integrations** - Configure Computer Use for Slack, Linear, and other integration-triggered agents - ---- - -## How Computer Use works - -### Setup and requirements - -Computer Use runs in a containerized sandbox, allowing headless cloud environments to render and interact with graphical applications. The sandbox is fully isolated—it does not have access to your local machine, credentials, or sensitive data outside the sandbox environment. - -Your cloud environment must include any applications you want the agent to control. For example, to test a web app in a browser, install Chrome or Firefox in your [environment configuration](/platform/environments/). - -### Model selection - -Computer Use supports multiple Anthropic Claude models, including Claude 4.5 Sonnet, Claude 4.5 Opus, Claude 4.5 Haiku, Claude 4.6 Sonnet, and Claude 4.6 Opus. Warp uses an auto model selector to choose the best-suited model for each Computer Use task. - ---- - -## Recording sessions - -Agents can record their Computer Use sessions as annotated video artifacts — capturing clicks, key presses, and cursor movement alongside the interaction, with idle time trimmed out. - -Recordings appear in the conversation, on the Oz web run page, and are attached to the pull request description when a cloud agent run produces them. They are captured entirely inside the sandbox and never include your local desktop or credentials. - -For a full explanation of the recording pipeline, what the finished video contains, where to find recordings, and how to handle recording failures, see [Testing with Computer Use and video recordings](/agent-platform/capabilities/computer-use-testing-and-recordings/). - ---- - -## Security considerations - -Computer Use is an experimental feature with unique security considerations. These risks are heightened when interacting with the internet. - -To minimize risks when using Computer Use: - -1. **Avoid sensitive data** - Do not pass API keys, authentication tokens, or personal information to agents using Computer Use -2. **Limit internet access** - If your environment has internet access, consider restricting to an allowlist of known-safe domains -3. **Require human confirmation** - For tasks with real-world consequences (e.g., financial transactions, accepting legal terms), ask a human to confirm before the agent proceeds -4. **Review agent actions** - Regularly review what agents are doing on your behalf, especially when testing new workflows - ---- - -## Example workflows - -### Testing UI changes - -Verify that code changes produce the expected visual results and behavior: - -* **Build from mockups** - Receive a Figma design or mockup image, build the UI, and test it matches -* **Visual regression testing** - After code changes, verify UI renders correctly -* **Form and interaction testing** - Test form submissions, validation, error handling -* **Responsive design validation** - Test layout on different screen sizes - -**Example: Testing a React component** - -1. You ask the agent: "Build a React button component that matches this design, then test it" -2. Agent takes a screenshot to see the current state -3. Agent opens your dev server in a browser -4. Agent navigates to the component, verifies it renders correctly -5. Agent tests interactions (hover, click) and reports back - -**Example: Testing a web form** - -1. You provide a form design and ask the agent to build and test it -2. Agent renders your form in the browser -3. Agent fills fields with valid and invalid data -4. Agent verifies validation messages and submission behavior -5. Agent reports which fields worked correctly and which need adjustment - -**Example: Verifying UI responsiveness** - -1. You ask the agent to test your app on different screen sizes -2. Agent resizes the browser window to mobile, tablet, and desktop widths -3. Agent takes screenshots at each size and verifies layout is correct -4. Agent reports any responsive design issues - -### Browsing and web interaction - -Computer Use can also help with general web tasks: - -* Browse websites and interact with web interfaces -* Fill out and submit web forms -* Navigate multi-step workflows in web applications - ---- - -## Related capabilities - -* [Images as Context](/agent-platform/local-agents/agent-context/images-as-context/) - Pass design mockups and screenshots as context -* [Full Terminal Use](/agent-platform/capabilities/full-terminal-use/) - Let agents drive interactive terminal apps, see live output, and run commands diff --git a/src/content/docs/agent-platform/capabilities/index.mdx b/src/content/docs/agent-platform/capabilities/index.mdx deleted file mode 100644 index 058e312ac..000000000 --- a/src/content/docs/agent-platform/capabilities/index.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Capabilities overview -description: >- - Core capabilities and configuration options that shape how agents behave, - what context they have access to, and how they execute tasks. ---- - -Agent capabilities are the core building blocks that define how Warp's agents operate, including the context sources agents can access, the rules that guide their behavior, the tools they can use, and the models they run on. Configure these capabilities to match your workflows and preferences. - -## Capabilities in this section - -* [Slash Commands](/agent-platform/capabilities/slash-commands/) - Quick actions and saved prompts accessible by typing `/` in Agent Mode. -* [Skills](/agent-platform/capabilities/skills/) - Reusable, scoped instructions that teach agents how to perform specific tasks in your codebase. -* [Planning](/agent-platform/capabilities/planning/) - Turn agent requests into organized, editable plans that execute step-by-step with full visibility. -* [Task Lists](/agent-platform/capabilities/task-lists/) - Track complex workflows with automatic task lists that update progress in real time. -* [Rules](/agent-platform/capabilities/rules/) - Define global and project-level guidelines that shape agent behavior and responses. -* [Full Terminal Use](/agent-platform/capabilities/full-terminal-use/) - Let the agent drive interactive terminal apps, seeing live output and running commands. -* [Computer Use](/agent-platform/capabilities/computer-use/) - Let agents interact with desktop environments by taking screenshots, clicking, typing, and controlling the GUI. -* [MCP](/agent-platform/capabilities/mcp/) - Connect external data sources and tools to Warp's agents via the Model Context Protocol. -* [Codebase Context](/agent-platform/capabilities/codebase-context/) - Let agents understand your codebase through semantic indexing of your Git-tracked files. -* [Agent Profiles & Permissions](/agent-platform/capabilities/agent-profiles-permissions/) - Control what permissions and autonomy agents have to run commands and apply changes. -* [Web Search](/agent-platform/capabilities/web-search/) - Allow agents to search the web for up-to-date information. - -## Related - -* [Inference & providers](/agent-platform/inference/model-choice/) - Pick the model that powers your agents, bring your own API key, or connect a custom inference endpoint. -* [Local Agents](/agent-platform/local-agents/overview/) - Hands-on agent interactions in Warp. diff --git a/src/content/docs/agent-platform/capabilities/slash-commands.mdx b/src/content/docs/agent-platform/capabilities/slash-commands.mdx deleted file mode 100644 index eb39fea18..000000000 --- a/src/content/docs/agent-platform/capabilities/slash-commands.mdx +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Slash Commands -description: >- - Use Slash Commands in Agent Mode or Auto-Detection Mode to quickly run - built-in actions or saved prompts without leaving the input field. ---- - -Slash Commands are quick actions and saved prompts you can invoke by typing `/` in Agent Mode or Auto-Detection Mode. They provide instant access to built-in actions like starting conversations, creating environments, switching models, opening static flows, and running saved prompts from Warp Drive. - -<figure> -![Slash Commands menu](../../../../assets/agent-platform/slash-commands-menu.png) -<figcaption>Slash Commands menu.</figcaption> -</figure> - -As you type, the menu filters results in real time, making it easy to find and run the command or prompt you need. - -## Static slash commands - -Warp currently supports the following built-in Slash Commands: - -<table><thead><tr><th width="211.64453125">Slash Command</th><th>Description</th></tr></thead><tbody><tr><td><code>/add-mcp</code></td><td>Add a new <a href="/agent-platform/capabilities/mcp/">MCP server</a>.</td></tr><tr><td><code>/add-prompt</code></td><td>Add a new <a href="/knowledge-and-collaboration/warp-drive/prompts/">Agent Prompt</a> in Warp Drive.</td></tr><tr><td><code>/add-rule</code></td><td>Add a new <a href="/agent-platform/capabilities/rules/">Global Rule</a> for the Agent.</td></tr><tr><td><code>/agent</code></td><td>Start a new <a href="/agent-platform/local-agents/interacting-with-agents/">agent conversation</a>. Optionally include a prompt to send immediately.</td></tr><tr><td><code>/changelog</code></td><td>Open the latest Warp <a href="/changelog/">changelog</a>.</td></tr><tr><td><code>/cloud-agent</code></td><td>Start a new <a href="/platform/">cloud agent conversation</a>. <code>{'*'}</code></td></tr><tr><td><code>/compact</code></td><td>Free up context by summarizing conversation history.</td></tr><tr><td><code>/compact-and</code></td><td>Compact the current conversation and then send a follow-up prompt.</td></tr><tr><td><code>/conversations</code></td><td>Open <a href="/agent-platform/local-agents/interacting-with-agents/">conversation history</a>.</td></tr><tr><td><code>/cost</code></td><td>Toggle credit usage details in the current conversation.</td></tr><tr><td><code>/create-environment</code></td><td>Create a <a href="/platform/environments/">Warp Environment</a> (Docker image + repos) via guided setup. <code>{'*'}</code></td></tr><tr><td><code>/create-new-project</code></td><td>Have the Agent walk you through creating a new coding project. <code>{'*'}</code></td></tr><tr><td><code>/environment</code></td><td>Switch the <a href="/platform/environments/">environment</a> for the current cloud agent conversation.</td></tr><tr><td><code>/export-to-clipboard</code></td><td>Export the current conversation to clipboard in markdown format.</td></tr><tr><td><code>/export-to-file</code></td><td>Export the current conversation to a markdown file.</td></tr><tr><td><code>/feedback</code></td><td>Open the static feedback experience. See <a href="/support-and-community/troubleshooting-and-support/sending-us-feedback/#using-feedback-in-warp">Using <code>/feedback</code> in Warp</a> for details.</td></tr><tr><td><code>/fork</code></td><td><a href="/agent-platform/local-agents/interacting-with-agents/conversation-forking/">Forks the current conversation</a> into a new thread with the full context and history of the original. <br /><br />You can optionally include a prompt that will be sent immediately in the forked conversation.</td></tr><tr><td><code>/fork-and-compact</code></td><td><a href="/agent-platform/local-agents/interacting-with-agents/conversation-forking/">Forks the current conversation</a> and automatically compacts the forked version.<br /><br />Useful when you want a fresh, summarized starting point that preserves relevant context while trimming the rest.</td></tr><tr><td><code>/fork-from</code></td><td>Open a searchable menu to <a href="/agent-platform/local-agents/interacting-with-agents/conversation-forking/">fork the conversation</a> from a specific query. Select a query to create a fork that includes everything up to that point.</td></tr><tr><td><code>/harness</code></td><td>Switch the <a href="/platform/harnesses/">harness</a> for the current cloud agent conversation.</td></tr><tr><td><code>/host</code></td><td>Switch the execution host for the current cloud agent conversation.</td></tr><tr><td><code>/index</code></td><td>Index the current codebase using <a href="/agent-platform/capabilities/codebase-context/">Codebase Context</a>.</td></tr><tr><td><code>/init</code></td><td>Index the current codebase and generate an <a href="/agent-platform/capabilities/rules/">AGENTS.md file</a>. <code>{'*'}</code></td></tr><tr><td><code>/model</code></td><td>Switch the base agent model for the current conversation.</td></tr><tr><td><code>/new</code></td><td>Start a new <a href="/agent-platform/local-agents/interacting-with-agents/">agent conversation</a> (alias for <code>/agent</code>).</td></tr><tr><td><code>/open-code-review</code></td><td>Open the <a href="/code/code-review/">code review</a> pane.</td></tr><tr><td><code>/open-file</code></td><td>Open a file for editing in Warp's <a href="/code/code-editor/">code editor</a>.</td></tr><tr><td><code>/open-mcp-servers</code></td><td>View the status of your <a href="/agent-platform/capabilities/mcp/">MCP servers</a>.</td></tr><tr><td><code>/open-project-rules</code></td><td>Open the <a href="/agent-platform/capabilities/rules/#project-rules">Project Rules</a> file (<code>AGENTS</code>).</td></tr><tr><td><code>/open-repo</code></td><td>Switch to another indexed repository.</td></tr><tr><td><code>/open-rules</code></td><td>View all of your global and project <a href="/agent-platform/capabilities/rules/">rules</a>.</td></tr><tr><td><code>/open-settings-file</code></td><td>Open the Warp <a href="/terminal/settings/">settings file</a> (<code>settings.toml</code>) in Warp's code editor.</td></tr><tr><td><code>/open-skill</code></td><td>Open an interactive menu to browse and edit project or global <a href="/agent-platform/capabilities/skills/">skills</a>.</td></tr><tr><td><code>/orchestrate</code></td><td>Break a task into subtasks and run them in parallel with multiple agents. <code>{'*'}</code></td></tr><tr><td><code>/plan</code></td><td>Prompt the Agent to do some research and create a <a href="/agent-platform/capabilities/planning/">plan</a> for a task.</td></tr><tr><td><code>/profile</code></td><td>Switch the active <a href="/agent-platform/capabilities/agent-profiles-permissions/">execution profile</a>.</td></tr><tr><td><code>/prompts</code></td><td>Search saved <a href="/knowledge-and-collaboration/warp-drive/prompts/">prompts</a>.</td></tr><tr><td><code>/queue</code></td><td>Queue a prompt to send after the agent finishes responding. See <a href="/agent-platform/local-agents/interacting-with-agents/prompt-queueing/">Prompt Queueing</a>.</td></tr><tr><td><code>/rename-conversation</code></td><td>Rename the current conversation.</td></tr><tr><td><code>/rename-tab</code></td><td>Rename the current tab. Include the new tab name as an argument (for example, <code>/rename-tab deploy</code>).</td></tr><tr><td><code>/rewind</code></td><td>Rewind to a previous point in the conversation.</td></tr><tr><td><code>/skills</code></td><td>Invoke a <a href="/agent-platform/capabilities/skills/">skill</a> from a searchable menu.</td></tr><tr><td><code>/usage</code></td><td>Open <a href="/support-and-community/plans-and-billing/">billing and usage</a> settings.</td></tr></tbody></table> - -:::caution -Slash commands marked with a `*` consume credits to complete the task. -::: - -#### Using Agent Prompts via Slash Commands - -In addition to static commands, the menu also shows [Agent Prompts](/knowledge-and-collaboration/warp-drive/prompts/) saved in your [Warp Drive](/knowledge-and-collaboration/warp-drive/). - -* These prompts can be custom ones you’ve created or ones shared with you. -* As you type after `/`, prompts are filtered dynamically, so you can quickly run them without leaving the input field. - -<figure> -![Slash Commands menu with filtered Agent Prompts](../../../../assets/agent-platform/slash-commands-prompts.png) -<figcaption>Slash Commands menu with filtered Agent Prompts.</figcaption> -</figure> - -### Tips - -* **Context-aware:** Many Slash Commands use your current working directory or file selection as context. -* **Quick access:** Use `/` from anywhere in Agent Mode or Auto-Detection Mode to avoid navigating through menus. - -### Example of using a Slash Command - -Below is an example interaction when `/init` is run: - -<figure> -![/init setup flow; 1 of 2](../../../../assets/agent-platform/init-setup-flow-1.png) -<figcaption>The /init setup flow, step 1 of 2.</figcaption> -</figure> - -<figure> -![/init setup flow; 2 of 2](../../../../assets/agent-platform/init-setup-flow-2.png) -<figcaption>The /init setup flow, step 2 of 2.</figcaption> -</figure> diff --git a/src/content/docs/agent-platform/cli-agents/codex.mdx b/src/content/docs/agent-platform/cli-agents/codex.mdx deleted file mode 100644 index 401fdc42a..000000000 --- a/src/content/docs/agent-platform/cli-agents/codex.mdx +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Codex CLI in Warp -sidebar: - label: "Codex" -description: >- - Set up Codex in Warp with notification support, rich input, code review, and - more. ---- - -Codex is OpenAI's open-source coding agent that runs in your terminal. It can write and edit code, execute commands, and navigate your codebase through natural language. For full documentation, see the [Codex GitHub repository](https://github.com/openai/codex). - -Warp auto-detects Codex when you run it, giving you access to rich input controls, code review, and other integrated features. For a product overview, see [Codex in Warp](https://www.warp.dev/agents/codex). - -For installation, authentication, project configuration, and productivity tips, see the [How to set up Codex CLI](/guides/external-tools/how-to-set-up-codex-cli/) guide. - -:::note -Codex is also available as a harness in Oz for cloud orchestration. See [Codex with Oz](/platform/harnesses/codex/). -::: - -## Setting up notifications - -Codex supports native notifications that Warp surfaces as in-app and desktop alerts — such as when Codex completes a task, encounters an error, or needs your input. - -First, update Codex to the latest version — support for this setting was recently added. See the [Codex upgrade instructions](https://developers.openai.com/codex/cli#upgrade). - -Then add the following to `~/.codex/config.toml`: - -```toml -[tui] -notification_condition = "always" -``` - -Then restart Codex. If this config isn't set, Warp displays a setup chip in the terminal with instructions you can follow directly. - -## Supported Warp features - -Codex supports the full set of Warp's agent integration features: - -* **Agent notifications** - Receive in-app and desktop alerts when Codex needs your attention. Requires a one-time config change (see [Setting up notifications](#setting-up-notifications)). -* **Rich input editor** - Press `Ctrl-G` to open an expanded input editor for composing longer prompts. -* **Code review** - Send inline review comments directly to the agent from Warp's code review panel. -* **Attach code as context** - Select code and send it to the agent as context. -* **Vertical tabs with agent metadata** - Monitor Codex sessions with status indicators in Warp's tab bar. -* **Tab Configs** - Save and restore Codex session configurations. -* **Remote Control** - Share your Codex session with teammates via session sharing. - -## Related pages - -* [How to set up Codex CLI](/guides/external-tools/how-to-set-up-codex-cli/) — step-by-step setup guide -* [Codex in Warp](https://www.warp.dev/agents/codex) — product overview -* [Third-party CLI agents overview](/agent-platform/cli-agents/overview/) — supported CLI agent integrations -* [Codex with Oz](/platform/harnesses/codex/) — Codex as a cloud harness -* [Claude Code](/agent-platform/cli-agents/claude-code/) — Claude Code in Warp -* [OpenCode](/agent-platform/cli-agents/opencode/) — OpenCode in Warp diff --git a/src/content/docs/agent-platform/getting-started/agents-in-warp.mdx b/src/content/docs/agent-platform/getting-started/agents-in-warp.mdx deleted file mode 100644 index 0677b46b4..000000000 --- a/src/content/docs/agent-platform/getting-started/agents-in-warp.mdx +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: Agents in Warp -description: >- - Warp's agents are capable collaborators that help you write code, debug - issues, and complete terminal workflows, all from natural language prompts. ---- -import VideoEmbed from '@components/VideoEmbed.astro'; - -Warp's agents help you write code, debug issues, and complete terminal workflows from natural language prompts. They operate with full context from your codebase, Warp Drive, and connected tools while you control their autonomy, permissions, and model choices. - -<VideoEmbed url="https://youtu.be/qiQtD1jPF6s" title="Agent Mode Overview" /> - -Warp includes powerful coding agents designed to help you build, test, deploy, and debug while keeping you in control. Describe what you want to do in natural language (_you can even use your voice_), and the agent will take action using your environment, codebase, and saved context. - -## What agents can do - -Agents understand your codebase and can execute tasks autonomously while keeping you in control: - -* **Write and edit code** - Create new files, refactor existing code, or make changes across multiple files in your codebase -* **Debug and fix errors** - Analyze stack traces, interpret error output, and apply fixes -* **Run commands** - Execute shell commands and use the output to guide next steps -* **Recover from errors** - Automatically retry failed operations with adjustments -* **Learn tools** - Integrate with any CLI tool by reading its `--help` or public documentation -* **Use your context** - Leverage [Warp Drive](/knowledge-and-collaboration/warp-drive/), [MCP servers](/agent-platform/capabilities/mcp/), [Rules](/agent-platform/capabilities/rules/), and [codebase indexing](/agent-platform/capabilities/codebase-context/) for tailored responses - -**Try this prompt** — [_open in Warp_](https://app.warp.dev/drive/prompt/Clone-and-install-Warps-themes-repository-PkK9Zw16SCD3JKzOUoGuj4) - -```text -Detect my current operating system. Based on that, navigate to the appropriate Warp themes directory (e.g. ~/.warp/ on macOS). - -Then, clone the official Warp themes repository using SSH (git@github.com:warpdotdev/themes.git) into that directory, following the structure and instructions provided in the repo's README. If SSH does not work, try HTTPS (https://github.com/warpdotdev/themes.git) or via the GitHub CLI (gh repo clone warpdotdev/themes). -``` ---- - -## Agent autonomy - -Under **Settings** > **Agents** > **Profiles** > **Permissions**, you can control how much autonomy the agent has when performing different types of actions: - -* Reading files -* Creating plans -* Executing commands -* Calling MCP servers - -For each action, set the autonomy level to: - -* **Let the agent decide** - The agent chooses when to ask for confirmation -* **Always prompt for confirmation** - Require approval before each action -* **Always allow** - Execute without prompting -* **Never** - Disable this action entirely - -You can also configure an **allowlist** and **denylist** for specific commands you always want to run—either with or without confirmation. - ---- - -## Agent profiles - -Profiles let you define different permission and model configurations for different contexts. Create and manage profiles in **Settings** > **Agents** > **Warp Agent**, then switch between them by clicking the profile icon in Warp's input area. - -Common profile patterns: - -* **Default** - Balanced permissions for everyday use -* **YOLO mode** - Loose permissions for personal projects where you want the agent to move fast -* **Prod mode** - Restrictive permissions ("Always Ask") for high-risk environments like production servers - -For more details, see [Agent Profiles & Permissions](/agent-platform/capabilities/agent-profiles-permissions/). - ---- - -## Managing agents - -You can run multiple agents simultaneously in Warp. All active agents—both local conversations and cloud agent runs—are tracked in the [management view](/platform/managing-cloud-agents/). - -Agents notify you when they need input, such as permission to run a command or approval to apply a code diff. This lets you focus on other work, knowing you'll be alerted when your attention is required. - -To access conversations across devices, share them with teammates, or restore past conversations, enable [cloud-synced conversations](/agent-platform/local-agents/cloud-conversations/). - ---- - -## Context and knowledge - -Agents work best when they understand your codebase and workflows. Warp provides several ways to give agents the context they need: - -* [**Codebase Context**](/agent-platform/capabilities/codebase-context/) - Warp indexes your Git-tracked files so agents can search and understand your code -* [**Rules**](/agent-platform/capabilities/rules/) - Define global and project-level guidelines that shape agent behavior -* [**Skills**](/agent-platform/capabilities/skills/) - Reusable instructions that teach agents how to perform specific tasks -* [**MCP Servers**](/agent-platform/capabilities/mcp/) - Connect external tools and data sources (GitHub, Linear, databases) to your agents -* [**Warp Drive**](/knowledge-and-collaboration/warp-drive/) - Save prompts, workflows, and notebooks that agents can reference - ---- - -## Third-party CLI agents - -In addition to Warp's built-in agent, Warp provides first-class support for third-party CLI coding agents like Claude Code, Codex, and OpenCode. Run any supported agent inside Warp and get rich input, code review, agent notifications, vertical tabs with agent metadata, and more. - -→ [Learn about Third-party CLI agents](/agent-platform/cli-agents/overview/) - ---- - -## From local to cloud - -The same agent capabilities that power interactive conversations in Warp also run in the cloud. Cloud agents can: - -* React to events from Slack, Linear, or GitHub -* Run on schedules for recurring tasks like dependency updates -* Execute in parallel across repos or tasks -* Produce tracked, auditable, shareable runs - -Cloud agents are ideal for work that doesn't need your immediate attention—PR reviews, issue triage, routine maintenance, and integration-driven workflows. - -→ [Learn about Cloud Agents](/platform/) - ---- - -## Resources - -* [**Oz web app**](https://oz.warp.dev) - Create runs, manage schedules, browse skills, and configure integrations -* [**Warp Agents overview**](/agent-platform/local-agents/overview/) - Detailed guide to working with agents in Warp -* [**Capabilities**](/agent-platform/capabilities/) - All agent capabilities: planning, task lists, model choice, and more -* [**Oz CLI**](/reference/cli/) - Run agents from the command line -* [**Oz API & SDK**](/reference/api-and-sdk/) - Programmatic access to agent runs diff --git a/src/content/docs/agent-platform/index.mdx b/src/content/docs/agent-platform/index.mdx deleted file mode 100644 index 5041c2197..000000000 --- a/src/content/docs/agent-platform/index.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Agents overview -description: >- - Oz is the orchestration platform for cloud agents, powering both interactive - and autonomous agents for development workflows. ---- - -Warp includes **Oz**, the orchestration platform that powers all of Warp's agents. Oz runs interactive agents locally inside Warp for real-time coding assistance and deploys autonomous agents in the cloud for background automation, event-driven workflows, and parallel execution across repos and teams. - -Warp's client is open source under [AGPL v3](https://github.com/warpdotdev/warp/blob/master/LICENSE-AGPL), so the editor and terminal that host your agents are fully auditable. See [Contributing to Warp](/support-and-community/community/contributing/) for the source and contribution flow. - -With Oz, you can: - -* Run interactive agent conversations in Warp for real-time coding assistance -* Deploy autonomous agents that run in the cloud from triggers, schedules, or integrations -* Coordinate multiple agents concurrently across machines, repos, and teams -* Track, audit, and share agent activity with full visibility into what ran and what it did - -Oz is fully programmable—launch agents manually or build custom logic around them with triggers, schedules, environments, and your choice of hosting (Warp's cloud or your own). - ---- - -## Key capabilities - -* [**Local Agents**](/agent-platform/local-agents/overview/) - Interactive agents embedded in Warp. Use natural language to write code, debug issues, run commands, and automate development tasks with full terminal access. -* [**Third-party CLI agents**](/agent-platform/cli-agents/overview/) - Use Claude Code, Codex, OpenCode, and other CLI coding agents in Warp with rich input, notifications, code review, and remote session control. -* [**Cloud Agents**](/platform/) - Autonomous agents that run in the background in response to system events, schedules, or integrations. -* [**Integrations**](/platform/integrations/) - Connect external system events to autonomous agent execution. Use [Slack](/platform/integrations/slack/), [Linear](/platform/integrations/linear/), [GitHub Actions](/platform/integrations/github-actions/), and other integrations to trigger agents in the cloud. -* [**Oz Platform**](/platform/overview/) - The underlying infrastructure that powers Oz, including the CLI, API/SDK, orchestration layer, environments, secrets, and management/observability. - ---- - -## Getting started - -* [**Agents in Warp**](/agent-platform/getting-started/agents-in-warp/) - Start using agents interactively in Warp -* [**Oz web app**](https://oz.warp.dev) - Create runs, manage schedules, browse skills, and configure integrations -* [**Oz CLI**](/reference/cli/) - Run agents from the command line, in CI, or on remote machines -* [**Oz API & SDK**](/reference/api-and-sdk/) - Programmatically create and monitor agent runs - ---- - -## Learn more - -* [Warp Agents overview](/agent-platform/local-agents/overview/) - Interactive agents in Warp -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) - Claude Code, Codex, OpenCode, and more -* [Cloud Agents overview](/platform/) - Background agents for automation at scale -* [Agent Capabilities](/agent-platform/capabilities/) - Skills, planning, MCP, rules, and more -* [Oz Platform](/platform/overview/) - CLI, API/SDK, orchestration, environments, and hosts -* [Environments](/platform/environments/) - Configure execution context for cloud agents -* [Integrations](/platform/integrations/) - Slack, Linear, GitHub Actions, and custom integrations -* [Skills as Agents](/platform/skills-as-agents/) - Run agents from reusable skill definitions -* [Managing Cloud Agents](/platform/managing-cloud-agents/) - Monitor and manage agent activity diff --git a/src/content/docs/agent-platform/local-agents/agent-context/index.mdx b/src/content/docs/agent-platform/local-agents/agent-context/index.mdx deleted file mode 100644 index 94fdb05fd..000000000 --- a/src/content/docs/agent-platform/local-agents/agent-context/index.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Agent context overview -description: >- - How to attach various forms of multi-modal context directly to Warp's Agent - within a prompt. ---- - -In Warp, you can pass different types of input directly to the Agent to guide its behavior and improve response quality. These inputs are known as **Agent Context**: ad-hoc pieces of information you manually supply during a session. - -**You can attach context in several ways:** - -* [Blocks as Context](/agent-platform/local-agents/agent-context/blocks-as-context/) - share output from your terminal to help the Agent understand errors, logs, or previous commands. -* [Images as Context](/agent-platform/local-agents/agent-context/images-as-context/) - include screenshots, diagrams, or other visuals to provide additional clarity. -* [URLs as Context](/agent-platform/local-agents/agent-context/urls-as-context/) - attach public webpages so the Agent can extract and reference their content. -* [Selection as Context](/agent-platform/local-agents/agent-context/selection-as-context/) - attach code snippets from the editor or review panel to enrich your prompts with precise context. -* [Using @ to Add Context](/agent-platform/local-agents/agent-context/using-to-add-context/) - reference files, folders, code symbols, or Warp Drive objects directly in your prompts. - -Commands you run inside an agent conversation are automatically included as context for your next prompt. For details, see [Blocks as Context](/agent-platform/local-agents/agent-context/blocks-as-context/). - ---- - -This is distinct from other persistent or automatic sources of context, such as [Rules](/agent-platform/capabilities/rules/), [Warp Drive as Agent Mode Context](/knowledge-and-collaboration/warp-drive/agent-mode-context/), and [Model Context Protocol (MCP)](/agent-platform/capabilities/mcp/), which the Agent also uses when available. diff --git a/src/content/docs/agent-platform/local-agents/overview.mdx b/src/content/docs/agent-platform/local-agents/overview.mdx deleted file mode 100644 index e5f9581c5..000000000 --- a/src/content/docs/agent-platform/local-agents/overview.mdx +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Warp Agents overview -description: >- - Powerful AI features like agents, code review, voice, and active AI - recommendations, fully integrated into the Warp Agentic Development - Environment. ---- - -Warp's local agents are interactive agents embedded directly in the terminal that help you write code, debug issues, run commands, and automate development tasks using natural language. Agents operate with full context from your codebase, Warp Drive, and connected tools, while you stay in control of every action. - -## AI in Warp - -Warp includes intelligent agents designed to help you build, test, deploy, and debug while keeping you in control. Interactive agent conversations in Warp can look up commands, execute tasks, fix bugs, and adapt to your workflows. You can manage agent behavior directly, with full context from your Warp Drive and your team. - -:::note -Warp's AI features can be globally disabled in **Settings** > **Agents** > **Warp Agent** with the AI toggle.\ -\ -These features send input data to various LLM providers through their API. 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. Read more about data privacy for Warp features [on our privacy page](https://www.warp.dev/privacy). -::: - -Warp's client is open source under [AGPL v3](https://github.com/warpdotdev/warp/blob/master/LICENSE-AGPL) at [`warpdotdev/warp`](https://github.com/warpdotdev/warp). The agent surface you're reading about is built in the open — see [Contributing to Warp](/support-and-community/community/contributing/) to read the code, file issues, or shape the roadmap. - -## What you can do with agents - -This section covers how to interact with Warp's agents and the capabilities available during agent conversations: - -* [Interacting with Agents](/agent-platform/local-agents/interacting-with-agents/) - Manage AI conversations tied to sessions, attach context, continue previous threads, or start new ones. -* [Agent questions](/agent-platform/local-agents/interacting-with-agents/agent-questions/) - Answer, skip, and configure clarifying questions the Agent asks during a conversation. -* [Agent Context](/agent-platform/local-agents/agent-context/) - Attach images, URLs, files, code blocks, and selections as context for your prompts. -* [Model Choice](/agent-platform/inference/model-choice/) - Pick your preferred LLM from a curated set of top models, or let Warp choose the optimal one. -* [Full Terminal Use](/agent-platform/capabilities/full-terminal-use/) - Let the agent drive interactive terminal apps, seeing live output and running commands. -* [Interactive Code Review](/agent-platform/local-agents/interactive-code-review/) - Review agent-generated diffs, leave inline comments, and have the agent address your feedback. -* [Task Lists](/agent-platform/capabilities/task-lists/) - Track complex workflows with automatic task lists that update progress in real time. -* [Web Search](/agent-platform/capabilities/web-search/) - Allow agents to search the web for up-to-date information. -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) - Run third-party CLI agents like Claude Code and Codex with Warp's built-in agent toolbelt. -* [Active AI Recommendations](/agent-platform/local-agents/active-ai/) - Get proactive fix recommendations based on errors and outputs. -* [Voice](/agent-platform/local-agents/interacting-with-agents/voice/) - Talk to Warp's agent using voice commands. - -For foundational capabilities like planning, rules, MCP servers, and agent profiles, see [Capabilities](/agent-platform/capabilities/). diff --git a/src/content/docs/agent-platform/agent-memory/index.mdx b/src/content/docs/agents/agent-memory/index.mdx similarity index 66% rename from src/content/docs/agent-platform/agent-memory/index.mdx rename to src/content/docs/agents/agent-memory/index.mdx index 923c54af7..6c575a7da 100644 --- a/src/content/docs/agent-platform/agent-memory/index.mdx +++ b/src/content/docs/agents/agent-memory/index.mdx @@ -1,18 +1,19 @@ --- title: Agent Memory (Research Preview) description: >- - Agent Memory gives agents in Oz persistent memory across supported harnesses, + Agent Memory gives agents in Warp persistent memory across supported harnesses, including the Warp Agent, Claude Code, and Codex. sidebar: label: "Agent Memory (Research Preview)" --- +import { VARS } from '@data/vars'; import VideoEmbed from '@components/VideoEmbed.astro'; :::caution Agent Memory is in **research preview** and is enabled per team for design partners. [Join the waitlist](https://www.warp.dev/oz/agent-memory#waitlist) to request access for your team. ::: -Agent Memory is a persistent memory system that lives on Oz and is shared across every supported agent harness, including the built-in Warp Agent, Claude Code, Codex, and others as they're added. Agents read from and write to this memory system as they run, so durable facts, decisions, and outcomes from one conversation are available to the next — regardless of which harness, machine, or teammate triggers the work. +Agent Memory is a persistent memory system that lives on Warp and is shared across every supported agent harness, including the built-in Warp Agent, Claude Code, Codex, and others as they're added. Agents read from and write to this memory system as they run, so durable facts, decisions, and outcomes from one conversation are available to the next — regardless of which harness, machine, or teammate triggers the work. Memory creation and retrieval are asynchronous and run in the background, so they don't consume tokens or add latency to the active task. @@ -27,7 +28,7 @@ Watch this short preview to see Agent Memory in context. * **Cross-harness memory** - One memory system is shared across the Warp Agent, Claude Code, Codex, and other harnesses as they're added. Third-party harnesses are covered when they run as cloud agents. * **Both local and cloud agents** - Supports interactive local agents in Warp and background cloud agents. * **Asynchronous by design** - Memory creation runs after a conversation ends. Retrieval runs in the background during a run. Neither consumes tokens or adds latency to the active task. -* **Automatic memory creation from conversations** - When a conversation ends, Oz extracts durable facts, learnings, and outcomes and writes them as memories. New knowledge merges with existing memories or supersedes them on conflict. +* **Automatic memory creation from conversations** - When a conversation ends, Warp extracts durable facts, learnings, and outcomes and writes them as memories. New knowledge merges with existing memories or supersedes them on conflict. * **Shareable stores** - Memory is organized into stores. A store can be attached to one or more agents, so the same knowledge is available wherever those agents run. To share knowledge across a team, attach a store to an agent the whole team uses. * **Auto-memory for new agents** - New agents get a dedicated, agent-owned memory store by default, so they start building long-term memory from their first run. You can turn this off when you create the agent. * **Per-agent access and instructions** - Attach stores to specific agents with read-only or read-write access. Per-store instructions tell each agent how and when to use the store. @@ -36,7 +37,7 @@ Watch this short preview to see Agent Memory in context. ## Where Agent Memory runs -Agent Memory is part of Oz. Storage, memory creation, and retrieval all run on Oz alongside your agents. The same memory is accessible from any agent you run on Oz: +Agent Memory is part of Warp. Storage, memory creation, and retrieval all run on Warp alongside your agents. The same memory is accessible from any agent you run in Warp: * The local Warp Agent. * Cloud agents triggered from the CLI, web app, schedules, or integrations. @@ -58,7 +59,7 @@ Teams can use multiple stores to keep contexts separate, and attach the same sto ### Auto-memory for new agents -When you create an agent in the Oz web app, **Auto-memory** is on by default. With it enabled, Oz creates a dedicated memory store owned by that agent and uses it as the agent's default long-term memory: the agent reads relevant memories before it acts and writes durable facts, decisions, and preferences for future runs. Each agent has a single auto-memory store. +When you create an agent in the {VARS.WEB_APP}, **Auto-memory** is on by default. With it enabled, Warp creates a dedicated memory store owned by that agent and uses it as the agent's default long-term memory: the agent reads relevant memories before it acts and writes durable facts, decisions, and preferences for future runs. Each agent has a single auto-memory store. Auto-memory is different from automatic memory creation from conversations, described below: auto-memory is the store an agent gets by default, while automatic memory creation from conversations is how memories are written to a store after a conversation ends. @@ -66,15 +67,15 @@ You can turn Auto-memory off when you create the agent, and you can attach exist ## Automatic memory creation from conversations -When a conversation finishes, Oz extracts durable facts, learnings, and outcomes from the transcript and writes them as memories. Memory creation runs in the background after the conversation ends, so it doesn't consume tokens or add latency during that run. +When a conversation finishes, Warp extracts durable facts, learnings, and outcomes from the transcript and writes them as memories. Memory creation runs in the background after the conversation ends, so it doesn't consume tokens or add latency during that run. * **Memories evolve over time** - Agents update and supersede their own memories as new information arrives, including to resolve contradictions with prior memories. -You can also explicitly ask an agent to remember something during a conversation. Oz saves that memory to the appropriate store. +You can also explicitly ask an agent to remember something during a conversation. Warp saves that memory to the appropriate store. ## How agents use memory -When an agent starts a task, Oz searches the stores the agent can access for relevant memories and injects them as context. The search runs in the background, so the agent only sees the memories returned. Agents can also retrieve additional memories on demand mid-conversation when they determine it's relevant, similar to how they consult [Rules](/agent-platform/capabilities/rules/) or [Codebase Context](/agent-platform/capabilities/codebase-context/). You don't need to write retrieval queries or pre-load memory. +When an agent starts a task, Warp searches the stores the agent can access for relevant memories and injects them as context. The search runs in the background, so the agent only sees the memories returned. Agents can also retrieve additional memories on demand mid-conversation when they determine it's relevant, similar to how they consult [Rules](/agents/capabilities/rules/) or [Codebase Context](/agents/capabilities/codebase-context/). You don't need to write retrieval queries or pre-load memory. ## Attaching memory to your agents @@ -84,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 [Oz API](/reference/api-and-sdk/), in addition to managing them in the Oz web app. -* **Self-hosting support** - Run Agent Memory on a [self-hosted Oz](/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}](/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. ## Join the waitlist @@ -93,7 +94,7 @@ Agent Memory is rolling out to design partner teams during research preview. [Jo ## Related pages -* [Codebase Context](/agent-platform/capabilities/codebase-context/) - Let agents understand your codebase through semantic indexing. -* [Rules](/agent-platform/capabilities/rules/) - Define global and project-level guidelines that shape agent behavior. -* [Skills](/agent-platform/capabilities/skills/) - Reusable, scoped instructions that teach agents how to perform specific tasks. -* [Agent profiles and permissions](/agent-platform/capabilities/agent-profiles-permissions/) - Control what permissions and autonomy agents have. +* [Codebase Context](/agents/capabilities/codebase-context/) - Let agents understand your codebase through semantic indexing. +* [Rules](/agents/capabilities/rules/) - Define global and project-level guidelines that shape agent behavior. +* [Skills](/agents/capabilities/skills/) - Reusable, scoped instructions that teach agents how to perform specific tasks. +* [Agent profiles and permissions](/agents/capabilities/agent-profiles-permissions/) - Control what permissions and autonomy agents have. diff --git a/src/content/docs/agent-platform/capabilities/agent-notifications.mdx b/src/content/docs/agents/capabilities/agent-notifications.mdx similarity index 87% rename from src/content/docs/agent-platform/capabilities/agent-notifications.mdx rename to src/content/docs/agents/capabilities/agent-notifications.mdx index 622fe589e..41554eceb 100644 --- a/src/content/docs/agent-platform/capabilities/agent-notifications.mdx +++ b/src/content/docs/agents/capabilities/agent-notifications.mdx @@ -4,6 +4,7 @@ description: >- Warp surfaces notifications from coding agents, both in-app and via desktop alerts, so you know exactly when an agent needs your attention. --- +import { VARS } from '@data/vars'; import VideoEmbed from '@components/VideoEmbed.astro'; Warp delivers notifications from any supported coding agent so you always know when an agent finishes a task, encounters an error, or needs your input. Notifications work whether you're in a different tab or a different app. @@ -88,9 +89,9 @@ For the **Warp Agent**, notifications work out of the box — no setup needed. For **third-party CLI agents**, each agent requires a one-time setup. The process varies by agent: -* **Claude Code** - one-click auto-install via a chip in Warp, or manual plugin commands. See [Claude Code setup](/agent-platform/cli-agents/claude-code/#setting-up-notifications). -* **Codex** - add `notification_condition = "always"` under `[tui]` in `~/.codex/config.toml`, then restart Codex. See [Codex setup](/agent-platform/cli-agents/codex/#setting-up-notifications). -* **OpenCode** - add `"@warp-dot-dev/opencode-warp"` to the `plugin` array in your OpenCode config. See [OpenCode setup](/agent-platform/cli-agents/opencode/#setting-up-notifications). +* **Claude Code** - one-click auto-install via a chip in Warp, or manual plugin commands. See [Claude Code setup](/agents/cli-agents/claude-code/#setting-up-notifications). +* **Codex** - add `notification_condition = "always"` under `[tui]` in `~/.codex/config.toml`, then restart Codex. See [Codex setup](/agents/cli-agents/codex/#setting-up-notifications). +* **OpenCode** - add `"@warp-dot-dev/opencode-warp"` to the `plugin` array in your OpenCode config. See [OpenCode setup](/agents/cli-agents/opencode/#setting-up-notifications). <figure> ![The Enable Claude Code notifications chip in the agent utility bar with a tooltip reading Install the Warp plugin to enable rich agent notifications within Warp](../../../../assets/agent-platform/enable-cli-agent-notifications.png) @@ -106,7 +107,7 @@ In a [multi-agent orchestration](/platform/orchestration/), the parent agent and That means: * **Toasts and the mailbox** - watch the parent's conversation for `Complete`, `Request`, and `Error` notifications. -* **Per-child state** - use the orchestration pill bar above the agent view header (in the Warp app) or the parent's **Sub-agents** tab on the [Runs page](https://oz.warp.dev/runs) (in the Oz web app) to see each child's live status. Both surfaces update as children transition through `INPROGRESS`, `SUCCEEDED`, `BLOCKED`, `FAILED`, `ERROR`, and `CANCELLED`. +* **Per-child state** - use the orchestration pill bar above the agent view header (in the Warp app) or the parent's **Sub-agents** tab on the <a href={`${VARS.WEB_APP_URL}/runs`}>Runs page</a> (in the {VARS.WEB_APP}) to see each child's live status. Both surfaces update as children transition through `INPROGRESS`, `SUCCEEDED`, `BLOCKED`, `FAILED`, `ERROR`, and `CANCELLED`. * **Blocked children** - if a child blocks on user input (for example, a command approval request), open that child from the pill bar to resolve the block. The parent's transcript also reflects the child's `BLOCKED` state so the parent can wait, send a follow-up, or cancel the child. ## Related pages @@ -114,7 +115,7 @@ That means: * [Desktop Notifications](/terminal/more-features/notifications/) - configure system-level notification permissions and troubleshoot delivery * [Managing Agents](/platform/managing-cloud-agents/) - monitor all agent conversations, filter by status, and inspect sessions * [Multi-agent orchestration](/platform/orchestration/) - parent/child model, run state transitions, and the orchestration pill bar -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) - overview of supported CLI agents and Warp features -* [Claude Code](/agent-platform/cli-agents/claude-code/) - setup and notification plugin installation -* [Codex](/agent-platform/cli-agents/codex/) - setup and notification configuration -* [OpenCode](/agent-platform/cli-agents/opencode/) - setup and notification plugin installation +* [Third-party CLI agents](/agents/cli-agents/overview/) - overview of supported CLI agents and Warp features +* [Claude Code](/agents/cli-agents/claude-code/) - setup and notification plugin installation +* [Codex](/agents/cli-agents/codex/) - setup and notification configuration +* [OpenCode](/agents/cli-agents/opencode/) - setup and notification plugin installation diff --git a/src/content/docs/agent-platform/capabilities/agent-profiles-permissions.mdx b/src/content/docs/agents/capabilities/agent-profiles-permissions.mdx similarity index 75% rename from src/content/docs/agent-platform/capabilities/agent-profiles-permissions.mdx rename to src/content/docs/agents/capabilities/agent-profiles-permissions.mdx index 86206f6fe..0880a35cb 100644 --- a/src/content/docs/agent-platform/capabilities/agent-profiles-permissions.mdx +++ b/src/content/docs/agents/capabilities/agent-profiles-permissions.mdx @@ -6,7 +6,7 @@ description: >- --- import { Tabs, TabItem } from '@astrojs/starlight/components'; -Agent Profiles let you configure how Warp's agents behave in different situations, including autonomy level, base model, tool access, and command permissions. Create multiple profiles for different workflows, control which commands run automatically, and set MCP server access rules per profile. +Agent Profiles let you configure how agents behave in different situations, including autonomy level, base model, tool access, and command permissions. Create multiple profiles for different workflows, control which commands run automatically, and set MCP server access rules per profile. ## Agent Profiles @@ -23,7 +23,7 @@ Agent Profiles let you configure how your Agent behaves in different situations. **In each Agent Profile, you can configure:** * The name of the profile -* **Base model**: The core engine for your Agent. It handles most interactions and invokes other models when needed (e.g. for code generation). This model is also used for [Planning](/agent-platform/capabilities/planning/) by default, though you can configure a separate planning model. +* **Base model**: The core engine for your Agent. It handles most interactions and invokes other models when needed (e.g. for code generation). This model is also used for [Planning](/agents/capabilities/planning/) by default, though you can configure a separate planning model. * Agent autonomy and permissions <figure> @@ -36,17 +36,17 @@ Agent Profiles let you configure how your Agent behaves in different situations. Agent Permissions let you define how your Agent in a specific Profile operates — control its autonomy, choose what tools or MCP servers it can access, and set when it should act independently or ask for approval. :::caution -**Still getting approval prompts?** If the Agent keeps asking for permission to run certain commands (like `curl`, `rm`, or `wget`) even though you've set permissions to "Always allow," check your **Command denylist** in **Settings** > **Agents** > **Profiles**. The denylist always takes precedence over other permission settings. Remove commands from the denylist to allow them to auto-execute, or use [Run until completion](#run-until-completion) to bypass the denylist for the current task. +**Still getting approval prompts?** If the Agent keeps asking for permission to run certain commands (like `curl`, `rm`, or `wget`) even though you've set permissions to "Always allow," check your **Command denylist** in **Settings** > **Agents** > **Profiles**. The denylist takes precedence over your other permission settings. Remove commands from the denylist to allow them to auto-execute, or use [Run until completion](#run-until-completion) to bypass the denylist for the current task. ::: -You can control how much autonomy the Agent has when performing different types of actions under **Settings** > **Agents** > **Profiles** > **Permissions** . Agent permission types: +You can control how much autonomy the Agent has when performing different types of actions under **Settings** > **Agents** > **Profiles** > **Permissions**. Agent permission types: * Apply code diffs * Read files * Create plans * Execute commands -* Interact with running commands (via [Full Terminal Use](/agent-platform/capabilities/full-terminal-use/)) -* Ask clarifying questions (via [Agent questions](/agent-platform/local-agents/interacting-with-agents/agent-questions/)) +* Interact with running commands (via [Full Terminal Use](/agents/capabilities/full-terminal-use/)) +* Ask clarifying questions (via [Agent questions](/agents/local-agents/interacting-with-agents/agent-questions/)) <div align="center">![Fine-tuning agent control: This permissions panel lets users customize how much autonomy the Agent has when applying code diffs, reading files, creating plans, and executing commands.](../../../../assets/agent-platform/agent-permissions-with-full-terminal-use.png)</div> @@ -70,7 +70,7 @@ The available settings are: * **Ask unless auto-approve** - The Agent can ask during normal conversations, but questions are skipped while auto-approve is on. * **Always ask** - The Agent can pause for your answer even when auto-approve is on. -For the full user flow, see [Agent questions](/agent-platform/local-agents/interacting-with-agents/agent-questions/). +For the full user flow, see [Agent questions](/agents/local-agents/interacting-with-agents/agent-questions/). ### Command allowlist @@ -98,7 +98,7 @@ For safety, the Agent always prompts for confirmation before executing potential * `rm(\s.*)?` - File deletion * `eval(\s.*)?` - Shell code execution -The denylist takes precedence over both the allowlist and `Agent decides`. If a command matches the denylist, user permission will always be required, regardless of other settings. You can add your own regular expressions to this list in **Settings** > **Agents** > **Profiles** > **Command denylist**. +The denylist takes precedence over both the allowlist and `Agent decides`: if a command matches the denylist, the Agent asks for permission even when that action type is set to **Always allow**. Add your own regular expressions to this list in **Settings** > **Agents** > **Profiles** > **Command denylist**. The one exception is [Run until completion](#run-until-completion), which bypasses your denylist by default. ### MCP permissions @@ -116,7 +116,7 @@ In this settings menu, you can configure which MCP servers the Agent is allowed </figure> :::note -To learn how to build and configure your own MCP server, check out the [MCP feature docs](/agent-platform/capabilities/mcp/). +To learn how to build and configure your own MCP server, check out the [MCP feature docs](/agents/capabilities/mcp/). ::: ## Run until completion @@ -140,8 +140,10 @@ During an Agent interaction, you can give the Agent full autonomy for the curren <figcaption>Auto-approve and take-over controls.</figcaption> </figure> -:::note -_Run until completion_ ignores the denylist entirely. It's the purest form of “YOLO” mode and essentially a fully "autonomous mode" where the Agent proceeds without asking for confirmation. +:::caution +_Run until completion_ is the purest form of “YOLO” mode: the Agent proceeds without asking for confirmation, and by default it also runs commands that match your command denylist. + +To keep your denylist in force during _Run until completion_, turn off **Allow auto-approve to bypass command denylist** in **Settings** > **Agents** > **Warp Agent** > **Input**. Denylist rules your team enforces through the [Admin Panel](/enterprise/team-management/admin-panel/) always require approval and are never bypassed. ::: --- @@ -150,6 +152,6 @@ _Run until completion_ ignores the denylist entirely. It's the purest form of Once you've configured how your agent operates, try giving it a larger task to plan and execute. -* **[Planning](/agent-platform/capabilities/planning/)** - Break down complex tasks into structured, executable plans that the agent runs step by step. -* **[Code diffs](/agent-platform/local-agents/code-diffs/)** - Review, refine, and apply code changes the agent generates. -* **[Interactive Code Review](/agent-platform/local-agents/interactive-code-review/)** - Leave inline comments on agent-generated diffs and have the agent address your feedback. +* **[Planning](/agents/capabilities/planning/)** - Break down complex tasks into structured, executable plans that the agent runs step by step. +* **[Code diffs](/agents/local-agents/code-diffs/)** - Review, refine, and apply code changes the agent generates. +* **[Interactive Code Review](/agents/local-agents/interactive-code-review/)** - Leave inline comments on agent-generated diffs and have the agent address your feedback. diff --git a/src/content/docs/agent-platform/capabilities/codebase-context.mdx b/src/content/docs/agents/capabilities/codebase-context.mdx similarity index 98% rename from src/content/docs/agent-platform/capabilities/codebase-context.mdx rename to src/content/docs/agents/capabilities/codebase-context.mdx index 7f4d0b033..774c7769d 100644 --- a/src/content/docs/agent-platform/capabilities/codebase-context.mdx +++ b/src/content/docs/agents/capabilities/codebase-context.mdx @@ -145,4 +145,4 @@ With your codebase indexed, you can browse your project directly in Warp and sta * **[File Tree](/code/code-editor/file-tree/)** - Browse your project structure in Warp's sidebar and open files directly. * **[Code editor](/code/code-editor/)** - Edit files with syntax highlighting, LSP support, and find-and-replace without leaving Warp. -* **[Agent profiles and permissions](/agent-platform/capabilities/agent-profiles-permissions/)** - Configure how much autonomy the agent has when working with your code. +* **[Agent profiles and permissions](/agents/capabilities/agent-profiles-permissions/)** - Configure how much autonomy the agent has when working with your code. diff --git a/src/content/docs/agents/capabilities/computer-use/artifacts-in-prs.mdx b/src/content/docs/agents/capabilities/computer-use/artifacts-in-prs.mdx new file mode 100644 index 000000000..dae1301f0 --- /dev/null +++ b/src/content/docs/agents/capabilities/computer-use/artifacts-in-prs.mdx @@ -0,0 +1,60 @@ +--- +title: Screenshots and videos in pull requests +sidebar: + label: "Screenshots and videos in PRs" +description: >- + Cloud agents automatically attach Computer Use screenshots and video + recordings to pull request descriptions, giving reviewers visual proof + without extra steps. +--- + +import { VARS } from '@data/vars'; + +When a cloud agent run opens or updates a pull request, the screenshots and video recordings it captured with [Computer Use](/agents/capabilities/computer-use/) are attached to the PR description automatically. Reviewers get visual proof of the change — a rendered UI state, a recorded flow, a bug reproduction — without leaving the pull request. + +## What gets attached + +* **Screenshots** - UI states the agent captures during its Computer Use session. Up to 10 screenshots are attached per pull request. +* **Video recordings** - Session recordings the agent produces. See [Testing and recordings](/agents/capabilities/computer-use/testing-and-recordings/) for how recordings are captured and processed. + +Attachment is automatic: once a screenshot or recording artifact is associated with the run, the agent includes it the next time it creates or updates a pull request. You can encourage captures in your prompt — for example, "take screenshots of the before and after states" or "record the flow and attach it to the PR." + +## Attachment modes + +A team-level setting controls how artifacts are attached: + +* **Link only (default)** - Screenshots and recordings are attached as links to the run's page in the {VARS.WEB_APP}. Artifacts stay private: opening a link requires access to the run. +* **Embed** - Screenshots render inline as images in the PR description, and recordings are attached as direct download links. To make this work, the attached artifacts are published at stable, publicly accessible URLs. +* **Disabled** - No screenshots or recordings are attached to pull requests. + +:::caution +In **Embed** mode, attached screenshots and recordings become publicly downloadable by anyone with the URL — including anyone who can read the PR description. Use **Link only** if your Computer Use sessions may capture content that shouldn't leave your team. +::: + +### Changing the attachment mode + +Team admins control the attachment mode from the [Admin Panel](https://app.warp.dev/admin/): + +1. In the Admin Panel sidebar, select your team under **Team admin**. +2. Click the **Platform** tab. +3. Under **Pull request artifact attachments**, choose **Disabled**, **Link only**, or **Embed**. + +<figure> +![Pull request artifact attachments setting in the Admin Panel Platform tab, with the Disabled, Link only, and Embed options open](../../../../../assets/agent-platform/admin-panel-pr-artifact-attachments.png) +<figcaption>The Pull request artifact attachments setting in the Admin Panel.</figcaption> +</figure> + +## Where else artifacts appear + +Pull requests aren't the only place captures end up: + +* **In the conversation** - Screenshots and recordings appear as blocks in the agent's conversation as they're captured. +* **On the run page** - Open the run in the [{VARS.WEB_APP}](/platform/oz-web-app/#runs) to view, play, or download all artifacts the run produced. + +## Related pages + +* [Computer Use](/agents/capabilities/computer-use/) - Control Computer Use and understand security considerations. +* [Testing and recordings](/agents/capabilities/computer-use/testing-and-recordings/) - How the recording pipeline works and what finished videos contain. +* [Admin Panel for teams](/enterprise/team-management/admin-panel/) - The full reference for team settings, including the Platform section. +* [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/) - Open and inspect cloud agent run transcripts. +* [Privacy](/support-and-community/privacy-and-security/privacy/) - Warp's data handling policies, including how run artifacts are stored. diff --git a/src/content/docs/agents/capabilities/computer-use/browser-use.mdx b/src/content/docs/agents/capabilities/computer-use/browser-use.mdx new file mode 100644 index 000000000..2b494fba0 --- /dev/null +++ b/src/content/docs/agents/capabilities/computer-use/browser-use.mdx @@ -0,0 +1,55 @@ +--- +title: Browser use for agents +sidebar: + label: "Browser use" +description: >- + Computer Use environments include bundled Chromium and the Playwright CLI, + so agents can test web apps and browse without extra setup. +--- + +Agents with [Computer Use](/agents/capabilities/computer-use/) enabled can drive a real browser inside their sandboxed cloud environment — opening web apps, exercising flows, filling forms, and verifying what renders on screen. Every Computer Use environment includes a browser out of the box, so browser-based tasks work without any changes to your [environment configuration](/platform/environments/). + +## The bundled browser + +Computer Use environments ship with a bundled Chromium browser that runs on any environment base image — you don't need to install Chrome, Firefox, or any browser dependencies yourself. + +* **Available as `chromium`** - The browser is on the agent's `PATH` as `chromium`, and the `CHROMIUM_BIN` and `BROWSER` environment variables point to it. +* **Your own browser wins** - If your environment's base image already provides a browser, the agent uses that instead of the bundled one. + +## Two ways to drive the browser + +Agents can interact with the browser in two complementary ways, and choose the right one for each task: + +* **Visual interaction** - The agent takes screenshots, then clicks, types, and scrolls like a person would. This is the right mode for verifying what a user actually sees: layout, styling, visual regressions, and rendering issues. +* **Scripted control with Playwright** - Computer Use environments also bundle the Playwright CLI (`playwright-cli`), which lets the agent drive the browser through shell commands — navigating to URLs, clicking elements, filling forms, and reading page content — without taking a screenshot for every step. Scripted control is faster and more token-efficient for functional flows, like stepping through a multi-page form or asserting that an element exists. + +You don't need to tell the agent which mode to use, but you can steer it in your prompt — for example, "verify the layout visually" or "use Playwright to step through the signup flow." + +The bundled Playwright CLI drives the bundled Chromium rather than downloading its own browser build, so it works on base images that don't provide Playwright's system dependencies. + +### Attaching to a running browser + +For advanced workflows, the agent can attach the Playwright CLI to a browser it launched manually with a Chrome DevTools Protocol (CDP) endpoint: + +```bash +chromium --remote-debugging-port=9222 +playwright-cli attach --cdp=http://localhost:9222 +``` + +This is useful when a task needs to set up specific browser state (for example, launching with custom flags) before scripted control takes over. + +:::caution +Browsing the open internet is where Computer Use risks are highest. Prefer non-root containers, which let Chromium run its own process sandbox properly, and consider restricting your environment's internet access to an allowlist of known-safe domains. See the [security considerations for Computer Use](/agents/capabilities/computer-use/#security-considerations). +::: + +## Example workflows + +* **Test a web app end-to-end** - "Start the dev server, then walk through the checkout flow in the browser and verify each step works." +* **Verify a UI change visually** - "Open the settings page and confirm the new toggle renders correctly in both light and dark mode." +* **Automate a web task** - "Fill out the staging signup form with test data and confirm the verification email screen appears." + +## Related pages + +* [Computer Use](/agents/capabilities/computer-use/) - Control Computer Use and understand how the sandbox works. +* [Testing and recordings](/agents/capabilities/computer-use/testing-and-recordings/) - Record browser sessions as annotated videos for review. +* [Environments](/platform/environments/) - Configure the cloud environment your agents run in. diff --git a/src/content/docs/agents/capabilities/computer-use/index.mdx b/src/content/docs/agents/capabilities/computer-use/index.mdx new file mode 100644 index 000000000..3543f8a41 --- /dev/null +++ b/src/content/docs/agents/capabilities/computer-use/index.mdx @@ -0,0 +1,137 @@ +--- +title: Computer Use for agents +sidebar: + label: "Computer Use" +description: >- + Let agents interact with desktop GUIs in sandboxed cloud environments for + automated UI testing and validation. +--- + +import { VARS } from '@data/vars'; + +Computer Use enables agents to interact with desktop environments. The agent can see what's displayed on screen, click and drag, type text, use keyboard shortcuts, and perform other GUI interactions—all within a secure, isolated sandbox. + +A key use case is **testing UI changes** with a self-contained feedback loop, where the agent can verify that your code changes produce the expected visual and behavioral results without requiring manual testing. + +## Capabilities + +With Computer Use, agents can: + +* **Take screenshots** - Capture and analyze the current display +* **Record video** - Capture sessions as annotated video recordings; see [Testing and recordings](/agents/capabilities/computer-use/testing-and-recordings/) +* **Interact with applications** - Click buttons, fill forms, navigate interfaces +* **Type and control keyboard** - Enter text and use keyboard shortcuts +* **Automate testing workflows** - Test UI changes end-to-end without manual intervention +* **Work with browser-based interfaces** - Test web apps and navigate the web + +Computer Use is only available in Warp's sandboxed cloud environments, not in local interactive terminal sessions. + +## In this section + +* [Browser use](/agents/capabilities/computer-use/browser-use/) - Drive the bundled Chromium browser, visually or with scripted Playwright commands. +* [Testing and recordings](/agents/capabilities/computer-use/testing-and-recordings/) - Validate changes end-to-end and capture annotated video recordings as proof. +* [Screenshots and videos in pull requests](/agents/capabilities/computer-use/artifacts-in-prs/) - Attach captured screenshots and recordings to pull request descriptions automatically. + +--- + +## Enabling Computer Use + +Computer Use is **enabled by default** for cloud agent runs on Warp's built-in harness: when a run's configuration doesn't specify a Computer Use setting, the agent runs with Computer Use available. Runs on third-party harnesses (Claude Code, Gemini, Codex) default to Computer Use disabled because third-party harnesses don't integrate with Warp's Computer Use tooling. You can control Computer Use per run or per configuration through several entry points: + +### Warp app settings + +Runs started from the Warp app don't use the server default: they always follow the app's **Computer use in Cloud Agents** setting ([`cloud_agent_computer_use_enabled`](/terminal/settings/all-settings/)), which is off by default. To control Computer Use for [Cloud Agents](/platform/) started from the Warp app, navigate to **Settings** > **Agents** > **Warp Agent** > **Experimental** > **Computer use in Cloud Agents**. + +### CLI + +When running cloud agents with the [{VARS.WARP_AGENT_CLI}](/reference/cli/), use flags to control Computer Use per run: + +```bash +oz agent run-cloud --computer-use --prompt "<task>" +oz agent run-cloud --no-computer-use --prompt "<task>" +``` + +### 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: + +```json +{ + "prompt": "Build a button component that matches this design, then test it in the browser", + "config": { + "computer_use_enabled": false, + "environment_id": "optional-environment-id" + } +} +``` + +For full API documentation, see the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) reference. + +### Web app + +In the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a>, you can enable or disable Computer Use for: + +* **New agent runs** - Configure Computer Use when starting a new agent run from the web app +* **Scheduled agent runs** - Enable Computer Use for scheduled agents managed from the web app +* **Integrations** - Configure Computer Use for Slack, Linear, and other integration-triggered agents + +--- + +## How Computer Use works + +### Setup and requirements + +Computer Use runs in a containerized sandbox, allowing headless cloud environments to render and interact with graphical applications. The sandbox is fully isolated—it does not have access to your local machine, credentials, or sensitive data outside the sandbox environment. + +Your cloud environment must include any desktop applications you want the agent to control in your [environment configuration](/platform/environments/). Browser-based tasks need no extra setup: every Computer Use environment includes a bundled Chromium browser. Learn more in [Browser use](/agents/capabilities/computer-use/browser-use/). + +### Model selection + +Computer Use currently supports Anthropic Claude models. Warp uses an auto model selector to choose the best-suited model for each Computer Use task. + +--- + +## Recording sessions + +Agents can record their Computer Use sessions as annotated video artifacts — capturing clicks, key presses, and cursor movement alongside the interaction, with idle time trimmed out. Recordings are captured entirely inside the sandbox and never include your local desktop or credentials. + +For the recording pipeline, what the finished video contains, and where to find recordings, see [Testing and recordings](/agents/capabilities/computer-use/testing-and-recordings/). For how recordings and screenshots land on pull requests, see [Screenshots and videos in pull requests](/agents/capabilities/computer-use/artifacts-in-prs/). + +--- + +## Security considerations + +Computer Use comes with unique security considerations. These risks are heightened when interacting with the internet. + +To minimize risks when using Computer Use: + +* **Avoid sensitive data** - Do not pass API keys, authentication tokens, or personal information to agents using Computer Use +* **Limit internet access** - If your environment has internet access, consider restricting to an allowlist of known-safe domains +* **Require human confirmation** - For tasks with real-world consequences (e.g., financial transactions, accepting legal terms), ask a human to confirm before the agent proceeds +* **Review agent actions** - Regularly review what agents are doing on your behalf, especially when testing new workflows + +--- + +## Example workflows + +### Testing UI changes + +Verify that code changes produce the expected visual results and behavior: + +* **Build from mockups** - Receive a Figma design or mockup image, build the UI, and test it matches +* **Visual regression testing** - After code changes, verify UI renders correctly +* **Form and interaction testing** - Test form submissions, validation, error handling +* **Responsive design validation** - Test layout on different screen sizes + +For complete end-to-end examples with demo recordings — validating UI changes, QA of critical flows, and bug reproduction — see [Testing and recordings](/agents/capabilities/computer-use/testing-and-recordings/). + +### Browsing and web interaction + +Computer Use can also help with general web tasks: browsing websites, filling out and submitting forms, and navigating multi-step workflows in web applications. See [Browser use](/agents/capabilities/computer-use/browser-use/) for how agents drive the browser. + +--- + +## Related capabilities + +* [Images as Context](/agents/local-agents/agent-context/images-as-context/) - Pass design mockups and screenshots as context +* [Full Terminal Use](/agents/capabilities/full-terminal-use/) - Let agents drive interactive terminal apps, see live output, and run commands diff --git a/src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx b/src/content/docs/agents/capabilities/computer-use/testing-and-recordings.mdx similarity index 71% rename from src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx rename to src/content/docs/agents/capabilities/computer-use/testing-and-recordings.mdx index b50333de7..6155e2b41 100644 --- a/src/content/docs/agent-platform/capabilities/computer-use-testing-and-recordings.mdx +++ b/src/content/docs/agents/capabilities/computer-use/testing-and-recordings.mdx @@ -3,16 +3,15 @@ title: Testing with Computer Use and video recordings sidebar: label: "Testing and recordings" description: >- - Agents can drive a real desktop UI in an isolated sandbox, record the session, - and give you a watchable video as proof, covering UI change validation, - end-to-end QA, and bug reproduction. + Use Computer Use to test desktop UIs in a sandbox and capture annotated + recordings for UI validation, end-to-end QA, and bug reproduction. --- import { VARS } from '@data/vars'; import DemoVideo from '@components/DemoVideo.astro'; import VideoEmbed from '@components/VideoEmbed.astro'; -Agents don't just write code; with [Computer Use](/agent-platform/capabilities/computer-use/) enabled they can drive a real desktop GUI in an isolated sandbox, record everything they do, and hand you a trimmed, annotated video as concrete proof of the result. +Agents don't just write code; with [Computer Use](/agents/capabilities/computer-use/) enabled they can drive a real desktop GUI in an isolated sandbox, record everything they do, and hand you a trimmed, annotated video as concrete proof of the result. This page explains when to use Computer Use with recordings, how the recording pipeline works, where your recordings end up, what the finished video contains, and how to handle common recording failures. @@ -32,11 +31,11 @@ You don't need to ask the agent to record explicitly. Prompts like "test this ch ## How it works -1. **Enable Computer Use.** The agent needs Computer Use enabled for its run. See the [Computer Use](/agent-platform/capabilities/computer-use/#enabling-computer-use) page for how to enable it via the Warp app, the CLI, or the API. +1. **Confirm Computer Use is enabled.** Computer Use is enabled by default for cloud agent runs on Warp's built-in harness, so no setup is needed unless it was turned off for your run. See the [Computer Use](/agents/capabilities/computer-use/#enabling-computer-use) page for how to control it via the Warp app, the {VARS.WARP_AGENT_CLI}, or the {VARS.WARP_AUTOMATION_PLATFORM} API. 2. **Agent starts recording.** Once Computer Use is active, the agent begins a screen capture inside the sandbox. The recording is gated by your session's Computer Use approval. If you've already approved Computer Use for the run, recording starts automatically without a separate prompt. 3. **Agent exercises the UI.** The agent takes screenshots, clicks, types, scrolls, and drives the interface. Each successful interaction is tracked: when it started, when it finished, what actions it contained, and where the cursor moved. 4. **Agent stops and processes.** When the task is complete (or when the recording's configured time or size limit is reached), the agent stops capture. Before upload, the recording is post-processed: idle and thinking gaps are cut, leaving only the windows where real interaction happened, and action overlays are burned in so the video is annotated. -5. **Artifact is published.** The processed video is uploaded as a run artifact and made available in the conversation, on the run page, and in the pull request description when the agent opens or updates a PR. +5. **Artifact is published.** The processed video is uploaded as a run artifact, ready to view wherever the run's artifacts appear. ## Where to find recordings @@ -44,22 +43,22 @@ You don't need to ask the agent to record explicitly. Prompts like "test this ch After the agent finishes its Computer Use session, any video recording appears as a block in the conversation. Clicking the block opens the full conversation view alongside the recording artifact. If the recording was produced by a cloud agent run, you can also access it by opening that run's transcript as a [cloud-synced conversation](/platform/viewing-cloud-agent-runs/). -### On the Oz web run page +### In the web app Cloud agent runs are listed on the [Runs page of the {VARS.WEB_APP}](/platform/oz-web-app/#runs). Open a run to see its artifacts section, which lists any video recordings produced during that run. You can play the video directly from the run page or download it. ### On pull requests -When a cloud agent run produces video recordings, those recordings are attached to the PR description as links alongside the agent's summary. The attachment is automatic once the recording artifact is associated with the run; no extra steps are needed from you. +Recordings are also attached to the PR description when the agent opens or updates a pull request — see [Screenshots and videos in pull requests](/agents/capabilities/computer-use/artifacts-in-prs/). ## What's in a recording -The finished video is not raw screen capture. After the agent stops recording, the client post-processes the video before uploading it: +The finished video is not raw screen capture. After the agent stops recording, Warp post-processes the video before uploading it: -- **Smart cut of idle and thinking time.** Gaps where the agent is planning, waiting on a network call, or idle between actions are removed. What remains are only the windows where real interaction happened, played back at normal speed. This makes recordings significantly shorter than the raw capture duration. -- **Action overlays.** Each interaction is burned into the video as overlay pills. Keyboard shortcuts (such as `Ctrl+C`, `Return`, or `Escape`) appear as labels on the frame where they were pressed, so non-visible keys like modifier chords show up clearly. Text typing is labeled "typing…" to avoid leaking sensitive input. Scroll events show a directional label. -- **Click ripples and drag trails.** Pointer events (mouse clicks, drags, and moves) are captured with their coordinates and burned into the video as click ripples and movement trails, so cursor activity is visible even when the cursor itself is small on screen. -- **Sandbox-only capture.** The recording is taken from inside the isolated sandbox environment. It never captures your local desktop, terminal, credentials, or anything outside the sandbox. +- **Smart cut of idle and thinking time** - Gaps where the agent is planning, waiting on a network call, or idle between actions are removed. What remains are only the windows where real interaction happened, played back at normal speed. This makes recordings significantly shorter than the raw capture duration. +- **Action overlays** - Each interaction is burned into the video as overlay pills. Keyboard shortcuts (such as `Ctrl+C`, `Return`, or `Escape`) appear as labels on the frame where they were pressed, so non-visible keys like modifier chords show up clearly. Text typing is labeled "typing…" to avoid leaking sensitive input. Scroll events show a directional label. +- **Click ripples and drag trails** - Pointer events (mouse clicks, drags, and moves) are captured with their coordinates and burned into the video as click ripples and movement trails, so cursor activity is visible even when the cursor itself is small on screen. +- **Sandbox-only capture** - The recording is taken from inside the isolated sandbox environment. It never captures your local desktop, terminal, credentials, or anything outside the sandbox. :::note Post-processing is best-effort: if the cut or overlay burn-in step fails for any reason, the original capture is uploaded without annotations. You still get a video, just without the smart cut or overlay pills. @@ -82,7 +81,7 @@ The finished recording is attached to the pull request, giving a reviewer proof ### End-to-end QA of an existing flow -An agent walks through a critical user journey, such as the "New run" creation flow in the Oz web app, capturing the complete interaction. +An agent walks through a critical user journey, such as the "New run" creation flow in the {VARS.WEB_APP}, capturing the complete interaction. Example prompt: ```text @@ -91,7 +90,7 @@ Build the Oz web app and walk through the entire "New run" creation flow end to This gives you a reproducible, time-stamped clip of the flow that can be archived, diffed across releases, or shared with the team as a baseline. -<DemoVideo src="/assets/agent-platform/new-run-demo.mp4" label="Agent walking through the New run creation flow in the Oz web app with Computer Use" /> +<DemoVideo src="/assets/agent-platform/new-run-demo.mp4" label={`Agent walking through the New run creation flow in the ${VARS.WEB_APP} with Computer Use`} /> ### Reproducing a bug @@ -123,7 +122,8 @@ Most recording failures are transient. If a recording fails or produces an unexp ## Related -- [Computer Use](/agent-platform/capabilities/computer-use/) - enable Computer Use, understand security considerations, and configure models for Computer Use sessions. +- [Computer Use](/agents/capabilities/computer-use/) - enable Computer Use, understand security considerations, and configure models for Computer Use sessions. +- [Screenshots and videos in pull requests](/agents/capabilities/computer-use/artifacts-in-prs/) - how captured artifacts are attached to PR descriptions and the team setting that controls it. - [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/) - open and inspect cloud agent run transcripts in Warp or the browser. -- [Security considerations](/agent-platform/capabilities/computer-use/#security-considerations) - understand the sandboxed environment and data isolation model. +- [Security considerations](/agents/capabilities/computer-use/#security-considerations) - understand the sandboxed environment and data isolation model. - [Privacy](/support-and-community/privacy-and-security/privacy/) - Warp's data handling policies, including how run artifacts are stored. diff --git a/src/content/docs/agent-platform/capabilities/full-terminal-use.mdx b/src/content/docs/agents/capabilities/full-terminal-use.mdx similarity index 95% rename from src/content/docs/agent-platform/capabilities/full-terminal-use.mdx rename to src/content/docs/agents/capabilities/full-terminal-use.mdx index f4fb8e0f9..6a46f6dee 100644 --- a/src/content/docs/agent-platform/capabilities/full-terminal-use.mdx +++ b/src/content/docs/agents/capabilities/full-terminal-use.mdx @@ -1,13 +1,14 @@ --- title: Full Terminal Use description: >- - Full Terminal Use means Warp's agents can interact with active terminal apps + Full Terminal Use means agents can interact with active terminal apps to monitor live output and run commands. --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import { VARS } from '@data/vars'; import VideoEmbed from '@components/VideoEmbed.astro'; -Full Terminal Use lets Warp's agent operate directly inside interactive terminal applications like database shells, debuggers, text editors, and long-running servers. The agent can see the live terminal buffer, write commands, respond to prompts, and hand control back to you at any time. +Full Terminal Use lets the Warp Agent operate directly inside interactive terminal applications like database shells, debuggers, text editors, and long-running servers. The agent can see the live terminal buffer, write commands, respond to prompts, and hand control back to you at any time. The agent can see the live terminal buffer (terminal state), write to the PTY to run commands, respond to prompts, and continue working inside the running process while you stay in control. @@ -15,7 +16,7 @@ The agent can see the live terminal buffer (terminal state), write to the PTY to ## Overview -With Full Terminal Use, Warp’s agent can attach to interactive tools like `psql`, `vim`, `python`, `gdb`, `top`, or your dev server, read the terminal output as it changes, and interact with the application as if you were typing. +With Full Terminal Use, the Warp Agent can attach to interactive tools like `psql`, `vim`, `python`, `gdb`, `top`, or your dev server, read the terminal output as it changes, and interact with the application as if you were typing. You can either ask the agent to start an interactive program, or you can start it yourself and then tag the agent in once the tool is already running. In both cases, the agent sees the same terminal buffer (and PTY session) you do and can act on it. @@ -102,7 +103,7 @@ This makes it easy to: When the agent starts a long-running command itself, prompts you submit while it drives that command are queued by default instead of steering the agent mid-command. They appear in the queued prompts panel with a *(queued until the command finishes)* suffix, and Warp sends them to the agent automatically when the command finishes. This applies only to commands the agent started; if you start a command and tag the agent in, your prompts keep steering the agent immediately. -To steer the agent immediately during an agent-started command, toggle auto-queue off for the remainder of the command, or change the **Default long-running command submission mode** setting in the Warp app under **Settings** > **Agents** > **Warp Agent** > **Input**. For the full behavior, including the setting's options and when it applies, see [Queueing during long-running commands](/agent-platform/local-agents/interacting-with-agents/prompt-queueing/#queueing-during-long-running-commands). +To steer the agent immediately during an agent-started command, toggle auto-queue off for the remainder of the command, or change the **Default long-running command submission mode** setting in the Warp app under **Settings** > **Agents** > **Warp Agent** > **Input**. For the full behavior, including the setting's options and when it applies, see [Queueing during long-running commands](/agents/local-agents/interacting-with-agents/prompt-queueing/#queueing-during-long-running-commands). #### Long-running commands in terminal vs agent view @@ -175,7 +176,7 @@ This lets you tighten or loosen control for the current task: #### Global permission settings -You can configure global defaults from your [Agent Profiles & Permissions](/agent-platform/capabilities/agent-profiles-permissions/) settings: +You can configure global defaults from your [Agent Profiles & Permissions](/agents/capabilities/agent-profiles-permissions/) settings: * **Ask on first write**: The first write to a shell process requires approval. After that, all subsequent writes for that specific process/command will be approved. * **Always ask**: Every write to the shell process from the agent requires your explicit approval. @@ -191,7 +192,7 @@ These settings apply to every session that uses Full Terminal Use. You can still All AI interactions from Full Terminal Use consume [credits](/support-and-community/plans-and-billing/credits/), including understanding your natural language requests. -Credits are consumed in a similar way as other Oz actions that use the same model and a similar context size. +Credits are consumed in a similar way as other Warp actions that use the same model and a similar context size. **Interactive sessions can consume more credits if:** diff --git a/src/content/docs/agents/capabilities/index.mdx b/src/content/docs/agents/capabilities/index.mdx new file mode 100644 index 000000000..1c72fb187 --- /dev/null +++ b/src/content/docs/agents/capabilities/index.mdx @@ -0,0 +1,27 @@ +--- +title: Capabilities overview +description: >- + Core capabilities and configuration options that shape how agents behave, + what context they have access to, and how they execute tasks. +--- + +Agent capabilities are the core building blocks that define how agents operate, including the context sources agents can access, the rules that guide their behavior, the tools they can use, and the models they run on. Configure these capabilities to match your workflows and preferences. + +## Capabilities in this section + +* [Slash Commands](/agents/capabilities/slash-commands/) - Quick actions and saved prompts accessible by typing `/` in Agent Mode. +* [Skills](/agents/capabilities/skills/) - Reusable, scoped instructions that teach agents how to perform specific tasks in your codebase. +* [Planning](/agents/capabilities/planning/) - Turn agent requests into organized, editable plans that execute step-by-step with full visibility. +* [Task Lists](/agents/capabilities/task-lists/) - Track complex workflows with automatic task lists that update progress in real time. +* [Rules](/agents/capabilities/rules/) - Define global and project-level guidelines that shape agent behavior and responses. +* [Full Terminal Use](/agents/capabilities/full-terminal-use/) - Let the agent drive interactive terminal apps, seeing live output and running commands. +* [Computer Use](/agents/capabilities/computer-use/) - Let agents interact with desktop environments by taking screenshots, clicking, typing, and controlling the GUI. +* [MCP](/agents/capabilities/mcp/) - Connect external data sources and tools to agents via the Model Context Protocol. +* [Codebase Context](/agents/capabilities/codebase-context/) - Let agents understand your codebase through semantic indexing of your Git-tracked files. +* [Agent Profiles & Permissions](/agents/capabilities/agent-profiles-permissions/) - Control what permissions and autonomy agents have to run commands and apply changes. +* [Web Search](/agents/capabilities/web-search/) - Allow agents to search the web for up-to-date information. + +## Related + +* [Inference & providers](/agents/inference/model-choice/) - Pick the model that powers your agents, bring your own API key, or connect a custom inference endpoint. +* [Agents overview](/agents/) - What the Warp Agent does, how to control it, and where to run it. diff --git a/src/content/docs/agent-platform/capabilities/mcp.mdx b/src/content/docs/agents/capabilities/mcp.mdx similarity index 94% rename from src/content/docs/agent-platform/capabilities/mcp.mdx rename to src/content/docs/agents/capabilities/mcp.mdx index 6a1e1bfd2..969518a7f 100644 --- a/src/content/docs/agent-platform/capabilities/mcp.mdx +++ b/src/content/docs/agents/capabilities/mcp.mdx @@ -7,7 +7,7 @@ description: >- import { Tabs, TabItem } from '@astrojs/starlight/components'; import DemoVideo from '@components/DemoVideo.astro'; -MCP servers extend Warp's [local agents](/agent-platform/local-agents/interacting-with-agents/) in a modular, flexible way by exposing custom tools or data sources through a standardized interface — essentially acting as plugins for Warp. Warp supports a variety of connection protocols, including Streamable HTTP and SSE, along with custom headers and environment variables. +MCP servers extend Warp's [local agents](/agents/local-agents/interacting-with-agents/) in a modular, flexible way by exposing custom tools or data sources through a standardized interface — essentially acting as plugins for Warp. Warp supports a variety of connection protocols, including Streamable HTTP and SSE, along with custom headers and environment variables. MCP is an open source protocol. Check out the official [MCP documentation](https://modelcontextprotocol.io/introduction) for more detailed information on how this protocol is engineered. @@ -107,7 +107,7 @@ To add multiple MCP servers, you can click the **+ Add** button then paste in a Compared to manually adding a server in the Warp settings, file-based servers are defined in config files that Warp detects and can spawn automatically. They offer a few additional benefits: -* **Configurable directly with an agent** - Use the [bundled skill](#using-agent-add-mcp) `/agent-add-mcp` so Warp's agent can add or update an MCP server without leaving the conversation. +* **Configurable directly with an agent** - Use the [bundled skill](#using-agent-add-mcp) `/agent-add-mcp` so the Warp Agent can add or update an MCP server without leaving the conversation. * **Inherited across providers and repos** - Warp reads `.warp/.mcp.json` files and also picks up config from third-party agent providers (Claude Code, Codex, and others). The same server definition follows you across tools and repos. #### Supported providers @@ -143,7 +143,7 @@ Project-scoped servers from any provider must be toggled on individually from th #### Using `/agent-add-mcp` -The built-in `/agent-add-mcp` skill lets Warp's agent create or update file-based MCP server definitions. Choose whether to save globally or in the current project — the skill writes the server definition to the matching file: +The built-in `/agent-add-mcp` skill lets the Warp Agent create or update file-based MCP server definitions. Choose whether to save globally or in the current project — the skill writes the server definition to the matching file: * **Global:** `~/.warp/.mcp.json` * **Project-scoped:** `{repo_root}/.warp/.mcp.json` @@ -214,7 +214,7 @@ In some cases you may need to reset the auth token for some MCP servers. To do t Note this will delete all your MCP auth tokens stored locally so you will need to login and re-authenticate. ::: -If the above doesn't help and you need to reset or change authentication, you may need to switch to a CLI-based MCP server configuration and provide the token via environment variables. See [Sentry CLI MCP Example](/agent-platform/capabilities/mcp/#sentry). +If the above doesn't help and you need to reset or change authentication, you may need to switch to a CLI-based MCP server configuration and provide the token via environment variables. See the Sentry tab under [MCP server configuration examples](/agents/capabilities/mcp/#mcp-server-configuration-examples). ### Where MCP logs are stored @@ -336,17 +336,17 @@ Below are examples for popular Model Context Protocol (MCP) servers. { "Linear": { "command": "npx", - "args": ["-y","mcp-remote","https://mcp.linear.app/sse"] + "args": ["-y","mcp-remote","https://mcp.linear.app/mcp"] } } ``` - **Linear SSE Server (URL)** + **Linear Streamable HTTP Server (URL)** ```json { "Linear": { - "url": "https://mcp.linear.app/sse" + "url": "https://mcp.linear.app/mcp" } } ``` diff --git a/src/content/docs/agent-platform/capabilities/planning.mdx b/src/content/docs/agents/capabilities/planning.mdx similarity index 90% rename from src/content/docs/agent-platform/capabilities/planning.mdx rename to src/content/docs/agents/capabilities/planning.mdx index 60ae8bea8..9fc0aae5d 100644 --- a/src/content/docs/agent-platform/capabilities/planning.mdx +++ b/src/content/docs/agents/capabilities/planning.mdx @@ -16,7 +16,7 @@ Warp has native planning functionality that helps you break down complex enginee ### Creating a plan -You can generate a plan using the `/plan` [slash command](/agent-platform/capabilities/slash-commands/) or by asking the agent in natural language. +You can generate a plan using the `/plan` [slash command](/agents/capabilities/slash-commands/) or by asking the agent in natural language. <figure> ![Prompting the agent to create a plan using the slash command.](../../../../assets/agent-platform/plan-slash-command.png) @@ -61,7 +61,7 @@ If you revise the plan while the agent is running, you can notify it directly; t ### Monitoring progress -While the agent is running, you can reopen the plan at any time by selecting **View plan** in the input. You can also follow each change in real time through the [Code Review](/code/code-review/) panel and add comments or guidance using [Interactive Code Review](/agent-platform/local-agents/interactive-code-review/). +While the agent is running, you can reopen the plan at any time by selecting **View plan** in the input. You can also follow each change in real time through the [Code Review](/code/code-review/) panel and add comments or guidance using [Interactive Code Review](/agents/local-agents/interactive-code-review/). <figure> ![Monitoring progress with the task list and plan view.](../../../../assets/agent-platform/agent-plans-tasks.png) @@ -93,7 +93,7 @@ Because plans persist in Warp Drive, you can return to them later, reuse them fo <figcaption>Plans are accessible directly from the Warp Drive side panel.</figcaption> </figure> -You can configure whether your plans will be automatically added and synced to Warp Drive in your [Agent Profiles & Permissions](/agent-platform/capabilities/agent-profiles-permissions/) under **Settings** > **Agents** > **Profiles**. +You can configure whether your plans will be automatically added and synced to Warp Drive in your [Agent Profiles & Permissions](/agents/capabilities/agent-profiles-permissions/) under **Settings** > **Agents** > **Profiles**. ![Toggle in Agent Profiles & Permissions to automatically sync agent-generated plans to Warp Drive.](../../../../assets/agent-platform/auto-sync-plans-1.png) @@ -101,7 +101,7 @@ You can configure whether your plans will be automatically added and synced to W Plans are reusable across tasks and sessions. You can reference them in future prompts, continue where you left off, or build follow-up plans that rely on earlier work. -The **@plans** command helps you quickly search for and reopen previously saved plans, making planning a consistent part of your development workflow rather than a one-off step. See [attaching context with @ references](/agent-platform/local-agents/agent-context/using-to-add-context/) for more ways to add files, folders, diffs, and saved objects to an agent conversation. +The **@plans** command helps you quickly search for and reopen previously saved plans, making planning a consistent part of your development workflow rather than a one-off step. See [attaching context with @ references](/agents/local-agents/agent-context/using-to-add-context/) for more ways to add files, folders, diffs, and saved objects to an agent conversation. ![Searching for and reopening previously saved plans with the @plans command.](../../../../assets/agent-platform/@-reference-plans.png) @@ -111,5 +111,5 @@ The **@plans** command helps you quickly search for and reopen previously saved As the agent executes your plan, you'll review code changes and may want to scale work to the cloud. -* **[Interactive Code Review](/agent-platform/local-agents/interactive-code-review/)** - Leave inline comments on agent-generated diffs and have the agent revise in one pass. +* **[Interactive Code Review](/agents/local-agents/interactive-code-review/)** - Leave inline comments on agent-generated diffs and have the agent revise in one pass. * **[Cloud Agents quickstart](/platform/quickstart/)** - Run agents in the cloud for longer tasks, background automation, or parallel work across repos. diff --git a/src/content/docs/agent-platform/capabilities/rules.mdx b/src/content/docs/agents/capabilities/rules.mdx similarity index 98% rename from src/content/docs/agent-platform/capabilities/rules.mdx rename to src/content/docs/agents/capabilities/rules.mdx index 9eb1ac089..af2493fba 100644 --- a/src/content/docs/agent-platform/capabilities/rules.mdx +++ b/src/content/docs/agents/capabilities/rules.mdx @@ -3,7 +3,7 @@ title: Rules for agents sidebar: label: "Rules" description: >- - Create reusable Global or Project Rules to ensure Warp’s agents follow your + Create reusable Global or Project Rules to ensure agents follow your coding standards, project conventions, and personal preferences. --- import VideoEmbed from '@components/VideoEmbed.astro'; diff --git a/src/content/docs/agent-platform/capabilities/skills.mdx b/src/content/docs/agents/capabilities/skills.mdx similarity index 90% rename from src/content/docs/agent-platform/capabilities/skills.mdx rename to src/content/docs/agents/capabilities/skills.mdx index dcffe7050..873ce1c1c 100644 --- a/src/content/docs/agent-platform/capabilities/skills.mdx +++ b/src/content/docs/agents/capabilities/skills.mdx @@ -6,6 +6,7 @@ description: >- Create reusable instruction sets that teach agents specific tasks and share expertise across your team. --- +import { VARS } from '@data/vars'; import VideoEmbed from '@components/VideoEmbed.astro'; import { FileTree } from '@astrojs/starlight/components'; @@ -23,7 +24,7 @@ Skills allow you to create reusable, shareable instructions that agents can invo ## How Skills work -When you start an [Agent conversation](/agent-platform/local-agents/interacting-with-agents/), the Agent receives a list of all available skills with their names and descriptions. +When you start an [Agent conversation](/agents/local-agents/interacting-with-agents/), the Agent receives a list of all available skills with their names and descriptions. When the Agent determines that a skill would help accomplish your task, it loads the skill's full instructions and follows them to complete the task. @@ -292,6 +293,10 @@ Understanding when to use each level: * Cross-project automation (git workflows, documentation templates) * Professional standards you apply everywhere +### Extra directories for cloud runs + +[Cloud agents](/platform/) discover skills from the repositories in their [environment](/platform/environments/). To index skills that live outside those repositories — for example, skills baked into a custom Docker image — set the `WARP_SKILL_DIRS` environment variable. See [extra skill directories in cloud runs](/platform/skills-as-agents/#extra-skill-directories-in-cloud-runs). + ## Creating skills ### Step 1: Choose a location @@ -384,7 +389,7 @@ The Agent lists all discovered skills with their names and descriptions. This in ### Editing skills -Use the [`/open-skill`](/agent-platform/capabilities/slash-commands/) slash command to modify existing skills: +Use the [`/open-skill`](/agents/capabilities/slash-commands/) slash command to modify existing skills: ``` /open-skill @@ -409,11 +414,11 @@ This opens an interactive menu where you can: Warp maintains a public collection of ready-to-use skills in the [warpdotdev/oz-skills](https://github.com/warpdotdev/oz-skills) repository. You can browse these skills for inspiration, copy them directly into your project's `.agents/skills/` directory, or adapt them to fit your team's workflows. -These same skills also appear as suggested agents in the [Oz web app](/platform/oz-web-app/), where you can run them directly in the cloud. +These same skills also appear as suggested agents in the [{VARS.WEB_APP}](/platform/oz-web-app/), where you can run them directly in the cloud. ## Suggested skills from Agent Memory -Promoting recurring patterns from [Agent Memory](/agent-platform/agent-memory/) into reviewable skill drafts is in design as part of the research preview. See the Agent Memory page for a current status. +Promoting recurring patterns from [Agent Memory](/agents/agent-memory/) into reviewable skill drafts is in design as part of the research preview. See the Agent Memory page for a current status. ## Invoking skills with a prompt @@ -430,14 +435,14 @@ This is useful when you want to reuse a skill's workflow but tailor the executio Skills can be used with both local and [cloud agents](/platform/) to create reusable, automated workflows. When running an agent via the CLI, web app, or API, you can specify a skill to provide the base instructions for the agent. -For a complete guide to running skill-based agents—including CLI usage, the Oz web app, scheduling, skill discovery, and API integration—see [Skills as Agents](/platform/skills-as-agents/). +For a complete guide to running skill-based agents—including CLI usage, the {VARS.WEB_APP}, scheduling, skill discovery, and API integration—see [Skills as Agents](/platform/skills-as-agents/). ## Related features -* [**Rules**](/agent-platform/capabilities/rules/) - Set persistent guidelines and constraints for Agent behavior -* [**MCP Servers**](/agent-platform/capabilities/mcp/) - Expose external data sources and tools to Agents +* [**Rules**](/agents/capabilities/rules/) - Set persistent guidelines and constraints for Agent behavior +* [**MCP Servers**](/agents/capabilities/mcp/) - Expose external data sources and tools to Agents * [**Cloud Agents**](/platform/) - Run Agents in the cloud on schedules or triggers -* [**Agent Profiles**](/agent-platform/capabilities/agent-profiles-permissions/) - Control Agent permissions and autonomy +* [**Agent Profiles**](/agents/capabilities/agent-profiles-permissions/) - Control Agent permissions and autonomy --- diff --git a/src/content/docs/agents/capabilities/slash-commands.mdx b/src/content/docs/agents/capabilities/slash-commands.mdx new file mode 100644 index 000000000..6b6e2ac8c --- /dev/null +++ b/src/content/docs/agents/capabilities/slash-commands.mdx @@ -0,0 +1,56 @@ +--- +title: Slash Commands +description: >- + Use Slash Commands in Agent Mode or Auto-Detection Mode to quickly run + built-in actions or saved prompts without leaving the input field. +--- + +Slash Commands are quick actions and saved prompts you can invoke by typing `/` in Agent Mode or Auto-Detection Mode. They provide instant access to built-in actions like starting conversations, creating environments, switching models, opening static flows, and running saved prompts from Warp Drive. + +<figure> +![Slash Commands menu](../../../../assets/agent-platform/slash-commands-menu.png) +<figcaption>Slash Commands menu.</figcaption> +</figure> + +As you type, the menu filters results in real time, making it easy to find and run the command or prompt you need. + +## Static slash commands + +Warp currently supports the following built-in Slash Commands: + +<table><thead><tr><th width="211.64453125">Slash Command</th><th>Description</th></tr></thead><tbody><tr><td><code>/add-mcp</code></td><td>Add a new <a href="/agents/capabilities/mcp/">MCP server</a>.</td></tr><tr><td><code>/add-prompt</code></td><td>Add a new <a href="/knowledge-and-collaboration/warp-drive/prompts/">Agent Prompt</a> in Warp Drive.</td></tr><tr><td><code>/add-rule</code></td><td>Add a new <a href="/agents/capabilities/rules/">Global Rule</a> for the Agent.</td></tr><tr><td><code>/agent</code></td><td>Start a new <a href="/agents/local-agents/interacting-with-agents/">agent conversation</a>. Optionally include a prompt to send immediately.</td></tr><tr><td><code>/changelog</code></td><td>Open the latest Warp <a href="/changelog/">changelog</a>.</td></tr><tr><td><code>/cloud-agent</code></td><td>Start a new <a href="/platform/">cloud agent conversation</a>. <code>{'*'}</code></td></tr><tr><td><code>/compact</code></td><td>Free up context by summarizing conversation history.</td></tr><tr><td><code>/compact-and</code></td><td>Compact the current conversation and then send a follow-up prompt.</td></tr><tr><td><code>/conversations</code></td><td>Open <a href="/agents/local-agents/interacting-with-agents/">conversation history</a>.</td></tr><tr><td><code>/copy-debugging-id</code></td><td>Copy debugging information for the current conversation to your clipboard, so you can include it when <a href="/support-and-community/troubleshooting-and-support/sending-us-feedback/">reporting an issue</a>. Available while a conversation is active.</td></tr><tr><td><code>/cost</code></td><td>Toggle credit usage details in the current conversation.</td></tr><tr><td><code>/create-environment</code></td><td>Create a <a href="/platform/environments/">Warp Environment</a> (Docker image + repos) via guided setup. <code>{'*'}</code></td></tr><tr><td><code>/create-new-project</code></td><td>Have the Agent walk you through creating a new coding project. <code>{'*'}</code></td></tr><tr><td><code>/environment</code></td><td>Switch the <a href="/platform/environments/">environment</a> for the current cloud agent conversation.</td></tr><tr><td><code>/export-to-clipboard</code></td><td>Export the current conversation to clipboard in markdown format.</td></tr><tr><td><code>/export-to-file</code></td><td>Export the current conversation to a markdown file.</td></tr><tr><td><code>/feedback</code></td><td>Open the static feedback experience. See <a href="/support-and-community/troubleshooting-and-support/sending-us-feedback/#using-feedback-in-warp">Using <code>/feedback</code> in Warp</a> for details.</td></tr><tr><td><code>/fork</code></td><td><a href="/agents/local-agents/interacting-with-agents/conversation-forking/">Forks the current conversation</a> into a new thread with the full context and history of the original. <br /><br />You can optionally include a prompt that will be sent immediately in the forked conversation.</td></tr><tr><td><code>/fork-and-compact</code></td><td><a href="/agents/local-agents/interacting-with-agents/conversation-forking/">Forks the current conversation</a> and automatically compacts the forked version.<br /><br />Useful when you want a fresh, summarized starting point that preserves relevant context while trimming the rest.</td></tr><tr><td><code>/fork-from</code></td><td>Open a searchable menu to <a href="/agents/local-agents/interacting-with-agents/conversation-forking/">fork the conversation</a> from a specific query. Select a query to create a fork that includes everything up to that point.</td></tr><tr><td><code>/harness</code></td><td>Switch the <a href="/platform/harnesses/">harness</a> for the current cloud agent conversation.</td></tr><tr><td><code>/host</code></td><td>Switch the execution host for the current cloud agent conversation.</td></tr><tr><td><code>/index</code></td><td>Index the current codebase using <a href="/agents/capabilities/codebase-context/">Codebase Context</a>.</td></tr><tr><td><code>/init</code></td><td>Index the current codebase and generate an <a href="/agents/capabilities/rules/">AGENTS.md file</a>. <code>{'*'}</code></td></tr><tr><td><code>/model</code></td><td>Switch the base agent model for the current conversation.</td></tr><tr><td><code>/new</code></td><td>Start a new <a href="/agents/local-agents/interacting-with-agents/">agent conversation</a> (alias for <code>/agent</code>).</td></tr><tr><td><code>/open-code-review</code></td><td>Open the <a href="/code/code-review/">code review</a> pane.</td></tr><tr><td><code>/open-file</code></td><td>Open a file for editing in Warp's <a href="/code/code-editor/">code editor</a>.</td></tr><tr><td><code>/open-mcp-servers</code></td><td>View the status of your <a href="/agents/capabilities/mcp/">MCP servers</a>.</td></tr><tr><td><code>/open-project-rules</code></td><td>Open the <a href="/agents/capabilities/rules/#project-rules">Project Rules</a> file (<code>AGENTS</code>).</td></tr><tr><td><code>/open-repo</code></td><td>Switch to another indexed repository.</td></tr><tr><td><code>/open-rules</code></td><td>View all of your global and project <a href="/agents/capabilities/rules/">rules</a>.</td></tr><tr><td><code>/open-settings-file</code></td><td>Open the Warp <a href="/terminal/settings/">settings file</a> (<code>settings.toml</code>) in Warp's code editor.</td></tr><tr><td><code>/open-skill</code></td><td>Open an interactive menu to browse and edit project or global <a href="/agents/capabilities/skills/">skills</a>.</td></tr><tr><td><code>/orchestrate</code></td><td>Break a task into subtasks and run them in parallel with multiple agents. See <a href="/platform/orchestration/">Multi-agent orchestration</a>. <code>{'*'}</code></td></tr><tr><td><code>/plan</code></td><td>Prompt the Agent to do some research and create a <a href="/agents/capabilities/planning/">plan</a> for a task.</td></tr><tr><td><code>/profile</code></td><td>Switch the active <a href="/agents/capabilities/agent-profiles-permissions/">execution profile</a>.</td></tr><tr><td><code>/prompts</code></td><td>Search saved <a href="/knowledge-and-collaboration/warp-drive/prompts/">prompts</a>.</td></tr><tr><td><code>/queue</code></td><td>Queue a prompt to send after the agent finishes responding. See <a href="/agents/local-agents/interacting-with-agents/prompt-queueing/">Prompt Queueing</a>.</td></tr><tr><td><code>/rename-conversation</code></td><td>Rename the current conversation.</td></tr><tr><td><code>/rename-tab</code></td><td>Rename the current tab. Include the new tab name as an argument (for example, <code>/rename-tab deploy</code>).</td></tr><tr><td><code>/rewind</code></td><td>Rewind to a previous point in the conversation.</td></tr><tr><td><code>/skills</code></td><td>Invoke a <a href="/agents/capabilities/skills/">skill</a> from a searchable menu.</td></tr><tr><td><code>/usage</code></td><td>Open <a href="/support-and-community/plans-and-billing/">billing and usage</a> settings.</td></tr></tbody></table> + +:::caution +Slash commands marked with a `*` consume credits to complete the task. +::: + +#### Using Agent Prompts via Slash Commands + +In addition to static commands, the menu also shows [Agent Prompts](/knowledge-and-collaboration/warp-drive/prompts/) saved in your [Warp Drive](/knowledge-and-collaboration/warp-drive/). + +* These prompts can be custom ones you’ve created or ones shared with you. +* As you type after `/`, prompts are filtered dynamically, so you can quickly run them without leaving the input field. + +<figure> +![Slash Commands menu with filtered Agent Prompts](../../../../assets/agent-platform/slash-commands-prompts.png) +<figcaption>Slash Commands menu with filtered Agent Prompts.</figcaption> +</figure> + +### Tips + +* **Context-aware:** Many Slash Commands use your current working directory or file selection as context. +* **Quick access:** Use `/` from anywhere in Agent Mode or Auto-Detection Mode to avoid navigating through menus. + +### Example of using a Slash Command + +Below is an example interaction when `/init` is run: + +<figure> +![/init setup flow; 1 of 2](../../../../assets/agent-platform/init-setup-flow-1.png) +<figcaption>The /init setup flow, step 1 of 2.</figcaption> +</figure> + +<figure> +![/init setup flow; 2 of 2](../../../../assets/agent-platform/init-setup-flow-2.png) +<figcaption>The /init setup flow, step 2 of 2.</figcaption> +</figure> diff --git a/src/content/docs/agent-platform/capabilities/task-lists.mdx b/src/content/docs/agents/capabilities/task-lists.mdx similarity index 88% rename from src/content/docs/agent-platform/capabilities/task-lists.mdx rename to src/content/docs/agents/capabilities/task-lists.mdx index effdbfb4c..f15e8ace3 100644 --- a/src/content/docs/agent-platform/capabilities/task-lists.mdx +++ b/src/content/docs/agents/capabilities/task-lists.mdx @@ -6,7 +6,7 @@ description: >- time. --- -Task Lists let Warp's agent automatically break down complex requests into clear, trackable steps. When a request requires multiple actions, the agent creates a structured list, executes each step in order, and tracks progress in real time. No configuration is needed—the agent detects and creates task lists automatically. +Task Lists let the Warp Agent automatically break down complex requests into clear, trackable steps. When a request requires multiple actions, the agent creates a structured list, executes each step in order, and tracks progress in real time. No configuration is needed—the agent detects and creates task lists automatically. <figure> ![An example of a task list in progress.](../../../../assets/agent-platform/in-progress-tasklist.png) diff --git a/src/content/docs/agent-platform/capabilities/web-search.mdx b/src/content/docs/agents/capabilities/web-search.mdx similarity index 97% rename from src/content/docs/agent-platform/capabilities/web-search.mdx rename to src/content/docs/agents/capabilities/web-search.mdx index 49c3fbb13..46c7fbc06 100644 --- a/src/content/docs/agent-platform/capabilities/web-search.mdx +++ b/src/content/docs/agents/capabilities/web-search.mdx @@ -75,7 +75,7 @@ This makes it easy to verify accuracy, audit reasoning, and validate sources. ### Enabling or disabling web search -Web search is controlled per [Profiles & Permissions](/agent-platform/capabilities/agent-profiles-permissions/). +Web search is controlled per [Profiles & Permissions](/agents/capabilities/agent-profiles-permissions/). To configure: diff --git a/src/content/docs/agent-platform/cli-agents/claude-code.mdx b/src/content/docs/agents/cli-agents/claude-code.mdx similarity index 80% rename from src/content/docs/agent-platform/cli-agents/claude-code.mdx rename to src/content/docs/agents/cli-agents/claude-code.mdx index 9e2936fe4..d6e77a84f 100644 --- a/src/content/docs/agent-platform/cli-agents/claude-code.mdx +++ b/src/content/docs/agents/cli-agents/claude-code.mdx @@ -6,6 +6,7 @@ description: >- Set up Claude Code in Warp with full notification support, rich input, code review, and more. --- +import { VARS } from '@data/vars'; Claude Code is Anthropic's agentic coding tool that operates directly in your terminal. It understands your codebase, executes commands, edits files, and manages Git workflows — all through natural language. For full documentation, see the [official Claude Code docs](https://code.claude.com/docs). @@ -14,7 +15,7 @@ Warp auto-detects Claude Code when you run it, giving you access to rich input c For installation, authentication, project configuration, and productivity tips, see the [How to set up Claude Code](/guides/external-tools/how-to-set-up-claude-code/) guide. :::note -Claude Code is also available as a harness in Oz for cloud orchestration. See [Claude Code with Oz](/platform/harnesses/claude-code/). +Claude Code is also available as a harness in the {VARS.WARP_AUTOMATION_PLATFORM} for cloud orchestration. See [Claude Code with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/claude-code/). ::: ## Setting up notifications @@ -59,7 +60,7 @@ For plugin source and updates, see the [claude-code-warp GitHub repository](http ## Supported Warp features -Claude Code supports the full set of Warp's agent integration features: +Claude Code supports Warp's full set of agent integration features: * **Agent notifications** - Receive in-app and desktop alerts when Claude Code needs your attention. The notification UI displays your current git branch alongside agent status. * **Rich input editor** - Press `Ctrl-G` to open an expanded input editor for composing longer prompts. @@ -67,13 +68,14 @@ Claude Code supports the full set of Warp's agent integration features: * **Attach code as context** - Select code and send it to the agent as context. * **Vertical tabs with agent metadata** - Monitor Claude Code sessions with status indicators in Warp's tab bar. * **Tab Configs** - Save and restore Claude Code session configurations. -* **Remote Control** - Share your Claude Code session with teammates via session sharing. +* **[Remote Control](/agents/cli-agents/remote-control/)** - Publish your Claude Code session so you can monitor and steer it from another device. ## Related pages * [How to set up Claude Code](/guides/external-tools/how-to-set-up-claude-code/) — step-by-step setup guide * [Claude Code in Warp](https://www.warp.dev/agents/claude-code) — product overview -* [Third-party CLI agents overview](/agent-platform/cli-agents/overview/) — supported CLI agent integrations -* [Claude Code with Oz](/platform/harnesses/claude-code/) — Claude Code as a cloud harness -* [OpenCode](/agent-platform/cli-agents/opencode/) — OpenCode in Warp -* [Codex](/agent-platform/cli-agents/codex/) — Codex in Warp +* [Third-party CLI agents overview](/agents/cli-agents/overview/) — supported CLI agent integrations +* [Remote Control](/agents/cli-agents/remote-control/) — publish a Claude Code session to monitor and steer it remotely +* [Claude Code with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/claude-code/) — Claude Code as a cloud harness +* [OpenCode](/agents/cli-agents/opencode/) — OpenCode in Warp +* [Codex](/agents/cli-agents/codex/) — Codex in Warp diff --git a/src/content/docs/agents/cli-agents/codex.mdx b/src/content/docs/agents/cli-agents/codex.mdx new file mode 100644 index 000000000..5f24d2574 --- /dev/null +++ b/src/content/docs/agents/cli-agents/codex.mdx @@ -0,0 +1,64 @@ +--- +title: Codex CLI in Warp +sidebar: + label: "Codex" +description: >- + Set up Codex in Warp with notification support, rich input, code review, and + more. +--- +import { VARS } from '@data/vars'; + +Codex is OpenAI's open-source coding agent that runs in your terminal. It can write and edit code, execute commands, and navigate your codebase through natural language. For full documentation, see the [Codex GitHub repository](https://github.com/openai/codex). + +Warp auto-detects Codex when you run it, giving you access to rich input controls, code review, and other integrated features. For a product overview, see [Codex in Warp](https://www.warp.dev/agents/codex). + +For installation, authentication, project configuration, and productivity tips, see the [How to set up Codex CLI](/guides/external-tools/how-to-set-up-codex-cli/) guide. + +:::note +Codex is also available as a harness in the {VARS.WARP_AUTOMATION_PLATFORM} for cloud orchestration. See [Codex with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/codex/). +::: + +## Setting up notifications + +Warp surfaces Codex activity as in-app and desktop alerts — such as when Codex completes a task, encounters an error, or needs your input. This is powered by the Warp plugin for Codex, published from the [warpdotdev/codex-warp](https://github.com/warpdotdev/codex-warp) plugin marketplace. + +When Warp detects a Codex session without the plugin, it shows an install chip in the terminal. Click the chip to install the plugin, then restart Codex. Warp shows an update chip the same way when a newer plugin version is required. + +To install the plugin yourself, add the marketplace and the plugin: + +```bash +codex plugin marketplace add warpdotdev/codex-warp +codex plugin add warp@codex-warp +``` + +Restart Codex to activate the plugin. To update it later, upgrade the marketplace and reinstall the plugin: + +```bash +codex plugin marketplace upgrade codex-warp +codex plugin add warp@codex-warp +``` + +:::note +If you point `codex-warp` at a local (non-Git) marketplace source, Warp leaves that override alone and doesn't offer plugin updates for it. +::: + +## Supported Warp features + +Codex supports Warp's full set of agent integration features: + +* **Agent notifications** - Receive in-app and desktop alerts when Codex needs your attention. Requires the Warp plugin for Codex (see [Setting up notifications](#setting-up-notifications)). +* **Rich input editor** - Press `Ctrl-G` to open an expanded input editor for composing longer prompts. +* **Code review** - Send inline review comments directly to the agent from Warp's code review panel. +* **Attach code as context** - Select code and send it to the agent as context. +* **Vertical tabs with agent metadata** - Monitor Codex sessions with status indicators in Warp's tab bar. +* **Tab Configs** - Save and restore Codex session configurations. +* **Remote Control** - Share your Codex session with teammates via session sharing. + +## Related pages + +* [How to set up Codex CLI](/guides/external-tools/how-to-set-up-codex-cli/) — step-by-step setup guide +* [Codex in Warp](https://www.warp.dev/agents/codex) — product overview +* [Third-party CLI agents overview](/agents/cli-agents/overview/) — supported CLI agent integrations +* [Codex with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/codex/) — Codex as a cloud harness +* [Claude Code](/agents/cli-agents/claude-code/) — Claude Code in Warp +* [OpenCode](/agents/cli-agents/opencode/) — OpenCode in Warp diff --git a/src/content/docs/agent-platform/cli-agents/opencode.mdx b/src/content/docs/agents/cli-agents/opencode.mdx similarity index 90% rename from src/content/docs/agent-platform/cli-agents/opencode.mdx rename to src/content/docs/agents/cli-agents/opencode.mdx index e4c94a96d..78c778253 100644 --- a/src/content/docs/agent-platform/cli-agents/opencode.mdx +++ b/src/content/docs/agents/cli-agents/opencode.mdx @@ -31,7 +31,7 @@ For plugin source and updates, see the [opencode-warp GitHub repository](https:/ ## Supported Warp features -OpenCode supports the full set of Warp's agent integration features: +OpenCode supports Warp's full set of agent integration features: * **Agent notifications** - Receive in-app and desktop alerts when OpenCode needs your attention. The notification UI displays your current git branch alongside agent status. * **Rich input editor** - Press `Ctrl-G` to open an expanded input editor for composing longer prompts. @@ -45,6 +45,6 @@ OpenCode supports the full set of Warp's agent integration features: * [How to set up OpenCode](/guides/external-tools/how-to-set-up-opencode/) — step-by-step setup guide * [OpenCode in Warp](https://www.warp.dev/agents/opencode) — product overview -* [Third-party CLI agents overview](/agent-platform/cli-agents/overview/) -* [Claude Code](/agent-platform/cli-agents/claude-code/) -* [Codex](/agent-platform/cli-agents/codex/) +* [Third-party CLI agents overview](/agents/cli-agents/overview/) +* [Claude Code](/agents/cli-agents/claude-code/) +* [Codex](/agents/cli-agents/codex/) diff --git a/src/content/docs/agent-platform/cli-agents/overview.mdx b/src/content/docs/agents/cli-agents/overview.mdx similarity index 74% rename from src/content/docs/agent-platform/cli-agents/overview.mdx rename to src/content/docs/agents/cli-agents/overview.mdx index 915e2f0fc..b1fda82a8 100644 --- a/src/content/docs/agent-platform/cli-agents/overview.mdx +++ b/src/content/docs/agents/cli-agents/overview.mdx @@ -6,22 +6,25 @@ description: >- sidebar: label: "Overview" --- +import { VARS } from '@data/vars'; -Warp auto-detects supported CLI agents and enhances them with IDE-level features — a rich input editor, agent notifications, inline code review, remote session control, and more. Run your preferred coding agent inside Warp and get a better experience out of the box. +Warp auto-detects supported CLI agents and enhances them with IDE-level features — a rich input editor, agent notifications, inline code review, [Remote Control](/agents/cli-agents/remote-control/), and more. Run your preferred coding agent inside Warp and get a better experience out of the box. This feature set is also known as **universal agent support**. +Looking for Warp's own CLI instead? The [Warp Agent CLI](/agents/cli/) runs the Warp Agent itself in any terminal. This page covers running third-party coding agents inside the Warp app. + :::note -Claude Code and Codex are also supported as harnesses in Oz for cloud orchestration. See [Harnesses in Oz](/platform/harnesses/). +Claude Code and Codex are also supported as harnesses in the {VARS.WARP_AUTOMATION_PLATFORM} for [multi-agent orchestration](/platform/orchestration/). See [Harnesses in the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/). ::: ## Supported agents Warp currently supports the following CLI coding agents: -* [**Claude Code**](/agent-platform/cli-agents/claude-code/) — Anthropic's CLI coding agent -* [**OpenAI Codex**](/agent-platform/cli-agents/codex/) — OpenAI's CLI coding agent -* [**OpenCode**](/agent-platform/cli-agents/opencode/) — Open-source CLI coding agent +* [**Claude Code**](/agents/cli-agents/claude-code/) — Anthropic's CLI coding agent +* [**OpenAI Codex**](/agents/cli-agents/codex/) — OpenAI's CLI coding agent +* [**OpenCode**](/agents/cli-agents/opencode/) — Open-source CLI coding agent * **Amp** — Sourcegraph's CLI coding agent * **Auggie** — Augment Code's CLI coding agent * **Copilot CLI** — GitHub's CLI coding agent @@ -84,6 +87,9 @@ If you don't see the agent toolbelt, make sure you're on the latest version of W ## Related pages -* [Agent Notifications](/agent-platform/capabilities/agent-notifications/) +* [Remote Control](/agents/cli-agents/remote-control/) — publish a CLI agent session to monitor and steer it from another device +* [Cloud handoff and orchestration](/agents/cli/cloud-and-orchestration/) — hand off a {VARS.WARP_CLI} conversation to a cloud agent, or run multi-agent orchestration from the terminal +* [Agent Notifications](/agents/capabilities/agent-notifications/) +* [How to run multiple AI coding agents](/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/) — run CLI agents in parallel with worktrees and cloud fan-out * [Tabs](/terminal/windows/tabs/) * [Tab Configs](/terminal/windows/tab-configs/) diff --git a/src/content/docs/agent-platform/cli-agents/remote-control.mdx b/src/content/docs/agents/cli-agents/remote-control.mdx similarity index 80% rename from src/content/docs/agent-platform/cli-agents/remote-control.mdx rename to src/content/docs/agents/cli-agents/remote-control.mdx index 09aa2925d..8d70766f9 100644 --- a/src/content/docs/agent-platform/cli-agents/remote-control.mdx +++ b/src/content/docs/agents/cli-agents/remote-control.mdx @@ -6,14 +6,14 @@ description: >- --- import VideoEmbed from '@components/VideoEmbed.astro'; -Remote Control lets you publish a running third-party agent session — such as Claude Code, Codex, or OpenCode — to the cloud with a single click. Once published, you can monitor progress, review output, and steer the agent from your phone, a web browser, or another computer without staying at the original machine. See [Third-party CLI agents](/agent-platform/cli-agents/overview/) for the full list of supported agents. +Remote Control lets you publish a running third-party agent session — such as Claude Code, Codex, or OpenCode — to the cloud with a single click. Once published, you can monitor progress, review output, and steer the agent from your phone, a web browser, or another computer without staying at the original machine. See [Third-party CLI agents](/agents/cli-agents/overview/) for the full list of supported agents. This is especially useful for long-running agent tasks. Start a coding agent, publish the session, and check back whenever you want. <VideoEmbed url="https://youtu.be/6xsngiSX2KQ" title="Remote Control for coding agent sessions" /> :::note -Remote Control is built on top of [Agent Session Sharing](/agent-platform/local-agents/session-sharing/). It uses the same underlying infrastructure to publish sessions and generate shareable links. +Remote Control is built on top of [Agent Session Sharing](/agents/local-agents/session-sharing/). It uses the same underlying infrastructure to publish sessions and generate shareable links. ::: ## Key capabilities @@ -28,7 +28,7 @@ Remote Control is built on top of [Agent Session Sharing](/agent-platform/local- When you publish a session through Remote Control, Warp uploads the session state to the cloud and generates a shareable link. The link stays live and in sync — any new agent output, tool use, or terminal activity appears for all connected viewers in real time. You control who can view and who can steer the agent. -Remote Control differs from standard [Agent Session Sharing](/agent-platform/local-agents/session-sharing/) in its intent: Session Sharing is designed for live collaborative work (pair-programming, interactive debugging), while Remote Control is designed for async monitoring and steering when you're away from your machine. +Remote Control differs from standard [Agent Session Sharing](/agents/local-agents/session-sharing/) in its intent: Session Sharing is designed for live collaborative work (pair-programming, interactive debugging), while Remote Control is designed for async monitoring and steering when you're away from your machine. ## Publishing a session @@ -66,6 +66,8 @@ Only you (the publisher) can revoke access or stop publishing the session. ## Related pages -* [Agent Session Sharing](/agent-platform/local-agents/session-sharing/) -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) +* [Agent Session Sharing](/agents/local-agents/session-sharing/) +* [Third-party CLI agents](/agents/cli-agents/overview/) * [Viewing Cloud Agent Runs](/platform/viewing-cloud-agent-runs/) +* [Handoff between local and cloud agents](/platform/handoff/) - Move work off your laptop into a cloud agent run when you need longer-running or unattended execution. +* [How to run multiple AI coding agents](/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/) - Run parallel CLI agents locally, then monitor or fan work out further. diff --git a/src/content/docs/agent-platform/cli-agents/rich-input.mdx b/src/content/docs/agents/cli-agents/rich-input.mdx similarity index 86% rename from src/content/docs/agent-platform/cli-agents/rich-input.mdx rename to src/content/docs/agents/cli-agents/rich-input.mdx index f26ab4882..308a7ae38 100644 --- a/src/content/docs/agent-platform/cli-agents/rich-input.mdx +++ b/src/content/docs/agents/cli-agents/rich-input.mdx @@ -13,9 +13,9 @@ Warp's rich input editor lets you write prompts for any CLI coding agent with th ## Key capabilities * **IDE-style editing** - Click, select, and navigate your prompt with your mouse. Copy, cut, paste, undo, and word-level navigation all work. Write multi-line prompts with line breaks and soft wrapping. Vim keybindings are also supported. See [Modern text editing](/terminal/editor/) for the full list of shortcuts. -* **Rich context with @mentions** - Reference files, folders, and code symbols with `@` mentions. Attach images for visual context. Search for specific symbols directly from the editor. See [Agent Context](/agent-platform/local-agents/agent-context/) for details. -* **Voice input** - Dictate prompts instead of typing. See [Voice](/agent-platform/local-agents/interacting-with-agents/voice/) for details. -* **Slash commands and skills** - Access saved `/prompts`, `/skills`, and [Warp Drive](/knowledge-and-collaboration/warp-drive/) content with `/`. The editor shows skills specific to the running agent's provider (e.g., Claude-specific skills when running Claude Code). See [Slash Commands](/agent-platform/capabilities/slash-commands/) for details. +* **Rich context with @mentions** - Reference files, folders, and code symbols with `@` mentions. Attach images for visual context. Search for specific symbols directly from the editor. See [Agent Context](/agents/local-agents/agent-context/) for details. +* **Voice input** - Dictate prompts instead of typing. See [Voice](/agents/local-agents/interacting-with-agents/voice/) for details. +* **Slash commands and skills** - Access saved `/prompts`, `/skills`, and [Warp Drive](/knowledge-and-collaboration/warp-drive/) content with `/`. The editor shows skills specific to the running agent's provider (e.g., Claude-specific skills when running Claude Code). See [Slash Commands](/agents/capabilities/slash-commands/) for details. * **Agent toolbar** - Browse files, view code changes, and manage the agent session from the toolbar. ## How to open @@ -56,8 +56,8 @@ In the Warp app, go to **Settings** > **Agents** > **Third party CLI agents** to ## Related pages -* [Third-party CLI agents overview](/agent-platform/cli-agents/overview/) -* [Remote Control](/agent-platform/cli-agents/remote-control/) -* [Voice](/agent-platform/local-agents/interacting-with-agents/voice/) -* [Slash Commands](/agent-platform/capabilities/slash-commands/) -* [Agent Context](/agent-platform/local-agents/agent-context/) +* [Third-party CLI agents overview](/agents/cli-agents/overview/) +* [Remote Control](/agents/cli-agents/remote-control/) +* [Voice](/agents/local-agents/interacting-with-agents/voice/) +* [Slash Commands](/agents/capabilities/slash-commands/) +* [Agent Context](/agents/local-agents/agent-context/) diff --git a/src/content/docs/agents/cli/agent-conversations.mdx b/src/content/docs/agents/cli/agent-conversations.mdx new file mode 100644 index 000000000..d6e848409 --- /dev/null +++ b/src/content/docs/agents/cli/agent-conversations.mdx @@ -0,0 +1,154 @@ +--- +title: "Agent conversations in the Warp Agent CLI" +description: >- + Read, manage, and resume agent conversations in the Warp Agent CLI, including streamed + responses, tool calls, file diffs, plans, and task lists. +--- +import { VARS } from '@data/vars'; + +When you send the agent a prompt in the {VARS.WARP_CLI}, the conversation appears as a scrollable transcript directly in your terminal. Responses stream in as they're generated, and everything the agent does renders inline: tool calls, file diffs, questions, task lists, and plans. Conversations persist as you work. You can start a new conversation, browse history, compact context, and [resume after exiting](#resuming-conversations). + +## The conversation transcript + +The agent's response streams into the transcript below your prompt as it's generated. Press `Ctrl+C` once to stop a response that's still in progress. + +Responses render as formatted Markdown, including syntax-highlighted code blocks and tables. Be aware of a few terminal-specific caveats: Mermaid diagrams appear as their source in a code block, images show their alt text instead of rendering inline, and very long code blocks are truncated to keep the transcript responsive. + +## Tool calls + +Every tool call the agent makes appears inline in the transcript, in the order it happens. Most render as a one-line status row with a state glyph and a label describing the action, like "reading a file" or "searching your codebase". + +Some tool calls render richer, interactive content: + +* **[Shell commands](/agents/cli/input-and-shell-commands/#shell-mode)** - Commands run in your session, with output streamed into the transcript. +* **[File edits](#code-diffs)** - Expandable diffs with per-file headers. +* **[Questions](#agent-questions)** - Interactive option prompts. +* **[Plans](#planning)** - Inline plan documents. + +When a tool call needs your approval before it runs, an approval card appears in place of the input. See [permissions in the CLI](/agents/cli/permissions-and-profiles/) to learn how approvals work. + +## Code diffs + +When the agent edits files, the edit renders as a diff in the transcript: + +* **Per-file sections** - Each edited file gets its own header showing the action taken and the lines added or removed. +* **Multi-file edits** - Each file's section nests, indented, under one collapsible summary header (for example, `Edited 3 files`). + +Diffs are fully expanded while the agent waits for your approval, then collapse to their headers once the edits are applied. Press `E` while the approval card is active to expand or collapse all diffs at once. + +The CLI renders diffs inline rather than in a separate editor. For how agent-generated changes work in the Warp app, including refining a diff in natural language, see [Agent code diffs and review](/agents/local-agents/code-diffs/). + +## Thinking blocks + +For models that expose their reasoning, the agent's thinking streams into a collapsible section with the header `Thinking...`, which collapses to a single `Thought for` row once it finishes. + +## Agent questions + +When the agent needs a decision from you mid-task, it asks a question with an interactive option list that temporarily replaces the input. Use the arrow keys to navigate between options, or press an option's number on your keyboard to select it. **Other…** accepts a free-form answer when the listed options don't fit. + +Options the agent suggests as the best fit are labeled `(recommended)`. For multi-select questions, chosen options are marked with a check mark so you can select more than one. When the agent asks several questions at once, the card advances through them. + +To control whether the agent pauses to ask questions, see [Agent questions](/agents/local-agents/interacting-with-agents/agent-questions/). + +## Task lists + +For multi-step work, the agent tracks its progress with a task list rendered directly in the transcript under a `≡ Tasks` header. Each task row starts with a status glyph: + +* `◌` - Pending +* <code class="glyph-attention">●</code> - In progress +* <code class="glyph-success">✓</code> - Completed + +Canceled tasks appear struck through. As the agent finishes tasks, compact confirmation rows (e.g., `✓ Completed <task> (2/5)`) track progress without repeating the whole list. + +Task lists in the CLI reflect the same agent behavior as in the Warp app. Learn more about [how task lists work](/agents/capabilities/task-lists/). + +## Planning + +To have the agent first research and produce a plan before making changes, use the `/plan` slash command followed by a description of your task. You can also ask for a plan in natural language. + +The plan renders inline in the transcript as a formatted document with its own header row showing the plan's status. An `Updated plan` entry appears when the agent revises it. Press `Ctrl+Shift+P` to expand or collapse the latest plan. + +Planning in the CLI follows the same workflow as the Warp app. See [Planning](/agents/capabilities/planning/) to learn how to create, review, and execute plans. + +## Selecting and copying output + +Select text anywhere in the transcript by clicking and dragging with the mouse. Releasing the mouse button copies the selection automatically. + +To copy an entire conversation as Markdown, use the `/export-to-clipboard` slash command, or use `/export-to-file` to save it to a file. + +:::note +In local sessions, the CLI writes directly to your system clipboard. Over SSH, it copies through your terminal using OSC 52 escape sequences (including from inside tmux), so the text lands on your local clipboard. Terminals that disable OSC 52 may ignore the copy. +::: + +## Managing conversations + +The CLI saves every agent conversation as you work, so closing your terminal won't lose your progress. + +### Conversation persistence + +The CLI shows one conversation at a time. Opening a past conversation replaces the current transcript, and the previous one remains available in history. You can't switch conversations while the current conversation is responding or a command is running. Finish or stop it with `Ctrl+C` first. + +Conversations sync to your Warp account, so the same history is available in the Warp app and on your other devices. See [Cloud-synced conversations](/agents/local-agents/cloud-conversations/) for details about syncing, restoring, and sharing work. + +### Starting a new conversation + +Use any of these slash commands to clear the transcript and start a fresh conversation: + +* `/new` +* `/agent` +* `/clear` + +Each command accepts an optional prompt. For example, `/new write tests for the parser` starts a new conversation and immediately sends that prompt to the agent. To keep the history but reduce its size instead, use [`/compact`](#compacting-context). + +For guidance on when to start fresh rather than follow up, see [Interacting with agents](/agents/local-agents/interacting-with-agents/). + +### Conversation history + +To browse and reopen past conversations, you can open the conversation menu in two ways: + +* **`/conversations`** - Run the slash command from the input. +* **`←`** - Press the left arrow key when the input is empty and the cursor is at the start. + +The menu lists your Warp Agent conversations, including conversations started in the Warp app and completed cloud agent runs tied to your account. Start typing to filter the list by title. + +:::caution +If the CLI can't load conversation data from Warp's servers, the menu shows conversations from your local device only and displays a warning. Conversations from other devices reappear once the connection recovers. +::: + +To continue a cloud agent run from the CLI, or to hand the current conversation off to a cloud agent, see [cloud handoff and orchestration](/agents/cli/cloud-and-orchestration/). + +### Resuming conversations + +There are two ways to pick a past conversation back up: + +* **The [conversation menu](#conversation-history)** `(recommended)` - From a running session, press `←` or run `/conversations`, then filter to the conversation you want. +* **`warp --resume`** - Reopens a specific conversation from your shell as the CLI starts, without going through the menu. + +When you exit the CLI with a non-empty conversation, it prints the `--resume` command for that conversation: + +```bash +To continue this conversation, run: +warp --resume YOUR_CONVERSATION_TOKEN +``` + +`YOUR_CONVERSATION_TOKEN` is a conversation identifier generated by Warp. For the complete list of command-line flags, see the [CLI reference](/agents/cli/reference/). + +### Compacting context + +Long conversations eventually fill the model's [context window](/agents/local-agents/interacting-with-agents/#context-window-management), which can degrade response quality. The `/compact` command frees up context by asking the agent to summarize the conversation history so far and carry only the summary forward. + +* **`/compact`** - Summarizes the conversation history with default instructions. +* **`/compact <instructions>`** - Adds custom summarization instructions. For example, `/compact keep the API design decisions` tells the agent what to preserve in the summary. + +After compaction, a collapsed **Conversation summary** block appears in the transcript, and the conversation keeps working normally with the summary standing in for the compacted history. + +## Related pages + +* [Permissions and profiles](/agents/cli/permissions-and-profiles/) - Approve, reject, or auto-approve the agent's tool calls. +* [Input and shell commands](/agents/cli/input-and-shell-commands/) - How commands the agent (or you) run appear in the transcript. +* [Cloud handoff and orchestration](/agents/cli/cloud-and-orchestration/) - Hand off conversations to cloud agents and resume cloud runs. +* [{VARS.WARP_CLI} reference](/agents/cli/reference/) - Command-line flags, slash commands, and keyboard shortcuts. +* [Planning](/agents/capabilities/planning/) - The full planning workflow. +* [Task lists](/agents/capabilities/task-lists/) - How agents create and update task lists. +* [Agent code diffs and review](/agents/local-agents/code-diffs/) - Reviewing and refining agent-generated changes. +* [Cloud-synced conversations](/agents/local-agents/cloud-conversations/) - How conversations sync, restore, and share across devices. diff --git a/src/content/docs/agents/cli/cloud-and-orchestration.mdx b/src/content/docs/agents/cli/cloud-and-orchestration.mdx new file mode 100644 index 000000000..8aa465260 --- /dev/null +++ b/src/content/docs/agents/cli/cloud-and-orchestration.mdx @@ -0,0 +1,120 @@ +--- +title: "Cloud handoff and orchestration in the Warp Agent CLI" +description: >- + Hand off Warp Agent CLI conversations to cloud agents, resume cloud runs, + and run multi-agent orchestration from your terminal. +--- +import { VARS } from '@data/vars'; + +The {VARS.WARP_CLI} connects your terminal sessions to the {VARS.WARP_AUTOMATION_PLATFORM}. You can hand off a local conversation to a cloud agent, pick a finished cloud run back up in your terminal, and coordinate multiple agents working in parallel, all without leaving the CLI. + +## Hand off to a cloud agent + +Handoff promotes your {VARS.WARP_CLI} conversation into a cloud agent run. Use it when a task outgrows your machine: long-running work you don't want to keep your laptop awake for, or work you want to check on later from another device. The [Handoff overview](/platform/handoff/) explains the feature across all Warp surfaces. This section covers the CLI flow. + +The cloud agent receives the same context as a handoff from the Warp app: + +* **Conversation history** - Warp forks the conversation, so the cloud agent sees the full transcript and your local conversation stays untouched. +* **Workspace changes** - Warp snapshots your uncommitted repository changes, including untracked files, and applies them in the cloud run. +* **Pending input** - The optional follow-up prompt and any images attached to the input move to the cloud run. + +See [what carries over](/platform/handoff/#what-carries-over) for the full behavior, and [Handoff from local to cloud](/platform/handoff/local-to-cloud/) for prerequisites. + +### Hand off a conversation + +1. In an active conversation, run `/handoff`, or `/handoff <prompt>` to give the cloud agent a follow-up prompt. The **Hand off to cloud** card replaces the input area while your transcript stays visible. +2. The card suggests your most recent environment (preferring one that contains the current repository) and preselects your conversation's current model if it can run in the cloud. If the model is incompatible, it's flagged so you can choose another before continuing. +3. To open the searchable environment and model selectors, press `Ctrl+E`. +4. From the card summary, press `Enter` to hand off. The card shows progress, then reports that the cloud run was created along with a link to the run. + +Press `Ctrl+C` at any point before confirming to cancel the handoff. Your prompt and attachments return to the input. + +From the created card: + +* **`Enter`** - Opens the cloud run in your browser. +* **`C`** - Continues the conversation locally. The card collapses into a transcript banner with the run link, and the input reopens. +* **`N`** - Starts a new conversation. + +:::note +If you don't have a cloud environment yet, the card prompts you to create one: `Enter` opens the <a href={`${VARS.WEB_APP_URL}/environments`}>Environments page</a> in the {VARS.WEB_APP}, and `R` refreshes the list after you create one. +::: + +Handoff needs the conversation in a state it can fork. You can't hand off while a command is still running, or while the conversation has child agents that are in progress or blocked. Cancel the command or let the children finish first. Handing off an orchestrator forks only its own conversation. The orchestration and its child agents stay local. + +## Resume cloud conversations + +There are two ways to pick up a cloud agent's work: + +* **In the browser** - Open the run in the {VARS.WEB_APP} to review its transcript and changes, steer it, or continue the conversation there. [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/) covers that flow. +* **In the CLI** - Pull a finished cloud run into your terminal. It appears in the conversation history alongside local conversations. Press `←` in an empty input, or run `/conversations`, to open the conversation list, then select the cloud run. Your next prompt continues the conversation locally. + +Resuming in the CLI has two constraints: + +* **The run must be finished** - Cloud runs that are still in progress or blocked can't be opened in the CLI. +* **Warp Agent runs only** - Conversations that ran with a different harness, such as Claude Code or Codex, can't be opened in the CLI. + +You can also open a conversation directly at startup with `warp --resume <token>`. See [managing conversations in the CLI](/agents/cli/agent-conversations/#managing-conversations) to learn more about conversation history and resume details. + +## Multi-agent orchestration + +Orchestration lets one conversation spawn child agents that work in parallel, on your machine or in the cloud. The CLI runs the same parent/child model as the rest of the platform. [Multi-agent orchestration](/platform/orchestration/) covers the model, run states, and common patterns. + +To start an orchestration, ask the agent to parallelize the work, for example "split this migration across three agents". + +You can also shape the configuration in your prompt. For example, ask for a specific model to manage token spend: keep the parent on a premium model while child agents handle research on a cheaper open-source model. + +When the agent decides to spawn child agents, the CLI shows an approval card titled **Can I start additional agents for this task?** that summarizes the agents it wants to launch and the run-wide configuration. + +By default, no child agents launch until you approve. The **Run orchestrated agents** permission in your profile controls this: **Always allow** skips the approval card, and **Never** blocks child agents entirely. See [Permissions and profiles](/agents/cli/permissions-and-profiles/). + +From the approval card: + +* **`Enter`** - Approves the request and launches the child agents. +* **`Ctrl+E`** - Edits the configuration first: where the agents run (on your machine or in the cloud) and which model they use. Cloud agents add pages for the harness, environment, and host, plus an API key page for harnesses that need one. +* **`Ctrl+C`** - Rejects the request. + +After launch, a tab bar labeled **Agents:** appears above the session with one tab for the orchestrator and one tab per child agent. Messages between the parent and child agents appear in each agent's transcript. + +<figure style={{ maxWidth: "563px" }}> +![The Agents: tab bar in the Warp Agent CLI, showing the orchestrator tab and three child agent tabs with status glyphs](../../../../assets/agents/cli/tui-agents-tab-bar.png) +<figcaption>The Agents: tab bar with one child agent running and two finished.</figcaption> +</figure> + +* **Local child agents** - Each local child runs on your machine as its own session, starting in the parent's working directory. Local children always run the Warp Agent. +* **Cloud child agents** - Each cloud child runs in a cloud [environment](/platform/environments/), and can run a different harness than the parent, such as Claude Code or Codex, chosen on the approval card's harness page. A cloud child's session shows the run's live status and a link. Press `Enter` or click the link to open the run in the {VARS.WEB_APP}. If a cloud child can't start because GitHub authentication is required, its session shows the authentication link. Authenticate, then ask the agent to run the orchestration again. + +:::caution +Cloud child sessions in the CLI only show status. They don't accept input. To send prompts to a cloud child or respond to its approvals, open the run in the {VARS.WEB_APP}. +::: + +## Managing child agents + +The **Agents:** tab bar is how you move around an orchestration. + +* **Focus the tab bar** - Press `Shift+↑` from the input. The bar highlights the active conversation. +* **Switch agents** - `Tab` or `→` selects the next agent and `Shift+Tab` or `←` the previous one, wrapping across the orchestrator and all children. Switching keeps the bar focused so you can keep cycling. +* **Jump to an end** - `Shift+←` selects the first child and `Shift+→` selects the last one. +* **Return to the conversation** - `↓` moves focus back to the current session's input. `Esc` jumps back to the orchestrator. +* **Use the mouse** - Tabs are clickable, and when there are more children than fit, arrows at the ends of the bar page through them without changing your selection. + +Each agent keeps its own session. Transcript position, input drafts, and running work are all preserved while you view another agent, and child agents keep working in the background. Tabs reorder as statuses change, moving children that need attention, such as blocked ones, toward the front of the bar. + +A focused local child behaves like a regular conversation. You can send it follow-up prompts and respond to its permission requests. If a child's tab shows a blocked status, switch to that child to respond to its pending request. + +### Kill a child agent + +`Ctrl+C` kills a child agent. It stops the child's work, cancels the cloud run if the child is a cloud agent, and removes the child's tab and conversation, returning you to the orchestrator. + +* **From the tab bar** - With the tab bar focused and a child tab selected, a single `Ctrl+C` kills the selected child. The footer shows `Ctrl+C to kill sub-agent` as a reminder. +* **While viewing a child** - Press `Ctrl+C` twice. The first press arms a short confirmation window and the footer shows `ctrl-c again to kill child agent`. A second press within the window kills the child. + +In the orchestrator's own session, `Ctrl+C` keeps its usual behavior. + +## Related pages + +* [Handoff overview](/platform/handoff/) - Directions of handoff and what carries over in each. +* [Handoff from local to cloud](/platform/handoff/local-to-cloud/) - Prerequisites, the Warp app flow, and troubleshooting. +* [Multi-agent orchestration](/platform/orchestration/) - The parent/child model, run states, and orchestration patterns. +* [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/) - Open, inspect, and continue cloud runs in the {VARS.WEB_APP}. +* [Agent conversations in the CLI](/agents/cli/agent-conversations/#managing-conversations) - Conversation history, `/conversations`, and `--resume`. +* [Environments](/platform/environments/) - Configure the repos, image, and setup commands cloud agents run with. diff --git a/src/content/docs/agents/cli/configuration.mdx b/src/content/docs/agents/cli/configuration.mdx new file mode 100644 index 000000000..7b6e15df3 --- /dev/null +++ b/src/content/docs/agents/cli/configuration.mdx @@ -0,0 +1,163 @@ +--- +title: "Customizing the Warp Agent CLI" +description: >- + Configure Warp Agent CLI themes, the statusline, and the start screen, and give the + agent context from project rules, skills, and MCP servers. +--- +import { VARS } from '@data/vars'; + +The {VARS.WARP_CLI} keeps its configuration in a plain TOML settings file on your machine. You can change settings by editing the file directly, by running slash commands like `/theme` and `/statusline`, or by asking the agent to update a setting for you. + +Beyond the CLI's own settings, this page also covers the agent's context, which includes the project rules, skills, and MCP servers the agent picks up as you work. + +## The settings file + +The CLI reads its settings from a `settings.toml` file: + +* **macOS** - `~/.warp_cli/settings.toml` +* **Linux** - `~/.config/warp-terminal/cli/settings.toml` (respects `$XDG_CONFIG_HOME`) +* **Windows** - `%LOCALAPPDATA%\warp\Warp\config\cli\settings.toml` + +The file is created the first time you change a setting, and you can also create it yourself. Settings use dotted TOML sections. For example: + +```toml title="settings.toml" +[appearance] +theme = "dark" +``` + +:::note +CLI settings are local to your machine and are never synced to the cloud. They are also independent from the Warp app's settings: the app and the CLI keep separate settings files, so changing one never affects the other. +::: + +## Edit settings + +Change settings any of these ways: + +### Edit the file directly + +Open the settings file in your editor and change values directly. The CLI watches the file while it's running and reloads most values as you save, so edits take effect without a restart. Theme edits are the exception: they apply the next time you run `/theme` or restart the CLI. If a value is invalid, the CLI logs the problem and uses the default for that setting instead. If the file can't be parsed at all, the CLI starts with default settings. + +### Use slash commands + +Commands like `/theme` and `/statusline` open interactive panels for specific settings and save your choice to the settings file automatically. See [Themes](#themes) and [Statusline](#statusline). + +### Ask the agent + +Describe the change to the agent in your CLI session, in plain language. The CLI ships with a bundled skill and a schema of every available setting, which the agent uses to find the right key, validate the value, and update the settings file for you. Try prompts like: + +* "Switch my theme to light." +* "Add the time to my [statusline](#statusline)." +* "What CLI settings can I change?" + +The agent's edits follow the same hot-reload behavior as editing the file directly (see [Edit the file directly](#edit-the-file-directly)). For the full list of built-in skills, see [Bundled skills](#bundled-skills). + +## Themes + +The CLI renders with a light or dark color theme. Set it with the `/theme` slash command: + +* **`/theme auto`** - Matches the host terminal's background (default). +* **`/theme light`** - Always uses the light theme. +* **`/theme dark`** - Always uses the dark theme. + +Running `/theme` applies the change immediately and persists it across sessions as the `theme` key under `[appearance]` in the settings file. + +In auto mode, detection runs at startup, so if you switch your terminal's colors while the CLI is running, restart it or set a theme explicitly. + +## Statusline + +The statusline is the row below the CLI's input box that shows session information at a glance. By default it shows the auto-approve indicator, the active model, the working directory, the Git branch, and the Git diff status inside a repository, plus the Vim mode indicator when Vim mode is on. You can enable any of these items: + +<figure style={{ maxWidth: "736px" }}> +![The Warp Agent CLI statusline showing the auto-approve, model, working directory, Git branch status, Git diff status, credit usage, context window usage, and agent to-do list chips](../../../../assets/agents/cli/tui-statusline.png) +<figcaption>The statusline with credit usage, context window usage, and task list chips enabled.</figcaption> +</figure> + +* **Auto-approve indicator** - A clickable `▶▶` toggle for auto-approve, highlighted when it's on. +* **Vim mode indicator** - The active Vim mode (such as `NOR` or `INS`), shown only when Vim mode is enabled. +* **Model** - The active model. Click it to open the model picker. +* **Working directory** - The current working directory. +* **Git branch** - The current branch, when the directory is a Git repository. +* **Git branch status** - The branch, plus how far it is ahead of or behind its upstream (for example, `master • ↑1`). Enabling this replaces the plain Git branch chip, rather than adding a second one. +* **Git diff status** - Files changed, with line additions and deletions. +* **GitHub pull request** - The pull request for the current branch. Click it to open the PR on GitHub. +* **Credit usage** - Credits used by the current conversation. Click it to switch between credits and provider cost. +* **Context window usage** - How much of the model's context window the conversation has used. +* **Agent to-do list** - The agent's progress through its current task list. + +You can also add the date, the time (12- or 24-hour), and a voice input control. + +Items only appear when they have something to show. For example, the Git items appear only inside a repository. In shell mode, the statusline always leads with a shell mode label. + +### Customizing the statusline + +Choose which items appear and in what order: + +1. Run `/statusline`. The **Configure statusline** panel opens with every available item. +2. Select an item and press `Enter` to toggle its visibility. +3. Press `←` and `→` to move the highlighted item earlier or later in the row. +4. Press `Esc` to save and close. Press `Ctrl+C` to cancel without saving. + +Your choices are saved to the settings file, so the layout persists across sessions. To start over, run `/reset-statusline`, which restores the default items and ordering. + +## Start screen + +The start screen appears when you launch the CLI, showing a rotating ASCII object alongside sections for your account, the changelog, project info, and MCP servers. Customize it with the `appearance.zero_state` settings: + +* **`object`** - The rotating object. Keep the built-in one, or point the setting at your own ASCII art file (a path relative to the CLI settings directory). Changing the setting reloads the object. Edits to the linked file take effect after a restart. +* **`rotation_period_seconds`** - Seconds per full rotation, from 1 through 60. +* **`show_signed_in_user`, `show_changelog`, `show_project_info`, `show_mcp`, `show_animation`** - Toggle individual start-screen sections. +* **`freeze_animation_when_unfocused`** - Stop repainting the animation while your terminal window is unfocused, so an idle start screen doesn't use CPU in the background. Off by default, and applied as soon as you save the setting. + +The fastest way to change these is to [ask the agent](#ask-the-agent), for example "use my own ASCII art for the start screen object". + +## Project context and rules + +The CLI gives its agent the same layered context system as the Warp app, combining your working directory, project rules, skills, and MCP servers, all scoped to the directory you're working in. + +The agent works in your session's current directory. When you `cd`, project rules and skills re-scope to the new directory automatically. + +Within a project, the CLI picks up the same rule files as the Warp app: + +* **Project rules** - `AGENTS.md` (or `WARP.md`) files in your repository apply automatically, starting from the repository root and your current directory. See [Rules](/agents/capabilities/rules/) for the file format, nested rules in subdirectories, and precedence. +* **Global rules** - A rule file at `~/.agents/AGENTS.md` applies across all projects on your machine. + +Because rules and skills come from the same shared locations, a repository already configured for agents in the Warp app (or any tool that reads `AGENTS.md`) works in the CLI immediately. + +## Skills + +[Skills](/agents/capabilities/skills/) are reusable instruction sets the agent can invoke to perform specific tasks. The CLI discovers the same skills as the Warp app. Project skills come from your repository's skill directories (e.g., `.agents/skills/`), and personal skills come from your home directory (e.g., `~/.agents/skills/`), scoped to your current working directory. + +Run `/skills` to browse every skill in scope. Selecting a skill inserts `/skill-name` into the input so you can add extra instructions before running it. Any text after the skill name is passed along, either as [skill arguments](/agents/capabilities/skills/#skill-arguments) or as additional context for the agent. You can also invoke a skill directly by typing `/` followed by its name, for example `/deploy push the latest changes to staging`. + +### Bundled skills + +The CLI ships with built-in skills that appear in the skills menu alongside your own: + +* **`/modify-settings`** - Updates CLI settings using the bundled settings schema to find and edit the right key. See [Ask the agent](#ask-the-agent). +* **`/tui-migrate-setup`** - Sets up the CLI from an existing Warp app installation. The agent copies compatible settings and global MCP server definitions from the app, and asks for approval before changing anything. Credentials and OAuth state are never copied, so MCP servers that require authentication prompt you to re-authenticate. Rules and skills don't need migration: the CLI and the Warp app both discover them from the same file locations (see [Project context and rules](#project-context-and-rules) and [Skills](#skills)). + +## MCP servers + +[MCP servers](/agents/capabilities/mcp/) extend the agent with external tools and data sources. The CLI keeps its own MCP server configuration, separate from the Warp app's, so each can run its own set of servers. + +Servers are defined in a JSON config file using the same `mcpServers` format as [file-based MCP servers](/agents/capabilities/mcp/#file-based-mcp-servers) in the Warp app (on macOS, the file is `~/.warp_cli/.mcp.json`). Edit the file to add or remove servers. The CLI picks up changes automatically. Configured servers start automatically once you're logged in. + +:::note +The CLI reads MCP servers from its global config file only. Project-scoped MCP config files in repositories are not detected. To copy global server definitions from the Warp app, use the `/tui-migrate-setup` bundled skill. +::: + +### Managing servers with `/mcp` + +Type `/mcp` to open the MCP management view. The header shows the path to the config file the CLI is reading. + +Each configured server is listed with its transport (`stdio` or `HTTP/SSE`) and current status, including the number of tools a running server exposes. + +Press `Enter` on a server to start, stop, or retry it depending on its state. Failed rows show the error message. Servers awaiting authentication reopen the OAuth page in your browser, and servers with saved credentials show a **Log out** row that clears them. + +## Related pages + +* [Rules](/agents/capabilities/rules/) - Full guide to project and global rules. +* [Skills](/agents/capabilities/skills/) - Authoring skills, skill arguments, and skill locations. +* [MCP servers](/agents/capabilities/mcp/) - Config format, server examples, and authentication. +* [Codebase Context](/agents/capabilities/codebase-context/) - Codebase indexing in the Warp app. +* [{VARS.WARP_CLI} reference](/agents/cli/reference/) - Command-line flags, slash commands, and keyboard shortcuts. diff --git a/src/content/docs/agents/cli/index.mdx b/src/content/docs/agents/cli/index.mdx new file mode 100644 index 000000000..e1b746c20 --- /dev/null +++ b/src/content/docs/agents/cli/index.mdx @@ -0,0 +1,55 @@ +--- +title: "Warp Agent CLI overview" +description: >- + Run the Warp Agent in any terminal with the Warp Agent CLI. Prompt the agent, + run shell commands, and hand work off to cloud agents. +--- +import { VARS } from '@data/vars'; + +The {VARS.WARP_CLI} brings the Warp Agent from the Warp app to the terminal you already use. Run the `warp` command to start an agent conversation. You can prompt the agent in natural language, review and approve its actions, and run shell commands in the same input, without changing your terminal setup. + +## What is the Warp Agent CLI? + +The {VARS.WARP_CLI} is a standalone terminal program that runs [the Warp Agent](/platform/harnesses/warp-agent/), the same agent that powers the Warp app. It renders conversations as a scrolling transcript in your terminal, with streaming responses, code diffs, tool calls, and permission requests you approve inline. + +The CLI is also a native terminal multiplexer. It creates and maintains its own pseudoterminal (PTY), which lets you and the agent execute commands and interact with running processes through the same terminal, including prompts and full-screen terminal apps. Because it's a regular command-line program, it works in any terminal emulator, including over SSH. + +To get a working setup in a few minutes, follow the [quickstart](/agents/cli/quickstart/). + +## Key features + +* **[Agent conversations](/agents/cli/agent-conversations/)** - Follow the agent's work in a scrollable transcript with streamed responses, Markdown formatting, file-edit diffs, tool calls, plans, and task lists. +* **[Shell commands](/agents/cli/input-and-shell-commands/#shell-mode)** - Run shell commands from the same input you use to prompt the agent, including long-running and interactive ones. +* **[Permissions and profiles](/agents/cli/permissions-and-profiles/)** - Approve commands and file edits from inline request cards, or configure execution profiles and auto-approve. +* **[Persistent conversations](/agents/cli/agent-conversations/#managing-conversations)** - Conversations save to your Warp account, so you can exit and resume later or switch between them. +* **[Cloud handoff and orchestration](/agents/cli/cloud-and-orchestration/)** - Hand off a conversation to a cloud agent, continue cloud runs in the CLI, and coordinate multiple agents. +* **[Project context](/agents/cli/configuration/#project-context-and-rules)** - The agent automatically picks up your project's rules (like `AGENTS.md`), skills, and MCP servers. +* **[Model choice](/agents/cli/models-and-usage/)** - Pick a model per conversation, bring your own provider API keys, and track credit usage. +* **[Customization](/agents/cli/configuration/)** - Configure themes, the statusline, and the start screen through a local settings file. + +## How it relates to the Warp app and cloud agents + +* **The Warp app** - The CLI runs the same [Warp Agent](/platform/harnesses/warp-agent/) harness as the Warp app, so your account, plan, model access, rules, and skills work the same in both. The CLI doesn't require the Warp app to be installed. +* **{VARS.WARP_AUTOMATION_PLATFORM}** - The {VARS.WARP_AUTOMATION_PLATFORM} is Warp's programmable platform for running and coordinating agents at scale. The CLI connects to the same platform. Conversations sync to your Warp account, and you can hand work off to [cloud agents](/agents/cli/cloud-and-orchestration/) or continue a cloud run from your terminal. + +## Checking your account, plan, and billing + +The CLI has slash commands for the account details you'd otherwise look up in the Warp app or the {VARS.WEB_APP}. + +* **Session and account status** - Run `/status` to open a read-only panel with the installed version, the current conversation's name and ID, the working directory, and the organization and email you're signed in as. Press `Esc` to close it. Include these details when you report a problem. +* **Upgrade your plan** - Run `/upgrade` to open Warp's upgrade page in your browser. +* **Manage team billing** - Run `/manage-billing` to open your team's billing page in your browser. The command is listed only when you administer billing for your team. + +For how usage is metered as you work, see [models and usage](/agents/cli/models-and-usage/#usage-and-cost). + +## Coming from the Warp app + +If you already use the Warp app, most of your setup carries over. Rules and skills are discovered from the same shared paths, and your saved Warp Drive prompts are available after you log in (other Warp Drive object types aren't available in the CLI). To copy compatible settings and global MCP server configurations, run the bundled `/tui-migrate-setup` skill and follow the agent's instructions. Credentials are never copied, so MCP servers that require authentication must be reauthenticated in the CLI. + +## Next steps + +* [Quickstart](/agents/cli/quickstart/) - Install the CLI, log in, run your first prompt, and see the supported platforms. +* [Agent conversations](/agents/cli/agent-conversations/) - Learn how the transcript, diffs, and approvals work. +* [Input and shell commands](/agents/cli/input-and-shell-commands/) - Compose prompts and run shell commands from the same input. +* [Configuration](/agents/cli/configuration/) - Customize the CLI with the settings file. +* [Reference](/agents/cli/reference/) - Flags, slash commands, and keyboard shortcuts. diff --git a/src/content/docs/agents/cli/input-and-shell-commands.mdx b/src/content/docs/agents/cli/input-and-shell-commands.mdx new file mode 100644 index 000000000..eb256a607 --- /dev/null +++ b/src/content/docs/agents/cli/input-and-shell-commands.mdx @@ -0,0 +1,161 @@ +--- +title: "Input and shell commands in the Warp Agent CLI" +description: >- + Compose prompts, edit input, and run shell commands in the Warp Agent CLI, + including menus, history, completions, images, voice, and interactive + commands. +--- +import { VARS } from '@data/vars'; + +The {VARS.WARP_CLI} is a full terminal as well as an agent. Every session runs a real shell, so you can run commands in the same place you prompt the agent. The input is a multiline editor that combines readline-style editing with inline menus for slash commands, history, and completions, plus mouse support, image attachments, and voice input. For the complete list of flags, slash commands, and keyboard shortcuts, see the [{VARS.WARP_CLI} reference](/agents/cli/reference/). + +## Editing basics + +The input is a multiline editor. + +* **Insert a newline** - Press `Ctrl+J`, or `Shift+Enter` in terminals that support distinguishing it. `Alt+Enter` also works. +* **Edit with readline-style keys** - The editor supports familiar bindings such as `Ctrl+A` and `Ctrl+E` (start and end of line), `Ctrl+W` (delete the previous word), `Ctrl+K` and `Ctrl+U` (delete to the end or start of the line), `Ctrl+Y` (reinsert the last deleted text), and `Ctrl+Z` (undo). +* **Use macOS Command shortcuts** - When the Kitty keyboard protocol is enabled in your terminal, the editor supports Command-modified shortcuts such as `⌘+X` to cut and `⌘+Shift+←` or `⌘+Shift+→` to extend the selection. + +The full editing and selection table is in the [keyboard shortcuts reference](/agents/cli/reference/#keyboard-shortcuts). + +:::note +Core `Ctrl` and `Alt` bindings are cross-platform. Shortcuts that use `Alt` require some macOS terminals' Option-as-Alt (Meta) setting. Command-modified shortcuts require a terminal with the Kitty keyboard protocol enabled. +::: + +### Vim mode + +If you prefer modal editing, run `/vim-mode` to toggle Vim keybindings in the input. The setting persists across sessions. Turn on the [statusline](/agents/cli/configuration/#statusline) Vim mode item to see the active mode (such as `NOR` or `INS`) while you type. + +## Slash commands + +Type `/` at the start of an empty input to open the slash command menu. Entries for toggles and pickers show their current state, for example `/theme (currently auto: Dark)` or `/auto-approve (currently off)`. + +When a command takes an argument, the input shows a ghost-text argument hint after the full command name, for example `/theme <auto|light|dark>`. + +Your [skills](/agents/cli/configuration/#skills) also appear in the slash command menu, so you can invoke a skill by typing `/` followed by its name. + +The [slash commands reference](/agents/cli/reference/#slash-commands) lists every command. + +## Input history + +Press `↑` with the cursor on the first row of the input to open the history menu. + +* **What's listed** - In agent mode, the menu combines your previous prompts and shell commands in one list, with commands marked by a `!` prefix. In [shell mode](#shell-mode), the menu lists commands only. +* **Preview** - Moving the selection previews each entry in the input and switches the input to the matching mode: recalled commands run as shell commands, and recalled prompts go to the agent. +* **Submit** - `Enter` runs the selection immediately. It doesn't insert it for editing. +* **Dismiss** - `Esc` restores what you had typed. Pressing `↓` past the newest entry does the same. + +## Tab completions + +In [shell mode](#shell-mode), press `Tab` to complete the command you're typing, including file and directory paths. + +* If exactly one completion matches, the CLI applies it immediately. +* If several completions match, the CLI inserts the longest shared prefix and opens a completion menu. Press `Tab` again to cycle through the suggestions. + +## Selection and clipboard + +* **Highlight to copy** - Finishing a mouse selection in the input or the [conversation transcript](/agents/cli/agent-conversations/) automatically copies it. +* **Keyboard selection** - Extend the selection with `Shift` plus the arrow keys, or select everything with `Ctrl+Shift+A`. Copy with `Ctrl+Shift+C` and cut with `Ctrl+X`. +* **Paste** - Press `Ctrl+V` or `Ctrl+Shift+V` (also `Alt+V` on Windows). Your terminal's own paste shortcut works as well. +* **Click controls** - Interactive elements such as the **Voice** footer entry and the attachment bar controls respond to clicks. + +:::note +Copying works over SSH: on remote sessions the CLI writes the clipboard through the OSC 52 escape sequence (including tmux passthrough), so your local clipboard receives the text when your terminal supports OSC 52. +::: + +## Attach images + +Attach images to a prompt so the agent can analyze them: + +* **Paste an image** - Copy an image to your clipboard and press `Ctrl+V`. +* **Paste or drop a file path** - Paste the path to an image file, or drag the file onto your terminal window to insert its path. Absolute paths, paths relative to the working directory, and `~` paths all resolve. + +Supported formats are PNG, JPEG, GIF, and WebP. Attaching an image locks the input to agent mode, since images are sent to the agent rather than the shell. + +Attached images appear in an attachment bar above the input. Press `Tab` to focus the bar, `Backspace` to remove the selected attachment, and `Esc` to return to the input. + +## Voice input + +Dictate prompts instead of typing them: + +:::caution +Voice input isn't currently included in the official Linux build. Linux support is planned. +::: + +1. Start listening with `Ctrl+S`, the `/voice` slash command, or by clicking **Voice** in the footer. The footer shows **Listening** while recording. +2. Press `Enter`, or click the footer entry again, to stop recording. The transcribed text lands in the input so you can review and edit it before submitting. + +Press `Esc` while transcription is in progress to cancel it. `/voice` clears the input before recording, and `Ctrl+S` keeps what you've already typed. + +Voice input in the CLI uses the same transcription service as the Warp app. See [voice input for agents](/agents/local-agents/interacting-with-agents/voice/) for microphone setup, privacy, and usage limits. + +## Keyboard hints and the shortcuts menu + +The CLI shows its shortcuts in context, so you rarely need to memorize them: + +* **Placeholder hints** - An empty input shows the key triggers for the current mode. +* **Shortcuts menu** - Type `?` in an empty input to open a shortcuts overview. Its contents adapt to what you're doing: agent mode lists the menu triggers and input history, shell mode shows how to return to agent mode, and extra sections appear during multi-agent sessions or agent-controlled terminal use. Press `Esc`, or start typing, to close it. + +## Shell mode + +The input is agent-first: by default, pressing `Enter` sends your text to the agent as a prompt. Use shell mode to run a command instead: + +1. Press `!` at the start of the input. The prompt marker changes from `>` to `!`, and the statusline below the input shows **Shell mode**. +2. Run a command. The input returns to agent mode afterward. + +To leave shell mode without running a command, press `Esc`, or press `Backspace` at the start of the input. Any text you typed stays in the input. + +In shell mode, press `Tab` to complete commands and paths. See [Tab completions](#tab-completions). + +:::note +Running a shell command cancels the agent's in-progress response, if there is one. +::: + +## Natural language detection + +Out of the box, the CLI never guesses what your input is: everything goes to the agent unless you enter shell mode. To type commands directly without the `!` prefix, turn on natural language detection: + +* **Toggle detection** - Run `/natural-language-detection` to turn detection on or off. The statusline confirms the change, and the setting persists across sessions. +* **Automatic classification** - With detection on, the CLI classifies your input as you type. When the input looks like a shell command (for example, `git status`), the input switches to shell mode, and `Enter` runs it as a command. Everything else is sent to the agent. +* **Ambiguous input** - Short or ambiguous input stays in agent mode, and a single word switches to shell mode only when it matches a command available in your shell. + +The prompt marker and statusline always show the current mode before you press `Enter`. If detection classifies input differently than you intended, press `Esc` to switch back to agent mode, or press `!` at the start of the input to force shell mode. + +## Long-running and interactive commands + +When a command keeps running, such as a dev server, a package install, or an interactive prompt, the CLI hands input over to it: + +* **Input passthrough** - Keystrokes and pasted text are forwarded to the running process, so password requests, confirmation prompts, and other interactive programs work as they do in a plain terminal. +* **Type ahead** - If you start typing your next command before the current one finishes, the typed characters are carried into the input when the command completes, with the cursor at the end. This matches type-ahead behavior in shells like zsh and bash. + +One command runs in the session at a time. If the terminal is already busy, for example while the agent is running a command of its own, submitting a shell command shows a notice in the statusline and keeps your text in the input. + +## Full-screen terminal apps + +Commands that switch the terminal to the alternate screen, such as `vim`, `htop`, or `less`, take over the whole CLI view: + +* The app renders full-screen and receives keyboard, paste, scroll, and mouse input, so editors and other terminal UIs are fully usable inside the CLI. +* When the app exits, the transcript returns with your conversation intact. + +## Stopping commands and exiting + +`Ctrl+C` performs one contextual action per press: + +* **While a command is running** - `Ctrl+C` interrupts the running command, as in a plain terminal. It doesn't exit the CLI. +* **While the agent is responding** - `Ctrl+C` cancels the in-progress response. Text in the input is preserved. +* **At an idle prompt** - `Ctrl+C` clears the input if it has text. + +After a press at the prompt, the statusline shows `ctrl-c again to exit` for about one second. Press `Ctrl+C` a second time within that window to exit the CLI. This works even while the agent is responding. While a shell command is running, `Ctrl+C` keeps interrupting the command instead. + +There are two other ways to exit: + +* **`Ctrl+D`** - Exits immediately when the input is empty. +* **`/exit`** - Exits from the slash command menu. + +When you exit, the CLI prints a command you can use to pick the conversation back up later. See [Managing conversations](/agents/cli/agent-conversations/#managing-conversations) for resuming and switching conversations. + +## Related pages + +* [{VARS.WARP_CLI} reference](/agents/cli/reference/) - Flags, environment variables, slash commands, and keyboard shortcuts. +* [Agent conversations in the {VARS.WARP_CLI}](/agents/cli/agent-conversations/) - The transcript, tool calls, diffs, and managing conversations. diff --git a/src/content/docs/agents/cli/models-and-usage.mdx b/src/content/docs/agents/cli/models-and-usage.mdx new file mode 100644 index 000000000..41b14f6f1 --- /dev/null +++ b/src/content/docs/agents/cli/models-and-usage.mdx @@ -0,0 +1,57 @@ +--- +title: "Models and usage in the Warp Agent CLI" +description: >- + Choose models in the Warp Agent CLI, bring your own API key, and track + credit usage and per-response cost. +--- +import { VARS } from '@data/vars'; + +The {VARS.WARP_CLI} gives you the same model options as the Warp app. You can pick the model that powers your conversations, bring your own provider API keys, route requests through custom model routers, and see what every response costs as you work. + +## Choosing a model + +Run `/model` to open the model picker. You can also click the model name in the [statusline](/agents/cli/configuration/#statusline) to open the same picker. + +Models that your plan or your team's settings don't allow appear disabled in the picker. + +Your choice is saved as the base model of your active profile, so it persists across sessions. See [permissions and profiles](/agents/cli/permissions-and-profiles/) for how profiles work in the CLI. For the full list of supported models and to learn more about how Warp's Auto models pick for you, see [Model choice](/agents/inference/model-choice/). + +## Bring your own API key + +The CLI supports [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/) for OpenAI, Anthropic, and Google models, and can connect an [X Premium or SuperGrok subscription](/agents/inference/grok-subscription/) for Grok models. When you select a model covered by one of your keys, requests are billed through your provider account and don't consume your Warp [credits](/support-and-community/plans-and-billing/credits/). + +Run `/api-keys` to open the key management menu. It lists each provider with its connection state, plus a Warp credit fallback toggle: + +* **Set a key** - Press `Enter` on OpenAI, Anthropic, or Google and enter the key. Input is masked, so the key never appears in your transcript or shell history, and it's saved to your device's secure storage. Warp does not store provider keys on its servers. +* **Replace or clear a key** - On a connected provider, `Enter` loads the stored key (still masked) for editing, and saving an empty field clears it. `Ctrl+X` clears the highlighted provider's key from the list. +* **Connect X Premium or SuperGrok** - Press `Enter` on the subscription row and the CLI opens your browser to sign in to your xAI account. `Ctrl+X` disconnects it. Running `/connect-grok` jumps straight to this row and starts the sign-in. +* **Warp credit fallback** - Press `Enter` to toggle whether a request that fails through your key is retried with Warp credits. See [failover and fallback behavior](/agents/inference/bring-your-own-api-key/#failover-and-fallback-behavior). + +You can also store or clear keys outside a session with the `--set-provider-api-key` and `--clear-provider-api-key` flags. See the [{VARS.WARP_CLI} reference](/agents/cli/reference/#command-line-flags). X Premium/SuperGrok connections can only be managed from inside a session, with `/api-keys` or `/connect-grok`. + +:::note +Warp's built-in Auto models always consume Warp credits, even with BYOK configured. To bill through your own account, select a specific provider model, or use a [custom router](/agents/inference/custom-routers/#using-your-own-api-keys-byok) whose targets your keys cover. See [BYOK usage and billing behavior](/agents/inference/bring-your-own-api-key/#byok-usage-and-billing-behavior) for the full rules. +::: + +## Custom model routing + +[Custom routers](/agents/inference/custom-routers/) appear in the `/model` picker alongside individual models. Select one and each prompt resolves to a concrete model using the routing logic you defined. + +The CLI loads the same router definitions as the Warp app. These are YAML files in `~/.warp/custom_model_routers/`, plus any team-synced routers your admin shares. [Authoring a router as a file](/agents/inference/custom-routers/#author-a-router-as-a-file) documents the file format. + +## Usage and cost + +The CLI shows usage at two levels: + +* **Conversation total** - Once a conversation has reported any usage, the [statusline](/agents/cli/configuration/#statusline) shows its accumulated credits (e.g., `2.5 credits`). Click the entry to switch between credits and the equivalent provider cost in dollars. Your choice persists across sessions. +* **Per-response details** - Run `/cost` to toggle a summary row under the latest response showing how long it took and how many credits it spent (e.g., `12s • 1.2 credits`). The summary appears once the response finishes. + +Credits are Warp's unit of usage for agent requests. For what credits cover and how plans differ, see [Credits](/support-and-community/plans-and-billing/credits/). + +## Related pages + +* [Model choice](/agents/inference/model-choice/) - Supported models and how automatic model selection works. +* [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) - How BYOK works, key storage, and billing behavior. +* [SuperGrok subscription](/agents/inference/grok-subscription/) - Use Grok models through your xAI account. +* [Custom routers](/agents/inference/custom-routers/) - Define routing logic that picks a model per task. +* [{VARS.WARP_CLI} reference](/agents/cli/reference/) - Flags and slash commands, including the API key commands. diff --git a/src/content/docs/agents/cli/permissions-and-profiles.mdx b/src/content/docs/agents/cli/permissions-and-profiles.mdx new file mode 100644 index 000000000..a394b6056 --- /dev/null +++ b/src/content/docs/agents/cli/permissions-and-profiles.mdx @@ -0,0 +1,102 @@ +--- +title: "Permissions and profiles in the Warp Agent CLI" +description: >- + Control what the agent can do in the Warp Agent CLI with permission request + cards, auto-approve, and execution profiles in the settings file. +--- +import { VARS } from '@data/vars'; + +The {VARS.WARP_CLI} uses the same permission model as the Warp app: you choose how much approval each type of action needs. This page covers how to set permissions in the CLI, what happens when the agent asks for approval, and how to grant full autonomy with auto-approve. For the full permission model, including team-wide controls, see [Profiles & Permissions](/agents/capabilities/agent-profiles-permissions/). + +## How permissions work + +Every action the agent proposes, such as running a shell command, editing files, or calling an MCP tool, is checked against your active execution profile before it runs. Each action type is set independently to [`always_ask`, `always_allow`, or `agent_decides`](#permission-values). For example, you could require approval for every shell command while letting the agent read files without asking, or allow everything for an agent that never stops to ask. + +By default, the CLI applies these permission values: + +* **Shell commands, file edits, file reads, MCP tool calls** - `agent_decides`. For file edits, `agent_decides` still prompts every time, so you always review a diff before it's applied. +* **Typing into a running command, launching child agents** - Always asks. +* **Command denylist** - Sits on top of these values. Matching commands require approval even when `execute_commands` is `always_allow`. + +Change any of this by [editing your execution profile](#execution-profiles). + +## Approving agent actions + +When an action needs your approval, the agent pauses and shows a permission card with the proposed command or file edits. Beyond approving or rejecting it, you can: + +* Select **Other** to reply with guidance instead of running the action. The agent adjusts its approach based on what you type. +* Press `E` on a command card to edit it before approving. `Esc` exits the editor without rejecting the request. +* Press `E` on a file-edits card to expand or collapse all diffs. + +## Auto-approve + +Auto-approve gives the agent full autonomy. Proposed actions run immediately, without permission cards, until the task finishes or you turn it off. Toggle it with `/auto-approve` or `Ctrl+Shift+I`. + +Auto-approve is scoped to a single conversation, and new conversations start with it off. To start every new conversation in a session with auto-approve already on, launch with `warp --auto-approve`. The statusline's auto-approve indicator (`▶▶`) shows the current state and is on by default. If your profile sets `ask_user_question = "ask_except_in_auto_approve"`, the agent also skips clarifying questions while auto-approve is on. + +:::danger +With auto-approve on, the agent runs commands and applies file edits without review, including commands that match your own command denylist. Press `Ctrl+C` to stop the agent if it starts doing something you didn't intend. +::: + +To keep your denylist in force while auto-approve is on, turn off the bypass in your [settings file](/agents/cli/configuration/#the-settings-file): + +```toml title="settings.toml" +[agents.warp_agent.other] +auto_approve_bypasses_command_denylist = false +``` + +Denylist rules enforced by your team in the [Admin Panel](/enterprise/team-management/admin-panel/) always require approval and are never bypassed, regardless of this setting. + +## Execution profiles + +The CLI reads its permissions from execution profiles stored in its [settings file](/agents/cli/configuration/). Profiles live under the `agents.execution_profiles` table, and the CLI always runs with the profile under the reserved `default` key: + +```toml title="settings.toml" +[agents.execution_profiles.default] +name = "Default" +execute_commands = "agent_decides" +apply_code_diffs = "agent_decides" +read_files = "agent_decides" +command_allowlist = ['cargo (build|check|test)(\s.*)?'] +``` + +:::caution +Setting `command_denylist` replaces the built-in default denylist, which covers `rm`, `curl`, `wget`, `eval`, `ssh`, shells, and other risky command patterns. Omitting the field keeps the defaults. To deny additional commands, extend the generated list in your settings file rather than writing a short list from scratch. +::: + +Edit the file directly, or ask the agent to change its own permissions and it will update the settings file for you. The CLI picks up saved changes automatically. + +Profiles in the {VARS.WARP_CLI} are local to your machine. They never sync to the cloud, and they are separate from the Agent Profiles you configure in the Warp app. You can define additional profiles in the file, but the CLI currently always runs with `default`. + +### Permission values + +Most permission fields accept one of three values: + +* **`agent_decides`** - The agent acts on its own when it's confident and asks when it's uncertain. +* **`always_ask`** - Every action of this type requires approval. +* **`always_allow`** - Actions of this type run without prompting. + +### Profile fields + +* **`execute_commands`** - Permission to run shell commands. +* **`apply_code_diffs`** - Permission to apply file edits. +* **`read_files`** - Permission to read files. +* **`mcp_permissions`** - Permission to call MCP servers. +* **`write_to_pty`** - Permission to type into running interactive commands. Also accepts `ask_on_first_write`. +* **`ask_user_question`** - Whether the agent may pause to ask clarifying questions: `always_ask`, `ask_except_in_auto_approve`, or `never`. +* **`run_agents`** - Permission to launch child agents: `always_ask`, `always_allow`, or `never_allow`. +* **`command_allowlist`** - Regular expressions for commands that run without approval. +* **`command_denylist`** - Regular expressions for commands that require approval regardless of the other permission values. [Auto-approve bypasses this list by default](#auto-approve). +* **`directory_allowlist`** - Directories the agent may read without approval. + +Profiles also hold model overrides such as `base_model`, covered in [Models and usage in the {VARS.WARP_CLI}](/agents/cli/models-and-usage/). + +:::note +The profile collection is validated as a whole. If any profile contains an invalid value, the CLI keeps the last valid configuration while it's running and falls back to the built-in default profile on the next launch, until the file is fixed. +::: + +## Related pages + +* [Profiles & Permissions](/agents/capabilities/agent-profiles-permissions/) - The full permission model, autonomy levels, and allowlist/denylist behavior. +* [Configuring the {VARS.WARP_CLI}](/agents/cli/configuration/) - The settings file, themes, statusline, and start screen. +* [Agent conversations in the {VARS.WARP_CLI}](/agents/cli/agent-conversations/) - How tool calls, diffs, and agent questions render in the transcript. diff --git a/src/content/docs/agents/cli/quickstart.mdx b/src/content/docs/agents/cli/quickstart.mdx new file mode 100644 index 000000000..5a8846e70 --- /dev/null +++ b/src/content/docs/agents/cli/quickstart.mdx @@ -0,0 +1,122 @@ +--- +title: "Warp Agent CLI quickstart" +description: >- + Install the Warp Agent CLI, log in, and run your first agent conversation + in your own terminal in a few minutes. +--- +import { VARS } from '@data/vars'; +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +This guide takes you from installing the {VARS.WARP_CLI} to your first agent conversation in about five minutes. + +## Prerequisites + +* **A Warp account** - The login step opens your browser, where you can sign in or [create an account](https://app.warp.dev/signup). The CLI uses the same account as the Warp app, but doesn't require the app to be installed. +* **A supported platform** - macOS (Apple Silicon or Intel), Linux (x64 or Arm64), or Windows (x64 or Arm64). + +## 1. Install the Warp Agent CLI + +Install the CLI with the command for your operating system. The install script is the recommended method, because it's the only one that keeps the CLI up to date on its own. + +<Tabs> + <TabItem label="macOS and Linux"> + ```bash + curl -fsSL https://app.warp.dev/download/agent-cli | bash + ``` + </TabItem> + <TabItem label="Windows"> + Run this command in PowerShell: + + ```powershell + Invoke-RestMethod "https://app.warp.dev/download/agent-cli.ps1" | Invoke-Expression + ``` + </TabItem> + <TabItem label="Homebrew"> + On macOS 14 or later and on Linux, install the `warp-agent-cli` cask. It's in the main Homebrew cask repository, so you don't need to tap anything first: + + ```bash + brew install --cask warp-agent-cli + ``` + + :::caution + Homebrew installations don't update themselves. The CLI still tells you when a new version is available, but you install it by running `brew upgrade --cask warp-agent-cli`. To get background updates instead, use the install script. + ::: + </TabItem> +</Tabs> + +After installing, verify that the `warp` command is available: + +```bash +warp --version +``` + +The command prints the installed version. + +:::note +How the CLI updates depends on how you installed it. + +* **Install script** - The CLI updates itself. While it runs, it periodically checks for a newer version, downloads it in the background, and stages it without interrupting your session. The staged version takes effect the next time you launch `warp`, and the start screen shows an "update installed, restart to apply" notice next to the version. +* **Homebrew** - Homebrew owns the installation, so the CLI never replaces it. It still checks for newer versions and shows an "update available" notice next to the version on the start screen. Install the update yourself by running `brew upgrade --cask warp-agent-cli`. + +To turn off update checks, set `general.autoupdate_enabled` to `false` in the [settings file](/agents/cli/configuration/#the-settings-file). To turn them off for a single launch, set the `WARP_TUI_DISABLE_AUTOUPDATE` environment variable to any value. +::: + +## 2. Log in + +Log in once so the CLI can access your Warp account, models, and saved context. Start the CLI: + +```bash +warp +``` + +The CLI shows a verification link and a device code, and opens the link in your browser. Approve the login there and the CLI unlocks automatically, so you don't need to restart it. If the browser doesn't open, visit the link shown in the CLI and enter the code. + +When login completes, the CLI shows its start screen with the version, a short "What's new" list, and the rules, skills, and MCP servers it discovered for your current directory. You stay signed in across sessions. To sign out later, run `/logout`, which returns the CLI to its login screen and signs out your browser session too. + +:::note +**Running in CI or a headless environment?** Authenticate with a Warp API key instead by setting the `WARP_API_KEY` environment variable: + +```bash +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. +::: + +## 3. Run your first prompt + +Type a prompt in plain language, such as `What does this project do?`, and press `Enter`. + +If the agent wants to run a command or edit a file, it shows a permission request. Choose an option to approve or reject the action. + +Learn more about the transcript, diffs, and approvals in [Agent conversations](/agents/cli/agent-conversations/) and [Permissions and profiles](/agents/cli/permissions-and-profiles/). + +## 4. Run a shell command + +You can run shell commands directly without leaving the CLI. + +Type `!` at the start of an empty input to switch to shell mode. The footer shows **Shell mode**. Type a command, such as `git status`, and press `Enter`. To go back to prompting the agent, press `Backspace` on the empty input. + +To run recognized shell commands without the `!` prefix, run `/natural-language-detection` to turn on natural language detection. The CLI then classifies input as you type: recognized commands switch to shell mode, while natural-language prompts stay in agent mode. The prompt marker and statusline show the active mode before you press `Enter`. + +See [Input and shell commands](/agents/cli/input-and-shell-commands/) for long-running commands, interactive programs, and full-screen apps. + +## 5. Exit and resume + +Press `Ctrl+C` twice in a row to exit, or run `/exit`. A single `Ctrl+C` press stops the agent's current response, or clears the input when nothing is running. + +On exit, the CLI prints a resume command for the conversation: + +```bash +warp --resume CONVERSATION_TOKEN +``` + +Run the printed command later to pick up where you left off. + +To browse and reopen past conversations from inside the CLI, see [Agent conversations](/agents/cli/agent-conversations/#conversation-history). + +## Next steps + +* [Agent conversations](/agents/cli/agent-conversations/) - Work with the transcript, code diffs, plans, and tasks. +* [Customizing the CLI](/agents/cli/configuration/) - Rules, skills, MCP servers, themes, and settings. +* [Reference](/agents/cli/reference/) - All flags, slash commands, and keyboard shortcuts. diff --git a/src/content/docs/agents/cli/reference.mdx b/src/content/docs/agents/cli/reference.mdx new file mode 100644 index 000000000..02fd7dd6b --- /dev/null +++ b/src/content/docs/agents/cli/reference.mdx @@ -0,0 +1,311 @@ +--- +title: "Warp Agent CLI reference" +description: >- + Look up Warp Agent CLI command-line flags, environment variables, slash commands, + keyboard shortcuts, and fixes for common issues. +--- +import { VARS } from '@data/vars'; + +This page is a lookup reference for the {VARS.WARP_CLI}, covering the flags and environment variables the `warp` command accepts, every slash command available in a session, the default keyboard shortcuts, and fixes for common issues. + +## Command-line flags + +Running `warp` with no flags starts an interactive session in the current directory. The following flags change how the CLI starts, or make it perform a one-off action and exit. They are listed alphabetically. + +### `--api-key` + +Authenticates with a Warp API key instead of the interactive browser login. Use it on machines that can't open a browser, such as CI runners and remote servers. + +Prefer supplying the key through the `WARP_API_KEY` environment variable: + +```bash +WARP_API_KEY=YOUR_API_KEY warp +``` + +The `--api-key` flag accepts the same value directly: + +```bash +warp --api-key YOUR_API_KEY +``` + +:::caution +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. + +### `--auto-approve` + +Starts new conversations with auto-approve enabled, so the agent runs actions without asking for approval first. + +```bash +warp --auto-approve +``` + +This flag applies only to the session you launch with it and doesn't change your saved settings. You can still toggle auto-approve per conversation with `/auto-approve` or `Ctrl+Shift+I`. See [permissions and profiles](/agents/cli/permissions-and-profiles/) for how approvals work. + +### `--clear-provider-api-key` + +Deletes a stored model-provider API key from your device's secure storage, then exits. + +```bash +warp --clear-provider-api-key <provider> +``` + +`<provider>` is `openai`, `anthropic`, or `google`. For example: + +```bash +warp --clear-provider-api-key anthropic +``` + +### `--help` + +Prints usage information for all flags and exits. + +```bash +warp --help +``` + +### `--resume` + +Reopens a previous conversation from your shell as the CLI starts. + +```bash +warp --resume CONVERSATION_TOKEN +``` + +`CONVERSATION_TOKEN` is the token the CLI prints when you exit a session ("To continue this conversation, run: `warp --resume ...`"). You can also reopen past conversations from inside a session with `/conversations`. See [agent conversations in the CLI](/agents/cli/agent-conversations/#managing-conversations) for how persistence and resuming work. + +### `--set-provider-api-key` + +Stores a model-provider API key for [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/) in your device's secure storage, then exits. Warp never stores provider keys on its servers. + +```bash +warp --set-provider-api-key <provider> +``` + +`<provider>` is `openai`, `anthropic`, or `google`. For example: + +```bash +warp --set-provider-api-key anthropic +``` + +The CLI prompts for the key with masked input, so the key never appears in your shell history. When stdin is piped, the key is read from stdin instead, so you can pass it straight from a secret manager without writing it to disk: + +```bash +your-secret-manager read anthropic-api-key | warp --set-provider-api-key anthropic +``` + +Avoid staging keys in plaintext files. If you must use a temporary file, delete it immediately afterward. + +Inside a session, manage the same keys with the `/api-keys` menu. See [models and usage](/agents/cli/models-and-usage/#bring-your-own-api-key) for how stored keys affect billing. + +### `--version` + +Prints the installed version and exits. + +```bash +warp --version +``` + +## Environment variables + +* **`WARP_API_KEY`** - A Warp API key for non-interactive authentication. Equivalent to passing `--api-key`. +* **`WARP_TUI_DISABLE_AUTOUPDATE`** - Set it to any value to turn off background updates for a single launch. See [Updating](#updating) for how updates work. + +## Slash commands + +Type `/` at the start of the input to open the slash command menu. Commands that take an argument show a hint after the command name. Angle brackets mark required arguments, and square brackets mark optional ones. + +| Command | Argument | Description | +| --- | --- | --- | +| `/agent` | `[prompt]` | Start a new conversation | +| `/api-keys` | | View and manage model-provider API keys | +| `/auto-approve` | | Toggle auto-approve for agent actions | +| `/clear` | `[prompt]` | Clear the transcript and start a new conversation | +| `/compact` | `[instructions]` | Free up context by summarizing the conversation history | +| `/connect-grok` | | Connect an X Premium or SuperGrok subscription for Grok models | +| `/conversations` | | Open conversation history | +| `/copy-debugging-id` | | Copy the current conversation's debugging information to the clipboard | +| `/cost` | | Toggle per-response credit usage details | +| `/create-new-project` | `<description>` | Have the agent walk you through creating a new coding project | +| `/exit` | | Exit the CLI | +| `/export-to-clipboard` | | Export the current conversation to the clipboard as Markdown | +| `/export-to-file` | `[filename]` | Export the current conversation to a Markdown file | +| `/fork` | `[prompt]` | Fork the current conversation into a copy, optionally sending a prompt in the copy | +| `/handoff` | `[prompt]` | Hand off this conversation to a cloud agent | +| `/logout` | | Log out of Warp | +| `/manage-billing` | | Open your team's billing page in the browser | +| `/mcp` | | View and manage MCP servers | +| `/model` | | Switch the base agent model | +| `/natural-language-detection` | | Toggle natural language detection for shell input | +| `/new` | `[prompt]` | Start a new conversation (alias for `/agent`) | +| `/orchestrate` | `[task]` | Break a task into subtasks and run them in parallel with multiple agents. See [multi-agent orchestration](/agents/cli/cloud-and-orchestration/#multi-agent-orchestration) | +| `/plan` | `[task]` | Ask the agent to research and create a plan for a task | +| `/reset-statusline` | | Restore the statusline to its default items and ordering | +| `/skills` | | Browse skills in scope and insert one into the input | +| `/status` | | Show session and account status | +| `/statusline` | | Configure the statusline | +| `/theme` | `<auto\|light\|dark>` | Set the color theme | +| `/upgrade` | | Open the Warp upgrade page in the browser | +| `/view-logs` | | Bundle your logs into a zip archive | +| `/vim-mode` | | Toggle Vim keybindings in the input | +| `/voice` | | Start voice input | + +Some commands appear only when they apply to your account. `/manage-billing` is listed when you administer billing for your team, and opens that team's billing page; it isn't available to members without billing access. `/connect-grok` opens the same subscription row as [`/api-keys`](/agents/cli/models-and-usage/#bring-your-own-api-key) and starts the xAI sign-in directly. + +`/status` opens a read-only panel with the installed version, the current conversation's name and ID, the working directory, and the organization and email you're signed in as. Press `Esc` to close it, and include those details when you report a problem. + +Skills also appear in the same menu under their own names, so you can invoke a skill directly as `/skill-name`. [Customizing the CLI](/agents/cli/configuration/) covers how skills are discovered. + +## Keyboard shortcuts + +Press `?` on an empty input to open the contextual shortcuts panel inside the CLI. The tables below list the default bindings. + +:::note +Bindings are the same on macOS, Linux, and Windows, except that Windows also accepts `Alt+V` for paste. For shortcuts that use `Alt`, some macOS terminals deliver `Option` as `Alt` only when their Option-as-Alt (Meta) setting is enabled. The macOS Command shortcuts described in [input and shell commands](/agents/cli/input-and-shell-commands/#editing-basics) require a terminal with the Kitty keyboard protocol enabled. +::: + +### Session + +| Shortcut | Action | +| --- | --- | +| `Ctrl+C` | Stop the current response, or clear the input; press again within a second to exit | +| `Ctrl+D` | Exit when the input is empty (deletes the next character otherwise) | +| `?` | Show the shortcuts panel (on an empty input) | +| `/` | Open the slash command menu | +| `!` | Enter shell mode (`Esc` returns to agent input) | +| `←` | Open the conversation list (on an empty input) | +| `↑` | Browse prompt and command history | +| `Esc` | Dismiss the open menu, or leave shell mode | +| `Ctrl+Shift+I` | Toggle auto-approve | +| `Ctrl+Shift+P` | Expand or collapse the latest plan | +| `Ctrl+S` | Start voice input | +| `Ctrl+V` / `Ctrl+Shift+V` | Paste from the clipboard, including images | +| `Tab` | Focus attached images when present; complete shell commands in shell mode | + +### Approvals + +These bindings apply while the agent is waiting for you to approve an action. [Permissions and profiles](/agents/cli/permissions-and-profiles/) explains the approval flow. + +| Shortcut | Action | +| --- | --- | +| `Enter` | Confirm the selected option on the approval card | +| `Esc` | Reject or cancel the request | +| `E` | Edit the proposed command, or expand and collapse all diffs in a file-edit approval | +| `Ctrl+Enter` | Approve a request to type into a running command | + +### Terminal control + +These bindings apply while an interactive terminal command is running. + +| Shortcut | Action | +| --- | --- | +| `Ctrl+C` | Interrupt a command you started, or take control of a command the agent is running | +| `Ctrl+G` | Hand control of the command back to the agent | + +### Multi-agent tabs + +When an orchestration launches child agents, an **Agents:** tab bar appears above the session. [Cloud and orchestration](/agents/cli/cloud-and-orchestration/) covers the workflow. + +| Shortcut | Action | +| --- | --- | +| `Shift+↑` | Focus the agent tab bar | +| `←` / `→` or `Tab` / `Shift+Tab` | Select the previous or next agent | +| `Shift+←` / `Shift+→` | Select the first or last child agent | +| `↓` | Return focus to the current session's input | +| `Esc` | Return to the orchestrator | +| `Ctrl+C` | Kill the selected child agent (press twice when viewing a child) | + +### Text editing + +The input supports readline-style editing. + +| Shortcut | Action | +| --- | --- | +| `Shift+Enter`, `Ctrl+J`, or `Alt+Enter` | Insert a newline | +| `Ctrl+A` / `Home` | Move to the start of the line | +| `Ctrl+E` / `End` | Move to the end of the line | +| `Ctrl+B` / `Ctrl+F` | Move left / right | +| `Alt+B` / `Alt+F` (or `Alt+←` / `Alt+→`) | Move one word left / right | +| `Ctrl+W` or `Alt+Backspace` | Delete the previous word | +| `Alt+D` or `Alt+Delete` | Delete the next word | +| `Ctrl+K` | Delete to the end of the line | +| `Ctrl+U` | Delete to the start of the line | +| `Ctrl+Y` | Reinsert the last deleted text | +| `Ctrl+Z` / `Ctrl+Shift+Z` | Undo / redo | +| `Shift+←` / `Shift+→` / `Shift+↑` / `Shift+↓` | Extend the selection | +| `Ctrl+Shift+A` | Select all | +| `Ctrl+Shift+C` | Copy the selection | +| `Ctrl+X` | Cut the selection | + +For mouse support, completions, and other input behavior, see [input and shell commands](/agents/cli/input-and-shell-commands/). + +## Troubleshooting + +This section covers common issues, including gathering logs for a bug report, fixing sign-in problems, resuming conversations, and keeping the CLI up to date. + +:::note +For known issues and feature requests across Warp, visit the [GitHub issues page](https://github.com/warpdotdev/Warp/issues). +::: + +### Viewing and sharing logs + +When something goes wrong, logs are the fastest way to help the Warp team diagnose the problem. + +Run `/view-logs` in a session to bundle the current session's log and recent previous sessions into a timestamped zip archive. The CLI reveals the archive in your file manager and shows the saved path in the footer, so you can attach it to a bug report or share it with support. + +On macOS, CLI logs are stored in `~/Library/Logs/warp-cli/`. Logs rotate per session, and older session logs are rotated out over time. The `/view-logs` archive is written to the same directory. + +When the problem is with the agent's response rather than the CLI itself, run `/copy-debugging-id` in the session. It copies the conversation's debugging information to your clipboard so you can paste it into a bug report. See [Gathering AI conversation ID](/support-and-community/troubleshooting-and-support/sending-us-feedback/#gathering-ai-conversation-id). + +### The browser doesn't open during sign-in + +The CLI signs you in with a browser-based flow. It opens a verification page (or shows you the URL and a code to enter) and continues once you approve the sign-in. On a remote or browser-less machine, the CLI can't launch a browser, but the sign-in screen still shows the verification URL and code. + +1. Open the displayed URL in a browser on any device, including another machine. +2. Enter the code shown in the CLI. +3. Return to the CLI. It proceeds automatically once the sign-in is approved. + +For machines where the browser flow isn't practical, authenticate non-interactively with an API key instead, using the `WARP_API_KEY` environment variable or the `--api-key` flag. See [command-line flags](#command-line-flags). + +### "Login failed" + +The sign-in attempt was rejected or timed out. The error message in the CLI names the underlying cause. + +1. Press `Ctrl+C` to exit. +2. Run `warp` again to restart the sign-in flow. +3. If the failure persists, check your network connection and any proxy or firewall that could block access to Warp's servers. + +### Signed in to the wrong account + +1. Run `/logout` in a session. The CLI signs you out, opens your browser to complete the sign-out on Warp's website, and returns to the sign-in screen. +2. Sign in with the account you want. + +### "Could not restore conversation" when resuming + +`warp --resume` failed to load the conversation for the given token, for example because the token is malformed or the conversation is no longer available. + +1. Press `Ctrl+C` to exit, then run `warp` to start normally. +2. Check the token against the resume command printed when you exited the original session. +3. If the conversation exists locally, open it from the [conversation menu](/agents/cli/agent-conversations/#conversation-history) with `/conversations` instead. + +### Updating + +The CLI updates automatically. Installed builds check for updates in the background, download new versions, and apply them the next time you launch `warp`. A running session is never interrupted. + +To check which version you're running, use `/status` in a session, or run: + +```bash +warp --version +``` + +To turn off background updates for a single launch, set the `WARP_TUI_DISABLE_AUTOUPDATE` environment variable to any value. To turn them off persistently, set `general.autoupdate_enabled` to `false` in the [CLI settings file](/agents/cli/configuration/#the-settings-file). + +If an install becomes corrupted, re-running the install command from the [quickstart](/agents/cli/quickstart/) replaces it with the latest version. + +### Getting help + +* [Sending us feedback](/support-and-community/troubleshooting-and-support/sending-us-feedback/) - How to reach Warp support and share feedback. +* [Known issues](/support-and-community/troubleshooting-and-support/known-issues/) - Current known issues across Warp. +* [GitHub issues](https://github.com/warpdotdev/Warp/issues) - Search existing reports or file a new one. Attach the `/view-logs` archive to bug reports. diff --git a/src/content/docs/agent-platform/getting-started/faqs.mdx b/src/content/docs/agents/getting-started/faqs.mdx similarity index 74% rename from src/content/docs/agent-platform/getting-started/faqs.mdx rename to src/content/docs/agents/getting-started/faqs.mdx index 4d0a5ef34..054dc99cc 100644 --- a/src/content/docs/agent-platform/getting-started/faqs.mdx +++ b/src/content/docs/agents/getting-started/faqs.mdx @@ -1,5 +1,5 @@ --- -title: Agent platform FAQs +title: Frequently asked questions about agents sidebar: label: "Agent FAQs" description: >- @@ -7,7 +7,7 @@ description: >- models, privacy practices, credit limits, billing, and usage guidelines. --- -Answers to frequently asked questions about Warp's agents, including supported models, data privacy, credit limits, billing, and common error messages. For billing-specific questions, see the pricing FAQs. +Answers to frequently asked questions about agents in Warp, including supported models, data privacy, credit limits, billing, and common error messages. For billing-specific questions, see the pricing FAQs. ## General @@ -21,15 +21,15 @@ Agent Mode has replaced the previous AI chat panel. Agent Mode is more powerful ### Is my data used for model training? -Warp reserves the right to use data collected to train models and improve Warp. Warp has Zero Data Retention with all its model providers (e.g. Anthropic, OpenAI, etc.). Please learn more about telemetry in our [Privacy page](/support-and-community/privacy-and-security/privacy/). +Warp reserves the right to use data collected to train models and improve Warp. Warp has Zero Data Retention with all its model providers (e.g. Anthropic, OpenAI, etc.). Learn more about telemetry on our [Privacy page](/support-and-community/privacy-and-security/privacy/). ### What model are you using for Agent Mode? -Warp supports a curated list of LLMs from providers like OpenAI, Anthropic, and Gemini. To view the full list of supported models and learn how to switch between them, visit the [Model Choice](/agent-platform/inference/model-choice/) page. +Warp supports a curated list of LLMs from providers like OpenAI, Anthropic, and Gemini. To view the full list of supported models and learn how to switch between them, visit the [Model Choice](/agents/inference/model-choice/) page. ### Can I use my own LLM API key? -Yes. Warp supports [Bring Your Own API Key (BYOK)](/agent-platform/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](/agent-platform/inference/custom-inference-endpoint/) are available for individual users and organizations with 10 or fewer employees, subject to Warp's Terms of Service. +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. @@ -39,14 +39,14 @@ No. Warp doesn't support signing in with a ChatGPT (OpenAI) or Claude (Anthropic Note that a ChatGPT or Claude subscription is different from API access. To use your own OpenAI or Anthropic account in Warp, you have two options: -* **[Bring Your Own API Key (BYOK)](/agent-platform/inference/bring-your-own-api-key/)** — Add your own OpenAI, Anthropic, or Google API key and pay your provider directly instead of using Warp credits. -* **[Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/)** — Route Warp through any OpenAI-compatible endpoint, such as OpenRouter or LiteLLM. +* **[Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/)** — Add your own OpenAI, Anthropic, or Google API key and pay your provider directly instead of using Warp credits. +* **[Custom inference endpoint](/agents/inference/custom-inference-endpoint/)** — Route Warp through any OpenAI-compatible endpoint, such as OpenRouter or LiteLLM. -For xAI's Grok models, you can connect a [SuperGrok subscription](/agent-platform/inference/grok-subscription/) directly through your xAI account. +For xAI's Grok models, you can connect a [SuperGrok subscription](/agents/inference/grok-subscription/) directly through your xAI account. ## Billing -Paid Warp plans include a set number of credits per user per month for Warp-provided AI usage. The Free plan doesn't include bundled AI usage for the Warp Agent; to use the Warp Agent, [upgrade to a paid plan](https://www.warp.dev/pricing) or bring your own inference (BYOK, a [custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/), or a [SuperGrok or X Premium subscription](/agent-platform/inference/grok-subscription/)). See [pricing](https://www.warp.dev/pricing) to compare plans. +Paid Warp plans include a set number of credits per user per month for Warp-provided AI usage. The Free plan doesn't include bundled AI usage for the Warp Agent; to use the Warp Agent, [upgrade to a paid plan](https://www.warp.dev/pricing) or bring your own inference (BYOK, a [custom inference endpoint](/agents/inference/custom-inference-endpoint/), or a [SuperGrok or X Premium subscription](/agents/inference/grok-subscription/)). See [pricing](https://www.warp.dev/pricing) to compare plans. Credit limits apply to Agent Mode, Generate (Legacy), and [AI autofill in Workflows](/knowledge-and-collaboration/warp-drive/workflows/#ai-autofill). diff --git a/src/content/docs/agents/index.mdx b/src/content/docs/agents/index.mdx new file mode 100644 index 000000000..3cea38d07 --- /dev/null +++ b/src/content/docs/agents/index.mdx @@ -0,0 +1,85 @@ +--- +title: Agents overview +description: >- + The Warp Agent runs commands in a real terminal, carries your context across + every surface, and works interactively or in the background. +--- +import { VARS } from '@data/vars'; +import VideoEmbed from '@components/VideoEmbed.astro'; + +The **Warp Agent** is Warp's built-in coding agent. It works through multi-step tasks on its own, running commands in a real terminal and using the output to decide what to do next. You stay in the loop, approving actions and reviewing diffs before anything lands. + +This page covers where to run the agent, the third-party CLI agents Warp supports, and the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/), which runs and coordinates agents at scale. + +--- + +## Where to use the Warp Agent + +You reach the same agent three ways. Which one you pick depends on where you're working, not on what the agent can do. + +* **In the Warp app** - The full experience, with code review, agent management, and the terminal beside your conversation. +* [**In any terminal, with the Warp Agent CLI**](/agents/cli/) - Run the `warp` command to start a conversation in any terminal emulator, over SSH, or on a machine where the Warp app isn't installed. +* [**In the cloud, as a cloud agent**](/platform/) - Run the agent in the background from a trigger, a schedule, or an integration, without keeping a session open. Cloud agents run on the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/), Warp's platform for environments, triggers, orchestration, and observability. + +--- + +## What makes the Warp Agent different + +* **It works in a real terminal** - The agent runs shell commands, reads live output, and drives interactive programs like REPLs, database shells, and full-screen apps. See [Full terminal use](/agents/capabilities/full-terminal-use/). +* **Your context follows it everywhere** - [Rules](/agents/capabilities/rules/), [Skills](/agents/capabilities/skills/), [MCP servers](/agents/capabilities/mcp/), and [Codebase Context](/agents/capabilities/codebase-context/) apply the same way in the app, the CLI, and the cloud. +* **Interactive or delegated, and you can switch mid-task** - Steer a conversation while it runs, or [hand it off](/platform/handoff/) to a cloud agent and pick it back up locally when it's done. +* **You approve before anything lands** - The agent asks before it runs commands, edits files, or calls MCP servers. Set how much it does on its own with [Agent Profiles and permissions](/agents/capabilities/agent-profiles-permissions/), and review generated changes in [interactive code review](/agents/local-agents/interactive-code-review/). +* **Many agents at once** - Run several conversations in parallel and track them in the [Agent Management Panel](/platform/managing-cloud-agents/), or use [orchestration](/platform/orchestration/) to have a parent agent spawn and coordinate children. + +<VideoEmbed url="https://youtu.be/qiQtD1jPF6s" title="Agent Mode Overview" /> + +**Try this prompt** — [_open in Warp_](https://app.warp.dev/drive/prompt/Clone-and-install-Warps-themes-repository-PkK9Zw16SCD3JKzOUoGuj4) + +```text +Detect my current operating system. Based on that, navigate to the appropriate Warp themes directory (e.g. ~/.warp/ on macOS). + +Then, clone the official Warp themes repository using SSH (git@github.com:warpdotdev/themes.git) into that directory, following the structure and instructions provided in the repo's README. If SSH does not work, try HTTPS (https://github.com/warpdotdev/themes.git) or via the GitHub CLI (gh repo clone warpdotdev/themes). +``` +--- + +## Third-party CLI agents + +Separately from the Warp Agent, Warp gives third-party CLI coding agents first-class support. Run Claude Code, Codex, OpenCode, and others inside Warp and get rich input, agent notifications, inline code review, and remote session control. + +→ [Learn about third-party CLI agents](/agents/cli-agents/overview/) + +--- + +## The platform behind the agent + +The [**{VARS.WARP_AUTOMATION_PLATFORM}**](/platform/overview/) 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, along with a CLI, API, and SDK for driving agents programmatically. + +To automate an entire workflow rather than a single task, use [Warp Factories](/factories/). Built on the {VARS.WARP_AUTOMATION_PLATFORM}, a factory runs a team of cloud agents that triage, spec, implement, review, and verify work. + +The {VARS.WARP_AUTOMATION_PLATFORM} tab covers the platform in full. + +--- + +## 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. + +You can disable Warp's AI features entirely in **Settings** > **Agents** > **Warp Agent**. + +→ [Read more about data privacy](https://www.warp.dev/privacy) + +--- + +## Where to go next + +* [**Interacting with agents**](/agents/local-agents/interacting-with-agents/) - Conversations, context, code review, and voice in the Warp app. +* [**Agent capabilities**](/agents/capabilities/) - Planning, skills, rules, MCP servers, task lists, and model choice. +* [**Warp Agent CLI quickstart**](/agents/cli/quickstart/) - Install the CLI and run your first conversation. +* [**Cloud agents quickstart**](/platform/quickstart/) - Run your first agent in the cloud, or put one on a [schedule](/platform/triggers/scheduled-agents/). For a comparison of triggers across schedules, Slack, Linear, GitHub Actions, the CLI, and the API, see [Run unattended agents](/guides/agent-workflows/how-to-run-unattended-agents/). +* [**Agent FAQs**](/agents/getting-started/faqs/) - Models, privacy, credits, and limits. + +--- + +## Open source + +Warp's client is open source under [AGPL v3](https://github.com/warpdotdev/warp/blob/master/LICENSE-AGPL), so the editor and terminal that host your agents are fully auditable. See [Contributing to Warp](/support-and-community/community/contributing/). diff --git a/src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx b/src/content/docs/agents/inference/bring-your-own-api-key.mdx similarity index 74% rename from src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx rename to src/content/docs/agents/inference/bring-your-own-api-key.mdx index 81cff0a3c..f0e4622e6 100644 --- a/src/content/docs/agent-platform/inference/bring-your-own-api-key.mdx +++ b/src/content/docs/agents/inference/bring-your-own-api-key.mdx @@ -6,15 +6,15 @@ description: >- --- import VideoEmbed from '@components/VideoEmbed.astro'; -Warp supports **Bring Your Own API Key (BYOK)** for users who want to connect Warp's agents to their own Anthropic, OpenAI, or Google API accounts. +Warp supports **Bring Your Own API Key (BYOK)** for users who want to connect agents to their own Anthropic, OpenAI, or Google API accounts. -This lets you use your own API keys for model access, giving you control over model selection, billing, and data routing. See [Model Choice](/agent-platform/inference/model-choice/) for a list of supported models. For xAI's Grok models, you connect a [SuperGrok subscription](/agent-platform/inference/grok-subscription/) instead of adding an API key. +This lets you use your own API keys for model access, giving you control over model selection, billing, and data routing. See [Model Choice](/agents/inference/model-choice/) for a list of supported models. For xAI's Grok models, you connect a [SuperGrok subscription](/agents/inference/grok-subscription/) instead of adding an API key. BYOK provides greater flexibility in model access and ensures Warp **never consumes your** [AI credits](/support-and-community/plans-and-billing/credits/) for requests routed through your own keys. <VideoEmbed url="https://youtu.be/jbSBnbPzQwY" title="How to BYOK to the Warp Agent" /> -For xAI's Grok models, you can also connect your SuperGrok subscription instead of entering an API key. In the Warp app, go to **Settings** > **Agents** > **Oz** and choose to connect your SuperGrok subscription — Warp opens your browser to complete the connection. +For xAI's Grok models, you can also connect your SuperGrok subscription instead of entering an API key. In the Warp app, go to **Settings** > **Agents** > **Warp Agent** and choose to connect your SuperGrok subscription — Warp opens your browser to complete the connection. :::note BYOK is available on Free and all eligible paid plans 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). Larger organizations need a Business or Enterprise plan. See [Warp pricing](https://www.warp.dev/pricing) for current availability. @@ -27,16 +27,16 @@ Warp offers several ways to bring your own AI infrastructure. Use this table to | Name | Meaning | Plans | | --- | --- | --- | | **Bring Your Own API Key** (BYOK) | Use your own API key for OpenAI, Anthropic, or Google models. Keys are stored locally on your device. | Free and all eligible paid plans | -| **[Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/)** | Connect Warp to an OpenAI-compatible endpoint such as OpenRouter, LiteLLM, z.ai, or an internal gateway. | Free and all eligible paid plans | -| **[Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/)** (BYOLLM) | Enterprise-managed inference through your cloud provider (AWS Bedrock today; Azure Foundry and Google Vertex coming soon), with Warp handling routing, orchestration, governance, and observability. | Enterprise only | -| **[SuperGrok subscription](/agent-platform/inference/grok-subscription/)** | Connect your SuperGrok subscription to use Grok models through your xAI account. Tokens are stored locally on your device. | Free and all eligible paid plans | +| **[Custom inference endpoint](/agents/inference/custom-inference-endpoint/)** | Connect Warp to an OpenAI-compatible endpoint such as OpenRouter, LiteLLM, z.ai, or an internal gateway. | Free and all eligible paid plans | +| **[Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/)** (BYOLLM) | Enterprise-managed inference through your cloud provider (AWS Bedrock and Gemini Enterprise Agent Platform (Vertex AI) today; Azure Foundry coming soon), with Warp handling routing, orchestration, governance, and observability. | Enterprise only | +| **[SuperGrok subscription](/agents/inference/grok-subscription/)** | Connect your SuperGrok subscription to use Grok models through your xAI account. Tokens are stored locally on your device. | Free and all eligible paid plans | See [Warp pricing](https://www.warp.dev/pricing) for current plan availability. Platform credits apply to every cloud agent run on any plan, and to local agent runs on Business and Enterprise when using BYOK, a custom inference endpoint, or BYOLLM. See [platform credits](/support-and-community/plans-and-billing/platform-credits/) for the full breakdown. :::note -**Can I sign in with a ChatGPT or Claude subscription?** No. A ChatGPT (OpenAI) or Claude (Anthropic) consumer subscription can't be connected to Warp the way a [SuperGrok subscription](/agent-platform/inference/grok-subscription/) can. OpenAI and Anthropic don't currently allow their subscription plans to be used in third-party clients like Warp. To use your own OpenAI or Anthropic account, add an API key with BYOK and pay your provider directly. A subscription and API access are billed separately by the provider. +**Can I sign in with a ChatGPT or Claude subscription?** No. A ChatGPT (OpenAI) or Claude (Anthropic) consumer subscription can't be connected to Warp the way a [SuperGrok subscription](/agents/inference/grok-subscription/) can. OpenAI and Anthropic don't currently allow their subscription plans to be used in third-party clients like Warp. To use your own OpenAI or Anthropic account, add an API key with BYOK and pay your provider directly. A subscription and API access are billed separately by the provider. ::: ## How BYOK works @@ -46,13 +46,13 @@ When you add your own model API keys in Warp, those keys are stored **only on yo When you send a prompt using a model with the **key icon**: 1. Your local Warp client pulls your API key from your device's secure storage and sends it up to Warp's backend along with your prompt. -2. Warp's agent harness, which runs on Warp's backend, assembles the full request (system instructions, conversation context, tools) and uses your key in-flight to call your chosen model provider (Anthropic, OpenAI, or Google). +2. The Warp Agent harness, which runs on Warp's backend, assembles the full request (system instructions, conversation context, tools) and uses your key in-flight to call your chosen model provider (Anthropic, OpenAI, or Google). 3. The provider's response streams back through Warp's backend to your client. Your API key passes through Warp's servers each time you send a request, but Warp never stores it there — it's used only in-flight to call the provider, then discarded. :::note -**Why does the request route through Warp's backend?** Warp's agent harness runs server-side — the same runtime that powers [Agent Mode](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/) with Warp-billed models. BYOK swaps the credential used to call the provider; it does not change where the harness runs. +**Why does the request route through Warp's backend?** The Warp Agent harness runs server-side — the same runtime that powers [Agent Mode](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) with Warp-billed models. BYOK swaps the credential used to call the provider; it does not change where the harness runs. ::: :::caution @@ -91,7 +91,7 @@ Warp's **Auto** models dynamically route requests across different models based To use your own key, select a specific provider model (for example, Claude Opus 4.7, Claude Sonnet 4.6, GPT-5.5, or Gemini 3.1 Pro) directly from the model picker with a key icon. -[Custom routers](/agent-platform/inference/custom-routers/) behave differently: a router resolves each task to a concrete model you chose, and Warp then applies your API keys to that model. Requests that resolve to a model covered by one of your keys are billed through your provider account instead of consuming Warp credits. See [Credits and model availability](/agent-platform/inference/custom-routers/#credits-and-model-availability) for details. +[Custom routers](/agents/inference/custom-routers/) behave differently: a router resolves each task to a concrete model you chose, and Warp then applies your API keys to that model. Requests that resolve to a model covered by one of your keys are billed through your provider account instead of consuming Warp credits. See [Credits and model availability](/agents/inference/custom-routers/#credits-and-model-availability) for details. ### Credit usage @@ -110,8 +110,8 @@ Some AI-powered features are not affected by BYOK and are included as part of Wa | Feature | Uses Warp's credits | Description | | ----------------------------------------------------------------------------- | ------------------- | -------------------------------------------------------------------- | -| [Active AI Recommendations](/agent-platform/local-agents/active-ai/) | No | Always included with Build and higher plans. | -| [Codebase Context](/agent-platform/capabilities/codebase-context/) | Yes | Uses Warp's AI infrastructure and consumes credits. | +| [Active AI Recommendations](/agents/local-agents/active-ai/) | No | Always included with Build and higher plans. | +| [Codebase Context](/agents/capabilities/codebase-context/) | Yes | Uses Warp's AI infrastructure and consumes credits. | | [Cloud Agents](/platform/) | Yes | BYOK keys are stored locally and not available to cloud-hosted runs. | These features will continue to function normally regardless of whether you’ve configured BYOK. @@ -157,8 +157,8 @@ Enterprise teams can also configure **team-managed API keys** centrally: an admi ## Related resources -* [Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/) — Route Warp through any OpenAI-compatible endpoint, such as OpenRouter, LiteLLM, z.ai, or an internal gateway. +* [Custom inference endpoint](/agents/inference/custom-inference-endpoint/) — Route Warp through any OpenAI-compatible endpoint, such as OpenRouter, LiteLLM, z.ai, or an internal gateway. * [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) — Enterprise-managed inference through your cloud provider or approved infrastructure. -* [SuperGrok subscription](/agent-platform/inference/grok-subscription/) — Use Grok models through your xAI account instead of Warp credits. -* [Model Choice](/agent-platform/inference/model-choice/) — Full list of supported models and `model_id` values. +* [SuperGrok subscription](/agents/inference/grok-subscription/) — Use Grok models through your xAI account instead of Warp credits. +* [Model Choice](/agents/inference/model-choice/) — Full list of supported models and `model_id` values. * [Credits](/support-and-community/plans-and-billing/credits/) — How Warp credits work and when they're consumed. diff --git a/src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx b/src/content/docs/agents/inference/custom-inference-endpoint.mdx similarity index 82% rename from src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx rename to src/content/docs/agents/inference/custom-inference-endpoint.mdx index 1f89f426a..f3d57e095 100644 --- a/src/content/docs/agent-platform/inference/custom-inference-endpoint.mdx +++ b/src/content/docs/agents/inference/custom-inference-endpoint.mdx @@ -1,11 +1,11 @@ --- title: Custom inference endpoint description: >- - Connect Warp's agents to any OpenAI-compatible inference endpoint — + Connect agents to any OpenAI-compatible inference endpoint — OpenRouter, LiteLLM, z.ai, or an internal gateway exposed at a public URL. --- -Warp supports **custom inference endpoints** for users who want to power Warp's agents with any OpenAI-compatible inference endpoint — a model router, hosted gateway, or internal infrastructure they already run. +Warp supports **custom inference endpoints** for users who want to power agents with any OpenAI-compatible inference endpoint — a model router, hosted gateway, or internal infrastructure they already run. This lets you route AI requests through your preferred provider, run inference behind your own gateway, or use a router like OpenRouter or LiteLLM, while keeping the agent experience inside Warp. @@ -36,13 +36,13 @@ When you configure a custom inference endpoint, your endpoint URL, model identif When you send a prompt using an endpoint-routed model: 1. Your local Warp client pulls your endpoint URL and API key from your device's secure storage and sends them up to Warp's backend along with your prompt. -2. Warp's agent harness, which runs on Warp's backend, assembles the full request (system instructions, conversation context, tools) and uses your key in-flight to call your configured endpoint. +2. The Warp Agent harness, which runs on Warp's backend, assembles the full request (system instructions, conversation context, tools) and uses your key in-flight to call your configured endpoint. 3. Your endpoint's response streams back through Warp's backend to your client. Your API key passes through Warp's servers each time you send a request, but Warp never stores it there — it's used only in-flight to call your endpoint, then discarded. :::note -**Why does the request route through Warp's backend?** Warp's agent harness runs server-side — the same runtime that powers [Agent Mode](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/) with Warp-billed models and [BYOK](/agent-platform/inference/bring-your-own-api-key/). A custom inference endpoint swaps the upstream destination and credential; it does not change where the harness runs. +**Why does the request route through Warp's backend?** The Warp Agent harness runs server-side — the same runtime that powers [Agent Mode](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) with Warp-billed models and [BYOK](/agents/inference/bring-your-own-api-key/). A custom inference endpoint swaps the upstream destination and credential; it does not change where the harness runs. ::: :::caution @@ -66,7 +66,7 @@ To enable and configure a custom inference endpoint: When you explicitly select an endpoint-routed model from the model picker, Warp routes the request through your endpoint instead of consuming Warp's AI credits. -The configuration flow mirrors the [Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/) setup, so the steps will feel familiar if you've already configured BYOK. +The configuration flow mirrors the [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) setup, so the steps will feel familiar if you've already configured BYOK. ## Network requirements @@ -95,11 +95,11 @@ Warp's **Auto** models dynamically route across providers using Warp's infrastru To use your endpoint, select the specific endpoint-routed model from the model picker rather than an Auto option. -[Custom routers](/agent-platform/inference/custom-routers/) can't use your endpoint either: routing targets must be Warp-supported models, so a router never resolves to an endpoint-routed model. Custom routers do apply [BYOK](/agent-platform/inference/bring-your-own-api-key/) provider keys after resolving a model. +[Custom routers](/agents/inference/custom-routers/) can't use your endpoint either: routing targets must be Warp-supported models, so a router never resolves to an endpoint-routed model. Custom routers do apply [BYOK](/agents/inference/bring-your-own-api-key/) provider keys after resolving a model. ### Other AI features in Warp -Some AI-powered features (Codebase Context, Active AI recommendations, cloud agent runs) rely on Warp's infrastructure and are unaffected by a custom inference endpoint. See the [feature breakdown on the BYOK page](/agent-platform/inference/bring-your-own-api-key/#byok-usage-and-billing-behavior) for which features still consume Warp credits. +Some AI-powered features (Codebase Context, Active AI recommendations, cloud agent runs) rely on Warp's infrastructure and are unaffected by a custom inference endpoint. See the [feature breakdown on the BYOK page](/agents/inference/bring-your-own-api-key/#byok-usage-and-billing-behavior) for which features still consume Warp credits. ## Zero Data Retention (ZDR) @@ -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 routing. +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. ## How custom inference endpoints differ from BYOK and BYOLLM @@ -127,15 +127,15 @@ Warp offers three ways to bring your own AI infrastructure. Use this table to pi | Name | Meaning | Plans | | --- | --- | --- | -| **[Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/)** (BYOK) | Use your own API key for OpenAI, Anthropic, or Google models. Keys are stored locally on your device. | Free and all eligible paid plans | +| **[Bring Your Own API Key](/agents/inference/bring-your-own-api-key/)** (BYOK) | Use your own API key for OpenAI, Anthropic, or Google models. Keys are stored locally on your device. | Free and all eligible paid plans | | **Custom inference endpoint** | Connect Warp to an OpenAI-compatible endpoint such as OpenRouter, LiteLLM, z.ai, or an internal gateway. | Free and all eligible paid plans | -| **[Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/)** (BYOLLM) | Enterprise-managed inference through your cloud provider (AWS Bedrock today; Azure Foundry and Google Vertex coming soon), with Warp handling routing, orchestration, governance, and observability. | Enterprise only | +| **[Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/)** (BYOLLM) | Enterprise-managed inference through your cloud provider (AWS Bedrock and Gemini Enterprise Agent Platform (Vertex AI) today; Azure Foundry coming soon), with Warp handling routing, orchestration, governance, and observability. | Enterprise only | Platform credits may apply for local agent runs on Business and Enterprise when using BYOK, a custom inference endpoint, or BYOLLM. See [platform credits](/support-and-community/plans-and-billing/platform-credits/). ## Related resources -* [Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/) — Use your own OpenAI, Anthropic, or Google API keys. +* [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) — Use your own OpenAI, Anthropic, or Google API keys. * [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) — Enterprise-managed inference through your cloud provider or approved infrastructure. -* [Model Choice](/agent-platform/inference/model-choice/) — Full list of supported models and `model_id` values. +* [Model Choice](/agents/inference/model-choice/) — Full list of supported models and `model_id` values. * [Credits](/support-and-community/plans-and-billing/credits/) — How Warp credits work and when they're consumed. diff --git a/src/content/docs/agent-platform/inference/custom-routers.mdx b/src/content/docs/agents/inference/custom-routers.mdx similarity index 81% rename from src/content/docs/agent-platform/inference/custom-routers.mdx rename to src/content/docs/agents/inference/custom-routers.mdx index 5d120cbc6..6da9767d3 100644 --- a/src/content/docs/agent-platform/inference/custom-routers.mdx +++ b/src/content/docs/agents/inference/custom-routers.mdx @@ -12,13 +12,13 @@ Custom routers automatically pick the right model for each task, using routing l * **Complexity-based routing** - Warp classifies each task's difficulty and routes to the model you mapped to that level. * **Rule-based routing** - Write natural-language rules that describe when to use each model. * **Any supported model** - Route to any concrete model you have access to, across providers. -* **BYOK support** - With [your own API keys](/agent-platform/inference/bring-your-own-api-key/) configured, requests that resolve to a model covered by one of your keys bill through your provider account instead of Warp credits. +* **BYOK support** - With [your own API keys](/agents/inference/bring-your-own-api-key/) configured, requests that resolve to a model covered by one of your keys bill through your provider account instead of Warp credits. * **Settings or file** - Create a router in settings, or author it as a YAML file that Warp loads automatically. * **Team-synced routers** - Admins can share a router with an entire team (Enterprise). ## How it works -A custom router appears in the [model picker](/agent-platform/inference/model-choice/#how-to-change-models) as its own entry, alongside Warp's built-in Auto models and individual models. You select it like any other model. +A custom router appears in the [model picker](/agents/inference/model-choice/#how-to-change-models) as its own entry, alongside Warp's built-in Auto models and individual models. You select it like any other model. When you send a prompt, the router resolves to a single concrete model and runs the task on it, just like Warp's built-in Auto models. You can always see which model actually ran. @@ -61,7 +61,7 @@ Your router now appears in the model picker. Saving also writes a file: use **Op Custom routers are stored as YAML files in `~/.warp/custom_model_routers/`, with one router per file. Warp loads every file in that directory and reloads automatically when you add, edit, or remove one, with no restart required. Routers you create in settings are saved here too. -Routing targets use the same `model_id` values listed on the [Model choice](/agent-platform/inference/model-choice/#available-models) page. Every target must be a concrete, Warp-supported model. You can't route to an Auto model, another router, or a model from a [custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/). +Routing targets use the same `model_id` values listed on the [Model choice](/agents/inference/model-choice/#available-models) page. Every target must be a concrete, Warp-supported model. You can't route to an Auto model, another router, or a model from a [custom inference endpoint](/agents/inference/custom-inference-endpoint/). A complexity router uses `type: complexity`. `default` is required and is used for any bucket you omit: @@ -119,13 +119,13 @@ A custom router resolves to a concrete model, so credit usage matches whichever ### Using your own API keys (BYOK) -Custom routers work with [Bring Your Own API Key (BYOK)](/agent-platform/inference/bring-your-own-api-key/). After the router resolves a task to a concrete model, Warp applies your API keys to that model — the same as selecting that model directly from the picker. Requests that resolve to a model covered by one of your keys are billed through your provider account and don't consume Warp credits; requests that resolve to a model without a matching key consume Warp credits as usual. +Custom routers work with [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/). After the router resolves a task to a concrete model, Warp applies your API keys to that model — the same as selecting that model directly from the picker. Requests that resolve to a model covered by one of your keys are billed through your provider account and don't consume Warp credits; requests that resolve to a model without a matching key consume Warp credits as usual. 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. -* **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](/agent-platform/inference/custom-inference-endpoint/) and never draws on your endpoint. +* **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 @@ -133,8 +133,8 @@ If a router targets a model you don't have access to or that's disabled for your ## Related resources -* [Model choice](/agent-platform/inference/model-choice/) — Supported models and `model_id` values, including Warp's built-in Auto models. -* [Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/) — Use your own OpenAI, Anthropic, or Google API keys. -* [Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/) — Route Warp through any OpenAI-compatible endpoint. +* [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. * [Admin Panel for teams](/enterprise/team-management/admin-panel/) — Manage team-wide settings, including team-synced routers. diff --git a/src/content/docs/agent-platform/inference/grok-subscription.mdx b/src/content/docs/agents/inference/grok-subscription.mdx similarity index 77% rename from src/content/docs/agent-platform/inference/grok-subscription.mdx rename to src/content/docs/agents/inference/grok-subscription.mdx index 84ef7e3a8..b48e5ccd5 100644 --- a/src/content/docs/agent-platform/inference/grok-subscription.mdx +++ b/src/content/docs/agents/inference/grok-subscription.mdx @@ -6,9 +6,9 @@ description: >- Grok Build. --- -Warp lets you connect your **SuperGrok subscription** to use Grok models in Warp's agents through your xAI account. If you already subscribe to Grok, you can run Grok models in Warp without consuming your Warp [credits](/support-and-community/plans-and-billing/credits/). X Premium subscriptions that include Grok access work the same way: you sign in to your xAI account, and xAI determines which subscription tiers are eligible and how much usage they include. +Warp lets you connect your **SuperGrok subscription** to use Grok models with agents in Warp through your xAI account. If you already subscribe to Grok, you can run Grok models in Warp without consuming your Warp [credits](/support-and-community/plans-and-billing/credits/). X Premium subscriptions that include Grok access work the same way: you sign in to your xAI account, and xAI determines which subscription tiers are eligible and how much usage they include. -Connecting a subscription works like [Bring Your Own API Key (BYOK)](/agent-platform/inference/bring-your-own-api-key/), except you sign in to your xAI account instead of pasting an API key. There is no xAI API key field in Warp today — the subscription is the way to bring your own Grok access. +Connecting a subscription works like [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/), except you sign in to your xAI account instead of pasting an API key. There is no xAI API key field in Warp today — the subscription is the way to bring your own Grok access. :::note Like BYOK, connecting a SuperGrok subscription is available on Free and all eligible paid plans 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). See [Warp pricing](https://www.warp.dev/pricing) for current availability. @@ -21,10 +21,10 @@ When you connect your subscription, Warp opens your browser to xAI's consent scr When you send a prompt with a Grok model selected and a subscription connected: 1. Your local Warp client sends the access token to Warp's backend along with your prompt. -2. Warp's agent harness assembles the full request and uses your token in-flight to call xAI, authenticating as your xAI account instead of Warp's. +2. The Warp Agent harness assembles the full request and uses your token in-flight to call xAI, authenticating as your xAI account instead of Warp's. 3. xAI's response streams back through Warp's backend to your client. -Your token passes through Warp's servers on each request but is used only in-flight to call xAI, then discarded — the same model as [BYOK](/agent-platform/inference/bring-your-own-api-key/#how-byok-works). +Your token passes through Warp's servers on each request but is used only in-flight to call xAI, then discarded — the same model as [BYOK](/agents/inference/bring-your-own-api-key/#how-byok-works). Once connected, supported Grok models show a **key icon** in the model picker, indicating requests will route through your xAI account. Usage and rate limits for these requests are governed by your xAI subscription — see [How usage counts against your xAI subscription](#how-usage-counts-against-your-xai-subscription). @@ -33,7 +33,9 @@ Once connected, supported Grok models show a **key icon** in the model picker, i 1. In the Warp app, open **Settings** and search for `SuperGrok` to jump to the **Connect SuperGrok subscription** row in your AI settings. 2. Click **Connect**. Warp opens your browser to xAI's consent screen and shows a toast with a **Copy URL** fallback in case the browser doesn't open. 3. Approve the connection in your browser. The page confirms with "Grok connected," and back in Warp the row shows a "Connected on..." timestamp. -4. Select a Grok model with the key icon from the model picker in your prompt input. Connecting a subscription doesn't change your selected model, so this last step is what actually routes your requests through your subscription. See [Model choice](/agent-platform/inference/model-choice/) for the list of available models. +4. Select a Grok model with the key icon from the model picker in your prompt input. Connecting a subscription doesn't change your selected model, so this last step is what actually routes your requests through your subscription. See [Model choice](/agents/inference/model-choice/) for the list of available models. + +In the [Warp Agent CLI](/agents/cli/), run `/connect-grok` instead. It starts the same xAI sign-in from your session, and `/api-keys` shows the connection state afterward. See [models and usage in the Warp Agent CLI](/agents/cli/models-and-usage/#bring-your-own-api-key). ## Usage and billing behavior @@ -41,7 +43,7 @@ When a Grok model with the key icon is selected: * Warp **does not consume** any of your [credits](/support-and-community/plans-and-billing/credits/) for the request. * Inference runs through your xAI account, within your xAI subscription's usage limits. -* If a request fails because your subscription hits a limit, Warp does not retry with Warp credits unless you enable **Warp credit fallback** in the same settings section. See [failover and fallback behavior](/agent-platform/inference/bring-your-own-api-key/#failover-and-fallback-behavior). +* If a request fails because your subscription hits a limit, Warp does not retry with Warp credits unless you enable **Warp credit fallback** in the same settings section. See [failover and fallback behavior](/agents/inference/bring-your-own-api-key/#failover-and-fallback-behavior). ### How usage counts against your xAI subscription @@ -83,7 +85,7 @@ Warp waits 5 minutes for you to approve the connection in your browser. Click ** ## Related resources -* [Model choice](/agent-platform/inference/model-choice/) — Full list of supported models and `model_id` values. -* [Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/) — Use your own Anthropic, OpenAI, or Google API keys. -* [Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/) — Route Warp through any OpenAI-compatible endpoint. +* [Model choice](/agents/inference/model-choice/) — Full list of supported models and `model_id` values. +* [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) — Use your own Anthropic, OpenAI, or Google API keys. +* [Custom inference endpoint](/agents/inference/custom-inference-endpoint/) — Route Warp through any OpenAI-compatible endpoint. * [Credits](/support-and-community/plans-and-billing/credits/) — How Warp credits work and when they're consumed. diff --git a/src/content/docs/agent-platform/inference/model-choice.mdx b/src/content/docs/agents/inference/model-choice.mdx similarity index 91% rename from src/content/docs/agent-platform/inference/model-choice.mdx rename to src/content/docs/agents/inference/model-choice.mdx index 95a92037d..147f6113d 100644 --- a/src/content/docs/agent-platform/inference/model-choice.mdx +++ b/src/content/docs/agents/inference/model-choice.mdx @@ -6,8 +6,9 @@ description: >- Choose from a curated set of top LLMs for Warp's Agents (or let Warp auto-select the best model). --- +import { VARS } from '@data/vars'; -Warp lets you choose from a curated set of large language models to power your agents, or let Warp auto-select the best model for each task. Models from OpenAI, Anthropic, Google, and open source providers are available, with configurable reasoning levels and per-profile defaults. You can also define [custom routers](/agent-platform/inference/custom-routers/) that pick a model for each task using your own logic. +Warp lets you choose from a curated set of large language models to power your agents, or let Warp auto-select the best model for each task. Models from OpenAI, Anthropic, Google, and open source providers are available, with configurable reasoning levels and per-profile defaults. You can also define [custom routers](/agents/inference/custom-routers/) that pick a model for each task using your own logic. ## Available models @@ -15,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 [Oz 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](/reference/cli/). ### Auto models @@ -73,6 +74,7 @@ All Auto models perform well across all agent workflows and are ideal if you pre | Claude Opus 5 | `claude-5-opus-low` | Low effort | | Claude Opus 5 | `claude-5-opus-medium` | Medium effort | | Claude Opus 5 | `claude-5-opus-xhigh` | Extra high effort | +| Claude Opus 5 | `claude-5-opus-xhigh-fast` | Fast mode | | Claude Opus 5 | `claude-5-opus-max` | Max effort | | Claude Fable 5 | `claude-5-fable-high` | Default effort | | Claude Fable 5 | `claude-5-fable-low` | Low effort | @@ -113,12 +115,18 @@ Anthropic requires data retention for Claude Fable 5 for safety, abuse monitorin | Model | `model_id` | | --- | --- | | Gemini 3.1 Pro | `gemini-3.1-pro` | +| Gemini 3.7 Flash | `gemini-3.7-flash` | +| Gemini 3.6 Flash | `gemini-3.6-flash` | | Gemini 3.5 Flash | `gemini-3.5-flash` | #### xAI | Model | `model_id` | Reasoning Level | | --- | --- | --- | +| Grok 4.6 | `grok-4-6-low` | Low | +| Grok 4.6 | `grok-4-6-medium` | Medium | +| Grok 4.6 | `grok-4-6-high` | High | +| Grok 4.6 | `grok-4-6-xhigh` | Extra High | | Grok 4.5 | `grok-4-5-low` | Low | | Grok 4.5 | `grok-4-5-medium` | Medium | | Grok 4.5 | `grok-4-5-high` | High | @@ -127,7 +135,7 @@ Anthropic requires data retention for Claude Fable 5 for safety, abuse monitorin | Grok 4.3 | `grok-4-3-high` | High | | Grok Build 0.1 | `grok-build-0.1` | — | -You can run Grok models through your own SuperGrok subscription instead of Warp credits by connecting your xAI account. See [SuperGrok subscription](/agent-platform/inference/grok-subscription/). +You can run Grok models through your own SuperGrok subscription instead of Warp credits by connecting your xAI account. See [SuperGrok subscription](/agents/inference/grok-subscription/). #### Hosted models (via [Fireworks AI](https://fireworks.ai)) @@ -160,7 +168,7 @@ To change models, click the displayed model name (for example, _Claude Sonnet 5_ Beyond the built-in Auto models, you can define your own custom routers that automatically route each task to a concrete model based on task complexity or rules you write. Custom routers appear in the model picker alongside Auto and individual models. -Add and manage custom routers in **Settings** > **Agents** > **Oz** > **Custom Routers**. See [Custom routers](/agent-platform/inference/custom-routers/) for details on creating one. +Add and manage custom routers in **Settings** > **Agents** > **Warp Agent** > **Custom Routers**. See [Custom routers](/agents/inference/custom-routers/) for details on creating one. ### Model fallback @@ -174,7 +182,7 @@ Warp uses a model fallback system to ensure uninterrupted service if your select ### Configuring models per Agent Profile -You can configure the base model for each [Agent Profile](/agent-platform/capabilities/agent-profiles-permissions/), alongside the Agent's autonomy, tool access, and other permissions. The base model is also used for [Planning](/agent-platform/capabilities/planning/). +You can configure the base model for each [Agent Profile](/agents/capabilities/agent-profiles-permissions/), alongside the Agent's autonomy, tool access, and other permissions. The base model is also used for [Planning](/agents/capabilities/planning/). Edit your default profile or any other profile directly in **Settings** > **Agents** > **Profiles**. diff --git a/src/content/docs/agent-platform/local-agents/active-ai.mdx b/src/content/docs/agents/local-agents/active-ai.mdx similarity index 89% rename from src/content/docs/agent-platform/local-agents/active-ai.mdx rename to src/content/docs/agents/local-agents/active-ai.mdx index 5c5e50fa7..1cf7fd0ca 100644 --- a/src/content/docs/agent-platform/local-agents/active-ai.mdx +++ b/src/content/docs/agents/local-agents/active-ai.mdx @@ -15,16 +15,16 @@ Active AI features can be disabled in **Settings** > **Agents** > **Warp Agent** Prompt Suggestions are contextual, AI-powered suggestions that activate Agent Mode. These banners will provide suggestions for what to ask Agent Mode in specific scenarios, similar to how Warp already suggests commands to run. -To disable, please visit **Settings** > **Agents** > **Warp Agent** > **Active AI** > **Prompt Suggestions** +To disable, go to **Settings** > **Agents** > **Warp Agent** > **Active AI** > **Prompt Suggestions**. ![Example of inline banner popping up when relevant contextually.](../../../../assets/agent-platform/prompt-suggestions-example-1.png) #### Accepting a prompt suggestion -If you press `CTRL-ENTER` (on macOS), `ALT-SHIFT-ENTER` (on Linux/Windows), or click on the chip, the suggestion will auto-populate into your input and run against [Agent Mode](/agent-platform/local-agents/interacting-with-agents/) (with the most recent block attached). +If you press `CTRL-ENTER` (on macOS), `ALT-SHIFT-ENTER` (on Linux/Windows), or click on the chip, the suggestion will auto-populate into your input and run against [Agent Mode](/agents/local-agents/interacting-with-agents/) (with the most recent block attached). :::note -Prompt Suggestions use an LLM to generate prompts based on your terminal session, specifically the most recent block. These AI requests do not contribute towards your AI limits, however, any accepted prompts run in Agent Mode contribute as normal. Visit **Settings** > **Agents** > **Warp Agent** > **Active AI** if you'd like to turn it off. +Prompt Suggestions use an LLM to generate prompts based on your terminal session, specifically the most recent block. These AI requests do not contribute towards your AI limits. However, any accepted prompts run in Agent Mode contribute as normal. To turn it off, go to **Settings** > **Agents** > **Warp Agent** > **Active AI**. If [Secret Redaction](/support-and-community/privacy-and-security/secret-redaction/) is enabled, any selected regexes are applied to content sent to Active AI features to prevent any sensitive data being leaked. ::: @@ -35,7 +35,7 @@ If [Secret Redaction](/support-and-community/privacy-and-security/secret-redacti Next Command uses AI to suggest the next command to run based on your active terminal session and command history. It uses your active terminal session contents and an LLM to generate commands. -To disable, please visit **Settings** > **Agents** > **Warp Agent** > **Active AI** > **Next Command** +To disable, go to **Settings** > **Agents** > **Warp Agent** > **Active AI** > **Next Command**. ![Next Command suggestion appearing inline based on the active terminal session and command history.](../../../../assets/agent-platform/next-command.png) diff --git a/src/content/docs/agent-platform/local-agents/agent-context/blocks-as-context.mdx b/src/content/docs/agents/local-agents/agent-context/blocks-as-context.mdx similarity index 93% rename from src/content/docs/agent-platform/local-agents/agent-context/blocks-as-context.mdx rename to src/content/docs/agents/local-agents/agent-context/blocks-as-context.mdx index dfe3f2ca1..4d9864418 100644 --- a/src/content/docs/agent-platform/local-agents/agent-context/blocks-as-context.mdx +++ b/src/content/docs/agents/local-agents/agent-context/blocks-as-context.mdx @@ -28,12 +28,12 @@ The most common use case is to ask the AI to fix an error. You can attach the er **Attach a previous block** * To attach blocks to a query, you can use `CMD-UP` to attach the previous block as context to the query. While holding `CMD`, you can then use your `UP/DOWN` keys to pick another block to attach. - * You may also use your mouse to attach blocks in your session. Hold `CMD` as you click on other blocks to extend your block selection. + * You can also use your mouse to attach blocks in your session. Hold `CMD` as you click on other blocks to extend your block selection. **Clear a previous block** * To clear blocks from a query, you can use `CMD-DOWN` until the blocks are removed from context. - * You may also use your mouse to clear blocks in your session. Hold `CMD` as you click on an attached block to clear it. + * You can also use your mouse to clear blocks in your session. Hold `CMD` as you click on an attached block to clear it. :::note When using "Pin to the top" [Input Position](/terminal/appearance/input-position/), the direction for attaching or detaching is reversed (i.e. `CMD-DOWN` attaches blocks to context, while `CMD-UP` clears blocks from context). @@ -43,12 +43,12 @@ The most common use case is to ask the AI to fix an error. You can attach the er **Attach a previous block** * To attach blocks to a query, you can use `CTRL-UP` to attach the previous block as context to the query. While holding `CTRL`, you can then use your `UP/DOWN` keys to pick another block to attach. - * You may also use your mouse to select blocks in your session. Hold `CTRL` as you click on other blocks to extend your block selection. + * You can also use your mouse to select blocks in your session. Hold `CTRL` as you click on other blocks to extend your block selection. **Clear a previous block** * To clear blocks from a query, you can use `CTRL-DOWN` until the blocks are removed from context. - * You may also use your mouse to clear blocks in your session. Hold `CTRL` as you click on an attached block to clear it. + * You can also use your mouse to clear blocks in your session. Hold `CTRL` as you click on an attached block to clear it. :::note When using "Pin to the top" [Input Position](/terminal/appearance/input-position/), the direction for attaching or detaching is reversed (i.e. `CTRL-DOWN` attaches blocks to context, while `CTRL-UP` clears blocks from context). @@ -58,12 +58,12 @@ The most common use case is to ask the AI to fix an error. You can attach the er **Attach a previous block** * To attach blocks to a query, you can use `CTRL-UP` to attach the previous block as context to the query. While holding `CTRL`, you can then use your `UP/DOWN` keys to pick another block to attach. - * You may also use your mouse to select blocks in your session. Hold `CTRL` as you click on other blocks to extend your block selection. + * You can also use your mouse to select blocks in your session. Hold `CTRL` as you click on other blocks to extend your block selection. **Clear a previous block** * To clear blocks from a query, you can use `CTRL-DOWN` until the blocks are removed from context. - * You may also use your mouse to clear blocks in your session. Hold `CTRL` as you click on an attached block to clear it. + * You can also use your mouse to clear blocks in your session. Hold `CTRL` as you click on an attached block to clear it. :::note When using "Pin to the top" [Input Position](/terminal/appearance/input-position/), the direction for attaching or detaching is reversed (i.e. `CTRL-DOWN` attaches blocks to context, while `CTRL-UP` clears blocks from context). diff --git a/src/content/docs/agent-platform/local-agents/agent-context/images-as-context.mdx b/src/content/docs/agents/local-agents/agent-context/images-as-context.mdx similarity index 95% rename from src/content/docs/agent-platform/local-agents/agent-context/images-as-context.mdx rename to src/content/docs/agents/local-agents/agent-context/images-as-context.mdx index 053115d52..6c7e1845b 100644 --- a/src/content/docs/agent-platform/local-agents/agent-context/images-as-context.mdx +++ b/src/content/docs/agents/local-agents/agent-context/images-as-context.mdx @@ -40,7 +40,7 @@ You can attach up to **5 images per request**, and up to **20 images across a si ### Model behavior and image handling -All supported models listed in [Model Choice](/agent-platform/inference/model-choice/) can interpret image input. +All supported models listed in [Model Choice](/agents/inference/model-choice/) can interpret image input. Attaching images will consume additional requests, proportional to the number of images added. To stay within model limits, Warp will intelligently resize images before passing them as context, minimizing token usage and respecting the model's maximum image dimensions. diff --git a/src/content/docs/agents/local-agents/agent-context/index.mdx b/src/content/docs/agents/local-agents/agent-context/index.mdx new file mode 100644 index 000000000..7c8794895 --- /dev/null +++ b/src/content/docs/agents/local-agents/agent-context/index.mdx @@ -0,0 +1,22 @@ +--- +title: Agent context overview +description: >- + How to attach various forms of multi-modal context directly to Warp's Agent + within a prompt. +--- + +In Warp, you can pass different types of input directly to the Agent to guide its behavior and improve response quality. These inputs are known as **Agent Context**: ad-hoc pieces of information you manually supply during a session. + +**You can attach context in several ways:** + +* [Blocks as Context](/agents/local-agents/agent-context/blocks-as-context/) - share output from your terminal to help the Agent understand errors, logs, or previous commands. +* [Images as Context](/agents/local-agents/agent-context/images-as-context/) - include screenshots, diagrams, or other visuals to provide additional clarity. +* [URLs as Context](/agents/local-agents/agent-context/urls-as-context/) - attach public webpages so the Agent can extract and reference their content. +* [Selection as Context](/agents/local-agents/agent-context/selection-as-context/) - attach code snippets from the editor or review panel to enrich your prompts with precise context. +* [Using @ to Add Context](/agents/local-agents/agent-context/using-to-add-context/) - reference files, folders, code symbols, or Warp Drive objects directly in your prompts. + +Commands you run inside an agent conversation are automatically included as context for your next prompt. For details, see [Blocks as Context](/agents/local-agents/agent-context/blocks-as-context/). + +--- + +This is distinct from other persistent or automatic sources of context, such as [Rules](/agents/capabilities/rules/), [Warp Drive as Agent Mode Context](/knowledge-and-collaboration/warp-drive/agent-mode-context/), and [Model Context Protocol (MCP)](/agents/capabilities/mcp/), which the Agent also uses when available. diff --git a/src/content/docs/agent-platform/local-agents/agent-context/selection-as-context.mdx b/src/content/docs/agents/local-agents/agent-context/selection-as-context.mdx similarity index 98% rename from src/content/docs/agent-platform/local-agents/agent-context/selection-as-context.mdx rename to src/content/docs/agents/local-agents/agent-context/selection-as-context.mdx index cc4776a0c..5987e7ceb 100644 --- a/src/content/docs/agent-platform/local-agents/agent-context/selection-as-context.mdx +++ b/src/content/docs/agents/local-agents/agent-context/selection-as-context.mdx @@ -42,4 +42,4 @@ You can select code, files, or snippets and feed them directly to a running thir When a third-party agent (Claude Code, Codex, OpenCode, etc.) is running in a Warp tab, select text in Warp's code editor or Code Review panel and attach it as context to that agent's session using `Cmd + L` (macOS) or `CTRL + SHIFT + L` (Windows/Linux). This works the same way as attaching context to Warp's built-in Agent. -For more on third-party agent support, see [Third-party CLI agents](/agent-platform/cli-agents/overview/). +For more on third-party agent support, see [Third-party CLI agents](/agents/cli-agents/overview/). diff --git a/src/content/docs/agent-platform/local-agents/agent-context/urls-as-context.mdx b/src/content/docs/agents/local-agents/agent-context/urls-as-context.mdx similarity index 91% rename from src/content/docs/agent-platform/local-agents/agent-context/urls-as-context.mdx rename to src/content/docs/agents/local-agents/agent-context/urls-as-context.mdx index 25ae2fef7..ec2b4dd24 100644 --- a/src/content/docs/agent-platform/local-agents/agent-context/urls-as-context.mdx +++ b/src/content/docs/agents/local-agents/agent-context/urls-as-context.mdx @@ -16,7 +16,7 @@ You can attach a public URL to any prompt to provide page content as context. Wa * Only the specific URL you provide is processed. The agent won’t explore the site, follow links, or crawl beyond that page. :::note -**Important**: URL attachments are different from web search. If you need the agent to look something up, gather real-time information, or pull in multiple sources, use [Web Search](/agent-platform/capabilities/web-search/) instead. +**Important**: URL attachments are different from web search. If you need the agent to look something up, gather real-time information, or pull in multiple sources, use [Web Search](/agents/capabilities/web-search/) instead. ::: <figure> diff --git a/src/content/docs/agent-platform/local-agents/agent-context/using-to-add-context.mdx b/src/content/docs/agents/local-agents/agent-context/using-to-add-context.mdx similarity index 92% rename from src/content/docs/agent-platform/local-agents/agent-context/using-to-add-context.mdx rename to src/content/docs/agents/local-agents/agent-context/using-to-add-context.mdx index e6cbae66e..e122cb710 100644 --- a/src/content/docs/agent-platform/local-agents/agent-context/using-to-add-context.mdx +++ b/src/content/docs/agents/local-agents/agent-context/using-to-add-context.mdx @@ -23,7 +23,7 @@ Attaching context with @ works in **both natural language mode** (when interacti <figcaption>File search using the @ symbol.</figcaption> </figure> -Additionally, no codebase indexing (via [Codebase Context](/agent-platform/capabilities/codebase-context/)) is required — file search is available immediately in any Git-initialized directory. The search also respects `.gitignore` rules and will exclude ignored files from the results. +Additionally, no codebase indexing (via [Codebase Context](/agents/capabilities/codebase-context/)) is required — file search is available immediately in any Git-initialized directory. The search also respects `.gitignore` rules and will exclude ignored files from the results. <figure> ![Filtering files using @app to locate files containing “app” in their name or path.](../../../../../assets/agent-platform/at-context-app.png) @@ -49,7 +49,7 @@ Warp Drive objects are another way to attach context with **@**. You can referen * [Workflows](/knowledge-and-collaboration/warp-drive/workflows/) — parameterized commands you can name and save in Warp with descriptions and arguments. * [Notebooks](/knowledge-and-collaboration/warp-drive/notebooks/) — runnable documentation consisting of markdown text and list elements, code blocks, and runnable shell snippets that can be automatically executed in your terminal session. -* [Rules](/agent-platform/capabilities/rules/) — reusable guidelines and constraints that inform how Agents respond to your prompts. +* [Rules](/agents/capabilities/rules/) — reusable guidelines and constraints that inform how Agents respond to your prompts. When you select one of these objects, Warp inserts a reference token into your prompt. The contents of the object are then automatically passed as context to the Agent. diff --git a/src/content/docs/agent-platform/local-agents/cloud-conversations.mdx b/src/content/docs/agents/local-agents/cloud-conversations.mdx similarity index 81% rename from src/content/docs/agent-platform/local-agents/cloud-conversations.mdx rename to src/content/docs/agents/local-agents/cloud-conversations.mdx index 552a0c36a..c6443e6ac 100644 --- a/src/content/docs/agent-platform/local-agents/cloud-conversations.mdx +++ b/src/content/docs/agents/local-agents/cloud-conversations.mdx @@ -6,7 +6,7 @@ description: >- --- import VideoEmbed from '@components/VideoEmbed.astro'; -Warp can sync your [agent conversations](/agent-platform/local-agents/interacting-with-agents/) to the cloud, making them accessible across devices, shareable with teammates, and persistent even after logging out. This enables you to pick up where you left off on any machine, share context with collaborators, and access past [cloud agent](/platform/) conversations. +Warp can sync your [agent conversations](/agents/local-agents/interacting-with-agents/) to the cloud, making them accessible across devices, shareable with teammates, and persistent even after logging out. This enables you to pick up where you left off on any machine, share context with collaborators, and access past [cloud agent](/platform/) conversations. ## Key capabilities @@ -46,13 +46,13 @@ When you restore a cloud conversation: * **Your own conversations** - You can continue the conversation directly, and updates sync back to the cloud. * **Shared conversations from others** - Continuing creates a fork, giving you a new conversation that starts with the shared context but does not modify the original. -This behavior mirrors [Conversation Forking](/agent-platform/local-agents/interacting-with-agents/conversation-forking/), where you branch off to explore a different direction without affecting the source conversation. +This behavior mirrors [Conversation Forking](/agents/local-agents/interacting-with-agents/conversation-forking/), where you branch off to explore a different direction without affecting the source conversation. ## Managing cloud-synced conversations Cloud-synced conversations appear in all the usual conversation management entrypoints alongside your local conversations. You can browse, search, restore, and delete them just like any other conversation. -See [Interacting with Agents](/agent-platform/local-agents/interacting-with-agents/) for detailed information on navigating and managing conversations, including keyboard shortcuts and the Conversation Panel in [Terminal and Agent modes](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/). +See [Interacting with Agents](/agents/local-agents/interacting-with-agents/) for detailed information on navigating and managing conversations, including keyboard shortcuts and the Conversation Panel in [Terminal and Agent modes](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/). * **Browse** - View all your local and cloud-synced conversations in one place. * **Search** - Find conversations by title or content. @@ -88,7 +88,7 @@ Recipients can view shared conversations in two ways: When you continue a shared conversation from someone else, Warp creates a fork so you can build on the shared context without modifying the original. :::note -Cloud-synced conversations store snapshots of conversation data. For real-time collaboration on a live session, use [Agent Session Sharing](/agent-platform/local-agents/session-sharing/). +Cloud-synced conversations store snapshots of conversation data. For real-time collaboration on a live session, use [Agent Session Sharing](/agents/local-agents/session-sharing/). ::: ## Cloud agent conversations @@ -132,8 +132,8 @@ When you delete a conversation, it is removed permanently and immediately. Make ## Related features -* [Interacting with Agents](/agent-platform/local-agents/interacting-with-agents/) - Learn about conversation mechanics, follow-ups, and context windows. -* [Conversation Forking](/agent-platform/local-agents/interacting-with-agents/conversation-forking/) - Branch conversations to explore different directions. -* [Session Sharing](/agent-platform/local-agents/session-sharing/) - Collaborate in real time on a live Agent session. +* [Interacting with Agents](/agents/local-agents/interacting-with-agents/) - Learn about conversation mechanics, follow-ups, and context windows. +* [Conversation Forking](/agents/local-agents/interacting-with-agents/conversation-forking/) - Branch conversations to explore different directions. +* [Session Sharing](/agents/local-agents/session-sharing/) - Collaborate in real time on a live Agent session. * [Cloud Agents overview](/platform/) - Run agents in the cloud from triggers, schedules, or integrations. * [Handoff between local and cloud agents](/platform/handoff/) - Promote a local conversation to a cloud agent run, or continue a finished cloud run. diff --git a/src/content/docs/agent-platform/local-agents/code-diffs.mdx b/src/content/docs/agents/local-agents/code-diffs.mdx similarity index 87% rename from src/content/docs/agent-platform/local-agents/code-diffs.mdx rename to src/content/docs/agents/local-agents/code-diffs.mdx index 0c0b167ae..9792fa766 100644 --- a/src/content/docs/agent-platform/local-agents/code-diffs.mdx +++ b/src/content/docs/agents/local-agents/code-diffs.mdx @@ -8,7 +8,7 @@ description: >- --- import VideoEmbed from '@components/VideoEmbed.astro'; -When Warp's agent generates code changes, they appear as visual diffs in a built-in editor. Review proposed changes line by line, refine them with natural language, make manual edits, or accept them to apply the modifications to your files. +When the Warp Agent generates code changes, they appear as visual diffs in a built-in editor. Review proposed changes line by line, refine them with natural language, make manual edits, or accept them to apply the modifications to your files. ## Reviewing code diffs @@ -17,7 +17,7 @@ During an Agent Conversation, Warp can generate code diffs that open directly in This lets you review proposed changes line by line, refine them with natural language, or make manual edits before choosing whether to apply them. It’s a fast, transparent way to stay in control of agent-generated code. :::caution -If the `Apply Code Diffs` permission is set to `Always allow` in [Agent Profiles & Permissions](/agent-platform/capabilities/agent-profiles-permissions/), code diffs are applied automatically without being surfaced for review. If it's set to `Agent decides` or `Always ask`, you'll always be prompted to review diffs before they're applied. +If the `Apply Code Diffs` permission is set to `Always allow` in [Agent Profiles & Permissions](/agents/capabilities/agent-profiles-permissions/), code diffs are applied automatically without being surfaced for review. If it's set to `Agent decides` or `Always ask`, you'll always be prompted to review diffs before they're applied. ::: :::note diff --git a/src/content/docs/agent-platform/local-agents/generate.mdx b/src/content/docs/agents/local-agents/generate.mdx similarity index 90% rename from src/content/docs/agent-platform/local-agents/generate.mdx rename to src/content/docs/agents/local-agents/generate.mdx index 6c38c1342..3bec4e7ca 100644 --- a/src/content/docs/agent-platform/local-agents/generate.mdx +++ b/src/content/docs/agents/local-agents/generate.mdx @@ -41,7 +41,7 @@ Type `#` on the command-line input to generate command suggestions. ### \[Legacy] Generate text and contextual suggestions in interactive CLIs :::caution -**Our legacy Generate feature which works in interactive CLIs has been replaced by** [Full Terminal Use](/agent-platform/capabilities/full-terminal-use/)**, where Warp's agent can now run and control long-running or full-screen terminal applications**.\ +**Our legacy Generate feature which works in interactive CLIs has been replaced by** [Full Terminal Use](/agents/capabilities/full-terminal-use/)**, where the Warp Agent can now run and control long-running or full-screen terminal applications**.\ The agent can provide input when prompted, navigate interactive screens, and continue execution without stalling. ::: @@ -61,21 +61,21 @@ In interactive CLI applications, you can generate input using natural language. <TabItem label="macOS"> 1. Inside a long-running, interactive command, press `CMD-I` when you see the hint text appear. 2. Type what you would like to generate in the input box. For example, "show me all tables in my Postgres database" or in Vim, "generate a recursive Fibonacci function and save it to the file." - 3. Results are generated in real time using the [LLM of your choice](/agent-platform/local-agents/generate/#supported-interactive-cli-models). + 3. Results are generated in real time using the [LLM of your choice](/agents/inference/model-choice/). 4. To refine or follow up on your query, press `CMD-Y`. You can then either edit your last message by pressing `UP ↑` or add a follow-up by typing in new text. 5. When you've found the text you want to add or execute, press `Enter` or click the Accept button. </TabItem> <TabItem label="Windows"> 1. Inside a long-running, interactive command, press `CTRL-SHIFT-I` when you see the hint text appear. 2. Type what you would like to generate in the input box. For example, "show me all tables in my Postgres database" or in Vim, "generate a recursive Fibonacci function and save it to the file." - 3. Results are generated in real time using the [LLM of your choice](/agent-platform/local-agents/generate/#supported-interactive-cli-models) + 3. Results are generated in real time using the [LLM of your choice](/agents/inference/model-choice/) 4. To refine or follow up on your query, press `CTRL-SHIFT-Y`. You can then either edit your last message by pressing `UP ↑` or add a follow-up by typing in new text. 5. When you've found the text you want to add or execute, press `Enter` or click the Accept button. </TabItem> <TabItem label="Linux"> 1. Inside a long-running, interactive command, press `CTRL-SHIFT-I` when you see the hint text appear. 2. Type what you would like to generate in the input box. For example, "show me all tables in my Postgres database" or in Vim, "generate a recursive Fibonacci function and save it to the file." - 3. Results are generated in real time using the [LLM of your choice](/agent-platform/local-agents/generate/#supported-interactive-cli-models) + 3. Results are generated in real time using the [LLM of your choice](/agents/inference/model-choice/) 4. To refine or follow up on your query, press `CTRL-SHIFT-Y`. You can then either edit your last message by pressing `UP ↑` or add a follow-up by typing in new text. 5. When you've found the text you want to add or execute, press `Enter` or click the Accept button. </TabItem> @@ -91,5 +91,5 @@ A couple of other examples of interactive CLIs where you can invoke Generate: * **Cloud provider shells** (e.g. `gcloud`, `aws cli`): faster setup or resource management such as "create a new Kubernetes cluster" or "provision a new RDS instance" :::caution -If you experience any issues with Generate, please visit known issues for [troubleshooting steps](/support-and-community/troubleshooting-and-support/known-issues/#online-features-dont-work). +If you experience any issues with Generate, see known issues for [troubleshooting steps](/support-and-community/troubleshooting-and-support/known-issues/#online-features-dont-work). ::: diff --git a/src/content/docs/agent-platform/local-agents/interacting-with-agents/agent-questions.mdx b/src/content/docs/agents/local-agents/interacting-with-agents/agent-questions.mdx similarity index 89% rename from src/content/docs/agent-platform/local-agents/interacting-with-agents/agent-questions.mdx rename to src/content/docs/agents/local-agents/interacting-with-agents/agent-questions.mdx index 2bc02dec4..029b2fb39 100644 --- a/src/content/docs/agent-platform/local-agents/interacting-with-agents/agent-questions.mdx +++ b/src/content/docs/agents/local-agents/interacting-with-agents/agent-questions.mdx @@ -50,6 +50,6 @@ Auto-approve is designed for unattended execution. If you want the Agent to keep ## Related pages -* [Terminal and Agent modes](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/) - Start and navigate Agent conversations in Warp. -* [Profiles & permissions](/agent-platform/capabilities/agent-profiles-permissions/) - Configure Agent Profile permissions and autonomy settings. -* [Agent notifications](/agent-platform/capabilities/agent-notifications/) - Learn how Warp notifies you when an Agent needs your input. +* [Terminal and Agent modes](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) - Start and navigate Agent conversations in Warp. +* [Profiles & permissions](/agents/capabilities/agent-profiles-permissions/) - Configure Agent Profile permissions and autonomy settings. +* [Agent notifications](/agents/capabilities/agent-notifications/) - Learn how Warp notifies you when an Agent needs your input. diff --git a/src/content/docs/agent-platform/local-agents/interacting-with-agents/conversation-forking.mdx b/src/content/docs/agents/local-agents/interacting-with-agents/conversation-forking.mdx similarity index 97% rename from src/content/docs/agent-platform/local-agents/interacting-with-agents/conversation-forking.mdx rename to src/content/docs/agents/local-agents/interacting-with-agents/conversation-forking.mdx index 457a3baaa..9a6509982 100644 --- a/src/content/docs/agent-platform/local-agents/interacting-with-agents/conversation-forking.mdx +++ b/src/content/docs/agents/local-agents/interacting-with-agents/conversation-forking.mdx @@ -56,7 +56,7 @@ _Example_: `/fork Can you try a different approach?` Forks the selected conversa #### 4. Using the `/fork-and-compact` slash command -Type `/fork-and-compact` to fork the current conversation and automatically compact the forked version. This combines forking with [context window management](/agent-platform/local-agents/interacting-with-agents/#context-window-management), giving you a fresh start with a summarized context. +Type `/fork-and-compact` to fork the current conversation and automatically compact the forked version. This combines forking with [context window management](/agents/local-agents/interacting-with-agents/#context-window-management), giving you a fresh start with a summarized context. * Press `Enter` to open the fork in a new pane (default) * Press `⌘+Enter` (macOS) or `Ctrl+Enter` (Windows/Linux) to open the fork in the current pane diff --git a/src/content/docs/agent-platform/local-agents/interacting-with-agents/index.mdx b/src/content/docs/agents/local-agents/interacting-with-agents/index.mdx similarity index 87% rename from src/content/docs/agent-platform/local-agents/interacting-with-agents/index.mdx rename to src/content/docs/agents/local-agents/interacting-with-agents/index.mdx index 5a737ff55..97518d26a 100644 --- a/src/content/docs/agent-platform/local-agents/interacting-with-agents/index.mdx +++ b/src/content/docs/agents/local-agents/interacting-with-agents/index.mdx @@ -5,6 +5,7 @@ description: >- and multi-thread support. --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import { VARS } from '@data/vars'; import VideoEmbed from '@components/VideoEmbed.astro'; Agent conversations in Warp are multi-turn interactions tied to terminal sessions. Continue previous threads with follow-ups, manage conversation history, attach context from blocks and files, and run multiple conversations simultaneously across windows, tabs, or panes. @@ -20,7 +21,7 @@ Long conversations can cause slower performance and lower-quality answers. When ::: :::note -To access conversations across devices, share them with teammates, or restore past cloud Agent conversations, enable [Cloud-synced Conversations](/agent-platform/local-agents/cloud-conversations/). +To access conversations across devices, share them with teammates, or restore past cloud Agent conversations, enable [Cloud-synced Conversations](/agents/local-agents/cloud-conversations/). ::: ### Staying in a conversation (follow-ups) @@ -36,7 +37,7 @@ By default, if you ask an AI query immediately after interacting in Agent Mode, * Open the **Conversations menu** (`CMD + Y` on macOS, `CTRL + SHIFT + Y` on Windows/Linux), select a conversation, and then enter your query. * Alternatively, click the pink conversation chip in the input field to resume. -You don't have to wait for the agent to finish before lining up your next prompt. With [prompt queueing](/agent-platform/local-agents/interacting-with-agents/prompt-queueing/), you can queue follow-ups while the agent is still responding and have them send automatically in order. +You don't have to wait for the agent to finish before lining up your next prompt. With [prompt queueing](/agents/local-agents/interacting-with-agents/prompt-queueing/), you can queue follow-ups while the agent is still responding and have them send automatically in order. <figure> ![Continuing an Agent conversation in Classic Input (with indicator)](../../../../../assets/agent-platform/classic-input-follow-up.png) @@ -50,7 +51,7 @@ You don't have to wait for the agent to finish before lining up your next prompt #### Agent tips in the input -While Warp’s agent is thinking and processing your request, Warp may surface short tips with helpful workflows and ways to use Warp. These tips appear under the Warping indicator. +While the Warp Agent is thinking and processing your request, Warp may surface short tips with helpful workflows and ways to use Warp. These tips appear under the Warping indicator. ![Agent tips appearing under the Warping indicator while the agent processes a request.](../../../../../assets/agent-platform/agent-tips.png) @@ -140,6 +141,19 @@ The context window usage indicator is available in agent conversation views. If you switch models during a conversation, the context usage indicator updates only after you send your next message. ::: +### Context window usage breakdown + +To see what is filling the context window, open the conversation usage card and click **View breakdown** in the **Context window used** row. The row expands into a per-segment breakdown, with each segment's share of the window shown as a percentage: + +* **System Prompt** - Warp's instructions to the model, including your [rules](/agents/capabilities/rules/). +* **Tool Definitions** - Descriptions of the tools available to the agent, including any [MCP servers](/agents/capabilities/mcp/). +* **Conversation History** - Previous queries, responses, and tool results in the conversation. +* **Latest Input** - Your most recent query and the context attached to it. +* **Images** - Any [images](/agents/local-agents/agent-context/images-as-context/) attached to the conversation. +* **Other** - Everything not covered by the segments above. + +Use the breakdown to decide what to trim: a large **Conversation History** segment is a good signal to start a new conversation or summarize, while a large **Tool Definitions** segment suggests turning off MCP servers you aren't using. + ## Conversation segmentation Warp automatically detects when your query has shifted to a new topic. When this happens, it suggests starting a new conversation instead of continuing in the same context. @@ -184,7 +198,7 @@ The **Active** dropdown lists conversations where you have sent at least one que * Select a conversation to switch to it immediately. * The conversation you're currently viewing is highlighted. -* Cloud agent conversations and Oz runs always appear in **Active** while they are open. +* Cloud agent conversations and runs always appear in **Active** while they are open. #### Past @@ -206,7 +220,7 @@ By default, your agent conversations are stored locally on your machine. You can * Share conversations with teammates * Retain conversations when you log out or switch machines -For full details on enabling cloud sync, sharing conversations, and accessing cloud agent conversations, see [Cloud-synced Conversations](/agent-platform/local-agents/cloud-conversations/). +For full details on enabling cloud sync, sharing conversations, and accessing cloud agent conversations, see [Cloud-synced Conversations](/agents/local-agents/cloud-conversations/). :::note To enable cloud sync, go to **Settings** > **Privacy** and toggle on **"Store AI conversations in the cloud"**. When disabled, conversations are stored locally only and cannot be shared. Note that cloud agent conversations are always stored in the cloud regardless of this setting. @@ -227,7 +241,7 @@ Starting a new conversation creates a fresh thread in the **Active** dropdown, w ### Navigation behavior -Navigation between [Terminal and Agent modes](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/) is designed to be direct: +Navigation between [Terminal and Agent modes](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) is designed to be direct: * **Clicking an active conversation** - Takes you directly to that conversation view. * **Clicking a past conversation** - Opens the conversation in a **new pane**, preserving your current context. @@ -241,7 +255,7 @@ Navigation between [Terminal and Agent modes](/agent-platform/local-agents/inter ### Ways to move around -Use `esc` or the back button to return to terminal mode, `⌘Y` to open the conversation selector, or `⌘↩` to start a new conversation. For a complete list of keyboard shortcuts and slash commands, see [Terminal and Agent modes - Keyboard shortcuts](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/#keyboard-shortcuts-quick-reference). +Use `esc` or the back button to return to terminal mode, `⌘Y` to open the conversation selector, or `⌘↩` to start a new conversation. For a complete list of keyboard shortcuts and slash commands, see [Terminal and Agent modes - Keyboard shortcuts](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/#keyboard-shortcuts-quick-reference). ### Exit confirmation for in-progress conversations diff --git a/src/content/docs/agent-platform/local-agents/interacting-with-agents/prompt-queueing.mdx b/src/content/docs/agents/local-agents/interacting-with-agents/prompt-queueing.mdx similarity index 94% rename from src/content/docs/agent-platform/local-agents/interacting-with-agents/prompt-queueing.mdx rename to src/content/docs/agents/local-agents/interacting-with-agents/prompt-queueing.mdx index 6dcc56e6c..c903d1b6b 100644 --- a/src/content/docs/agent-platform/local-agents/interacting-with-agents/prompt-queueing.mdx +++ b/src/content/docs/agents/local-agents/interacting-with-agents/prompt-queueing.mdx @@ -84,7 +84,7 @@ When **Interrupt response** is selected, a second dropdown, **Default long-runni ## Queueing during long-running commands -When an agent is driving a long-running command it started (a dev server, REPL, database shell, or other interactive program it launched through [Full Terminal Use](/agent-platform/capabilities/full-terminal-use/)), prompts you submit are queued by default instead of steering the agent mid-command. Warp sends them to the agent automatically when the command finishes. This auto-queueing applies only to commands the agent started; if you start a command yourself and tag the agent in, your prompts keep steering the agent immediately. +When an agent is driving a long-running command it started (a dev server, REPL, database shell, or other interactive program it launched through [Full Terminal Use](/agents/capabilities/full-terminal-use/)), prompts you submit are queued by default instead of steering the agent mid-command. Warp sends them to the agent automatically when the command finishes. This auto-queueing applies only to commands the agent started; if you start a command yourself and tag the agent in, your prompts keep steering the agent immediately. While the agent is in control of the command (including while it's blocked waiting for an approval): @@ -165,7 +165,7 @@ Because cloud conversations keep running after you leave the agent view, their q ## Related pages -* [Slash Commands](/agent-platform/capabilities/slash-commands/) - The full list of built-in commands, including `/queue`. -* [Full Terminal Use](/agent-platform/capabilities/full-terminal-use/) - How agents attach to and drive interactive long-running commands. -* [Terminal and Agent modes](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/) - How input is routed between the terminal and the agent. +* [Slash Commands](/agents/capabilities/slash-commands/) - The full list of built-in commands, including `/queue`. +* [Full Terminal Use](/agents/capabilities/full-terminal-use/) - How agents attach to and drive interactive long-running commands. +* [Terminal and Agent modes](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) - How input is routed between the terminal and the agent. * [Cloud agents overview](/platform/) - Run agents in the cloud from any trigger. diff --git a/src/content/docs/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes.mdx b/src/content/docs/agents/local-agents/interacting-with-agents/terminal-and-agent-modes.mdx similarity index 92% rename from src/content/docs/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes.mdx rename to src/content/docs/agents/local-agents/interacting-with-agents/terminal-and-agent-modes.mdx index dc46ff2f9..87795a795 100644 --- a/src/content/docs/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes.mdx +++ b/src/content/docs/agents/local-agents/interacting-with-agents/terminal-and-agent-modes.mdx @@ -4,9 +4,10 @@ description: >- Warp provides two distinct modes: a clean terminal for commands, and a dedicated conversation view for multi-turn agent workflows. --- +import { VARS } from '@data/vars'; import VideoEmbed from '@components/VideoEmbed.astro'; -Warp provides two distinct modes: a clean terminal for running shell commands, and a dedicated conversation view for multi-turn interactions with Oz, Warp's agent. Terminal mode keeps the interface minimal by default, while Agent Mode surfaces full controls for model selection, voice input, image attachments, and conversation management. +Warp provides two distinct modes: a clean terminal for running shell commands, and a dedicated conversation view for multi-turn interactions with the Warp Agent. Terminal mode keeps the interface minimal by default, while Agent Mode surfaces full controls for model selection, voice input, image attachments, and conversation management. <VideoEmbed url="https://youtu.be/J715YW5VC18" title="Switching between Terminal and Agent modes video" /> @@ -17,7 +18,7 @@ Warp provides two distinct modes: a clean terminal for running shell commands, a Before diving in, here are two key concepts: * **Terminal session** - Your shell environment where you run commands. This is the default mode when you open Warp—a clean, traditional terminal input. -* **Agent conversation** - A multi-turn interaction with Oz. Conversations maintain context across exchanges and have their own dedicated view with richer controls. +* **Agent conversation** - A multi-turn interaction with the {VARS.WARP_AUTOMATION_PLATFORM}. Conversations maintain context across exchanges and have their own dedicated view with richer controls. Terminal and Agent modes make switching between these two contexts seamless while keeping them visually distinct. @@ -92,7 +93,7 @@ Agent conversation views are identified with an alternative background color and The chips and buttons on the agent input toolbelt can be reordered, hidden, or moved between the left and right sides of the input. Right-click the input in an agent conversation and select **Edit agent toolbelt** to open the editor. Your layout persists across app restarts. -Agent Mode-specific items include the model selector, autodetection toggle, Context Usage, and fast forward toggle. Shared items like voice input, file attachment, and context chips appear in both the Agent Mode toolbelt and the [CLI coding agent toolbelt](/agent-platform/cli-agents/overview/#customizing-the-toolbelt). +Agent Mode-specific items include the model selector, autodetection toggle, Context Usage, and fast forward toggle. Shared items like voice input, file attachment, and context chips appear in both the Agent Mode toolbelt and the [CLI coding agent toolbelt](/agents/cli-agents/overview/#customizing-the-toolbelt). **Block origin and visibility** @@ -107,7 +108,7 @@ In agent conversations, context is managed automatically, with optional manual a * **Manual attachment** - You can attach terminal blocks to bring in outputs from outside the conversation. * **Conversation scope** - Agent conversation blocks stay scoped to that conversation, while terminal blocks remain in the terminal block list. -This separation keeps your terminal view clean while preserving full context within each conversation. For shortcuts, pending vs. attached context, and block selection behavior, see [Blocks as Context](/agent-platform/local-agents/agent-context/blocks-as-context/). +This separation keeps your terminal view clean while preserving full context within each conversation. For shortcuts, pending vs. attached context, and block selection behavior, see [Blocks as Context](/agents/local-agents/agent-context/blocks-as-context/). #### Cloud agent conversations @@ -126,13 +127,13 @@ Cloud agent conversations have a few differences from local conversations: * **Credits indicator** - Shows your remaining cloud agent credits * **Different zero state** - The conversation header indicates "New cloud agent conversation" -Cloud agent conversations are always stored in the cloud. For more details on accessing and sharing cloud conversations, see [Cloud-synced Conversations](/agent-platform/local-agents/cloud-conversations/). +Cloud agent conversations are always stored in the cloud. For more details on accessing and sharing cloud conversations, see [Cloud-synced Conversations](/agents/local-agents/cloud-conversations/). **Accessing running or past cloud conversations:** * **From the conversation list panel** - Cloud conversations appear alongside local conversations. Click to open. * **From the management view** - Use the [Agent Management view](/platform/managing-cloud-agents/) to see all cloud agent runs, filter by status, and click any row to open the conversation. -* **From the Oz web app** - Access your cloud agents from the [Oz web app](https://oz.warp.dev) to manage runs from any browser. +* **From the {VARS.WEB_APP}** - Access your cloud agents from the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> to manage runs from any browser. For more on cloud agents, see [Cloud Agents overview](/platform/). @@ -220,17 +221,17 @@ This "quicksend" method is useful for quick, text-only requests when you don't n #### D) Continue from the up-arrow history menu -Press `↑` (up arrow) to open an inline history menu. The menu contents vary by context—see [Navigation behavior](/agent-platform/local-agents/interacting-with-agents/#navigation-behavior) for details on how up-arrow works in terminal view vs. agent view. +Press `↑` (up arrow) to open an inline history menu. The menu contents vary by context—see [Navigation behavior](/agents/local-agents/interacting-with-agents/#navigation-behavior) for details on how up-arrow works in terminal view vs. agent view. #### E) Click an active AI suggestion -When [Active AI Recommendations](/agent-platform/local-agents/active-ai/) is enabled, Warp displays contextual prompt suggestions based on your recent activity. Clicking any of these suggestions opens the agent conversation view and sends that prompt immediately. +When [Active AI Recommendations](/agents/local-agents/active-ai/) is enabled, Warp displays contextual prompt suggestions based on your recent activity. Clicking any of these suggestions opens the agent conversation view and sends that prompt immediately. --- ### Navigating conversations -Warp includes a **Conversation Panel** for browsing and managing your agent conversations. For details on the panel layout, navigation, and conversation storage, see [Agent Conversations](/agent-platform/local-agents/interacting-with-agents/). +Warp includes a **Conversation Panel** for browsing and managing your agent conversations. For details on the panel layout, navigation, and conversation storage, see [Agent Conversations](/agents/local-agents/interacting-with-agents/). ### Using slash commands @@ -238,7 +239,7 @@ Warp includes a **Conversation Panel** for browsing and managing your agent conv ![Slash command menu open inside an agent conversation, showing the full set of commands.](../../../../../assets/agent-platform/slash-commands-agent-modality.png) -While you're in an agent conversation, you can access Warp's [slash commands](/agent-platform/capabilities/slash-commands/) any time by typing `/` in the input. +While you're in an agent conversation, you can access Warp's [slash commands](/agents/capabilities/slash-commands/) any time by typing `/` in the input. * Type `/` to open the command menu * Keep typing to filter commands (for example: `/conversations`, `/compact`) @@ -268,7 +269,7 @@ Slash commands aren't just for agent conversations. You can also type `/` in ter Agent conversations expose the full set of slash commands (including `/fork`, `/compact`, and `/model`). Terminal mode exposes a reduced set focused on quick actions. ::: -For the complete list of available slash commands, see [Slash Commands](/agent-platform/capabilities/slash-commands/). +For the complete list of available slash commands, see [Slash Commands](/agents/capabilities/slash-commands/). ### Forking conversations @@ -296,7 +297,7 @@ Use `/fork from` to choose exactly where in the conversation you want to branch This is helpful when you want to go back to an earlier point and try a different approach. -For more forking methods and use cases, see [Conversation Forking](/agent-platform/local-agents/interacting-with-agents/conversation-forking/). +For more forking methods and use cases, see [Conversation Forking](/agents/local-agents/interacting-with-agents/conversation-forking/). --- diff --git a/src/content/docs/agent-platform/local-agents/interacting-with-agents/voice.mdx b/src/content/docs/agents/local-agents/interacting-with-agents/voice.mdx similarity index 100% rename from src/content/docs/agent-platform/local-agents/interacting-with-agents/voice.mdx rename to src/content/docs/agents/local-agents/interacting-with-agents/voice.mdx diff --git a/src/content/docs/agent-platform/local-agents/interactive-code-review.mdx b/src/content/docs/agents/local-agents/interactive-code-review.mdx similarity index 95% rename from src/content/docs/agent-platform/local-agents/interactive-code-review.mdx rename to src/content/docs/agents/local-agents/interactive-code-review.mdx index 3bec24655..abc8414be 100644 --- a/src/content/docs/agent-platform/local-agents/interactive-code-review.mdx +++ b/src/content/docs/agents/local-agents/interactive-code-review.mdx @@ -29,7 +29,7 @@ Interactive Code Review works with any supported agent running in Warp: * **Warp's native Agent** — the built-in agent in Agent Mode * **Third-party CLI agents** — Claude Code, OpenAI Codex, OpenCode, Amp, Auggie, Copilot CLI, Cursor CLI, Gemini CLI, Droid, and Pi -For the full feature matrix and setup details for each CLI agent, see [Third-party CLI agents](/agent-platform/cli-agents/overview/). +For the full feature matrix and setup details for each CLI agent, see [Third-party CLI agents](/agents/cli-agents/overview/). --- @@ -80,4 +80,4 @@ Once you're comfortable reviewing agent code locally, try running agents in the * **[Cloud Agents quickstart](/platform/quickstart/)** - Run agents on Warp's infrastructure for background tasks like PR review, issue triage, and dependency updates. * **[Attach agent session context to GitHub PRs](/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs/)** - Share the agent's prompt, plan, commands, logs, validation, and reviewer asks with the PR. -* **[Skills](/agent-platform/capabilities/skills/)** - Turn successful agent workflows into reusable, shareable instructions. +* **[Skills](/agents/capabilities/skills/)** - Turn successful agent workflows into reusable, shareable instructions. diff --git a/src/content/docs/agent-platform/local-agents/session-sharing.mdx b/src/content/docs/agents/local-agents/session-sharing.mdx similarity index 57% rename from src/content/docs/agent-platform/local-agents/session-sharing.mdx rename to src/content/docs/agents/local-agents/session-sharing.mdx index 5e2b95c99..ad56b38ea 100644 --- a/src/content/docs/agent-platform/local-agents/session-sharing.mdx +++ b/src/content/docs/agents/local-agents/session-sharing.mdx @@ -4,9 +4,10 @@ description: >- Share live agent sessions so collaborators can view, steer, and interact with agent activity from any device — in real time or asynchronously. --- +import { VARS } from '@data/vars'; import VideoEmbed from '@components/VideoEmbed.astro'; -**Agent Session Sharing** extends Warp's regular [Session Sharing](/knowledge-and-collaboration/session-sharing/) to include full visibility and control over Agent activity. Share any agent session — Oz or third-party — so collaborators can watch progress, review output, and steer the agent from the Warp app, a web browser, or a mobile device. +**Agent Session Sharing** extends Warp's regular [Session Sharing](/knowledge-and-collaboration/session-sharing/) to include full visibility and control over Agent activity. Share any agent session — {VARS.WARP_AUTOMATION_PLATFORM} or third-party — so collaborators can watch progress, review output, and steer the agent from the Warp app, a web browser, or a mobile device. Use Agent Session Sharing when teammates need the execution context behind an agent's work, not just the final answer or code diff. A shared agent session can show the prompt, responses, thinking states, tool use, planning steps, terminal output, and follow-up messages in one reviewable link. @@ -18,7 +19,7 @@ Use Agent Session Sharing when teammates need the execution context behind an ag * **Cross-device access** - Open shared sessions from the Warp app, any web browser, or a mobile device. No install required for web viewers. * **Collaborative editing** - Grant edit access so collaborators can send their own Agent queries, execute commands, and start new conversations * **Multi-viewer support** - Multiple participants can observe and interact with the same session simultaneously, each with their own cursor and avatar -* **Remote Control** - Publish third-party agent sessions to the cloud for persistent, asynchronous monitoring and steering from anywhere. See [Remote Control](/agent-platform/cli-agents/remote-control/). +* **Remote Control** - Publish third-party agent sessions to the cloud for persistent, asynchronous monitoring and steering from anywhere. See [Remote Control](/agents/cli-agents/remote-control/). ## Review agent work with a shared session @@ -33,16 +34,55 @@ Share the link only with collaborators who should be able to see the session con ## How it works -When you share an agent session, Warp publishes it to the cloud and generates a shareable link. The session stays in sync — any new agent output or terminal activity appears for all viewers in real time. The person who shares the session controls who can view and who can interact. +When you share an agent session, Warp uploads the session's scrollback and live output to Warp's servers and generates a shareable link. Session Sharing works through Warp's servers rather than as a direct, peer-to-peer connection between devices, so the session stays in sync — any new agent output or terminal activity appears for all viewers in real time. The person who shares the session controls who can view and who can interact. + +## Data retention and access + +Understanding how long shared data sticks around, how to stop sharing it, and who can see it helps you decide what's safe to share. + +### How long shared data is kept + +Shared session data expires automatically about one week after you create the share. After that, the link can no longer be opened. This matches the message Warp shows when you try to open an expired link: "Sessions expire after one week and cannot be opened." + +### Stopping a share + +Stopping a share immediately ends live access for every participant — no one can continue watching or interacting once you stop it. The share link can no longer be opened after the one-week expiry. There's currently no separate control to delete a single shared session's data before that expiry. + +:::note +Shared [Blocks](/terminal/blocks/block-sharing/) work differently. Unsharing a Block permanently deletes it. Session shares rely on the one-week expiry instead of an immediate-delete action. +::: + +To remove all of your shared session data through account deletion rather than waiting for the shared-session expiry, delete your Warp account and data. Deletion jobs run every 24 hours, so removal is not immediate. See [Delete your account and data](/support-and-community/privacy-and-security/privacy/#delete-your-account-and-data). + +### Who can access a shared session + +Access to a shared session is based on who you grant it to, not just who has the link: + +* **Owner** - You, the person who started the share, control who can view and interact +* **Invited collaborators** - People you explicitly invite to the session +* **Your team** - Optionally, you can extend access to your whole team +* **Anyone with the link** - Available as a setting when you want broader access + +Viewers must sign in to a Warp account to open a shared session. Workspace admins can disable invites and link sharing for the team by policy. Roles determine what a participant can do once they have access — some participants can only view the session, while others can also steer it by sending commands or agent queries. See [Collaboration and steering](#collaboration-and-steering) below. + +### Secrets in shared sessions + +:::caution +[Secret Redaction](/support-and-community/privacy-and-security/secret-redaction/) isn't applied to Session Sharing. Anything visible in a shared session's scrollback, including values that Secret Redaction would otherwise redact elsewhere, is visible to everyone who can access the share. Treat sharing a session like sharing your screen: review what's in the scrollback before you share it. +::: + +### AI and shared sessions + +Sharing a session doesn't, by itself, send its contents to a model. Shared sessions are excluded from Warp Drive's AI indexing, so a shared session's contents aren't made searchable or citable by agents just because it was shared. An agent only sees a shared session's terminal content when someone actually uses an AI feature inside that session — either you, or a collaborator you've granted edit access to. ## Sharing a session 1. Start or open an agent session in Warp. The agent can be Warp's built-in agent, a third-party coding agent, or any interactive agent running in your terminal. 2. Open the share action from any of these entry points: - * **Command Palette** - Search for "Share session" + * **Command Palette** - Search for "Share current session" * **Pane header** - Click the overflow menu in the pane header * **Right-click context menu** - Right-click inside the session pane - * **`/remote-control` chip** - For third-party agent sessions, click the `/remote-control` chip in the agent view footer or the CLI footer to publish and share instantly. See [Remote Control](/agent-platform/cli-agents/remote-control/) for details. + * **`/remote-control` chip** - For third-party agent sessions, click the `/remote-control` chip in the agent view footer or the CLI footer to publish and share instantly. See [Remote Control](/agents/cli-agents/remote-control/) for details. 3. Choose your starting point (full scrollback, no scrollback, or a specific block). 4. Confirm the share. Warp uploads the session to the cloud and generates a shareable link. 5. Copy the link and share it with teammates, or open it on another device. @@ -99,8 +139,10 @@ Multiple participants can join the same session from different machines, browser ## Related pages -* [Remote Control](/agent-platform/cli-agents/remote-control/) -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) +* [Remote Control](/agents/cli-agents/remote-control/) +* [Third-party CLI agents](/agents/cli-agents/overview/) * [Cloud Agent Session Sharing](/platform/viewing-cloud-agent-runs/) * [Attach agent session context to GitHub PRs](/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs/) * [Session Sharing (terminal)](/knowledge-and-collaboration/session-sharing/) +* [Secret Redaction](/support-and-community/privacy-and-security/secret-redaction/) +* [Privacy and data control](/support-and-community/privacy-and-security/privacy/) diff --git a/src/content/docs/changelog/2023.mdx b/src/content/docs/changelog/2023.mdx index 8b5be90b8..7d02695d6 100644 --- a/src/content/docs/changelog/2023.mdx +++ b/src/content/docs/changelog/2023.mdx @@ -169,7 +169,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **Improvements** -* Enhanced user accessibility by adding a tab bar button as a new entry point for the command palette. +* Enhanced user accessibility by adding a tab bar button as a new entry point for the Command Palette. * Improved user guidance by displaying a warning when attempting to run a workflow while another command is already in progress. **Bug fixes** diff --git a/src/content/docs/changelog/2024.mdx b/src/content/docs/changelog/2024.mdx index 469b8e4c2..0cf29ff23 100644 --- a/src/content/docs/changelog/2024.mdx +++ b/src/content/docs/changelog/2024.mdx @@ -115,7 +115,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **Bug fixes** * \[Agent Mode] Single-line code suggestions are no longer hidden behind the horizontal scrollbar. -* Fixed a crash interacting with Env Vars in the command palette. +* Fixed a crash interacting with Env Vars in the Command Palette. ### 2024.11.25 (v0.2024.11.25.16.32) @@ -127,7 +127,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **Bug fixes** * \[Agent Mode] Single-line code suggestions are no longer hidden behind the horizontal scrollbar. -* Fixed a crash interacting with Env Vars in the command palette. +* Fixed a crash interacting with Env Vars in the Command Palette. ### 2024.11.22 (v0.2024.11.22.18.28) @@ -139,7 +139,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **Bug fixes** * \[Agent Mode] Single-line code suggestions are no longer hidden behind the horizontal scrollbar. -* Fixed a crash interacting with Env Vars in the command palette. +* Fixed a crash interacting with Env Vars in the Command Palette. ### 2024.11.26 (v0.2024.11.19.08.02) @@ -155,7 +155,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **Bug fixes** * \[Agent Mode] Single-line code suggestions are no longer hidden behind the horizontal scrollbar. -* Fixed a crash interacting with Env Vars in the command palette. +* Fixed a crash interacting with Env Vars in the Command Palette. * Fixed a bug where `command substitution: ignored null byte in input` would appear as output while using a Bash subshell. ### 2024.11.19 (v0.2024.11.19.08.02) @@ -172,7 +172,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **Bug fixes** * \[Agent Mode] Single-line code suggestions are no longer hidden behind the horizontal scrollbar. -* Fixed a crash interacting with Env Vars in the command palette. +* Fixed a crash interacting with Env Vars in the Command Palette. ### 2024.11.18 (v0.2024.11.18.16.37) diff --git a/src/content/docs/changelog/2025.mdx b/src/content/docs/changelog/2025.mdx index b76dfe370..a87fa2fa0 100644 --- a/src/content/docs/changelog/2025.mdx +++ b/src/content/docs/changelog/2025.mdx @@ -3,6 +3,7 @@ title: "Changelog — 2025" description: >- Warp release notes for 2025. Updates ship weekly, typically on Thursdays. --- +import { VARS } from '@data/vars'; Submit bugs and feature requests on our [GitHub board!](https://github.com/warpdotdev/Warp/issues/new/choose) @@ -18,7 +19,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **Bug fixes** -* Fixed a bug where Oz CLI runs could get stuck trying to run a denylisted command. +* Fixed a bug where {VARS.WARP_AGENT_CLI} runs could get stuck trying to run a denylisted command. ### 2025.12.10 (v0.2025.12.10.08.12) @@ -42,7 +43,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **Improvements** -* The Oz CLI now displays more detailed information when the agent tries to take a prohibited action. +* The {VARS.WARP_AGENT_CLI} now displays more detailed information when the agent tries to take a prohibited action. * Allow dragging file paths from the Project Explorer into active terminal commands like claude code and gemini for referencing files and folders. **Bug fixes** @@ -50,7 +51,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Fixed a bug that could cause unbounded memory growth when using Warpified subshells or the legacy (non-tmux) SSH Warpify implementation. * Fixed a bug that could cause `comm` errors to appear in Warpified subshells. * \[Windows] Fixed keybinding for "find in code editor." This is now `CTRL-SHIFT-F` and configurable from Settings > Keyboard shortcuts. -* Ensured that the Oz CLI is available automatically on macOS. +* Ensured that the {VARS.WARP_AGENT_CLI} is available automatically on macOS. * Fixed toast messages showing "Notebook" instead of "Plan" when taking actions on Plans in Warp Drive. ### 2025.11.19 (v0.2025.11.19.08.12) @@ -65,11 +66,11 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **New features** -* [Full Terminal Use](/agent-platform/capabilities/full-terminal-use/): Let the agent use the terminal as you would: interact with REPLs, debuggers, and full-screen apps like `top`. Warp is the only product on the market with Full Terminal Use capabilities. -* [`/plan`](/agent-platform/capabilities/planning/): do spec-driven development in Warp. Work with an agent to align on an implementation plan that can be saved, versioned, and even attached to a PR for teammates. -* [Interactive Code Review](/agent-platform/local-agents/interactive-code-review/): Review an agent's code like you would a teammate's, directly in Warp, and ask the agent to address the comments. +* [Full Terminal Use](/agents/capabilities/full-terminal-use/): Let the agent use the terminal as you would: interact with REPLs, debuggers, and full-screen apps like `top`. Warp is the only product on the market with Full Terminal Use capabilities. +* [`/plan`](/agents/capabilities/planning/): do spec-driven development in Warp. Work with an agent to align on an implementation plan that can be saved, versioned, and even attached to a PR for teammates. +* [Interactive Code Review](/agents/local-agents/interactive-code-review/): Review an agent's code like you would a teammate's, directly in Warp, and ask the agent to address the comments. * [Slack and Linear integrations](https://docs.warp.dev/platform/integrations):\*\* Ask the agent to get to work from the tools you already use, track their progress, and take the wheel via live session sharing. -* Warp's Agents can now [search the web](/agent-platform/capabilities/web-search/) to retrieve information, when relevant. This capability is configurable via Agent Profiles. +* Warp's Agents can now [search the web](/agents/capabilities/web-search/) to retrieve information, when relevant. This capability is configurable via Agent Profiles. ### 2025.11.12 (v0.2025.11.12.08.12) @@ -100,7 +101,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **Improvements** * Display conversation summaries when summarization is triggered. -* Added completions for the Oz CLI. +* Added completions for the {VARS.WARP_AGENT_CLI}. * Updated community links from Discord to Slack throughout the app. **Bug Fixes** @@ -136,7 +137,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Added confirmation dialog when cancelling AI summarization requests. * You can now expand Suggested Code Diffs further on down arrow. * Restore closed panes using `CMD-SHIFT-T` or `CTRL-ALT-T` on Windows / Linux within 60 seconds of them being closed. -* Added shell completions for the Oz CLI. +* Added shell completions for the {VARS.WARP_AGENT_CLI}. * Warp Drive Environment Variables are now supported for Warp for Windows (PowerShell, Git Bash, and WSL). * Enriched the model picker to include detailed specs of each model's intelligence, speed and cost. @@ -172,7 +173,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **New features** -* You can now create new files directly in Warp. Search "New File" in the command palette. macOS users can find it in the app menu under "File". +* You can now create new files directly in Warp. Search "New File" in the Command Palette. macOS users can find it in the app menu under "File". **Improvements** @@ -266,7 +267,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **New Features** -* [Agent Profiles](/agent-platform/capabilities/agent-profiles-permissions/#agent-profiles): define how your agent operates. +* [Agent Profiles](/agents/capabilities/agent-profiles-permissions/#agent-profiles): define how your agent operates. * New pane to view changes to a Git repository. * Files now open in a tabbed viewer. * Syntax highlighting for Scala files in Warp. @@ -279,7 +280,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **New features** -* [Suggested Code Diffs](/agent-platform/local-agents/active-ai/#suggested-code-diffs) - Warp now intelligently suggests the appropriate fixes for any simple errors encountered in the command line e.g. compiler errors. Head to `Settings > Active AI` to toggle this feature. +* [Suggested Code Diffs](/agents/local-agents/active-ai/#suggested-code-diffs) - Warp now intelligently suggests the appropriate fixes for any simple errors encountered in the command line e.g. compiler errors. Head to `Settings > Active AI` to toggle this feature. **Improvements** @@ -301,9 +302,9 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **New Features** * Agent Mode now displays interactive code blocks when referencing snippets from your codebase. You can easily copy the snippet, add the snippet as Agent Mode context, or open the file in Warp's built-in editor. -* Agent Mode now creates and tracks task lists for more complex workflows. See [Agent Task Lists](/agent-platform/capabilities/task-lists/). -* Added support for defining project-scoped rules with a WARP.md file. See [Rules](/agent-platform/capabilities/rules/#project-rules). -* Added Slash Commands (/) in Agent Mode or Auto-Detection Mode to quickly run built-in actions or saved prompts without leaving the input field. See [Slash Commands](/agent-platform/capabilities/slash-commands/). +* Agent Mode now creates and tracks task lists for more complex workflows. See [Agent Task Lists](/agents/capabilities/task-lists/). +* Added support for defining project-scoped rules with a WARP.md file. See [Rules](/agents/capabilities/rules/#project-rules). +* Added Slash Commands (/) in Agent Mode or Auto-Detection Mode to quickly run built-in actions or saved prompts without leaving the input field. See [Slash Commands](/agents/capabilities/slash-commands/). **Improvements** @@ -532,7 +533,7 @@ All of this comes with higher AI usage limits on our Pro and Turbo plans, plus n **New Features** -* Added MCP server support. It's now possible to extend Agent Mode's capabilities using programs that support the [Model Context Protocol](/agent-platform/capabilities/mcp/). +* Added MCP server support. It's now possible to extend Agent Mode's capabilities using programs that support the [Model Context Protocol](/agents/capabilities/mcp/). ### 2025.05.21 (v0.2025.05.21.08.11) @@ -603,7 +604,7 @@ All of this comes with higher AI usage limits on our Pro and Turbo plans, plus n * Restored Agent Mode conversations can now be continued. * Agent Mode now has access to a filepath search tool for coding tasks. * Improved the reliability and positioning of suggestion dialogs for rules and Agent Mode workflows. -* We reworked the command palette search to make it more useful. +* We reworked the Command Palette search to make it more useful. **Bug Fixes** @@ -727,7 +728,7 @@ All of this comes with higher AI usage limits on our Pro and Turbo plans, plus n * Control whether Warp starts at login via a setting under Settings > Features > Start Warp at login (macOS only). * \[Windows] Fixed an issue where dynamic enums commands weren't being executed. * Fixed a bug with the mouse cursor when hovering over buttons. -* Fixed a bug that causes high CPU load with codebase context. +* Fixed a bug that causes high CPU load with Codebase Context. ### 2025.03.05 (v0.2025.03.05.08.02) @@ -759,11 +760,11 @@ All of this comes with higher AI usage limits on our Pro and Turbo plans, plus n **New features** -* Warp is now available for Windows! See our [Quickstart Guide](/getting-started/quickstart/installation-and-setup/#windows) -* Prompt, plan, and execute fully autonomous tasks from [Agent Mode with Dispatch](/agent-platform/local-agents/interacting-with-agents/) (Beta) -* Add codebase context support to Agent Mode. Currently enabled for Git repositories only. +* Warp is now available for Windows! See our [Quickstart Guide](/getting-started/quickstart/installation-and-setup/#install-warp) +* Prompt, plan, and execute fully autonomous tasks from [Agent Mode with Dispatch](/agents/local-agents/interacting-with-agents/) (Beta) +* Add Codebase Context support to Agent Mode. Currently enabled for Git repositories only. * \[macOS] You can now customize your [App Icon](https://docs.warp.dev/terminal/appearance/app-icons) in `Settings > Appearance > Icon`. -* Create and store [Rules](/agent-platform/capabilities/rules/) to use as Agent Mode context. +* Create and store [Rules](/agents/capabilities/rules/) to use as Agent Mode context. * Show default suggestions in Agent Mode input. **Bug fixes** diff --git a/src/content/docs/changelog/2026.mdx b/src/content/docs/changelog/2026.mdx index e0637b28a..f287fcd51 100644 --- a/src/content/docs/changelog/2026.mdx +++ b/src/content/docs/changelog/2026.mdx @@ -6,6 +6,184 @@ description: >- Submit bugs and feature requests on our [GitHub board!](https://github.com/warpdotdev/Warp/issues/new/choose) +### 2026.08.19 (v0.2026.08.19.08.15) + +**New features** + +* Warp Factories is now live in Early Access! Read the [Warp Factories launch announcement](https://www.warp.dev/blog/open-infrastructure-for-building-a-software-factory) for more details. +* Added an inline `/usage` command to the Warp Agent CLI showing plan, credit usage, and billing links. ([#14968](https://github.com/warpdotdev/warp/pull/14968)) + +**Bug fixes** + +* Fixed an unbounded memory leak in the terminal completions engine where large or unusual input (e.g. pasting a large blob of text) could permanently grow memory usage over a session. ([#15181](https://github.com/warpdotdev/warp/pull/15181)) +* Fixed a font-fallback bug on web that made the ⇧ (Shift) key glyph in keyboard shortcut hints render heavier, larger, and misaligned compared to neighboring ⌘/⌥ glyphs. ([#15261](https://github.com/warpdotdev/warp/pull/15261)) +* Removed a stray 1px border around the workspace on Warp Web that could get clipped by rounded browser corners. ([#15259](https://github.com/warpdotdev/warp/pull/15259)) + +**Oz updates** + +* Fixed intermittent “MCP server not found” errors after a cloud agent sandbox is rebuilt mid-task. + +### 2026.08.18 (v0.2026.08.18.02.52) + +**New features** + +* Warp Factories is now live in Early Access! Read the [Warp Factories announcement](https://www.warp.dev/blog/open-infrastructure-for-building-a-software-factory). +* Warp now includes a built-in Factory MCP server for logged-in users. + +**Improvements** + +* Added completions for `mpv` and `ruff`, and refreshed `deno` completions. ([#15248](https://github.com/warpdotdev/warp/pull/15248)) +* Teamless users in a native workspace now see an Admin Panel link and joinable teams on the Teams settings page instead of team creation. ([#15246](https://github.com/warpdotdev/warp/pull/15246)) +* `oz agent run-cloud` now accepts `--title` and `--parent-run-id`, so third-party harnesses can set a run's title and orchestration lineage. ([#15187](https://github.com/warpdotdev/warp/pull/15187)) +* The agent run details panel now has a copy button on the Initial query field, matching the Error and Environment details fields. ([#15156](https://github.com/warpdotdev/warp/pull/15156)) +* Workspace admins can now manage team membership (promote/demote/remove) on their current team, and show a "Workspace admin"/"Workspace owner" badge in the team members list. ([#15123](https://github.com/warpdotdev/warp/pull/15123)) +* Cloud agent sandboxes now default to a `Warp` git identity instead of `Oz` when the server doesn't return a resolved GitHub identity. ([#15110](https://github.com/warpdotdev/warp/pull/15110)) +* Added completions for `yay` and `paru`, and `kubectl --user` value completions. ([#15109](https://github.com/warpdotdev/warp/pull/15109)) +* Added completions for `ip` — address, link, route, neighbour, netns, rule, tunnel, xfrm, monitor, and the remaining subcommands — plus `git read-tree`. ([#15101](https://github.com/warpdotdev/warp/pull/15101)) +* Vim keybindings now work in several more multi-line editors (commit messages, suggested-rule content, env var commands, compact AI inputs, queued-prompt editing, workflow dynamic enums) when vim mode is enabled. ([#15054](https://github.com/warpdotdev/warp/pull/15054)) +* Vim keybindings now work in the rule editor when vim mode is enabled. ([#15044](https://github.com/warpdotdev/warp/pull/15044)) +* The File explorer chip can now be added to Warp Agent's input toolbelt via Edit agent toolbelt. ([#15007](https://github.com/warpdotdev/warp/pull/15007)) + +**Bug fixes** + +* Fixed a memory leak where repeatedly re-parsing and deep-cloning `.gitignore` matchers during file-tree watcher updates could allocate an unbounded number of regex caches in large repositories. ([#15240](https://github.com/warpdotdev/warp/pull/15240)) +* Fixed billing copy that described add-on credit purchases as going to your personal balance instead of the team's shared pool. ([#15207](https://github.com/warpdotdev/warp/pull/15207)) +* Fixed the client failing to load a cloud agent task list that included an orchestration-sourced task. ([#15164](https://github.com/warpdotdev/warp/pull/15164)) +* Fixed `paru` completions to match the real v2.1.0 CLI (options, operations, and argument types). ([#15159](https://github.com/warpdotdev/warp/pull/15159)) +* Fixed excessive memory growth where a burst of repository-indexing updates could spawn many concurrent background tasks re-reading project rule files (WARP.md/AGENTS.md). ([#15147](https://github.com/warpdotdev/warp/pull/15147)) +* Fixed a runaway loop of duplicate network requests that could fire while viewing a completed cloud agent conversation. ([#15138](https://github.com/warpdotdev/warp/pull/15138)) +* Fixed the Teams settings page showing an invite-by-link option for Private and Hidden teams, which don't support it. ([#15129](https://github.com/warpdotdev/warp/pull/15129)) +* Fixed the Teams settings page showing another team's pending email invites in a multi-team workspace. ([#15121](https://github.com/warpdotdev/warp/pull/15121)) +* Fixed zsh sessions occasionally echoing Warp's own shell-integration bootstrap script into the terminal when `cursor_mode`/prezto's `init.zsh` was loaded. ([#15118](https://github.com/warpdotdev/warp/pull/15118)) +* Fixed the Teams settings page's "Open admin panel" link sending workspace admins to the team admin page instead of the workspace admin panel. ([#15113](https://github.com/warpdotdev/warp/pull/15113)) +* Fixed `kubectl` completions ignoring a `--context`, `--cluster`, or `--user` flag on the command line; `kubecolor`/`oc` now complete those flags too, and `nx run` completions were fixed. ([#15109](https://github.com/warpdotdev/warp/pull/15109)) +* Fixed `ip nexthop` filter completions suggesting protocol names that iproute2 rejects, and completed the `ip rule`/`ip mrule` flush selector sets. ([#15102](https://github.com/warpdotdev/warp/pull/15102)) +* Fixed `ip` completions not appearing for iproute2's bare keyword arguments, along with missing `ip addr`/`ip a`/`ip neighbor` aliases. ([#15101](https://github.com/warpdotdev/warp/pull/15101)) +* Fixed missing product logos for MCP servers with decorated titles (e.g. "Sentry (OAuth)") in MCP settings. ([#15037](https://github.com/warpdotdev/warp/pull/15037)) +* Cancelling a conversation while an orchestration tool call was still streaming left the card stuck on "Configuring agents…"; it now shows a cancelled state. ([#14972](https://github.com/warpdotdev/warp/pull/14972)) +* Fixed an issue where removing a team member from **Settings** > **Teams** would fail silently with no error shown if the removal was rejected by the server. ([#14964](https://github.com/warpdotdev/warp/pull/14964)) +* [Windows] Stopped enumerating the full process table with per-process CPU sampling on every terminal session, which could cause DPC_WATCHDOG_VIOLATION / high CPU on machines with many cores. ([#13405](https://github.com/warpdotdev/warp/pull/13405)) — [@npapano42](https://github.com/npapano42) ✨ +* Fixed excessive memory usage when opening code review in a repository with large untracked directories (e.g. `node_modules`). ([#13393](https://github.com/warpdotdev/warp/pull/13393)) +* Fixed a performance issue where every file-tree change deep-cloned compiled `.gitignore` matchers in large repositories. ([#13290](https://github.com/warpdotdev/warp/pull/13290)) + +### 2026.08.13 (v0.2026.08.12.21.54) + +**Improvements** + +* Added a customizable action to cycle the active tab color from a keybinding or the Command Palette. ([#14329](https://github.com/warpdotdev/warp/pull/14329)) — [@rasitakyol](https://github.com/rasitakyol) ✨ +* Cloud agent run details now show the platform the run executes on, with a macOS or Linux icon alongside the architecture and runner. ([#14790](https://github.com/warpdotdev/warp/pull/14790)) +* Added completions for `vagrant`, including its nested `box`, `cloud`, `plugin`, and `snapshot` command groups plus dynamic machine and box names. ([#14775](https://github.com/warpdotdev/warp/pull/14775)) +* Added `openssl` command-line completions. ([#14771](https://github.com/warpdotdev/warp/pull/14771)) +* Added inline command completions for the Yandex Cloud CLI (`yc`) and git worktree name suggestions. ([#14767](https://github.com/warpdotdev/warp/pull/14767)) +* Tab autocomplete now follows symlinks to directories in remote/SSH sessions. ([#14746](https://github.com/warpdotdev/warp/pull/14746)) +* Added completions for `journalctl`, including units, boots, journal fields, and syslog identifiers. ([#14742](https://github.com/warpdotdev/warp/pull/14742)) + +**Bug fixes** + +* Fixed a crash in the AI `@` context menu when a workflow's content included multi-byte characters (emoji, CJK, accented Latin) near the preview truncation boundary. ([#14933](https://github.com/warpdotdev/warp/pull/14933)) +* Fixed the MCP tool-call JSON viewer's key/chevron being vertically centered against a tall expanded multi-line string value instead of aligned to its top. ([#14949](https://github.com/warpdotdev/warp/pull/14949)) +* Fixed long-running commands in Warp Agent CLI not accepting keyboard input. ([#14943](https://github.com/warpdotdev/warp/pull/14943)) +* Fixed an issue where an AI response could fail to render entirely if it included a citation of an unrecognized type. ([#14915](https://github.com/warpdotdev/warp/pull/14915)) +* Fixed the code review pane failing to load file content for renamed files with uncommitted changes. ([#14655](https://github.com/warpdotdev/warp/pull/14655)) +* Fixed inactive agent toolbelts continuing to run hidden context chip commands. ([#14854](https://github.com/warpdotdev/warp/pull/14854)) +* Fixed canceled background commands leaving wrapped child processes running. ([#14853](https://github.com/warpdotdev/warp/pull/14853)) +* Prevent stale shared-session links and QR codes from being exposed while a new session is pending. ([#13813](https://github.com/warpdotdev/warp/pull/13813)) — [@rasitakyol](https://github.com/rasitakyol) ✨ +* Fixed combining marks rendering at the wrong position on Linux and Windows. ([#14322](https://github.com/warpdotdev/warp/pull/14322)) — [@SS-Script](https://github.com/SS-Script) ✨ +* Fixed the Find in File field becoming unclickable after pressing Enter in Vim mode. ([#14836](https://github.com/warpdotdev/warp/pull/14836)) +* Fixed background orchestrated agents stealing input focus in Warp Agent CLI when they need user interaction. ([#14829](https://github.com/warpdotdev/warp/pull/14829)) +* Fixed the environment selector showing "New Environment" for agent runs without an environment. ([#14837](https://github.com/warpdotdev/warp/pull/14837)) +* Fixed excessive Git process creation when loading global skills. ([#14830](https://github.com/warpdotdev/warp/pull/14830)) +* Fixed window corners being rounded in fullscreen. ([#14109](https://github.com/warpdotdev/warp/pull/14109)) — [@s1ckoleg](https://github.com/s1ckoleg) ✨ +* Cmd-Up in Agent Mode now navigates user prompts and skips agent-run commands. ([#14685](https://github.com/warpdotdev/warp/pull/14685)) +* macOS Option-click on Warp's green traffic-light button now performs zoom instead of entering fullscreen. ([#14716](https://github.com/warpdotdev/warp/pull/14716)) +* Fixed the dedicated hotkey (Quake mode) window not taking keyboard focus when opened on a different monitor than the main Warp window. ([#14726](https://github.com/warpdotdev/warp/pull/14726)) +* `pkill <TAB>` now suggests running process names instead of filesystem paths. ([#14749](https://github.com/warpdotdev/warp/pull/14749)) +* Fixed Warp Agent CLI Tab completions missing desktop completion sources and supported native-shell fallback. ([#14600](https://github.com/warpdotdev/warp/pull/14600)) +* Fixed pasting rich text dropping numeric CSS font weights. ([#14512](https://github.com/warpdotdev/warp/pull/14512)) — [@fbartho](https://github.com/fbartho) ✨ +* Fixed the Warp Agent CLI input occasionally rendering without a cursor after temporary interactions. ([#14747](https://github.com/warpdotdev/warp/pull/14747)) +* Fixed the Warp Agent CLI model picker changing the default model for every session. ([#14737](https://github.com/warpdotdev/warp/pull/14737)) +* Fixed the copy-link menu action doing nothing while a cloud agent session was still setting up. ([#14431](https://github.com/warpdotdev/warp/pull/14431)) +* Running Oz from the command line on macOS no longer puts a bouncing Warp icon in the Dock. ([#14636](https://github.com/warpdotdev/warp/pull/14636)) + +**Oz updates** + +* Fixed background subagent sessions stealing focus from the visible Warp Agent CLI input. ([#14961](https://github.com/warpdotdev/warp/pull/14961)) +* Renamed the Oz agent UI to Warp Agent across the app and CLI. ([#11022](https://github.com/warpdotdev/warp/pull/11022)) +* Fixed keyboard input for long-running commands. ([#14943](https://github.com/warpdotdev/warp/pull/14943)) +* Homebrew installations now show the correct `brew upgrade` command when an update is available. ([#14899](https://github.com/warpdotdev/warp/pull/14899)) +* The Warp Agent CLI's Agents bar now mirrors the GUI's multi-level orchestration: drill into an orchestrating child's level, follow breadcrumbs back up, and see subtree rollup badges. ([#14884](https://github.com/warpdotdev/warp/pull/14884)) +* Background orchestrated agents no longer take focus away from the session you are using. ([#14829](https://github.com/warpdotdev/warp/pull/14829)) +* Fixed excessive Git process creation when loading global skills. ([#14830](https://github.com/warpdotdev/warp/pull/14830)) +* Add a `/connect-grok` TUI slash command that jumps straight into connecting your Grok (X Premium / SuperGrok) account. ([#14759](https://github.com/warpdotdev/warp/pull/14759)) +* Fixed occasional transcript jitter while Agent Mode responses stream in Warp Agent CLI. ([#14750](https://github.com/warpdotdev/warp/pull/14750)) +* Shell Tab completions now share desktop ordering and native fallback behavior. ([#14600](https://github.com/warpdotdev/warp/pull/14600)) +* Fixed the input occasionally rendering without a cursor after temporary interactions. ([#14747](https://github.com/warpdotdev/warp/pull/14747)) +* Model selection now applies only to the current session and identifies the profile default. ([#14737](https://github.com/warpdotdev/warp/pull/14737)) +* Code blocks no longer include box borders, making code easier to select and copy. ([#14738](https://github.com/warpdotdev/warp/pull/14738)) +* Failed cloud agent runs now stay open and attachable for debugging instead of becoming unreachable. ([#14561](https://github.com/warpdotdev/warp/pull/14561)) +* Child agents can now be launched with repository-qualified skill references instead of absolute paths. ([#14271](https://github.com/warpdotdev/warp/pull/14271)) +* Running Oz from the command line on macOS no longer puts a bouncing Warp icon in the Dock. ([#14636](https://github.com/warpdotdev/warp/pull/14636)) + +### 2026.08.07 (v0.2026.08.05.09.03) + +**Improvements** + +* Support `SKILLS_DIRS` env var in agent-driver mode to index extra skill directories at personal-skill precedence ([#14394](https://github.com/warpdotdev/warp/pull/14394)) + +**Bug fixes** + +* Onboarding no longer shows the smallest AI credit pack as selected when the "Buy AI credits" option isn't the one chosen. ([#14712](https://github.com/warpdotdev/warp/pull/14712)) +* The vertical tab layout now shows the synced-inputs indicator on tabs with Synchronized Inputs enabled. ([#14697](https://github.com/warpdotdev/warp/pull/14697)) +* Fixed a crash that could happen when typing immediately after a CLI agent session ended with completions-while-typing enabled. ([#14709](https://github.com/warpdotdev/warp/pull/14709)) +* The tab bar background now matches the terminal background instead of rendering as a lighter strip. ([#14701](https://github.com/warpdotdev/warp/pull/14701)) +* Opening a file from an agent conversation's code-block preview now jumps to the first line of the shown range instead of the top of the file. ([#14702](https://github.com/warpdotdev/warp/pull/14702)) +* Fixed Cmd and Option shortcuts for Backspace, Delete, and arrow keys being dropped in apps using the Kitty keyboard protocol. ([#14012](https://github.com/warpdotdev/warp/pull/14012)) — [@FreddieMcHeart](https://github.com/FreddieMcHeart) ✨ + +**Oz updates** + +* Fixed background (window-scoped) computer use on Linux dropping the mouse button between actions, which broke drag gestures like text selection. ([#14686](https://github.com/warpdotdev/warp/pull/14686)) +* Computer-use video recordings now render a smooth synthetic cursor that glides between actions and tracks drags continuously, consistently across window- and screen-scoped captures. ([#14681](https://github.com/warpdotdev/warp/pull/14681)) + +### 2026.07.31 (v0.2026.07.29.09.05) + +**Improvements** + +* Custom model endpoints can now select an OpenAI Chat Completions, OpenAI Responses, or Anthropic Messages schema. ([#13938](https://github.com/warpdotdev/warp/pull/13938)) +* Third-party agent harnesses can now report non-PR work products back to Warp. ([#14072](https://github.com/warpdotdev/warp/pull/14072)) +* `gcloud` is now signed in automatically during GCP provider setup for cloud agents. ([#14132](https://github.com/warpdotdev/warp/pull/14132)) +* Computer-use recording overlays now stay on screen long enough to read after recordings are trimmed to action segments. ([#14148](https://github.com/warpdotdev/warp/pull/14148)) +* Managed secrets are now validated against the 128 KB environment variable limit before an agent run starts. ([#14219](https://github.com/warpdotdev/warp/pull/14219)) +* The `oz` CLI can now set a named agent's prompt when creating or updating agents. ([#14261](https://github.com/warpdotdev/warp/pull/14261)) +* Added Vim `<` and `>` indent and dedent operators to the code editor. ([#14268](https://github.com/warpdotdev/warp/pull/14268)) +* Code-block file references now open in your configured editor, with a Warp fallback. ([#14275](https://github.com/warpdotdev/warp/pull/14275)) +* Logging out now also signs out of Warp web and avoids immediate re-authorization. ([#14284](https://github.com/warpdotdev/warp/pull/14284)) +* MCP tool confirmations now show which tool is running and which server it came from. ([#14298](https://github.com/warpdotdev/warp/pull/14298)) +* Replace Oz armadillo icon with theme-adaptive Warp "W" logo (Icon::Agent) app-wide across all agent/Oz interactive surfaces. ([#14344](https://github.com/warpdotdev/warp/pull/14344)) +* Agent execution profiles can now be configured from settings files for all users. ([#14418](https://github.com/warpdotdev/warp/pull/14418)) + +**Bug fixes** + +* Updated a bundled dependency to resolve CVE-2026-50185. ([#13357](https://github.com/warpdotdev/warp/pull/13357)) +* Fixed the cloud agent Execution host dropdown not appearing when self-hosted workers were connected. ([#13875](https://github.com/warpdotdev/warp/pull/13875)) +* Markdown content no longer renders HTML comments as visible text. ([#14009](https://github.com/warpdotdev/warp/pull/14009)) — [@maxmilian](https://github.com/maxmilian) ✨ +* Cap and expand the shared desktop toast stack to keep error floods bounded and readable. ([#14028](https://github.com/warpdotdev/warp/pull/14028)) +* Settings search now filters widgets on AI and Code subpages correctly — only matching widgets are shown instead of all widgets on the subpage. ([#14116](https://github.com/warpdotdev/warp/pull/14116)) +* Fixed the Runner dropdown missing from the agent orchestration approval card. ([#14133](https://github.com/warpdotdev/warp/pull/14133)) +* Remove shell selection from warpctrl tab/window create so local control cannot spawn caller-chosen shell binaries. ([#14158](https://github.com/warpdotdev/warp/pull/14158)) +* Fixed misaligned zsh prompts caused by explicit-width prompt constructs. ([#14166](https://github.com/warpdotdev/warp/pull/14166)) +* Report accurate video recording durations after post-processing. ([#14172](https://github.com/warpdotdev/warp/pull/14172)) +* Fixed Vim `d%`, `c%`, and `y%` being no-ops in the code editor. ([#14176](https://github.com/warpdotdev/warp/pull/14176)) +* Fixed click and drag annotations in computer-use recordings being offset or split across calls. ([#14191](https://github.com/warpdotdev/warp/pull/14191)) +* Open recording artifacts in the authenticated viewer using the client-built Oz run URL. ([#14210](https://github.com/warpdotdev/warp/pull/14210)) +* Warp now reports a server outage instead of blaming your model ID when the agent model list is unavailable. ([#14227](https://github.com/warpdotdev/warp/pull/14227)) +* Fixed New Worktree tab configs breaking when the repository path contained spaces. ([#14296](https://github.com/warpdotdev/warp/pull/14296)) +* Order the authenticated user's team first in freshly fetched multi-team workspace metadata. ([#14301](https://github.com/warpdotdev/warp/pull/14301)) +* Fixed voice input submitting partial transcriptions to Hermes. ([#14367](https://github.com/warpdotdev/warp/pull/14367)) + +**Oz updates** + +* The `oz` CLI now accepts harness-specific model IDs with `--harness claude` and `--harness codex`. ([#14011](https://github.com/warpdotdev/warp/pull/14011)) + ### 2026.07.23 (v0.2026.07.22.09.01) **New features** @@ -33,7 +211,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Added agent_identity_uid support for remote child agent execution in orchestration. ([#13773](https://github.com/warpdotdev/warp/pull/13773)) * Added Ctrl+P to expand and collapse inline plans in the TUI. ([#13781](https://github.com/warpdotdev/warp/pull/13781)) * Pressing Left on an empty Warp TUI input now opens the conversation list. ([#13797](https://github.com/warpdotdev/warp/pull/13797)) -* Excluded directories from the files command palette filter so files are not crowded out. ([#13801](https://github.com/warpdotdev/warp/pull/13801)) +* Excluded directories from the files Command Palette filter so files are not crowded out. ([#13801](https://github.com/warpdotdev/warp/pull/13801)) * Added natural language detection to the headless TUI input, with Agent-biased mode switching and automatic Shell command detection. ([#13826](https://github.com/warpdotdev/warp/pull/13826)) * Added up-arrow prompt history navigation to the Warp TUI. ([#13827](https://github.com/warpdotdev/warp/pull/13827)) * Warp's TUI can now answer interactive agent questions, including multiple-choice and custom responses. ([#13830](https://github.com/warpdotdev/warp/pull/13830)) @@ -121,7 +299,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Highlighted the currently selected period in the Billing & Usage dropdown. ([#13551](https://github.com/warpdotdev/warp/pull/13551)) * Added a Copy action to the locked initial queued prompt in cloud mode. ([#13595](https://github.com/warpdotdev/warp/pull/13595)) * Suppressed passive suggestions for cloud-agent session viewers. ([#13565](https://github.com/warpdotdev/warp/pull/13565)) -* Added a 'Copy current path' command palette action. ([#13148](https://github.com/warpdotdev/warp/pull/13148)) — [@elviskahoro](https://github.com/elviskahoro) ✨ +* Added a 'Copy current path' Command Palette action. ([#13148](https://github.com/warpdotdev/warp/pull/13148)) — [@elviskahoro](https://github.com/elviskahoro) ✨ * Added Resend and Sentry product icons to the MCP gallery. ([#13450](https://github.com/warpdotdev/warp/pull/13450)) * Matched MCP Servers search field sizing to standard search fields. ([#13536](https://github.com/warpdotdev/warp/pull/13536)) * Replaced the `/pr-comments` slash command with the bundled PR Comments skill. ([#13621](https://github.com/warpdotdev/warp/pull/13621)) @@ -161,7 +339,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Cross-window tab dragging has been re-enabled on macOS and Windows. ([#13411](https://github.com/warpdotdev/warp/pull/13411)) * "Copy file path" is now available from the file viewer pane right-click menu. ([#13145](https://github.com/warpdotdev/warp/pull/13145)) — [@elviskahoro](https://github.com/elviskahoro) ✨ * Made custom inference model lists scrollable. ([#12647](https://github.com/warpdotdev/warp/pull/12647)) -* Added a command palette action to write a heap profile to disk. ([#13107](https://github.com/warpdotdev/warp/pull/13107)) — [@AndreKalberer](https://github.com/AndreKalberer) ✨ +* Added a Command Palette action to write a heap profile to disk. ([#13107](https://github.com/warpdotdev/warp/pull/13107)) — [@AndreKalberer](https://github.com/AndreKalberer) ✨ **Bug fixes** @@ -213,7 +391,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Add a Copy as Markdown action to AI planning document menus. ([#13082](https://github.com/warpdotdev/warp/pull/13082)) — [@SkyNotSilent](https://github.com/SkyNotSilent) ✨ * Artifact download notifications now include links to open the file or its location. ([#13096](https://github.com/warpdotdev/warp/pull/13096)) * The agent context window indicator now shows how much context remains instead of how much is used. ([#13097](https://github.com/warpdotdev/warp/pull/13097)) -* Clearer command palette labels for installing/uninstalling the Oz and Warp Control CLIs (they now describe global, outside-Warp use vs. in-Warp use). ([#13155](https://github.com/warpdotdev/warp/pull/13155)) +* Clearer Command Palette labels for installing/uninstalling the Oz and Warp Control CLIs (they now describe global, outside-Warp use vs. in-Warp use). ([#13155](https://github.com/warpdotdev/warp/pull/13155)) * The Billing & Usage legend no longer lists credit buckets that have zero credits. ([#13181](https://github.com/warpdotdev/warp/pull/13181)) * Added `warp://settings` deep links - open settings, pre-fill the search bar with `?q=`, or jump to a specific setting with `?widget=`. ([#13232](https://github.com/warpdotdev/warp/pull/13232)) @@ -454,7 +632,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Cloud environment creation modal now auto-focuses the name field for quicker setup ([#11233](https://github.com/warpdotdev/warp/pull/11233)) * Authentication secrets for agent orchestration can now be deleted directly from the selector menu ([#11241](https://github.com/warpdotdev/warp/pull/11241)) * Conversation usage breakdown now surfaces inference vs. platform credit split ([#11441](https://github.com/warpdotdev/warp/pull/11441)) -* Added command palette entries for toggle settings that were missing across Appearance, Features, Code, Privacy, AI, and other settings pages ([#11512](https://github.com/warpdotdev/warp/pull/11512)) +* Added Command Palette entries for toggle settings that were missing across Appearance, Features, Code, Privacy, AI, and other settings pages ([#11512](https://github.com/warpdotdev/warp/pull/11512)) * Cloud agent setup mode now uses the improved queued prompt UI ([#11547](https://github.com/warpdotdev/warp/pull/11547)) * Cloud agent sessions can now be started without an initial prompt ([#11573](https://github.com/warpdotdev/warp/pull/11573)) * Updated `/compact-and` and `/fork-and-compact` commands to use the new queued prompts UI ([#11575](https://github.com/warpdotdev/warp/pull/11575)) @@ -509,7 +687,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Fixed the Accept button staying enabled in the multi-agent run card when "New API key" was selected in the harness API key picker without a key being created. ([#11904](https://github.com/warpdotdev/warp/pull/11904)) * Fixed billing usage display showing incorrect per-user base credit limits ([#11910](https://github.com/warpdotdev/warp/pull/11910)) * Fixed apply-diff/edit-file sending full file contents instead of only changed ranges after accepting edits ([#11987](https://github.com/warpdotdev/warp/pull/11987)) -* Fixed duplicate command palette entries for mouse reporting. ([#12011](https://github.com/warpdotdev/warp/pull/12011)) +* Fixed duplicate Command Palette entries for mouse reporting. ([#12011](https://github.com/warpdotdev/warp/pull/12011)) * Fixed project skill refreshes causing UI stalls when unrelated files change in large repositories. ([#12040](https://github.com/warpdotdev/warp/pull/12040)) * Fixed the orchestration pill bar's scrollbar overlapping the agent chips. ([#12045](https://github.com/warpdotdev/warp/pull/12045)) * Fixed a crash when trying to use the microphone on macOS ([#12074](https://github.com/warpdotdev/warp/pull/12074)) @@ -680,7 +858,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Added 'Reveal in Finder' option to the code pane overflow menu ([#10334](https://github.com/warpdotdev/warp/pull/10334)) — @wzc520pyfm ✨ * Agent Mode can now help you remap Warp keyboard shortcuts — ask it to change a shortcut and it will edit your keybindings.yaml for you. ([#9415](https://github.com/warpdotdev/warp/pull/9415)) — @sebryu ✨ * Agent Mode project rules are now re-indexed on app startup ([#10377](https://github.com/warpdotdev/warp/pull/10377)) -* Performance improvement for opening the command palette when in a project with a lot of files. ([#10332](https://github.com/warpdotdev/warp/pull/10332)) +* Performance improvement for opening the Command Palette when in a project with a lot of files. ([#10332](https://github.com/warpdotdev/warp/pull/10332)) * Context window size is now configurable for custom model endpoints ([#10386](https://github.com/warpdotdev/warp/pull/10386)) * Added 'Cycle Most Recent Tab' as a third Ctrl+Tab behavior option in Settings ([#9658](https://github.com/warpdotdev/warp/pull/9658)) — @Akeuuh ✨ * Rename Pane is now reachable from Settings → Keyboard shortcuts as a remappable binding (`workspace:rename_active_pane`), in addition to the existing right-click context menu. Thanks @lonexreb! ([#9712](https://github.com/warpdotdev/warp/pull/9712)) — @lonexreb ✨ @@ -863,7 +1041,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Add setting to disable suggested rules. * Added a `/feedback` slash command for submitting feedback about Warp. * The `oz run get` and `oz run list` commands now support JSON output, along with filtering via the `--jq` flag. -* Feedback from the user menu, Help menu, Resource Center footer, and command palette now opens the `/feedback` flow. +* Feedback from the user menu, Help menu, Resource Center footer, and Command Palette now opens the `/feedback` flow. * Middle-clicking a vertical tab now closes it, matching horizontal tabs. * Slash commands in the terminal are now available even when AI is disabled. * The network log viewer now opens as an in-app read-only pane backed by a 50-item in-memory buffer instead of writing `warp_network.log` to disk. @@ -1014,7 +1192,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Added `warp://settings/appearance` deep link to open Appearance settings directly. * Improved AI @context menu to prioritize blocks from the active terminal session and rank items by recency. * Added support for rendering markdown tables in notebooks and Warp's built-in Markdown viewer. -* The command palette file opener now supports `~` (tilde) expansion to the home directory when searching for files. +* The Command Palette file opener now supports `~` (tilde) expansion to the home directory when searching for files. * Added completions for `timedatectl`, `ack`, `watch`, `lsof`, `systemctl`, `ros2`, `nextflow`, `tsh`, `codex`, `asdf`, `sdk`, `pass`, `az`, `oc`, `scp`, `claude`, `git show`, `git rm`, `gsutil`, `aws ec2`, `docker-compose`, `yarn`, and `docker run`. * Improved dynamic completions for `git switch`, `git diff`, `gt`, `kubectl`, `tf`, `pnpm`, `apt` and SSH hosts. @@ -1067,7 +1245,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Fixed links in blocklist code review comments not opening when clicked. * Fixed "Out of credits" alert not dismissing when users provide their own API keys. * Fixed link detection being offset in AI conversations after conversation summaries or hidden reasoning blocks. -* Simplified file explorer lazy-loaded folder handling and fixed transitions between standalone folders and indexed git repositories. +* Simplified file explorer lazy-loaded folder handling and fixed transitions between standalone folders and indexed Git repositories. * Fixed inline code snippet colors and underline colors not updating when switching editor themes in notebooks. * \[Windows] Fix rendering on an additional set of older Intel iGPU drivers. * Fixed web auth flows so session-cookie-authenticated clients can call authenticated server APIs without requiring an Authorization header. @@ -1100,7 +1278,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Add a `/changelog` command for reopening the latest changelog, and keep the update toast visible until dismissed. * Added syntax highlighting for Dockerfiles in the file editor. * Added a setting to hide agent-executed commands from shell history, now enabled by default. -* MCP servers detected from third-party agents (Claude, Codex) are now visible and spawnable from the MCP servers page in Warp's AI settings. For more, see our [docs](/agent-platform/capabilities/mcp/#file-based-mcp-servers) on file-based MCP servers. +* MCP servers detected from third-party agents (Claude, Codex) are now visible and spawnable from the MCP servers page in Warp's AI settings. For more, see our [docs](/agents/capabilities/mcp/#file-based-mcp-servers) on file-based MCP servers. **Bug fixes** @@ -1125,7 +1303,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd **New features** -* Warp now automatically detects global and project-scoped MCP servers configured with `claude` or `codex`. Toggle **File-based MCP servers** in **Settings** > **AI** to auto-spawn servers based on your local configuration. See [docs](/agent-platform/capabilities/mcp/#file-based-mcp-servers) for more. +* Warp now automatically detects global and project-scoped MCP servers configured with `claude` or `codex`. Toggle **File-based MCP servers** in **Settings** > **AI** to auto-spawn servers based on your local configuration. See [docs](/agents/capabilities/mcp/#file-based-mcp-servers) for more. * Added Go to Line dialog in the code editor (`CTRL-G`) with line:column support. **Improvements** @@ -1150,7 +1328,7 @@ Submit bugs and feature requests on our [GitHub board!](https://github.com/warpd * Fixed "for terminal" text in pane header becoming bold when disabled, causing a layout shift. * Fixed notebook find bar showing `?/n` instead of proper match counter. * Fixed bug where editing a tab title always started with the pane title (instead of the tab's custom title, if it existed). -* Fixed "View latest changelog" action not appearing in the command palette. +* Fixed "View latest changelog" action not appearing in the Command Palette. * Fixed issue where artifacts from cloud agent runs did not update live in the conversation details pane. * Fixed intermittent "Failed to update plan" toast appearing without user action when background plan auto-saves encountered transient failures. * Fixed tooltip for branch name in code review panel overlapping the truncated text — it now appears above the branch name. @@ -1308,19 +1486,19 @@ Oz is Warp's orchestration platform for cloud agents: launch parallel agents, au * **Run Cloud Agents from anywhere with built-in tracking** — start agents from Warp or via the CLI, triggers, or schedules. Every run is auditable and steerable. [Cloud Agents docs →](https://docs.warp.dev/platform/) * **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 [Oz web app](https://oz.warp.dev). +* **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/). #### Warp Upgrades -* **Agent Modality** — two distinct modes: a clean terminal for commands, and a dedicated conversation view for multi-turn agent workflows with full controls (model select, voice, attachments). +* **Terminal and Agent modes** — two distinct modes: a clean terminal for commands, and a dedicated conversation view for multi-turn agent workflows with full controls (model select, voice, attachments). * **Cloud-Synced Conversations** — your agent conversations sync to the cloud and persist across devices. Share with teammates via link, view on the web, or continue locally. #### Agent Capabilities -* **Skills** — reusable instruction sets that agents auto-discover from your project or home directory. Invoke with `/{skill-name}` or run as scheduled cloud agents for repeatable automation. [Skills docs →](/agent-platform/capabilities/skills/) -* **Computer Use** — agents can interact with desktop environments in sandboxed cloud containers—take screenshots, click, type, and test UI changes. [Computer Use docs →](/agent-platform/capabilities/computer-use/) +* **Skills** — reusable instruction sets that agents auto-discover from your project or home directory. Invoke with `/{skill-name}` or run as scheduled cloud agents for repeatable automation. [Skills docs →](/agents/capabilities/skills/) +* **Computer Use** — agents can interact with desktop environments in sandboxed cloud containers—take screenshots, click, type, and test UI changes. [Computer Use docs →](/agents/capabilities/computer-use/) ### 2026.02.04 (v0.2026.02.04.08.20) @@ -1392,7 +1570,7 @@ Oz is Warp's orchestration platform for cloud agents: launch parallel agents, au * Fixed duplicate entries appearing in the agent management view for Slack-triggered conversations. * Fixed alias expansion being triggered in AI input when it should only apply to shell commands. * Fixed an issue where multiple shell commands could enter long-running mode in the same request batch. -* Hide AI options in the command palette when AI is disabled. +* Hide AI options in the Command Palette when AI is disabled. * Stopped highlighting search matches in reasoning blocks. * Fixed session viewer input being cleared when agent runs commands. diff --git a/src/content/docs/code/code-editor/code-editor-vim-keybindings.mdx b/src/content/docs/code/code-editor/code-editor-vim-keybindings.mdx index 0d7db88df..24102a348 100644 --- a/src/content/docs/code/code-editor/code-editor-vim-keybindings.mdx +++ b/src/content/docs/code/code-editor/code-editor-vim-keybindings.mdx @@ -26,7 +26,7 @@ Unlike the input editor, the Vim implementation in the code editor starts in Nor At the moment, Warp only supports default Vim keybindings. -One exception is the keyboard shortcut for exiting insert mode, which can be rebound under **Settings** > **Keyboard shortcuts** > **Exit Vim Insert Mode**, or through the [Command Palette](/terminal/command-palette/) search for "Exit Vim Insert Mode". +One exception is the keyboard shortcut for exiting insert mode, which can be rebound under **Settings** > **Keyboard shortcuts** > **Exit Vim insert mode**, or through the [Command Palette](/terminal/command-palette/) search for "Exit Vim insert mode". ## Supported keybindings @@ -79,9 +79,28 @@ See [Vim docs: motion](https://vimdoc.sourceforge.net/htmldoc/motion.html) for m | `.` | repeat last edit | | `gcc` | toggle comments on current line | | `gc` | toggle comments on visual selection | +| `>`, `<` | indent or dedent a range or object | +| `>>`, `<<` | indent or dedent the current line | See [Vim docs: editing](https://vimdoc.sourceforge.net/htmldoc/editing.html) for more information. +#### Indenting and dedenting + +`>` and `<` are operators, so they combine with any supported motion or text object the same way `d` and `y` do: + +| Command | Description | +| --------- | -------------------------------------------------------- | +| `>>` | indent the current line | +| `<<` | dedent the current line | +| `>j` | indent the current line and the line below | +| `>ap` | indent the current paragraph | +| `3>>` | indent the current line and the two below it | +| `>` / `<` | indent or dedent the selection in visual or visual line mode | + +In visual mode, `>` and `<` shift the selected lines and return to Normal mode. + +See [Vim docs: shifting text](https://vimdoc.sourceforge.net/htmldoc/change.html#%3E) for more information. + #### Text objects | Command(s) | Description | @@ -148,4 +167,4 @@ See [Vim docs: registers](https://vimdoc.sourceforge.net/htmldoc/change.html#reg ## Feedback -The best way to report bugs and request features is through Warp's [GitHub Issues](https://github.com/warpdotdev/Warp/issues) page. Please note that the issue or request is for Vim keybindings. +The best way to report bugs and request features is through Warp's [GitHub Issues](https://github.com/warpdotdev/Warp/issues) page. Note that the issue or request is for Vim keybindings. diff --git a/src/content/docs/code/code-editor/index.mdx b/src/content/docs/code/code-editor/index.mdx index 2c8ed8833..390481888 100644 --- a/src/content/docs/code/code-editor/index.mdx +++ b/src/content/docs/code/code-editor/index.mdx @@ -21,7 +21,7 @@ The editor is built for fast changes to agent-generated code: renaming a variabl ![Magnifying glass icon in the pane coding toolbelt for opening the file search.](../../../../assets/terminal/search-files-icon.png) 3. **Browse via the** [File Tree (Project Explorer)](/code/code-editor/file-tree/) to open or create files. -4. **Opening a generated code diff** from an Agent Conversation: [Code Diffs in Agent Conversations](/agent-platform/local-agents/code-diffs/). +4. **Opening a generated code diff** from an Agent Conversation: [Code Diffs in Agent Conversations](/agents/local-agents/code-diffs/). <VideoEmbed url="https://screen.studio/share/H7hTUgf2" title="Opening files in Warp's code editor" /> diff --git a/src/content/docs/code/code-review.mdx b/src/content/docs/code/code-review.mdx index eb9339ef4..8aaef03aa 100644 --- a/src/content/docs/code/code-review.mdx +++ b/src/content/docs/code/code-review.mdx @@ -27,7 +27,7 @@ Any uncommitted changes appear in the panel (or compare the changes on your bran </figure> :::note -To review agent-generated diffs, leave inline comments, batch your feedback, and have the agent apply all requested changes, see [Interactive Code Review](/agent-platform/local-agents/interactive-code-review/). +To review agent-generated diffs, leave inline comments, batch your feedback, and have the agent apply all requested changes, see [Interactive Code Review](/agents/local-agents/interactive-code-review/). ::: :::tip @@ -58,7 +58,7 @@ In terminal mode, when you're in a Git repository with changes, the Git diff chi #### 2. Agent conversation: review changes button -When an Agent makes code edits in an [Agent Conversation](/agent-platform/local-agents/interacting-with-agents/), a `Review changes` button appears at the bottom of the conversation. Click the button to open the code review panel. +When an Agent makes code edits in an [Agent Conversation](/agents/local-agents/interacting-with-agents/), a `Review changes` button appears at the bottom of the conversation. Click the button to open the code review panel. <figure style={{ maxWidth: "563px" }}> ![Review changes at bottom of Agent Conversation.](../../../assets/terminal/Blocklist-with-review-changes.png) @@ -135,7 +135,7 @@ The Code Review pane makes it simple to share changes with the Agent. You can at <figcaption>Attaching a diff as context from the Code Review panel.</figcaption> </figure> -This ensures responses are grounded in your latest edits, whether you're asking for feedback, explanations, or follow-up changes. For more details, see [Selection as Context](/agent-platform/local-agents/agent-context/selection-as-context/). +This ensures responses are grounded in your latest edits, whether you're asking for feedback, explanations, or follow-up changes. For more details, see [Selection as Context](/agents/local-agents/agent-context/selection-as-context/). #### Reverting diffs @@ -166,7 +166,7 @@ In addition to reviewing and editing diffs directly in the Code Review pane, you #### Directly editing code diffs -Alternatively, from the Code Review panel, you are able to click and edit the diffs directly: +Alternatively, from the Code Review panel, you can click and edit the diffs directly: <figure style={{ maxWidth: "563px" }}> ![Directly editing code in the Code Review panel inline diff view](/assets/terminal/directly-editing-diffs.gif) @@ -177,11 +177,11 @@ Alternatively, from the Code Review panel, you are able to click and edit the di You can leave inline comments in the Code Review panel and send them directly to a running coding agent session, including third-party CLI agents like Claude Code, Codex, and others. -This extends Warp's [Interactive Code Review](/agent-platform/local-agents/interactive-code-review/) workflow to any supported CLI agent running in Warp. The agent receives your batch of comments and applies the requested changes. +This extends Warp's [Interactive Code Review](/agents/local-agents/interactive-code-review/) workflow to any supported CLI agent running in Warp. The agent receives your batch of comments and applies the requested changes. <DemoVideo src="/assets/terminal/code-review-inline-comment.mp4" label="Adding an inline comment on a diff line and sending it to a running agent" /> -For more on supported agents, see [Third-party CLI agents](/agent-platform/cli-agents/overview/). +For more on supported agents, see [Third-party CLI agents](/agents/cli-agents/overview/). ### Discarding all changes diff --git a/src/content/docs/code/git-worktrees.mdx b/src/content/docs/code/git-worktrees.mdx index 60b36450a..db4ffe65b 100644 --- a/src/content/docs/code/git-worktrees.mdx +++ b/src/content/docs/code/git-worktrees.mdx @@ -5,7 +5,7 @@ description: >- simultaneously with full Code Review, Codebase Context, and Agent support. --- -Warp natively supports [Git worktrees](https://git-scm.com/docs/git-worktree) — a Git feature that lets you check out multiple branches simultaneously in separate directories, all backed by the same repository. This is different from simply switching branches: with worktrees, you can have `~/project` on `main` and `~/project-wt/feature-x` on `feature-x` at the same time, with no stashing or context-switching required. +Warp natively supports [Git worktrees](https://git-scm.com/docs/git-worktree) — a Git feature that lets you check out multiple branches simultaneously in separate directories, all backed by the same repository. This is different from switching branches: with worktrees, you can have `~/project` on `main` and `~/project-wt/feature-x` on `feature-x` at the same time, with no stashing or context-switching required. ## How worktrees work in Warp @@ -14,7 +14,7 @@ Warp automatically detects worktree checkouts. When you open a terminal in a wor * **Code Review panel** — Each worktree has its own Code Review panel showing uncommitted changes for that worktree's branch. You can review diffs, revert hunks, and discard changes independently in each worktree. * **Git Status chip** — The Git diff chip and branch indicator in the input bar reflect the correct branch and change counts for whichever worktree your terminal is in. * **File watching** — Warp watches both the worktree's working directory and the shared `.git` directory. Changes to shared Git state (such as new commits pushed to the remote) are detected and propagated across all open worktrees. -* **Codebase Context** — Each worktree is indexed independently for [Codebase Context](/agent-platform/capabilities/codebase-context/), so Agents have accurate context for whichever worktree you're working in. +* **Codebase Context** — Each worktree is indexed independently for [Codebase Context](/agents/capabilities/codebase-context/), so Agents have accurate context for whichever worktree you're working in. * **Repository-scoped features** — Project rules (`AGENTS.md`, `WARP.md`), ignore files, and other repository-scoped settings work correctly within each worktree. ## When to use worktrees diff --git a/src/content/docs/code/overview.mdx b/src/content/docs/code/overview.mdx index 978d82c7f..488c7ed12 100644 --- a/src/content/docs/code/overview.mdx +++ b/src/content/docs/code/overview.mdx @@ -18,8 +18,8 @@ Warp Code is a suite of features designed to help you take agent-generated code In addition to Warp’s modern, [native code editor](/code/code-editor/), it includes: -* [Codebase Context](/agent-platform/capabilities/codebase-context/) for accurate, context-aware agent responses -* [Project Rules](/agent-platform/capabilities/rules/) and Commands to tailor agent behavior per repository +* [Codebase Context](/agents/capabilities/codebase-context/) for accurate, context-aware agent responses +* [Project Rules](/agents/capabilities/rules/) and Commands to tailor agent behavior per repository * A dedicated [Code Review](/code/code-review/) experience for reviewing and editing diffs * [Zero-state and setup flows](/code/overview/#getting-started-with-coding-in-warp) to quickly start a new project or initialize an existing one @@ -75,13 +75,13 @@ Warp provides multiple entry points to begin coding with agents, whether you are #### 1. Starting a new project -To begin a new project, select **Create a New Project** from the tab. You can start directly with a prompt (Warp will suggest ideas) or configure the project manually. Warp sets up the repository with an `AGENTS.md` file (filename must be in all caps) containing [project rules](/agent-platform/capabilities/rules/#project-rules) and enables [codebase indexing](/agent-platform/capabilities/codebase-context/) to provide the agent with full context. +To begin a new project, select **Create a New Project** from the tab. You can start directly with a prompt (Warp will suggest ideas) or configure the project manually. Warp sets up the repository with an `AGENTS.md` file (filename must be in all caps) containing [project rules](/agents/capabilities/rules/#project-rules) and enables [codebase indexing](/agents/capabilities/codebase-context/) to provide the agent with full context. #### 2. Open an existing repo -Select **Open Repository** to use your computer's file picker. If you choose a Git repository, Warp automatically changes into the directory and runs the `/init` setup command (a built-in "[slash command](/agent-platform/capabilities/slash-commands/)") if the repo has not already been initialized. Warp will detect the repository, index the codebase, and prepare it for coding. +Select **Open Repository** to use your computer's file picker. If you choose a Git repository, Warp automatically changes into the directory and runs the `/init` setup command (a built-in "[slash command](/agents/capabilities/slash-commands/)") if the repo has not already been initialized. Warp will detect the repository, index the codebase, and prepare it for coding. -* For non-Git folders, Warp simply changes into the directory without initialization. +* For non-Git folders, Warp changes into the directory without initialization. * If you have an existing project that is not yet initialized, you can run `/init` manually to bootstrap it with a version-controlled `AGENTS.md` file. * This view also shows a list of your three most recently used repositories and AI conversations for quick access, as well as a list of recent directories (which behave like running `cd`). @@ -94,7 +94,7 @@ Select **Clone Repository** to paste in a repo link or clone directly from GitHu * [Code Editor](/code/code-editor/) - Warp's built-in code editor lets you make quick, in-context edits with essentials like syntax highlighting, tabs, find and replace, Vim keybindings, and a file tree. * [Language Server Protocol (LSP)](/code/code-editor/language-server-protocol/) - Warp integrates with language servers to provide hover info, go-to-definition, find references, inline diagnostics, and format-on-save for Rust, Go, Python, TypeScript/JavaScript, and C/C++. * [Find and Replace](/code/code-editor/find-and-replace/) - Search within a file, move between matches, and replace text with options for regex, case sensitivity, and smart case preservation. -* [Codebase Context](/agent-platform/capabilities/codebase-context/) - Warp indexes your Git-tracked codebase to help Agents understand your code and generate accurate, context-aware responses. No code is stored on Warp servers. +* [Codebase Context](/agents/capabilities/codebase-context/) - Warp indexes your Git-tracked codebase to help Agents understand your code and generate accurate, context-aware responses. No code is stored on Warp servers. * [Code Review](/code/code-review/) - review, edit, and manage Git diffs in real time, with options to attach, revert, or open files directly. - * You can also enter [Interactive Code Review](/agent-platform/local-agents/interactive-code-review/) to comment on changes, guide the agent, or adjust individual edits as they happen. -* [Code Diffs](/agent-platform/local-agents/code-diffs/) - Learn how to review, refine, and apply code changes generated by Warp's agents using the built-in visual diff editor. + * You can also enter [Interactive Code Review](/agents/local-agents/interactive-code-review/) to comment on changes, guide the agent, or adjust individual edits as they happen. +* [Code Diffs](/agents/local-agents/code-diffs/) - Learn how to review, refine, and apply code changes generated by Warp's agents using the built-in visual diff editor. diff --git a/src/content/docs/code/ssh-feature-support.mdx b/src/content/docs/code/ssh-feature-support.mdx index 666244fad..2204a9bf4 100644 --- a/src/content/docs/code/ssh-feature-support.mdx +++ b/src/content/docs/code/ssh-feature-support.mdx @@ -26,11 +26,11 @@ The following features require the **SSH extension**: * **File tree (Project Explorer)** — The [file tree sidebar](/code/code-editor/file-tree/) reflects the remote project structure and updates as you navigate or change files. * **Code editor** — Open, view, and edit remote files in Warp's [code editor](/code/code-editor/) from the file tree or the Command Palette, then save back to the remote host. Warp detects conflicting changes on disk and prompts you to resolve them. * **Code review and git operations** — The [code review panel](/code/code-review/) works on remote repositories: review diffs, discard files, commit, push, and create PRs. AI-generated commit messages and PR descriptions are produced on the remote host. -* **Codebase indexing** — Warp indexes the remote repository so Agents can semantically search it, the same as [Codebase Context](/agent-platform/capabilities/codebase-context/) locally. +* **Codebase indexing** — Warp indexes the remote repository so Agents can semantically search it, the same as [Codebase Context](/agents/capabilities/codebase-context/) locally. * **File search** — Search for remote files by name from the [Command Palette](/terminal/command-palette/). * **Project rules and skills** — Agents discover and use the remote project's rules (`WARP.md`) and skills. * **Native file reading** — The Agent reads remote files through Warp's built-in file reading tool instead of shelling out to `cat`. -* **Native code diffs** — The Agent applies edits as inline [code diffs](/agent-platform/local-agents/code-diffs/) you can review and approve, instead of using `sed` or other shell commands. +* **Native code diffs** — The Agent applies edits as inline [code diffs](/agents/local-agents/code-diffs/) you can review and approve, instead of using `sed` or other shell commands. * **Reliable, parallel completions** — Generators run in parallel over a single multiplexed connection, so completions stop hitting the remote host's `MaxSessions` ceiling and stop occasionally injecting errors into your blocks. ## Features not yet available over SSH diff --git a/src/content/docs/enterprise/enterprise-features/analytics-api.mdx b/src/content/docs/enterprise/enterprise-features/analytics-api.mdx index 8b6b60748..3dae9cf28 100644 --- a/src/content/docs/enterprise/enterprise-features/analytics-api.mdx +++ b/src/content/docs/enterprise/enterprise-features/analytics-api.mdx @@ -6,13 +6,14 @@ description: >- sidebar: label: "Analytics API" --- +import { VARS } from '@data/vars'; -The Enterprise Analytics API lets enterprise admins pull Warp usage data into their own dashboards, cost-allocation tooling, or audit pipelines. It exposes three read-only endpoints over HTTPS that return aggregated team metrics, per-user rollups, and message-level activity events for the agents your team runs in Warp and Oz. +The Enterprise Analytics API lets enterprise admins pull Warp usage data into their own dashboards, cost-allocation tooling, or audit pipelines. It exposes three read-only endpoints over HTTPS that return aggregated team metrics, per-user rollups, and message-level activity events for the agents your team runs in Warp and the {VARS.WARP_AUTOMATION_PLATFORM}. :::note[Early access] The Enterprise Analytics API is in Early Access. It is available to all enterprise teams. To start collecting data for your team, an admin must open the Warp app and turn on **Enterprise Usage Reporting (Early Access)** in **Admin Panel** > **Privacy** — no usage data is recorded until that toggle is on. -The API exposes **aggregated usage metrics** only (counts, credit spend, code-change tallies, and message-level metadata). It does not return the raw text of agent conversations. To retain and inspect full conversation contents, enable [cloud-synced conversations](/agent-platform/local-agents/cloud-conversations/) under **Settings** > **Privacy**. +The API exposes **aggregated usage metrics** only (counts, credit spend, code-change tallies, and message-level metadata). It does not return the raw text of agent conversations. To retain and inspect full conversation contents, enable [cloud-synced conversations](/agents/local-agents/cloud-conversations/) under **Settings** > **Privacy**. ::: ## What you can do with the API @@ -28,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** > **Oz Cloud 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](/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. * **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 @@ -296,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** > **Oz Cloud 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](/reference/cli/api-keys/) for how to create one. ### Are these calls billed? 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 c8805b257..1130480de 100644 --- a/src/content/docs/enterprise/enterprise-features/architecture-and-deployment.mdx +++ b/src/content/docs/enterprise/enterprise-features/architecture-and-deployment.mdx @@ -4,6 +4,7 @@ description: >- Understand Warp's system architecture and choose the right deployment model for your organization - Warp-hosted, self-hosted, or hybrid. --- +import { VARS } from '@data/vars'; Warp's architecture separates the **control plane** (orchestration, observability, and LLM inference) from the **execution plane** (where agents run, code is accessed, and commands execute). This separation gives enterprise teams flexibility to choose where sensitive workloads run while maintaining centralized management and visibility. @@ -14,9 +15,9 @@ Use this information to evaluate which deployment model fits your organization's Warp's cloud agent infrastructure has four key components: 1. **Trigger** - What starts an agent run (CI step, webhook, cron schedule, Slack mention, CLI command, or API/SDK call). -2. **Orchestration** - What decides what to run and tracks it (Oz orchestrator or your own system). +2. **Orchestration** - What decides what to run and tracks it ({VARS.WARP_AUTOMATION_PLATFORM} orchestrator or your own system). 3. **Execution** - Where the agent actually runs (Warp-hosted environment, your infrastructure, or your existing CI/orchestrator). -4. **Visibility** - How the team monitors and intervenes (Oz dashboard, session sharing, APIs/SDKs). +4. **Visibility** - How the team monitors and intervenes ({VARS.DASHBOARD}, session sharing, APIs/SDKs). {/* TODO: Insert system architecture diagram once received from design team */} @@ -34,7 +35,7 @@ Warp-hosted is the default deployment model. Agents run on Warp-managed infrastr ### How it works * Agents execute in **isolated Docker containers** on Warp-hosted infrastructure (GCP). -* The Oz orchestrator manages agent lifecycle - provisioning, execution, monitoring, and cleanup. +* The {VARS.WARP_AUTOMATION_PLATFORM} orchestrator manages agent lifecycle - provisioning, execution, monitoring, and cleanup. * Environments are ephemeral and destroyed after each run. ### Triggers @@ -75,9 +76,9 @@ Self-hosted deployments use a split architecture: * You control scheduling, scaling, and environment setup. * Warp provides cloud connectivity, shared context, visibility, and session sharing. -**Managed** - Run the `oz-agent-worker` daemon to let the Oz platform orchestrate agents in isolated Docker containers on your infrastructure. +**Managed** - Run the `oz-agent-worker` daemon to let Warp orchestrate agents in isolated Docker containers on your infrastructure. -* The worker process connects to Oz via WebSocket and receives tasks automatically. +* The worker process connects to the {VARS.WARP_AUTOMATION_PLATFORM} via WebSocket and receives tasks automatically. * Agents run in isolated Docker containers managed by the worker. * You get the same orchestration capabilities as Warp-hosted, but execution stays on your infrastructure. @@ -94,7 +95,7 @@ Self-hosted agents require **outbound-only** network access. No inbound network * Compliance or security requirements prevent using Warp-hosted compute. * Source code and execution must stay within your network boundary. -* You want Oz orchestration and visibility without sending code to Warp's infrastructure. +* You want {VARS.WARP_AUTOMATION_PLATFORM} orchestration and visibility without sending code to Warp's infrastructure. ## Hybrid deployments @@ -104,7 +105,7 @@ Organizations can combine Warp-hosted and self-hosted execution to balance conve * Route sensitive workloads (e.g., production code, regulated data) to self-hosted agents. * Route less sensitive workloads (e.g., open-source tooling, internal utilities) to Warp-hosted agents. -* Both execution modes share the same Oz dashboard, session sharing, and API/SDK visibility. +* Both execution modes share the same {VARS.DASHBOARD}, session sharing, and API/SDK visibility. ### Example configurations @@ -151,7 +152,7 @@ Consider the following when selecting a deployment model: ## Related resources -* [Deployment Patterns](/platform/deployment-patterns/) - Detailed patterns for CLI-only, Oz-hosted, and self-hosted setups +* [Deployment Patterns](/platform/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/enterprise-features/bring-your-own-llm.mdx b/src/content/docs/enterprise/enterprise-features/bring-your-own-llm.mdx index 3d8112453..6e1460079 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 @@ -1,336 +1,55 @@ --- title: Bring Your Own LLM description: >- - Route Warp's agents through your AWS Bedrock models for billing control and - infrastructure flexibility. + BYOLLM routes Warp Agent inference through your AWS Bedrock or Google Cloud + environment for billing control and data locality. --- -Warp supports **Bring Your Own LLM (BYOLLM)** for enterprise teams that need to run inference on their own cloud infrastructure. With BYOLLM, your team can use Warp's agents while routing inference through models hosted in your AWS Bedrock environment. +Warp supports **Bring Your Own LLM (BYOLLM)** for Enterprise teams that need to run inference on their own cloud infrastructure. With BYOLLM, your team keeps using Warp's agents as usual, while eligible requests route through models hosted in your own cloud account instead of Warp's direct provider integrations. -This gives you control over cloud spend and model hosting, without changing how your team works in Warp. - -:::caution -BYOLLM currently supports **AWS Bedrock** only. Coming soon: Azure Foundry and Google Vertex support. -::: +This gives you control over cloud spend, model hosting, and data locality, without changing how your team works in Warp. Admins configure BYOLLM centrally in the [Admin Panel](/enterprise/team-management/admin-panel/) — team members don't need to change anything about how they use Warp (unless your admin asks them to opt in; see each provider's page for details). :::note BYOLLM is only available on Warp's Enterprise plan. [Contact sales](https://www.warp.dev/contact-sales) to learn more. ::: -## Key features - -* **Cloud-native credentials** - No long-lived API keys. Interactive terminal sessions use each user's AWS CLI session credentials; cloud agent runs assume an IAM role in your AWS account via OIDC. -* **Admin-controlled IAM** - Admins define which IAM role(s) Warp can assume and which models are available via AWS Bedrock, with the ability to disable non-Bedrock model access entirely. -* **Admin-enforced routing** - Team admins configure which models are available to users in AWS Bedrock, with the ability to disable non-Bedrock model access entirely. -* **Consolidated billing** - Inference costs are billed directly to your AWS account, leveraging existing cloud commitments. - -## How BYOLLM works - -{/* TODO: Add architecture diagram showing BYOLLM request flow (admin configures routing → user authenticates to AWS → Warp routes request → inference in customer AWS account) */} - -When BYOLLM is enabled, Warp redirects inference calls to your AWS Bedrock environment instead of using model providers' direct APIs. - -Here's the high-level flow: - -**Interactive terminal flow** - -1. **Admin configures routing** - Your team admin sets routing policies in Warp's admin settings (e.g., "Route Claude Opus 4.7 through AWS Bedrock; disable direct Anthropic API"). -2. **Team members authenticate** - Each team member authenticates to AWS locally using the AWS CLI (`aws login`). -3. **Warp routes requests** - When a team member uses an interactive agent in the terminal, Warp uses their short-lived session credentials to authenticate requests to your configured AWS Bedrock API endpoint. -4. **Inference executes in your cloud** - The model runs in your AWS account. Responses return to the Warp client. - -**Cloud agent flow** - -1. **Admin configures routing** - Your team admin configures BYOLLM in the Admin Panel and provides an IAM role ARN that Warp can assume. See [Enabling BYOLLM for Cloud Agents](#enabling-byollm-for-cloud-agents) for setup details. -2. **Warp assumes the role** - At run start, Warp mints an OIDC token and assumes the configured IAM role in your AWS account to obtain temporary credentials. -3. **Warp routes requests** - The cloud agent uses those temporary credentials to call your configured AWS Bedrock endpoint. -4. **Inference executes in your cloud** - The model runs in your AWS account. Responses return to the cloud agent worker. - -### Credential lifecycle - -BYOLLM uses **cloud-native IAM authentication**, not long-lived API keys: - -* **Automatic refresh** - Session tokens refresh automatically every ~15 minutes. Users can enable auto-refresh by opening **Settings** and searching for `AWS Bedrock`, or when prompted during first credential expiration. With auto-refresh enabled, sessions can run uninterrupted for up to 12 hours (depending on your AWS admin configuration). -* **Per-user credentials** - Credentials are not shared across the organization. Your cloud provider's default credential provider chain (e.g., AWS CLI) provisions and refreshes them locally. -* **No storage or logging** - Warp never stores or logs your cloud session tokens on its servers. - -This approach ensures access management stays with your cloud provider, giving admins member-by-member control. - -### Model availability - -BYOLLM supports the intersection of models that Warp supports and models available on AWS Bedrock. Currently, only **Claude models** (Anthropic) are available through AWS Bedrock. OpenAI and Google models are not available on Bedrock. - -To determine which models you can use with BYOLLM: - -* [Model Choice](/agent-platform/inference/model-choice/) - Full list of Warp-supported models. -* [Supported models in Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/model-cards.html) - AWS Bedrock model availability. - -A model must appear on both lists to be available through BYOLLM. - -## Enabling BYOLLM - -### Prerequisites - -Before configuring BYOLLM, confirm the following: - -* Your organization has the desired models enabled in AWS Bedrock. -* You have admin access to both Warp's [Admin Panel](/enterprise/team-management/admin-panel/) and your AWS IAM settings. -* Team members have the AWS CLI installed locally. - -### 1. Configure routing policies (admin) - -In the [Admin Panel](/enterprise/team-management/admin-panel/), configure which models should route through AWS Bedrock: - -1. From the [Admin Panel](/enterprise/team-management/admin-panel/), navigate to the **Models** page. -2. Select which models should use your cloud provider (e.g., "Claude Opus 4.7 via AWS Bedrock"). -3. Optionally, disable direct API access to enforce provider-only routing. - -### 2. Provision IAM roles (cloud admin) - -Grant your team members the necessary permissions in AWS. Use least-privilege IAM policies. - -**Example: AWS Bedrock minimum IAM policy** - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "BedrockModelAccess", - "Effect": "Allow", - "Action": [ - "bedrock:InvokeModel", - "bedrock:InvokeModelWithResponseStream" - ], - "Resource": [ - "arn:aws:bedrock:*::foundation-model/*", - "arn:aws:bedrock:*:*:inference-profile/*", - "arn:aws:bedrock:*:*:application-inference-profile/*" - ] - } - ] -} -``` - -:::note -This policy covers Warp's current usage. By default, Warp uses [global inference profiles](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html) for models when available. Admins can override the inference profile per model on the **Models** page of the [Admin Panel](/enterprise/team-management/admin-panel/). -::: - -### 3. Authenticate locally (team member) - -Each team member authenticates to AWS using the AWS CLI: - -```bash -aws login -``` - -Confirm your AWS environment and region are correctly configured before using Warp. - -### 4. Validate - -Run a test prompt in Warp using a model configured for BYOLLM routing. Verify: - -* The request completes successfully. -* Logs appear in AWS CloudWatch. - -## Enabling BYOLLM for cloud agents - -Cloud agents authenticate to AWS Bedrock differently from the local terminal flow above. Instead of relying on each user's AWS CLI session, Warp assumes an IAM role you provision in your AWS account using OIDC identity federation. - -### Prerequisites - -Before configuring BYOLLM for cloud agents, confirm the following: - -* You have admin access to both Warp's [Admin Panel](/enterprise/team-management/admin-panel/) and your AWS IAM settings. - -### 1. Set up Warp as an OIDC identity provider in AWS (cloud admin) - -Before AWS can trust tokens issued by Warp, register Warp as an OpenID Connect (OIDC) identity provider in IAM. This is a one-time setup per AWS account. - -1. Open the [Identity providers](https://console.aws.amazon.com/iam/home#/identity_providers) page in the AWS IAM console. -2. Click **Add provider**. -3. For **Provider type**, choose **OpenID Connect**. -4. For **Provider URL**, enter `https://app.warp.dev`. -5. For **Audience**, enter `sts.amazonaws.com`. -6. Click **Add provider**. - -After the provider is created, copy its ARN — it will look like `arn:aws:iam::<aws-account-id>:oidc-provider/app.warp.dev`. You'll reference this ARN in the trust policy in the next step. - -For more detail, see AWS's [Create an OpenID Connect (OIDC) identity provider in IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html) guide. - -### 2. Provision an assumable IAM role (cloud admin) - -Create an IAM role that Warp can assume via OIDC, then attach the minimum Bedrock permissions policy. Use least-privilege IAM policies. - -The role setup has two parts: - -1. A **trust policy** that allows Warp's OIDC identity to call `sts:AssumeRoleWithWebIdentity`. -2. A **permissions policy** that grants the minimum Bedrock inference permissions. - -#### Trust policy requirements - -This trust policy authorizes any cloud-hosted run from your team. The `sub` claim Warp signs has the shape `scoped_principal:<team-uid>/<actor-type>:<principal-uid>`, where `<actor-type>` is `user` for user-triggered runs or `service_account` for [cloud agent](/platform/agents/) runs. The `<team-uid>/*` pattern below covers both. - -**Example trust policy** - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "Federated": "arn:aws:iam::<aws-account-id>:oidc-provider/app.warp.dev" - }, - "Action": "sts:AssumeRoleWithWebIdentity", - "Condition": { - "StringLike": { - "app.warp.dev:sub": "scoped_principal:<team-uid>/*" - }, - "StringEquals": { - "app.warp.dev:aud": "sts.amazonaws.com" - } - } - } - ] -} -``` - -Replace the account ID, issuer host, and team UID with values for your environment. - -The `<team-uid>` is the Warp team UID for the team that will be allowed to assume this role. You can find it in your team's [Admin Panel](/enterprise/team-management/admin-panel/) URL as the path segment after `/admin/`. For example, in `https://app.warp.dev/admin/HzjUdNkg8Uiq8gp6FMgfxe/models`, the team UID is `HzjUdNkg8Uiq8gp6FMgfxe`. - -#### Permissions policy - -Attach the minimum Bedrock invoke permissions policy to the role: - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "BedrockModelAccess", - "Effect": "Allow", - "Action": [ - "bedrock:InvokeModel", - "bedrock:InvokeModelWithResponseStream" - ], - "Resource": [ - "arn:aws:bedrock:*::foundation-model/*", - "arn:aws:bedrock:*:*:inference-profile/*", - "arn:aws:bedrock:*:*:application-inference-profile/*" - ] - } - ] -} -``` - -:::note -This policy covers Warp's current usage. By default, Warp uses [global inference profiles](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html) for models when available. Admins can override the inference profile per model on the **Models** page of the [Admin Panel](/enterprise/team-management/admin-panel/). -::: - -After you create the role, copy its ARN. You'll paste it into the **Models** page in the next step. - -### 3. Configure routing policies (admin) - -Attach the IAM role from Step 2 to your team or to a specific named agent. - -#### Option A: Team-wide +## Supported providers -This applies the OIDC role to all cloud agent runs on the team. +BYOLLM supports two cloud providers today, each with its own dedicated setup guide: -1. In the [Admin Panel](/enterprise/team-management/admin-panel/), navigate to the **Models** page. -2. Under the **AWS Bedrock** host configuration, paste the IAM role ARN from Step 2 into the **Role ARN** field. -3. Select which models should route through AWS Bedrock. +* **[BYOLLM: AWS Bedrock](/enterprise/enterprise-features/byollm-aws-bedrock/)** - Route inference through Claude models hosted in your AWS account. Interactive requests use each member's AWS CLI session credentials, and cloud agent runs assume an IAM role via OIDC. +* **[BYOLLM: Gemini Enterprise (Vertex AI)](/enterprise/enterprise-features/byollm-gemini-enterprise/)** - Route inference through Gemini and Claude partner models hosted in your Google Cloud project, using short-lived Workload Identity Federation (WIF) credentials rooted in the member's Warp session. -#### Option B: Per named agent - -This applies the OIDC role only to runs from a specific named agent. - -:::note -To safely test BYOLLM, configure it on a single named agent first. Misconfigurations scoped to one agent only affect that agent's runs, not the whole team. +:::caution +Azure Foundry support is coming soon. ::: -In the Oz web app: - -1. [Create a new agent](/platform/oz-web-app/#creating-a-new-agent) or edit an existing one. -2. In the agent form, expand the **AWS Bedrock** section. -3. Choose **Custom** and paste the IAM role ARN from Step 2. -4. Ensure the agent's default model is one that's enabled for Bedrock under the Admin Panel **Models** page. - -New runs for this agent will authenticate to Bedrock using the configured role. +Use the comparison below to pick a provider, then follow its setup guide for configuration steps. -### 4. Validate the configuration - -Start a test cloud agent run using a model configured for BYOLLM routing. Verify: - -* The request completes successfully. -* Logs appear in AWS CloudWatch. - -## BYOLLM usage and billing behavior - -### Billing - -When a request routes through BYOLLM: - -* **Warp does not consume AI credits** for that request. -* Cloud agent runs still consume platform and compute credits for orchestration and the cloud agent's compute. - -See [The three credit buckets](/support-and-community/plans-and-billing/platform-credits/#the-three-credit-buckets) for more on credit types. - -### Routing behavior - -Warp's agents automatically select the best model for your task while respecting your admin's routing policies. If you configure a model for BYOLLM, requests for that model route to AWS Bedrock. - -### Failover behavior - -If a BYOLLM request fails (e.g., due to role assumption errors, insufficient permissions, or provider quota limits), Warp attempts to fall back to the next available model your admin has enabled. - -For example, if Claude Opus 4.7 on Bedrock fails but your admin also enabled it via direct API, Warp falls back to the direct API to avoid disruption. If a fallback uses a direct API model, that request consumes Warp credits. - -If no fallback is available (e.g., the admin disabled all non-Bedrock models), Warp displays a clear error message. - -## Security and data handling - -### Credential security - -* **No long-lived API keys** — BYOLLM uses cloud-native IAM with short-lived session tokens. -* **Per-user authentication** — Each team member authenticates individually; credentials are not shared. -* **No storage or logging** — Warp never stores or logs your cloud session tokens on its servers. - -### Zero Data Retention (ZDR) - -Warp maintains **SOC 2 compliance** and has **Zero Data Retention (ZDR)** agreements with its contracted LLM providers. - -However, when using BYOLLM: +| Aspect | AWS Bedrock | Gemini Enterprise (Vertex AI) | +| --- | --- | --- | +| Models | Claude (Anthropic) | Gemini (native) and Claude (Vertex AI partner models) | +| Credential mechanism | AWS CLI session (interactive); IAM role via OIDC (cloud agents) | Workload Identity Federation (WIF), rooted in the Warp session | +| Works with cloud agents | Yes | Not yet (planned) | +| Setup guide | [BYOLLM: AWS Bedrock](/enterprise/enterprise-features/byollm-aws-bedrock/) | [BYOLLM: Gemini Enterprise](/enterprise/enterprise-features/byollm-gemini-enterprise/) | -* **Your** cloud account settings determine data retention policies. -* Warp cannot enforce ZDR for requests routed through your infrastructure. -* If your cloud account does not have ZDR enabled, your provider may retain data according to their terms. +## Key features -### Auditability +* **Cloud-native credentials** - No long-lived API keys stored by Warp. Each provider uses its own cloud-native identity mechanism — see the provider pages for details. +* **Admin-controlled routing and models** - Admins choose exactly which models route through your cloud account, with the option to disable direct provider access entirely. +* **Consolidated billing** - Inference costs are billed directly to your cloud account (AWS or Google Cloud), leveraging your existing cloud commitments. -* Warp keeps all runs fully steerable and logged within Warp. -* Your cloud account retains provider-side logs (usage, latency, errors). +## How BYOLLM works -## Troubleshooting +When BYOLLM is enabled for a model, Warp redirects eligible inference calls to your configured cloud provider instead of using model providers' direct APIs. The model runs in your cloud account, and the response streams back to the Warp client (or cloud agent worker, for providers that support it). -### Common errors +Each provider has its own request flow, credential lifecycle, and setup process. See [BYOLLM: AWS Bedrock](/enterprise/enterprise-features/byollm-aws-bedrock/#how-it-works) or [BYOLLM: Gemini Enterprise](/enterprise/enterprise-features/byollm-gemini-enterprise/#how-it-works) for the full details. -* **Missing or expired local credentials** (interactive terminal use) — Re-authenticate using `aws login`. To avoid interruptions, enable auto-refresh by opening **Settings** and searching for `AWS Bedrock`, or when prompted during credential expiration. -* **Role assumption failed** (cloud agent runs) — Verify the IAM trust policy, issuer host, team UID restriction, and the configured role ARN in Warp. -* **Missing OIDC provider** (cloud agent runs) — Confirm the OIDC provider exists in your AWS account for the issuer host referenced in the trust policy. -* **Insufficient permissions** — Verify your IAM policy includes the required Bedrock actions and any needed resources. -* **Region or model mismatch** — Confirm the model is enabled in your AWS region and that your environment is configured for the correct region. -* **Provider quota limits** — Check your AWS Bedrock quota and request increases if needed. +## Billing behavior -### Debugging steps +BYOLLM-routed inference **consumes no credits** — Warp doesn't charge credits for requests that execute in your cloud. Inference costs are billed directly to your cloud account. Local agent runs that use BYOLLM still consume [platform credits](/support-and-community/plans-and-billing/platform-credits/) for Warp's platform infrastructure. -1. Confirm the configured role ARN is the one you intended Warp to assume. -2. Check the IAM trust policy and verify the issuer host, `sub`, and `aud` conditions match your Warp configuration. -3. Check the attached IAM policy for the required Bedrock permissions. -4. Confirm the model ID and region match your Warp configuration. -5. Inspect AWS CloudWatch logs for request details and errors. +See each provider's page for provider-specific routing and fallback behavior: [AWS Bedrock](/enterprise/enterprise-features/byollm-aws-bedrock/#routing-and-fallback-behavior) or [Gemini Enterprise](/enterprise/enterprise-features/byollm-gemini-enterprise/#routing-and-fallback-behavior). ## FAQ @@ -338,42 +57,35 @@ However, when using BYOLLM: **BYOK (Bring Your Own API Key)** lets individual users add their own API keys for direct model provider access (e.g., Anthropic, OpenAI, Google). Warp stores keys locally on the user's device. -**BYOLLM (Bring Your Own LLM)** routes inference through your organization's cloud infrastructure (AWS Bedrock) using cloud-native IAM. Admins configure it at the admin level and it applies to the entire team. +**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). +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 | | --- | --- | --- | | Configuration level | User | Admin/Team | -| Authentication | API keys (local) | IAM role assumed by Warp via OIDC | +| Authentication | API keys (local) | Cloud-native IAM (AWS) or Workload Identity Federation (Google Cloud) | | Billing | Direct to provider | Your cloud account | | Data locality | Provider infrastructure | Your cloud infrastructure | ### Does BYOLLM work with Auto? -Auto model selection is disabled if an admin disables **any** Direct API model, regardless of AWS Bedrock configuration. - -When Direct API models remain enabled and BYOLLM is configured, Auto picks the best model for the task. If the selected model is also enabled for AWS Bedrock, the request routes through Bedrock; otherwise it routes through the Direct API. - -### Where does compute run and who pays? - -Inference runs in **your AWS account**, which AWS bills directly. Warp does not consume AI credits for BYOLLM-routed inference. Cloud agent runs continue to consume platform and compute credits for orchestration. See [The three credit buckets](/support-and-community/plans-and-billing/platform-credits/#the-three-credit-buckets) for more. +Auto model selection is disabled if an admin disables **any** Direct API model, regardless of BYOLLM configuration. When Direct API models remain enabled and BYOLLM is configured, Auto picks the best model for the task; if the selected model is enabled for your configured provider, the request routes through your cloud account. ### What data does Warp store? Do you store our cloud credentials? -Warp **does not store or log** your cloud credentials. - -* **Interactive terminal use** — Credentials are used transiently to sign requests and are never persisted on Warp servers. -* **Cloud agent runs** — Temporary AWS credentials are used only for the duration of the run and are not retained after it ends. +Warp **does not store or log** your cloud credentials for either provider. Credentials are used transiently, or minted as short-lived tokens, to authenticate requests and are never persisted on Warp's servers. See the [AWS Bedrock](/enterprise/enterprise-features/byollm-aws-bedrock/#security-and-data-handling) or [Gemini Enterprise](/enterprise/enterprise-features/byollm-gemini-enterprise/#security-and-data-handling) security sections for provider-specific detail. -### Can admins enforce provider-only routing and disable Warp-managed models? +### Can admins enforce provider-only routing? -Yes. Admins can configure routing policies to require specific models to use BYOLLM and disable direct API access to Warp-managed model endpoints. +Yes. Admins can disable Direct API access for models on the **Models** page so eligible requests only route through your cloud account. Note that disabling any Direct API model also disables Auto model selection. ## Related resources -* [Bring Your Own API Key](/agent-platform/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 -* [Model Choice](/agent-platform/inference/model-choice/) — Full list of supported models +* [BYOLLM: AWS Bedrock](/enterprise/enterprise-features/byollm-aws-bedrock/) — Route inference through your AWS account +* [BYOLLM: Gemini Enterprise (Vertex AI)](/enterprise/enterprise-features/byollm-gemini-enterprise/) — Route inference through your Google Cloud project +* [Team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) — Admin-configured shared provider keys and custom endpoints +* [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) — Self-serve, user-level API keys +* [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 +* [Contact sales](https://www.warp.dev/contact-sales) — Get help with Enterprise setup diff --git a/src/content/docs/enterprise/enterprise-features/byollm-aws-bedrock.mdx b/src/content/docs/enterprise/enterprise-features/byollm-aws-bedrock.mdx new file mode 100644 index 000000000..b285f4b23 --- /dev/null +++ b/src/content/docs/enterprise/enterprise-features/byollm-aws-bedrock.mdx @@ -0,0 +1,375 @@ +--- +title: "BYOLLM: AWS Bedrock" +sidebar: + label: "BYOLLM: AWS Bedrock" +description: >- + Route Warp Agent inference through your AWS account with Bedrock BYOLLM, IAM + credentials, and AWS-billed inference. +--- +import { VARS } from '@data/vars'; + +Warp's **AWS Bedrock** BYOLLM integration routes agent inference through your own AWS account using **Amazon Bedrock**. Your team keeps using Warp's agents as usual, while eligible requests execute against Claude models hosted in your AWS account, billed to your AWS account and governed by your IAM controls. + +AWS Bedrock is one of the providers supported by [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/). For Google Cloud-based routing, see [BYOLLM: Gemini Enterprise](/enterprise/enterprise-features/byollm-gemini-enterprise/). + +:::note +BYOLLM is only available on Warp's Enterprise plan. [Contact sales](https://www.warp.dev/contact-sales) to learn more. +::: + +## Key features + +* **Cloud-native credentials** - No long-lived API keys. Interactive terminal sessions use each user's AWS CLI session credentials; cloud agent runs assume an IAM role in your AWS account via OIDC. +* **Admin-controlled IAM and model routing** - Admins define which IAM role(s) Warp can assume and which models are available via AWS Bedrock, with the ability to disable non-Bedrock model access entirely. +* **Consolidated billing** - Inference costs are billed directly to your AWS account, leveraging existing cloud commitments. + +## How it works + +{/* TODO: Add architecture diagram showing BYOLLM request flow (admin configures routing → user authenticates to AWS → Warp routes request → inference in customer AWS account) */} + +When BYOLLM is enabled, Warp redirects inference calls to your AWS Bedrock environment instead of using model providers' direct APIs. + +Here's the high-level flow: + +**Interactive terminal flow** + +1. **Admin configures routing** - Your team admin sets routing policies in Warp's admin settings (e.g., "Route Claude Opus 4.7 through AWS Bedrock; disable direct Anthropic API"). +2. **Team members authenticate** - Each team member authenticates to AWS locally using the AWS CLI (`aws login`). +3. **Warp routes requests** - When a team member uses an interactive agent in the terminal, Warp uses their short-lived session credentials to authenticate requests to your configured AWS Bedrock API endpoint. +4. **Inference executes in your cloud** - The model runs in your AWS account. Responses return to the Warp client. + +**Cloud agent flow** + +1. **Admin configures routing** - Your team admin configures BYOLLM in the Admin Panel and provides an IAM role ARN that Warp can assume. See [Enabling BYOLLM for cloud agents](#enabling-byollm-for-cloud-agents) for setup details. +2. **Warp assumes the role** - At run start, Warp mints an OIDC token and assumes the configured IAM role in your AWS account to obtain temporary credentials. +3. **Warp routes requests** - The cloud agent uses those temporary credentials to call your configured AWS Bedrock endpoint. +4. **Inference executes in your cloud** - The model runs in your AWS account. Responses return to the cloud agent worker. + +### Credential lifecycle + +BYOLLM uses **cloud-native IAM authentication**, not long-lived API keys: + +* **Automatic refresh** - Session tokens refresh automatically every ~15 minutes. Users can enable auto-refresh by opening **Settings** and searching for `AWS Bedrock`, or when prompted during first credential expiration. With auto-refresh enabled, sessions can run uninterrupted for up to 12 hours (depending on your AWS admin configuration). +* **Per-user credentials** - Credentials are not shared across the organization. Your cloud provider's default credential provider chain (e.g., AWS CLI) provisions and refreshes them locally. +* **No storage or logging** - Warp never stores or logs your cloud session tokens on its servers. + +This approach ensures access management stays with your cloud provider, giving admins member-by-member control. + +### Model availability + +BYOLLM supports the intersection of models that Warp supports and models available on your provider. On AWS Bedrock, only **Claude models** (Anthropic) are available; OpenAI and Google models are not available on Bedrock. To route Gemini models (or Claude partner models on Vertex AI) through your Google Cloud project, use [Gemini Enterprise BYOLLM](/enterprise/enterprise-features/byollm-gemini-enterprise/) instead. + +To determine which models you can use with BYOLLM: + +* [Model Choice](/agents/inference/model-choice/) - Full list of Warp-supported models. +* [Supported models in Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/model-cards.html) - AWS Bedrock model availability. + +A model must appear on both lists to be available through BYOLLM. + +## Enabling BYOLLM + +### Prerequisites + +Before configuring BYOLLM, confirm the following: + +* Your organization has the desired models enabled in AWS Bedrock. +* You have admin access to both Warp's [Admin Panel](/enterprise/team-management/admin-panel/) and your AWS IAM settings. +* Team members have the AWS CLI installed locally. + +### 1. Configure routing policies (admin) + +In the [Admin Panel](/enterprise/team-management/admin-panel/), configure which models should route through AWS Bedrock: + +1. From the [Admin Panel](/enterprise/team-management/admin-panel/), navigate to the **Models** page. +2. Select which models should use your cloud provider (e.g., "Claude Opus 4.7 via AWS Bedrock"). +3. Optionally, disable direct API access to enforce provider-only routing. + +### 2. Provision IAM roles (cloud admin) + +Grant your team members the necessary permissions in AWS. Use least-privilege IAM policies. + +**Example: AWS Bedrock minimum IAM policy** + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "BedrockModelAccess", + "Effect": "Allow", + "Action": [ + "bedrock:InvokeModel", + "bedrock:InvokeModelWithResponseStream" + ], + "Resource": [ + "arn:aws:bedrock:*::foundation-model/*", + "arn:aws:bedrock:*:*:inference-profile/*", + "arn:aws:bedrock:*:*:application-inference-profile/*" + ] + } + ] +} +``` + +:::note +This policy covers Warp's current usage. By default, Warp uses [global inference profiles](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html) for models when available. Admins can override the inference profile per model on the **Models** page of the [Admin Panel](/enterprise/team-management/admin-panel/). +::: + +### 3. Authenticate locally (team member) + +Each team member authenticates to AWS using the AWS CLI: + +```bash +aws login +``` + +Confirm your AWS environment and region are correctly configured before using Warp. + +### 4. Validate + +Run a test prompt in Warp using a model configured for BYOLLM routing. Verify: + +* The request completes successfully. +* Logs appear in AWS CloudWatch. + +## Enabling BYOLLM for cloud agents + +Cloud agents authenticate to AWS Bedrock differently from the local terminal flow above. Instead of relying on each user's AWS CLI session, Warp assumes an IAM role you provision in your AWS account using OIDC identity federation. + +### Prerequisites + +Before configuring BYOLLM for cloud agents, confirm the following: + +* You have admin access to both Warp's [Admin Panel](/enterprise/team-management/admin-panel/) and your AWS IAM settings. + +### 1. Set up Warp as an OIDC identity provider in AWS (cloud admin) + +Before AWS can trust tokens issued by Warp, register Warp as an OpenID Connect (OIDC) identity provider in IAM. This is a one-time setup per AWS account. + +1. Open the [Identity providers](https://console.aws.amazon.com/iam/home#/identity_providers) page in the AWS IAM console. +2. Click **Add provider**. +3. For **Provider type**, choose **OpenID Connect**. +4. For **Provider URL**, enter `https://app.warp.dev`. +5. For **Audience**, enter `sts.amazonaws.com`. +6. Click **Add provider**. + +After the provider is created, copy its ARN — it will look like `arn:aws:iam::<aws-account-id>:oidc-provider/app.warp.dev`. You'll reference this ARN in the trust policy in the next step. + +For more detail, see AWS's [Create an OpenID Connect (OIDC) identity provider in IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html) guide. + +### 2. Provision an assumable IAM role (cloud admin) + +Create an IAM role that Warp can assume via OIDC, then attach the minimum Bedrock permissions policy. Use least-privilege IAM policies. + +The role setup has two parts: + +1. A **trust policy** that allows Warp's OIDC identity to call `sts:AssumeRoleWithWebIdentity`. +2. A **permissions policy** that grants the minimum Bedrock inference permissions. + +#### Trust policy requirements + +This trust policy authorizes any cloud-hosted run from your team. The `sub` claim Warp signs has the shape `scoped_principal:<team-uid>/<actor-type>:<principal-uid>`, where `<actor-type>` is `user` for user-triggered runs or `service_account` for [cloud agent](/platform/agents/) runs. The `<team-uid>/*` pattern below covers both. + +**Example trust policy** + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam::<aws-account-id>:oidc-provider/app.warp.dev" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringLike": { + "app.warp.dev:sub": "scoped_principal:<team-uid>/*" + }, + "StringEquals": { + "app.warp.dev:aud": "sts.amazonaws.com" + } + } + } + ] +} +``` + +Replace the account ID, issuer host, and team UID with values for your environment. + +The `<team-uid>` is the Warp team UID for the team that will be allowed to assume this role. You can find it in your team's [Admin Panel](/enterprise/team-management/admin-panel/) URL as the path segment after `/admin/`. For example, in `https://app.warp.dev/admin/HzjUdNkg8Uiq8gp6FMgfxe/models`, the team UID is `HzjUdNkg8Uiq8gp6FMgfxe`. + +#### Permissions policy + +Attach the minimum Bedrock invoke permissions policy to the role: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "BedrockModelAccess", + "Effect": "Allow", + "Action": [ + "bedrock:InvokeModel", + "bedrock:InvokeModelWithResponseStream" + ], + "Resource": [ + "arn:aws:bedrock:*::foundation-model/*", + "arn:aws:bedrock:*:*:inference-profile/*", + "arn:aws:bedrock:*:*:application-inference-profile/*" + ] + } + ] +} +``` + +:::note +This policy covers Warp's current usage. By default, Warp uses [global inference profiles](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html) for models when available. Admins can override the inference profile per model on the **Models** page of the [Admin Panel](/enterprise/team-management/admin-panel/). +::: + +After you create the role, copy its ARN. You'll paste it into the **Models** page in the next step. + +### 3. Configure routing policies (admin) + +Attach the IAM role from Step 2 to your team or to a specific named agent. + +#### Option A: Team-wide + +This applies the OIDC role to all cloud agent runs on the team. + +1. In the [Admin Panel](/enterprise/team-management/admin-panel/), navigate to the **Models** page. +2. Under the **AWS Bedrock** host configuration, paste the IAM role ARN from Step 2 into the **Role ARN** field. +3. Select which models should route through AWS Bedrock. + +#### Option B: Per named agent + +This applies the OIDC role only to runs from a specific named agent. + +:::note +To safely test BYOLLM, configure it on a single named agent first. Misconfigurations scoped to one agent only affect that agent's runs, not the whole team. +::: + +In the {VARS.WEB_APP}: + +1. [Create a new agent](/platform/oz-web-app/#creating-a-new-agent) or edit an existing one. +2. In the agent form, expand the **AWS Bedrock** section. +3. Choose **Custom** and paste the IAM role ARN from Step 2. +4. Ensure the agent's default model is one that's enabled for Bedrock under the Admin Panel **Models** page. + +New runs for this agent will authenticate to Bedrock using the configured role. + +### 4. Validate the configuration + +Start a test cloud agent run using a model configured for BYOLLM routing. Verify: + +* The request completes successfully. +* Logs appear in AWS CloudWatch. + +## Routing and fallback behavior + +### Routing behavior + +Warp's agents automatically select the best model for your task while respecting your admin's routing policies. If you configure a model for BYOLLM, requests for that model route to AWS Bedrock. + +### Failover behavior + +If a BYOLLM request fails (e.g., due to role assumption errors, insufficient permissions, or provider quota limits), Warp attempts to fall back to the next available model your admin has enabled. + +For example, if Claude Opus 4.7 on Bedrock fails but your admin also enabled it via direct API, Warp falls back to the direct API to avoid disruption. If a fallback uses a direct API model, that request consumes Warp credits. + +If no fallback is available (e.g., the admin disabled all non-Bedrock models), Warp displays a clear error message. + +### Auto model selection + +Auto model selection is disabled if an admin disables **any** Direct API model, regardless of AWS Bedrock configuration. + +When Direct API models remain enabled and BYOLLM is configured, Auto picks the best model for the task. If the selected model is also enabled for AWS Bedrock, the request routes through Bedrock; otherwise it routes through the Direct API. + +## Billing behavior + +When a request routes through BYOLLM: + +* **Warp doesn't consume credits** for that request. +* Cloud agent runs still consume platform and compute credits for orchestration and the cloud agent's compute. + +See [The three credit buckets](/support-and-community/plans-and-billing/platform-credits/#the-three-credit-buckets) for more on credit types. + +## Security and data handling + +### Credential security + +* **No long-lived API keys** — BYOLLM uses cloud-native IAM with short-lived session tokens. +* **Per-user authentication** — Each team member authenticates individually; credentials are not shared. +* **No storage or logging** — Warp never stores or logs your cloud session tokens on its servers. + +### Zero Data Retention (ZDR) + +Warp maintains **SOC 2 compliance** and has **Zero Data Retention (ZDR)** agreements with its contracted LLM providers. + +However, when using BYOLLM: + +* **Your** cloud account settings determine data retention policies. +* Warp cannot enforce ZDR for requests routed through your infrastructure. +* If your cloud account does not have ZDR enabled, your provider may retain data according to their terms. + +### Auditability + +* Warp keeps all runs fully steerable and logged within Warp. +* Your cloud account retains provider-side logs (usage, latency, errors). + +## Troubleshooting + +### Common errors + +* **Missing or expired local credentials** (interactive terminal use) — Re-authenticate using `aws login`. To avoid interruptions, enable auto-refresh by opening **Settings** and searching for `AWS Bedrock`, or when prompted during credential expiration. +* **Role assumption failed** (cloud agent runs) — Verify the IAM trust policy, issuer host, team UID restriction, and the configured role ARN in Warp. +* **Missing OIDC provider** (cloud agent runs) — Confirm the OIDC provider exists in your AWS account for the issuer host referenced in the trust policy. +* **Insufficient permissions** — Verify your IAM policy includes the required Bedrock actions and any needed resources. +* **Region or model mismatch** — Confirm the model is enabled in your AWS region and that your environment is configured for the correct region. +* **Provider quota limits** — Check your AWS Bedrock quota and request increases if needed. + +### Debugging steps + +1. Confirm the configured role ARN is the one you intended Warp to assume. +2. Check the IAM trust policy and verify the issuer host, `sub`, and `aud` conditions match your Warp configuration. +3. Check the attached IAM policy for the required Bedrock permissions. +4. Confirm the model ID and region match your Warp configuration. +5. Inspect AWS CloudWatch logs for request details and errors. + +## FAQ + +### How is BYOLLM different from BYOK? + +**BYOK (Bring Your Own API Key)** lets individual users add their own API keys for direct model provider access (e.g., Anthropic, OpenAI, Google). Warp stores keys locally on the user's device. + +**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). + +| Feature | BYOK | BYOLLM | +| --- | --- | --- | +| Configuration level | User | Admin/Team | +| Authentication | API keys (local) | IAM role assumed by Warp via OIDC | +| Billing | Direct to provider | Your cloud account | +| Data locality | Provider infrastructure | Your cloud infrastructure | + +### What data does Warp store? Do you store our cloud credentials? + +Warp **does not store or log** your cloud credentials. + +* **Interactive terminal use** — Credentials are used transiently to sign requests and are never persisted on Warp servers. +* **Cloud agent runs** — Temporary AWS credentials are used only for the duration of the run and are not retained after it ends. + +### Can admins enforce provider-only routing and disable Warp-managed models? + +Yes. Admins can configure routing policies to require specific models to use BYOLLM and disable direct API access to Warp-managed model endpoints. + +## Related resources + +* [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 +* [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/byollm-gemini-enterprise.mdx b/src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx new file mode 100644 index 000000000..73c9b75de --- /dev/null +++ b/src/content/docs/enterprise/enterprise-features/byollm-gemini-enterprise.mdx @@ -0,0 +1,424 @@ +--- +title: "BYOLLM: Gemini Enterprise (Vertex AI)" +sidebar: + label: "BYOLLM: Gemini Enterprise" +description: >- + Route Warp Agent inference through your Google Cloud project with Gemini + Enterprise BYOLLM and short-lived WIF credentials. +--- + +Warp's **Gemini Enterprise** BYOLLM integration routes agent inference through your own Google Cloud project using **Vertex AI** (the Gemini Enterprise Agent Platform). Your team keeps using Warp's agents as usual, while eligible requests execute against models hosted in your GCP project, billed to your Google Cloud account and governed by your IAM controls. + +Gemini Enterprise is one of the providers supported by [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/). For AWS-based routing, see the [AWS Bedrock BYOLLM setup](/enterprise/enterprise-features/byollm-aws-bedrock/). + +:::note +Gemini Enterprise BYOLLM is only available on Warp's Enterprise plan. [Contact sales](https://www.warp.dev/contact-sales) to learn more. +::: + +:::caution +Gemini Enterprise BYOLLM currently applies to **interactive agent requests** in the Warp app. [Cloud agent](/platform/) runs don't route through Gemini Enterprise yet; cloud agent support is available today with [AWS Bedrock BYOLLM](/enterprise/enterprise-features/byollm-aws-bedrock/#enabling-byollm-for-cloud-agents). +::: + +## Key features + +* **Session-based federated authentication** - Warp uses the member's signed-in Warp session to issue a short-lived OIDC identity token, then exchanges it through Google Workload Identity Federation for temporary Google Cloud credentials. +* **Admin-controlled routing and models** - Admins configure the GCP project, Vertex location, and WIF provider once in the Admin Panel, then choose exactly which models are enabled and which Vertex model references they resolve to. +* **Gemini and Claude models** - Route native Gemini models and Claude partner models available on Vertex AI through your project. +* **Consolidated billing and quota attribution** - Inference runs against your project's Vertex AI quota and is billed to your Google Cloud account. Requests carry your project for quota attribution (`X-Goog-User-Project`). +* **No long-lived credentials** - Warp never stores service account keys, refresh tokens, or credential files. The client keeps only a short-lived Google Cloud access token in memory and automatically replaces it as it approaches expiration. + +## How it works + +When Gemini Enterprise is enabled, Warp redirects eligible inference calls to Vertex AI in your Google Cloud project instead of using model providers' direct APIs. + +Here's the high-level flow: + +1. **Admin configures routing** - Your team admin enables the Gemini Enterprise host on the **Models** page of the [Admin Panel](/enterprise/team-management/admin-panel/) and sets the GCP project, Vertex location, and WIF provider audience string. +2. **Members enable credentials** - Each signed-in member turns on **Use Gemini Enterprise credentials** in Warp's Settings (or the admin enforces it team-wide). +3. **Warp mints a short-lived token** - The Warp client exchanges a Warp-signed identity token for a short-lived Google Cloud access token via Google's Security Token Service (STS), optionally impersonating a service account you designate. +4. **Warp routes requests** - Eligible agent requests carry that access token, and Warp's backend uses it to call Vertex AI in your project with the configured location and model reference. +5. **Inference executes in your cloud** - The model runs in your GCP project. Responses stream back to the Warp client. + +### Credential lifecycle + +Gemini Enterprise uses **federated, short-lived credentials** instead of API keys or local cloud CLI sessions: + +* **Rooted in the Warp session** - Each mint starts from the member's signed-in Warp session. Warp issues a signed OpenID Connect (OIDC) token, exchanges it at Google STS for a federated access token, and, if configured, impersonates your designated service account. +* **Automatic refresh** - Tokens are held in memory and refreshed automatically about five minutes before they expire. Members don't need to re-authenticate during normal use. +* **Strict binding** - A minted token is only attached to requests while the signed-in user and the admin's WIF configuration still match. Signing out, switching accounts, or admin configuration changes invalidate it. +* **No storage or logging** - The client never uploads refresh tokens, credential JSON, or service account keys, and Warp's servers never persist or log the access token. + +### Model availability + +Gemini Enterprise supports the intersection of models that Warp supports and models available through Vertex AI in your project: + +* **Native Gemini models** - Current Gemini Flash, Flash Lite, and Pro families (for example, Gemini 3.1 Pro and Gemini 3.7 Flash). +* **Claude partner models on Vertex AI** - Current Claude Sonnet, Opus, Haiku, and Fable families offered as Vertex AI partner models. + +To determine which models you can use, see [Model Choice](/agents/inference/model-choice/) for Warp's supported models and the **Models** page of the Admin Panel for your team's Gemini Enterprise enablement. + +## Enabling Gemini Enterprise + +Setting up Gemini Enterprise has two parts: + +1. **In Google Cloud** - Trust identities issued by Warp, then grant them permission to call Vertex AI. +2. **In Warp** - Point the Admin Panel at your project and choose which models route through it. + +Access is granted through **Workload Identity Federation**, so no long-lived service account key is ever created or shared with Warp. Step 2 covers two ways to grant that access: directly to your federated Warp identities, or through a service account you designate. + +:::note +The Google Cloud steps use the Google Cloud console. If you prefer the command line, see [Alternative: configure Google Cloud with the gcloud CLI](#alternative-configure-google-cloud-with-the-gcloud-cli). +::: + +### Prerequisites + +Before configuring Gemini Enterprise, confirm the following: + +* You have a Google Cloud project that will own inference, quota, and billing. +* The Vertex AI API (`aiplatform.googleapis.com`) is enabled in that project. +* The models you plan to route are available to the project. Claude partner models must be enabled in the Vertex AI Model Garden. +* You can create Workload Identity Federation pools and providers and modify the project's IAM policy. To use service account impersonation in Step 2, you also need permission to create service accounts. +* You have administrator access to Warp's [Admin Panel](/enterprise/team-management/admin-panel/). + +### Values you'll need + +Collect these values before you start. You'll reuse them across Google Cloud and Warp. + +* **`PROJECT_ID`** - Your Google Cloud project's alphanumeric identifier, such as `my-gcp-project`. +* **`PROJECT_NUMBER`** - Your Google Cloud project's numeric identifier, such as `123456789012`. Both identifiers appear on the **Welcome** page of the Google Cloud console. +* **`TEAM_UID`** - Your Warp team UID, which is the path segment immediately after `/admin/` in your Admin Panel URL. In `https://app.warp.dev/admin/HzjUdNkg8Uiq8gp6FMgfxe/models`, the team UID is `HzjUdNkg8Uiq8gp6FMgfxe`. +* **`POOL_ID`** and **`PROVIDER_ID`** - Names you choose for the workload identity pool and provider you create in Step 1, such as `warp-byollm` and `warp`. + +### 1. Create a workload identity pool and provider (cloud admin) + +Before Google Cloud accepts identity tokens issued by Warp, register Warp as an OIDC identity provider in a workload identity pool. + +A workload identity pool provides a namespace for external identities. The provider inside that pool tells Google Cloud how to validate and interpret the OIDC tokens Warp issues. + +Warp-issued OIDC tokens carry these claims: + +* **`sub`** - Identifies the Warp actor, shaped as `scoped_principal:TEAM_UID/ACTOR_TYPE:PRINCIPAL_UID`. For interactive requests, `ACTOR_TYPE` is `user`. +* **`teams`** - Lists the Warp team UIDs the actor belongs to. Mapping this claim to `google.groups` lets you grant a role to an entire Warp team with a single IAM binding. + +#### Create the pool + +1. In the Google Cloud console, go to **IAM & Admin** > **Workload Identity Federation**. +2. Click **Create pool**. +3. For **Name**, enter your `POOL_ID` value, then click **Continue**. + +If your organization already has a suitable pool, skip this step and create the Warp provider inside the existing pool instead. + +#### Create the provider + +Continue in the **Add a provider to pool** step: + +1. For **Select a provider**, choose **OpenID Connect (OIDC)**. +2. For **Provider name**, enter your `PROVIDER_ID` value. +3. For **Issuer (URL)**, enter `https://app.warp.dev`. +4. Leave **Audience** set to **Default audience**, then click **Continue**. + +The default audience requires Warp's OIDC token to name this provider in its `aud` claim, which takes this canonical form: + +```text +https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID +``` + +You'll enter a variation of this value in Warp in Step 3. + +#### Configure attribute mappings + +In **Configure provider attributes**, add both mappings exactly as shown: + +| Google attribute | OIDC expression | +| --- | --- | +| `google.subject` | `assertion.sub` | +| `google.groups` | `assertion.teams` | + +#### Restrict the provider to your Warp team + +Turn on **Attribute conditions** and enter the following expression, replacing `TEAM_UID` with your Warp team UID: + +```text +"TEAM_UID" in assertion.teams +``` + +This rejects any Warp-issued token that doesn't belong to your team. Click **Save**. + +The provider now appears in the pool and is ready to exchange tokens. + +### 2. Grant Vertex AI access to your Warp team (cloud admin) + +The provider you created controls which Warp tokens Google Cloud accepts. Now grant permissions to the identities those tokens represent. Choose one of the following approaches: + +* **Option A (Recommended): Direct federated access** - Grants roles straight to your federated Warp identities. +* **Option B: Service account impersonation** - Routes access through a dedicated service account. + +Neither option creates a long-lived service account key, and Warp never receives one. + +#### Option A: Direct federated access (recommended) + +1. In the Google Cloud console, go to **IAM & Admin** > **IAM**, then click **Grant access**. +2. For **New principals**, enter your team's principal set, substituting your own values: + + ```text + principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/TEAM_UID + ``` + +3. Assign both of the following roles, then click **Save**: + * **Vertex AI User** (`roles/aiplatform.user`) - Allows Vertex AI inference calls. For stricter least privilege, create a custom role that contains only `aiplatform.endpoints.predict` and assign that role instead. + * **Service Usage Consumer** (`roles/serviceusage.serviceUsageConsumer`) - Lets the federated identity draw quota and billing from your project. + +The principal set now appears in the project's IAM policy with both roles attached. Leave **Service account email** blank in Step 3. + +#### Option B: Service account impersonation (optional) + +1. In the Google Cloud console, go to **IAM & Admin** > **Service Accounts**, then click **Create service account**. +2. Enter a name for the account, such as `warp-byollm-sa`, then click **Create and continue**. +3. Grant the service account the **Vertex AI User** (`roles/aiplatform.user`) and **Service Usage Consumer** (`roles/serviceusage.serviceUsageConsumer`) roles on your project, then click **Done**. +4. Select the service account, open the **Principals with access** tab, then click **Grant access**. +5. For **New principals**, enter your team's principal set: + + ```text + principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/TEAM_UID + ``` + +6. Assign the **Workload Identity User** role (`roles/iam.workloadIdentityUser`), then click **Save**. +7. Go to **APIs & Services** > **Library**, search for **IAM Service Account Credentials API**, and click **Enable** so Warp can request impersonated tokens. + +Copy the service account's email address, such as `warp-byollm-sa@PROJECT_ID.iam.gserviceaccount.com`. You'll enter it in Step 3. + +Warp never receives the service account's keys. Each request carries a short-lived impersonated token that the client mints at request time. + +### 3. Configure routing in the Admin Panel (Warp admin) + +Connect Warp to the Google Cloud configuration you just created: + +1. In the [Admin Panel](https://app.warp.dev/admin/), go to the **Models** page. +2. Find the **Gemini Enterprise** host configuration and enable it. +3. For **GCP project ID**, enter your `PROJECT_ID` value. +4. For **Location**, choose the Vertex AI location that should serve requests. +5. For **WIF audience**, enter the provider resource name in this form: + + ```text + //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID + ``` + +6. For **Service account email**, leave the field blank if you chose Option A, or enter the service account's email if you chose Option B. +7. Enable the models that should route through your project, then save. + +:::caution +The **WIF audience** must begin with `//iam.googleapis.com/`, not `https://`. Don't include a trailing slash, surrounding quotation marks, or trailing whitespace. +::: + +The default location is `global`. Multi-region values (`global`, `us`, `eu`) and specific regions (for example, `us-central1`) are supported. The location applies host-wide to every Gemini Enterprise model. + +You can also choose how member credentials behave: + +* **Enforce** - Every signed-in member's client uses Gemini Enterprise credentials automatically, and the member toggle is managed by the organization. +* **Respect user setting** - Each member opts in with the **Use Gemini Enterprise credentials** toggle in their Settings. + +To enforce provider-only routing, disable **Direct API** access for the models you enabled. + +### 4. Validate + +Run a test prompt in Warp using a model enabled for Gemini Enterprise. Verify: + +* The model shows the Gemini Enterprise badge in the model picker. +* The request completes successfully. +* The request appears in your project's Vertex AI monitoring or Cloud Logging. + +### Alternative: configure Google Cloud with the gcloud CLI + +If you prefer the command line, these commands replace Step 1 and Step 2, Option A. Step 3 in the Admin Panel is still required either way. + +Set your values once so the commands below can reuse them: + +```bash +export PROJECT_ID="my-gcp-project" +export PROJECT_NUMBER="123456789012" +export POOL_ID="warp-byollm" +export PROVIDER_ID="warp" +export TEAM_UID="HzjUdNkg8Uiq8gp6FMgfxe" +``` + +Enable the Vertex AI API: + +```bash +gcloud services enable aiplatform.googleapis.com \ + --project="${PROJECT_ID}" +``` + +Create the workload identity pool: + +```bash +gcloud iam workload-identity-pools create "${POOL_ID}" \ + --project="${PROJECT_ID}" \ + --location="global" \ + --display-name="Warp BYOLLM" +``` + +Create the OIDC provider: + +```bash +gcloud iam workload-identity-pools providers create-oidc "${PROVIDER_ID}" \ + --project="${PROJECT_ID}" \ + --location="global" \ + --workload-identity-pool="${POOL_ID}" \ + --display-name="Warp" \ + --issuer-uri="https://app.warp.dev" \ + --attribute-mapping="google.subject=assertion.sub,google.groups=assertion.teams" \ + --attribute-condition="'${TEAM_UID}' in assertion.teams" +``` + +Grant the Vertex AI role. For stricter least privilege, substitute a custom role that contains only `aiplatform.endpoints.predict`: + +```bash +gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ + --member="principalSet://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${POOL_ID}/group/${TEAM_UID}" \ + --role="roles/aiplatform.user" +``` + +Grant the Service Usage Consumer role: + +```bash +gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ + --member="principalSet://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${POOL_ID}/group/${TEAM_UID}" \ + --role="roles/serviceusage.serviceUsageConsumer" +``` + +Retrieve the provider resource name for the **WIF audience** field: + +```bash +gcloud iam workload-identity-pools providers describe "${PROVIDER_ID}" \ + --project="${PROJECT_ID}" \ + --location="global" \ + --workload-identity-pool="${POOL_ID}" \ + --format="value(name)" +``` + +The command returns a value in this form: + +```text +projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID +``` + +Prefix that value with `//iam.googleapis.com/` and enter the result as the **WIF audience** in Warp: + +```text +//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID +``` + +## Using Gemini Enterprise as a team member + +Members need to be signed in to Warp; the credential flow is rooted in the Warp session, so Gemini Enterprise isn't available to logged-out users. + +1. In the Warp app, go to **Settings** > **Agents** > **Warp Agent** and scroll to the **Gemini Enterprise** section. The section appears once your admin has enabled the host. +2. Toggle **Use Gemini Enterprise credentials** on. If your admin enforces credentials team-wide, the toggle is already on and managed by your organization. +3. Check the credential status card. It shows the current state (for example, loaded with the next scheduled refresh, refreshing, setup incomplete, or a failure) and a **Refresh** button to force a new credential mint. +4. Pick an eligible model in the model picker. Models routed through your project show a Gemini Enterprise badge. + +If the status card reports that setup is incomplete, your workspace's Gemini Enterprise host is enabled but not fully configured; contact your team admin. + +## Routing and fallback behavior + +### Host priority + +For each request, Warp expands the selected model into the hosts your admin has enabled and tries them in a fixed order: + +1. AWS Bedrock +2. Gemini Enterprise +3. Direct API + +The priority is fixed and not admin-configurable. A Gemini Enterprise route is only used when the request carries valid Gemini Enterprise credentials; otherwise Warp falls back to the next enabled host. + +### Failover behavior + +If a Gemini Enterprise request fails (for example, due to IAM misconfiguration or Vertex AI quota limits), Warp attempts to fall back to the next available host your admin has enabled. If a fallback uses a Direct API model, that request consumes Warp credits. If no fallback is available, Warp displays a clear error message. + +### Auto model selection + +Auto model selection is disabled if an admin disables **any** Direct API model, regardless of Gemini Enterprise configuration. When Direct API models remain enabled, Auto picks the best model for the task; if the selected model is enabled for Gemini Enterprise and your credentials are active, the request routes through your project. + +## Billing behavior + +When a request routes through Gemini Enterprise: + +* **Warp doesn't consume AI credits** for that request. Inference is billed by Google Cloud to your project. +* **Platform credits still apply** - On Business and Enterprise plans, local agent runs that use customer-supplied inference consume [platform credits](/support-and-community/plans-and-billing/platform-credits/) for Warp's platform infrastructure. +* **Fallbacks are billed normally** - A request that falls back to a Direct API model consumes Warp credits at the standard rate. + +See [The three credit buckets](/support-and-community/plans-and-billing/platform-credits/#the-three-credit-buckets) for more on credit types. + +## Security and data handling + +### Credential security + +* **No long-lived credentials** - The only long-lived credential involved is the member's Warp session. Access tokens are short-lived, held in memory, and never persisted. +* **Nothing sensitive leaves your boundary** - Warp stores only non-secret routing configuration (project ID, location, WIF audience, and optional service account email). Service account keys, refresh tokens, and credential files are never uploaded to Warp. +* **Per-user identity** - Every token is minted for the individual signed-in member, so access control and revocation stay in your identity stack: remove a member from your Warp team (or restrict the WIF provider's attribute condition) and their tokens stop minting. + +### Zero Data Retention (ZDR) + +Warp maintains **SOC 2 compliance** and has **Zero Data Retention (ZDR)** agreements with its contracted LLM providers. + +However, when using Gemini Enterprise: + +* **Your** Google Cloud project settings determine data retention policies. +* Warp cannot enforce ZDR for requests routed through your infrastructure. +* Review Vertex AI's data governance settings for your project to control retention. + +### Auditability + +* Warp keeps all conversations fully steerable and logged within Warp. +* Your GCP project retains provider-side logs (usage, latency, errors) in Vertex AI monitoring and Cloud Logging, attributed to your project. + +## Troubleshooting + +### Common errors + +* **Credentials expired or invalid** - The request reached Vertex AI but was rejected as unauthenticated. Click **Refresh credentials** in the inline error, or use the **Refresh** button in **Settings** > **Agents** > **Warp Agent**, then retry. +* **Setup incomplete** - The host is enabled but the WIF audience is missing or blank. A team admin needs to complete the **Models** page configuration. +* **Token exchange or impersonation failed** - Verify the WIF provider's issuer (`https://app.warp.dev`), both attribute mappings, and the attribute condition. Confirm your Warp team UID in the condition matches the one in your Admin Panel URL exactly. With service account impersonation, also confirm the principal set holds `roles/iam.workloadIdentityUser` on the service account and that the IAM Service Account Credentials API is enabled. +* **Permission denied from Vertex AI** - Confirm that `roles/aiplatform.user` and `roles/serviceusage.serviceUsageConsumer` are granted on the project, to the principal set for direct access or to the service account for impersonation. +* **Model not found** - Confirm the model is available in your configured location and, for Claude partner models, enabled in the Vertex AI Model Garden. Check any per-model reference overrides on the **Models** page. +* **Provider quota limits** - Check your project's Vertex AI quotas and request increases if needed. + +### Debugging steps + +1. Confirm the WIF audience in the Admin Panel exactly matches the provider's full resource name. +2. Check the credential status card in **Settings** > **Agents** > **Warp Agent** for the failing state and recovery action. +3. Verify the IAM bindings for the principal set, and for the service account if you use impersonation, in your GCP project. +4. Confirm the model reference and location match what's available in your project. +5. Inspect Cloud Logging in your project for request details and errors. + +## FAQ + +### How is this different from BYOK with a Google API key? + +**BYOK** routes requests to the Gemini Developer API using a personal API key stored on each member's device. **Gemini Enterprise BYOLLM** routes requests to Vertex AI in your organization's GCP project using short-lived federated credentials, configured centrally by an admin, with your project's IAM, quota, and billing. See [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) for the self-serve option. + +### Do members need the gcloud CLI installed? + +No. Unlike [AWS Bedrock BYOLLM](/enterprise/enterprise-features/byollm-aws-bedrock/), which uses each member's local AWS CLI session, Gemini Enterprise mints credentials from the member's signed-in Warp session. No local Google tooling or configuration is required. Admins can optionally use the gcloud CLI for the one-time Google Cloud setup, but it isn't required. + +### Does Gemini Enterprise work with cloud agents? + +Not yet. Gemini Enterprise currently routes interactive agent requests in the Warp app. Cloud agent BYOLLM is available today through [AWS Bedrock](/enterprise/enterprise-features/byollm-aws-bedrock/#enabling-byollm-for-cloud-agents), and Gemini Enterprise support for cloud agents is planned. + +### Which Claude models route through my project? + +Claude models offered as Vertex AI partner models (current Sonnet, Opus, Haiku, and Fable families) can route through Gemini Enterprise when your admin enables them. Eligible models show the Gemini Enterprise badge in the model picker. This is unrelated to any routing Warp does through its own infrastructure for Warp-billed requests. + +### Can admins enforce provider-only routing? + +Yes. Admins can disable Direct API access for models on the **Models** page so eligible requests only route through your project. Note that disabling any Direct API model also disables Auto model selection. + +## Related resources + +* [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) - BYOLLM overview and provider comparison +* [BYOLLM: AWS Bedrock](/enterprise/enterprise-features/byollm-aws-bedrock/) - Route inference through your AWS account +* [Team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) - Admin-configured shared provider keys and custom endpoints +* [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) - Self-serve, user-level API keys +* [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 e88e723fe..acc804e2e 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 @@ -1,12 +1,12 @@ --- title: Team-managed LLM API keys and endpoints description: >- - Configure shared LLM provider API keys and custom inference endpoints for your whole team - from the Admin Panel, available in both interactive sessions and cloud agents. + Configure shared LLM provider API keys and custom endpoints for your team from + the Admin Panel, including cloud agents. --- import VideoEmbed from '@components/VideoEmbed.astro'; -Warp lets an **Enterprise team admin** configure shared provider API keys and OpenAI-compatible custom endpoints once, so every member can use them without pasting anything locally. Unlike the self-serve [Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/) and [custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/) features — which each member configures on their own device and which work only for interactive requests — team-managed providers are stored server-side by Warp and work for **both interactive terminal requests and [cloud agents](/platform/)**. +Warp lets an **Enterprise team admin** configure shared provider API keys and OpenAI-compatible custom endpoints once, so every member can use them without pasting anything locally. Unlike the self-serve [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) and [custom inference endpoint](/agents/inference/custom-inference-endpoint/) features — which each member configures on their own device and which work only for interactive requests — team-managed providers are stored server-side by Warp and work for **both interactive terminal requests and [cloud agents](/platform/)**. This gives your organization one place to provision approved model providers, control spend, and keep inference on your own accounts across your whole team. @@ -22,7 +22,7 @@ Team-managed API keys and endpoints are available only on Warp's Enterprise plan * **Works for interactive sessions and cloud agents** - Because credentials are stored by Warp, team-managed providers power both interactive terminal requests and cloud agent runs. Self-serve, member-managed keys and endpoints are stored locally and passed to Warp only in-flight for interactive requests, so they aren't available to cloud agents. * **First-party keys and custom endpoints** - Configure API keys for OpenAI, Anthropic, and Google, and add one or more OpenAI-compatible custom endpoints (for example, OpenRouter or LiteLLM). * **Secrets stored server-side, never synced to devices** - Keys and endpoint URLs are encrypted and stored by Warp. They're never synced to member devices and never delivered to cloud agent environments. -* **Optional member-managed keys** - Admins choose whether members may also add their own [self-serve API keys](/agent-platform/inference/bring-your-own-api-key/) and [custom endpoints](/agent-platform/inference/custom-inference-endpoint/) on top of the team's. +* **Optional member-managed keys** - Admins choose whether members may also add their own [self-serve API keys](/agents/inference/bring-your-own-api-key/) and [custom endpoints](/agents/inference/custom-inference-endpoint/) on top of the team's. * **Member key precedence** - When a member has their own key for the same provider, their key is used instead of the team's. (Custom endpoints don't need precedence — a member's endpoint and a team endpoint are always distinct.) ## How team-managed providers differ from self-serve BYOK and BYOLLM @@ -32,11 +32,12 @@ Warp offers several ways to bring your own AI infrastructure. Use this table to | Name | Configured by | Stored | Works with cloud agents | Plans | | --- | --- | --- | --- | --- | | **Team-managed API keys and endpoints** | Team admin (Admin Panel) | Server-side by Warp | Yes | Enterprise only | -| **[Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/)** (BYOK) | Each member | Locally on the member's device | No | Free and all eligible paid plans | -| **[Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/)** | Each member | Locally on the member's device | No | Free and all eligible paid plans | -| **[Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/)** (BYOLLM) | Team admin (Admin Panel) | Cloud-native IAM (no stored keys) | Yes | Enterprise only | +| **[Bring Your Own API Key](/agents/inference/bring-your-own-api-key/)** (BYOK) | Each member | Locally on the member's device | No | Free and all eligible paid plans | +| **[Custom inference endpoint](/agents/inference/custom-inference-endpoint/)** | Each member | Locally on the member's device | No | Free and all eligible paid plans | +| **[BYOLLM — AWS Bedrock](/enterprise/enterprise-features/byollm-aws-bedrock/)** | Team admin (Admin Panel) | Cloud-native IAM (no stored keys) | Yes | Enterprise only | +| **[BYOLLM — Gemini Enterprise](/enterprise/enterprise-features/byollm-gemini-enterprise/)** | Team admin (Admin Panel) | Cloud-native IAM (no stored keys) | No (interactive sessions only) | Enterprise only | -Team-managed API keys and endpoints and [BYOLLM](/enterprise/enterprise-features/bring-your-own-llm/) are both Enterprise, admin-configured options. Choose team-managed keys and endpoints to route through provider APIs (OpenAI, Anthropic, Google) or any OpenAI-compatible endpoint using stored keys. Choose BYOLLM to route through your own AWS Bedrock environment using cloud-native IAM instead of long-lived keys. +Team-managed API keys and endpoints and BYOLLM are both Enterprise, admin-configured options. Choose team-managed keys and endpoints to route through provider APIs (OpenAI, Anthropic, Google) or any OpenAI-compatible endpoint using stored keys. Choose [AWS Bedrock BYOLLM](/enterprise/enterprise-features/byollm-aws-bedrock/) for cloud-native IAM routing through your AWS account, including cloud agent support. Choose [Gemini Enterprise BYOLLM](/enterprise/enterprise-features/byollm-gemini-enterprise/) for cloud-native IAM routing through your Google Cloud project; in this iteration, Gemini Enterprise BYOLLM supports interactive sessions only, with cloud agent support planned. ## How it works @@ -87,7 +88,7 @@ Configure team providers from the [Admin Panel](/enterprise/team-management/admi Saved configuration propagates to members the next time their client loads team settings — the team's providers appear in their model picker, and disabled endpoints or models are removed automatically. :::note -A team endpoint's base URL must be reachable from Warp's servers over the public internet, because requests route through Warp's backend. Expose an internal gateway at a public HTTPS URL before adding it. See [Network requirements](/agent-platform/inference/custom-inference-endpoint/#network-requirements) for details. +A team endpoint's base URL must be reachable from Warp's servers over the public internet, because requests route through Warp's backend. Expose an internal gateway at a public HTTPS URL before adding it. See [Network requirements](/agents/inference/custom-inference-endpoint/#network-requirements) for details. ::: ### Keep inference on your team's providers @@ -101,12 +102,12 @@ Members don't configure anything for team providers — they just select a model * **Custom endpoints** - Each enabled team endpoint model appears in the model picker as its own entry, showing the model's name (or alias) and the endpoint name. Members select it like any other model. * **First-party keys** - Members select the standard model for a provider (for example, a Claude, GPT, or Gemini model), and requests route through the team key automatically. If a member has added their own key for that provider, their own key takes precedence. -If the admin allows members to add their own keys and endpoints, members can still do so through the standard self-serve [BYOK](/agent-platform/inference/bring-your-own-api-key/) and [custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/) settings. +If the admin allows members to add their own keys and endpoints, members can still do so through the standard self-serve [BYOK](/agents/inference/bring-your-own-api-key/) and [custom inference endpoint](/agents/inference/custom-inference-endpoint/) settings. ## Billing behavior * **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](/agent-platform/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. +* **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. See [The three credit buckets](/support-and-community/plans-and-billing/platform-credits/#the-three-credit-buckets) for more on credit types. @@ -127,9 +128,9 @@ Warp is **SOC 2 compliant** and has **Zero Data Retention (ZDR)** agreements wit ## Related resources -* [Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/) — Self-serve, user-level API keys for OpenAI, Anthropic, and Google. -* [Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/) — Self-serve, user-level OpenAI-compatible endpoints. -* [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) — Enterprise inference through your AWS Bedrock environment using cloud-native IAM. +* [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) — Self-serve, user-level API keys for OpenAI, Anthropic, and Google. +* [Custom inference endpoint](/agents/inference/custom-inference-endpoint/) — Self-serve, user-level OpenAI-compatible endpoints. +* [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) — BYOLLM overview: route inference through [AWS Bedrock](/enterprise/enterprise-features/byollm-aws-bedrock/) or [Gemini Enterprise (Vertex AI)](/enterprise/enterprise-features/byollm-gemini-enterprise/). * [Admin Panel](/enterprise/team-management/admin-panel/) — Configure team settings and model routing. -* [Model Choice](/agent-platform/inference/model-choice/) — Full list of supported models. +* [Model Choice](/agents/inference/model-choice/) — Full list of supported models. * [Contact sales](https://www.warp.dev/contact-sales) — Get help with Enterprise setup. diff --git a/src/content/docs/enterprise/getting-started/getting-started-developers.mdx b/src/content/docs/enterprise/getting-started/getting-started-developers.mdx index 87a65d2c9..f434a7084 100644 --- a/src/content/docs/enterprise/getting-started/getting-started-developers.mdx +++ b/src/content/docs/enterprise/getting-started/getting-started-developers.mdx @@ -4,10 +4,11 @@ description: >- Download Warp, log in to your team, and start using agents, Codebase Context, and collaborative features to accelerate your development workflow. --- +import { VARS } from '@data/vars'; This guide helps developers get up and running with their team in Warp. You'll learn how to download Warp, log in with your organization's SSO, and configure key features like Codebase Context, Warp Drive, and Agent Profiles to accelerate your work across the entire SDLC (all while staying in your terminal). -When you use agents in Warp, you're working with **Warp's built-in agents**. Oz is Warp's programmable platform for running and coordinating agents at scale, whether they run locally on your machine or in the cloud. Oz provides the orchestration, tracking, and control plane that makes scaling agent workflows seamless. +When you use agents in Warp, you're working with **Warp's built-in agents**. The {VARS.WARP_AUTOMATION_PLATFORM} is Warp's programmable system for running and coordinating agents at scale, whether they run locally on your machine or in the cloud. The {VARS.WARP_AUTOMATION_PLATFORM} provides the orchestration, tracking, and control plane for scaling agent workflows. :::note New to Warp Enterprise? Try the [Enterprise quickstart](/enterprise/getting-started/quickstart/) for a 10-minute walkthrough of SSO login, Warp setup, and running your first agent. @@ -250,7 +251,7 @@ For common login, SSO, and access issues, see the [Enterprise FAQ](/enterprise/g Now that you're set up: -* **Explore agent capabilities** - Learn about [agents in Warp](/agent-platform/local-agents/overview/) and [cloud agents](/platform/) +* **Explore agent capabilities** - Learn about [agents in Warp](/agents/) and [cloud agents](/platform/) * **Contribute to team knowledge** - Add useful Workflows, Prompts, and Rules to your team's Warp Drive to compound productivity gains across your team * **Stay updated** - Check the [Warp changelog](/changelog/) for new features 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 e3a1fb976..c21fb46bc 100644 --- a/src/content/docs/enterprise/getting-started/getting-started-enterprise.mdx +++ b/src/content/docs/enterprise/getting-started/getting-started-enterprise.mdx @@ -111,7 +111,7 @@ Alternatively, visit the [Warp Admin Panel](https://app.warp.dev/admin) directly * **Billing** - View your plan type and AI usage limit information * **Teams** - Manage team members, roles, and invites — the same controls available in **Settings** > **Teams** in the Warp app * **AI** - Configure general and AI autonomy settings for your team -* **Models** - Configure which models are available to your team and AWS Bedrock +* **Models** - Configure which models are available to your team, plus BYOLLM routing through AWS Bedrock or Gemini Enterprise * **Code** - Enable Codebase Context for your team * **Platform** - Configure cloud agent settings * **Privacy** - Configure user-generated content data collection, cloud conversation storage, and enterprise secret redaction @@ -153,14 +153,14 @@ Connect Warp to your team's tools for enhanced agent context. Navigate to **Sett Once configured, click the share icon on a server to make it available to your team. -See the [MCP documentation](/agent-platform/capabilities/mcp/) for full configuration details. +See the [MCP documentation](/agents/capabilities/mcp/) for full configuration details. ## Next steps Once your team is set up: * **For developers** - Share the [Getting started for developers](/enterprise/getting-started/getting-started-developers/) guide with your team -* **Agent Profiles** - Configure default [Agent Profiles](/agent-platform/capabilities/agent-profiles-permissions/) for different types of work to give teams appropriate autonomy and control +* **Agent Profiles** - Configure default [Agent Profiles](/agents/capabilities/agent-profiles-permissions/) for different types of work to give teams appropriate autonomy and control * **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 diff --git a/src/content/docs/enterprise/getting-started/quickstart.mdx b/src/content/docs/enterprise/getting-started/quickstart.mdx index 073248e76..3142c8644 100644 --- a/src/content/docs/enterprise/getting-started/quickstart.mdx +++ b/src/content/docs/enterprise/getting-started/quickstart.mdx @@ -6,6 +6,7 @@ description: >- sidebar: label: "Quickstart" --- +import { VARS } from '@data/vars'; This quickstart walks you through the essentials: logging in via SSO, setting up Warp, and running your first agent. You can complete this in under 10 minutes. @@ -34,7 +35,7 @@ If you have an existing Warp account from before your organization enabled SSO, ## 3. Configure and run your first agent -When you use agents in Warp, you're working with **Warp's built-in agents**. Oz is Warp's programmable platform for running and coordinating agents at scale, whether they run locally on your machine or in the cloud. +When you use Agent Mode in Warp, you're working with the Warp Agent, Warp's built-in agent. The {VARS.WARP_AUTOMATION_PLATFORM} is Warp's programmable system for running and coordinating agents at scale, whether they run locally on your machine or in the cloud. ### Index your codebase @@ -51,14 +52,14 @@ Start a conversation right in the terminal. Try the following prompt: Explain the architecture of this project ``` -Oz reads your codebase, understands its structure, and responds with a context-aware explanation. +The Warp Agent reads your codebase, understands its structure, and responds with a context-aware explanation. ### Try more prompts * **Write code** - "Add input validation to the signup form" * **Debug** - "Why is this test failing?" (paste the error output) * **Explore** - "What patterns does this repo use for error handling?" -* **Plan** - Use `/plan` to have Oz create a structured task plan for complex features +* **Plan** - Use `/plan` to have the Warp Agent create a structured task plan for complex features ## 4. Run a cloud agent @@ -76,7 +77,7 @@ From the Warp app terminal input, run the command: ``` This launches an interactive flow that guides you through environment setup. -**Option 2: Oz web app** +**Option 2: {VARS.WEB_APP}** Go to the [Environments page](https://app.warp.dev/environments) and click **Create Environment**. @@ -88,7 +89,7 @@ Once your environment is ready, use the following command to launch a cloud agen oz agent run-cloud --env my-env --prompt "Review the open PRs in this repo" ``` -Monitor and steer cloud agents from the Oz dashboard or directly in Warp. +Monitor and steer your agents from the {VARS.DASHBOARD} or directly in Warp. ## Next steps diff --git a/src/content/docs/enterprise/index.mdx b/src/content/docs/enterprise/index.mdx index f0b86e04c..c2945eebf 100644 --- a/src/content/docs/enterprise/index.mdx +++ b/src/content/docs/enterprise/index.mdx @@ -4,13 +4,15 @@ description: >- Warp Enterprise provides the security, control, and collaboration features organizations need to deploy Warp across their engineering teams at scale. --- +import { VARS } from '@data/vars'; Warp Enterprise is built for organizations that want to accelerate software development with agents while maintaining security, compliance, and administrative control. It brings Warp's **Agentic Development Environment** to your entire engineering organization with the governance features IT and security teams require. -Warp has two core products: +Warp has three products: * **Warp Terminal** - A modern terminal designed for agentic development where developers run commands, collaborate with agents, and orchestrate autonomous work from the command line. -* **Oz** - Warp's programmable platform for running and coordinating agents at scale. Oz powers all agents in Warp, whether they run locally or in the cloud, and provides the orchestration, tracking, and control plane for scalable agent workflows. +* **{VARS.WARP_AUTOMATION_PLATFORM}** - Warp's programmable system for running and coordinating agents at scale. The {VARS.WARP_AUTOMATION_PLATFORM} powers all agents in Warp, whether they run locally or in the cloud, and provides the orchestration, tracking, and control plane for scalable agent workflows. +* [**Warp Factories**](/factories/) - Warp's product for building and operating software factories, where cloud agents triage, spec, implement, review, and verify work, and humans approve key decisions. ## Who Warp Enterprise is for @@ -32,7 +34,7 @@ Warp Enterprise serves three primary audiences: * **SOC 2 Type II certified** - Meets enterprise security and compliance requirements * **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) +* **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 * **Flexible deployment** - Choose Warp-hosted or hybrid deployment models * **Telemetry controls** - Configure what data is collected at the team level @@ -46,10 +48,10 @@ Warp Enterprise serves three primary audiences: ### Agent capabilities * **State-of-the-art agents** - Multi-model agents with full terminal access, code editing, and autonomous task execution * **Cloud agents** - Run agents in the cloud for unlimited parallelization, background automation, and long-running workflows. Perfect for PR reviews, scheduled tasks, and distributed work across multiple repositories -* **Integrated control plane** - Launch, orchestrate, and manage local, cloud, and autonomous agents from a unified interface. Track all agent activity across your team from the Oz dashboard +* **Integrated control plane** - Launch, orchestrate, and manage local, cloud, and autonomous agents from a unified interface. Track all agent activity across your team from the {VARS.DASHBOARD} * **Agent Profiles** - Customize agent behavior, models, autonomy levels, and permissions * **Rules and guardrails** - Enforce coding standards, tech stack preferences, and security practices through team-wide or project-specific rules -* **Multi-agent support** - Support for all major models and CLI coding agents (Oz, Claude Code, Codex, Copilot) +* **Multi-agent support** - Support for all major models and CLI coding agents ({VARS.WARP_AUTOMATION_PLATFORM}, Claude Code, Codex, Copilot) ## What this section covers diff --git a/src/content/docs/enterprise/security-and-compliance/security-overview.mdx b/src/content/docs/enterprise/security-and-compliance/security-overview.mdx index f9741d17d..eb531dd0c 100644 --- a/src/content/docs/enterprise/security-and-compliance/security-overview.mdx +++ b/src/content/docs/enterprise/security-and-compliance/security-overview.mdx @@ -5,6 +5,7 @@ description: >- compliance certifications to ensure your organization's requirements are met. --- +import { VARS } from '@data/vars'; Warp builds security and compliance into its core, keeping **developers in control** while enabling powerful agent workflows. This overview explains how Warp handles your data, what security controls are available, and how Warp meets enterprise security standards. @@ -31,7 +32,7 @@ How data collection works by plan: * **Business and Enterprise** - Team admins can enforce data collection settings for the entire team. Data collection is **disabled by default**. :::note -Some product features — including cloud conversations and Oz runs — require storing conversation data to function. This data is stored to power the product experience and is separate from analytics or telemetry data collection. +Some product features — including cloud conversations and {VARS.PLATFORM_RUN}s — require storing conversation data to function. This data is stored to power the product experience and is separate from analytics or telemetry data collection. ::: Some models carry provider-specific data retention requirements and are therefore not covered by ZDR. For Enterprise teams, these models are **off by default**; a workspace admin must explicitly enable them in the [Admin Panel](/enterprise/team-management/admin-panel/#models-settings). @@ -131,7 +132,7 @@ Self-hosted deployments use a split architecture: Two deployment modes are available: * **Unmanaged** - Use `oz agent run` to run agents in your existing orchestrator or CI environment. Supports Linux, macOS, and Windows with no Docker dependency. -* **Managed** - Run the `oz-agent-worker` daemon to let the Oz platform orchestrate agents in isolated Docker containers on your infrastructure. +* **Managed** - Run the `oz-agent-worker` daemon to let Warp orchestrate agents in isolated Docker containers on your infrastructure. Agent runs are fully tracked and steerable in both modes. No inbound network access is required. @@ -161,7 +162,7 @@ Security-relevant controls include: * **Privacy** - Configure user-generated content (UGC) data collection, cloud conversation storage, and enterprise secret redaction * **Sharing** - Restrict or permit direct link sharing and "anyone with link" sharing permissions * **AI** - Configure AI autonomy settings and general agent behavior for the team -* **Models** - Control which LLM models are available to team members, including AWS Bedrock +* **Models** - Control which LLM models are available to team members, including BYOLLM routing through AWS Bedrock and Gemini Enterprise (Vertex AI) * **Platform** - Configure cloud agent access and settings ## Security features for developers @@ -170,7 +171,7 @@ Security-relevant controls include: Route agent inference through your own cloud infrastructure for complete control: -* **Data locality** - Interactive agent inference runs in your AWS account +* **Data locality** - Interactive agent inference runs in your AWS account or Google Cloud project * **Cloud-native IAM** - Authenticate using your user's existing identity and access management process * **No key storage** - Warp never stores your cloud credentials or API keys * **Billing control** - Inference costs billed directly to your cloud account diff --git a/src/content/docs/enterprise/support-and-resources/billing.mdx b/src/content/docs/enterprise/support-and-resources/billing.mdx index beca4611d..ffdcc7a7f 100644 --- a/src/content/docs/enterprise/support-and-resources/billing.mdx +++ b/src/content/docs/enterprise/support-and-resources/billing.mdx @@ -43,7 +43,7 @@ For more details, see [Access, Billing, and Identity](/platform/team-access-bill ## BYOLLM billing -When using [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/), Warp routes requests through your cloud infrastructure (AWS Bedrock today, with Azure Foundry and Google Vertex coming soon). BYOLLM requests **consume credits at a reduced rate** which is approximately 80% lower than standard usage. Inference costs are also billed directly to your cloud account. +When using [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/), Warp routes requests through your cloud infrastructure ([AWS Bedrock](/enterprise/enterprise-features/byollm-aws-bedrock/) and [Gemini Enterprise Agent Platform (Vertex AI)](/enterprise/enterprise-features/byollm-gemini-enterprise/) today, with Azure Foundry coming soon). Customer-routed BYOLLM inference **consumes no credits** — Warp does not charge credits for requests that execute in your cloud. Inference costs are billed directly to your cloud account. Local agent runs that use BYOLLM still consume [platform credits](/support-and-community/plans-and-billing/platform-credits/) for Warp's platform infrastructure. If a BYOLLM request fails and Warp falls back to a direct API model, that fallback request consumes Warp credits at the standard rate. diff --git a/src/content/docs/enterprise/team-management/admin-panel.mdx b/src/content/docs/enterprise/team-management/admin-panel.mdx index 8c96bf319..896571486 100644 --- a/src/content/docs/enterprise/team-management/admin-panel.mdx +++ b/src/content/docs/enterprise/team-management/admin-panel.mdx @@ -7,6 +7,7 @@ description: >- sidebar: label: "Admin panel" --- +import { VARS } from '@data/vars'; The Admin Panel provides administrators with centralized control over team settings in Warp. Configure agent behavior, security policies, codebase indexing, and collaboration features for your entire organization from a single interface. @@ -213,11 +214,11 @@ When enabled, agents understand your code patterns, architecture, and convention ### Models settings -Control which LLM models are available to your team and how inference is routed. From the **Models** page, admins can enable or disable individual models and configure [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/) routing through AWS Bedrock. +Control which LLM models are available to your team and how inference is routed. From the **Models** page, admins can enable or disable individual models and configure [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/) routing through AWS Bedrock or [Gemini Enterprise (Vertex AI)](/enterprise/enterprise-features/byollm-gemini-enterprise/). From the **Models** page, admins can also configure [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) in the **Bring Your Own Keys & Endpoints** card, sharing provider keys and custom endpoints across the team for both interactive sessions and cloud agents. -From the **Models** page, admins can also create team-synced [custom routers](/agent-platform/inference/custom-routers/) that route each task to a model based on complexity or rules. Team-synced routers appear in the model picker for every team member. +From the **Models** page, admins can also create team-synced [custom routers](/agents/inference/custom-routers/) that route each task to a model based on complexity or rules. Team-synced routers appear in the model picker for every team member. **Models with provider-specific data retention requirements** @@ -262,14 +263,18 @@ For organizations with sensitive internal processes, disable "Anyone with link" Configure cloud agent settings for your team, including GitHub authorization for automated workflows. +**Pull request artifact attachments** + +Controls how screenshots and video recordings captured with [Computer Use](/agents/capabilities/computer-use/) are attached to pull request descriptions. Choose **Disabled**, **Link only**, or **Embed**. For what each mode does and its security implications, see [Screenshots and videos in pull requests](/agents/capabilities/computer-use/artifacts-in-prs/). + **Enabled GitHub Orgs** -The **Enabled GitHub Orgs** setting associates your Warp team with one or more GitHub App installations, enabling cloud agents initiated with an [agent API key](/reference/cli/api-keys/) to clone repositories and open pull requests using the Oz by Warp GitHub App. +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. To configure: 1. Navigate to the **Platform** section of the Admin Panel. -2. Under **Enabled GitHub Orgs**, review the list of GitHub organizations where the Oz by Warp GitHub App is installed. +2. Under **Enabled GitHub Orgs**, review the list of GitHub organizations where the Warp Factories GitHub App is installed. 3. Select which organizations your team should have access to. <figure> @@ -277,10 +282,10 @@ To configure: <figcaption>Enabled GitHub Orgs setting in the Admin Panel.</figcaption> </figure> -The organizations and repository access shown here reflect the Oz by Warp GitHub App installation scope, which is configured in [GitHub settings](https://github.com/settings/installations). To change which repositories the app can access, edit the installation directly in GitHub. +The organizations and repository access shown here reflect the Warp Factories GitHub App installation scope, which is configured in [GitHub settings](https://github.com/settings/installations). To change which repositories the app can access, edit the installation directly in GitHub. :::note -This setting controls GitHub access for agent API key runs only. Runs triggered by individual users (via personal API key, Slack, or Linear) continue to use that user's personal GitHub token. For more details, see [Team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization). +This setting controls which GitHub App installation agent API key runs authenticate with, and which GitHub organizations can start [GitHub integration](/platform/integrations/github/) runs for this team. Runs from an `@warp-agent` mention also authenticate with the installation's GitHub App token, so their repository access comes from the app installation rather than the person who wrote the mention. Runs triggered from a personal API key, Slack, Linear, or the Warp app continue to use that user's own GitHub authorization. For more details, see [Team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization). ::: ## Multi-admin functionality diff --git a/src/content/docs/factories/automation-filters.mdx b/src/content/docs/factories/automation-filters.mdx new file mode 100644 index 000000000..e848e2dec --- /dev/null +++ b/src/content/docs/factories/automation-filters.mdx @@ -0,0 +1,103 @@ +--- +title: Automation filters +description: >- + Automation filters decide which events from connected tools start factory + runs: matching rules, per-source filters, and what filters don't control. +sidebar: + label: Automation filters +--- + +Automation filters decide which events from your connected tools start factory work. Every trigger on a [factory automation](/factories/connect-your-factory/) carries filters — conditions such as a repository, channel, team, project, label, or author — and an event starts a run only when it matches them. Filters let a factory watch busy channels and repositories without acting on everything in them. + +## How matching works + +An event starts an automation only when it matches the trigger's provider, its event type, and every filter set on that trigger: + +* **Every filter must match.** A trigger that sets both a team and a label matches only events carrying both. +* **Within one filter, any value matches.** A **Labels** filter listing `bug` and `regression` matches an issue with either label. +* **A filter you leave empty matches everything.** A trigger with no filters at all starts work for every event of its type. + +One event can match more than one automation, and each match starts its own run. If a single action starts duplicate runs, narrow or remove one of the overlapping triggers. + +## Filters route work; they don't restrict access + +Filters decide when work starts, not what a running agent can reach. Access comes from what you authorize on each provider — the GitHub App installation, the GitLab bot's project membership, the Slack app's authorization, the Linear OAuth scope, or the Jira app installation. Tightening a filter never shrinks that access, and removing one never widens it. To change what an integration can reach, change what you authorize for that provider. + +Filters are still your main control over who starts runs. On GitHub and GitLab, the event author doesn't need to be a Warp team member, so use author, member, and branch filters to decide whose activity starts work. Slack mentions and direct messages additionally require a Slack account linked to a member of the factory's Warp team. + +## What each source can filter on + +Every source filters on where the event happened — a repository, project, conversation, or team. The remaining filters vary by source and event type: + +| Source | Filters | +| --- | --- | +| [Slack](/factories/integrations/slack/) | Conversations, authors or members, keywords, emoji, and reacted-message authors | +| [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 | +| [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 | + +Each integration guide lists which filters appear on which event types. + +## Edit filters on an automation + +1. In the factory's dashboard, open **Automations**, then create an automation or edit an existing one. +2. Under **Triggers**, open a trigger and set the filters shown for its event. Click **More filters** for the event-specific options. +3. Click **Save**. To confirm the routing works, send a matching test event, such as opening a test issue, and check that a work item starts in the factory dashboard. + +{/* VISUAL: An automation's trigger editor with More filters expanded. */} + +Review the default automations Warp creates when you connect a provider, too: their filters are starting points, not fixed rules. + +## Filters in definitions as code + +In a [factory definition](/factories/factory-as-code/), each entry under an automation's `triggers` takes an optional `filter` whose keys mirror the filters in the automation editor: + +```markdown title="automations/labeled-issue/automation.md" +--- +enabled: true +agent: foreman +triggers: + - provider: github + event: issue_labeled + filter: + repos: [acme/payments-service] + labels: [factory-ready] +--- + +Review the labeled issue and decide the next required stage. +``` + +The same matching rules apply: every key must match, any listed value within a key matches, and an omitted key matches everything. Each integration guide shows the keys its provider accepts. + +For example, this automation from [`04-code-review-only`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/04-code-review-only) in the [warp-factory-examples](https://github.com/warpdotdev/warp-factory-examples) repository scopes reviews to one base branch and excludes work-in-progress PRs with a `not_in` list: + +```markdown title="automations/pr-opened/automation.md" +--- +triggers: + - provider: github + event: pull_request_opened + filter: + repos: [acme/api-service] + base_branches: [main] + labels: + not_in: [wip] +--- +A pull request was opened against the default branch. If it is a draft, +stop silently. Otherwise review it and post your findings and verdict on +the PR. +``` + +For more automations that use these filters, including branches, paths, workflow conclusions, and emoji reactions, see [`06-common-automations`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/06-common-automations). + +## Troubleshooting + +* **A matching event doesn't start work** - Confirm the automation is enabled and the trigger's event type matches, then check every filter; a single mismatch prevents routing. Each integration guide's troubleshooting section covers provider-specific causes, such as app installation coverage. + +## Related pages + +* [**Connect your factory**](/factories/connect-your-factory/) - Choose the sources that route work into the factory. +* [Slack](/factories/integrations/slack/), [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. +* [**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. +* [**Factory dashboard**](/factories/factory-dashboard/) - Create and edit automations in the factory's **Automations** view. diff --git a/src/content/docs/factories/connect-your-factory.mdx b/src/content/docs/factories/connect-your-factory.mdx new file mode 100644 index 000000000..6d3be6dbd --- /dev/null +++ b/src/content/docs/factories/connect-your-factory.mdx @@ -0,0 +1,87 @@ +--- +title: Connect your factory +description: >- + Route work into your factory from Slack, GitHub, GitLab, Linear, Jira, local + agents, direct runs, and schedules. +sidebar: + label: "Connect your factory" +--- + +Connect your factory to the tools where your team already discusses, tracks, and reviews work. Wherever work starts, the factory keeps the original context — the thread, issue, or pull request — and posts results back to the same place. + +## Choose a source + +Pick the sources that match where work starts for your team. You can connect multiple sources, but not both Linear and Jira at the same time. The setup wizard currently offers Linear; to use Jira, connect it after setup or in your [factory definition](/factories/factory-as-code/). + +| Source | Best for | Where follow-ups continue | +| --- | --- | --- | +| [Slack](/factories/integrations/slack/) | Chat and support requests | The Slack thread or DM | +| [GitHub](/factories/integrations/github/) | Issues, pull requests, reviews, and CI | The issue, pull request, or review thread | +| [GitLab](/factories/integrations/gitlab/) | Merge request activity and bot mentions | The merge request thread | +| [Linear](/factories/integrations/linear/) | Planned issues | The Linear issue and its agent session | +| [Jira](/factories/integrations/jira/) | Work items assigned to Warp | The Jira agent session | +| [Factory MCP](/factories/factory-mcp/) | Exchanging work with a local coding agent, in both directions | The factory work item | +| Direct runs and schedules | One-off or recurring work | The factory work item | + +## Connect a source + +Each source's integration guide walks through authorizing access; grant only what the factory needs. Provider connections come with default automations that decide which events start work and which agent handles them. Review their [filters](/factories/automation-filters/) and run settings after connecting. Filters route work, not access: what a running agent can reach depends on its own configuration, not the filters that started it. + +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. + +{/* VISUAL: The factory's Integrations settings connect screen, to ground the abstract source table above in the actual setup flow. */} + +## How work reaches your factory + +```mermaid +flowchart LR + Event["Event from a<br/>connected tool"] --> Automation["Matching<br/>automation"] + Schedule["Schedule"] --> Automation + Automation --> Foreman["Foreman agent"] + Direct["Direct request"] --> Foreman + Foreman --> Work["Work item"] + Work --> Results["Results posted<br/>back to the source"] +``` + +An event from a connected tool starts the automation based on filter matching, such as a specific repository, channel, or label. Schedules start their automation on a timer, and direct requests go straight to the factory. + +Every request lands with the foreman agent, which turns it into a work item and dispatches the agents each stage needs. A reply in the same thread, issue, or pull request continues that work item instead of starting a new one, and repeated event deliveries don't create duplicates. See [how Warp Factories work](/factories/how-factories-work/) for the full lifecycle, including where people stay in the loop. + +## Review the default automations + +When you create a factory through the setup wizard, Warp adds default automations for each tool you connect, so common requests work immediately: + +* **GitHub** - Starts work when the factory is mentioned or assigned, and follows up when 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/). +* **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/). + +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. + +## Factory MCP + +The Factory MCP connects local coding agents and other MCP clients to your factory, and it works in both directions. Send work to the factory, or take work over from it by pulling a task down to your machine, iterating on it locally, and handing it back to the same work item. See the [Factory MCP guide](/factories/factory-mcp/). + +## Direct runs and schedules + +Not every task starts in an external tool: + +* Start a direct run for one-off work. Click **New** on the factory's Runs page and describe the task to the foreman, the same way you would from Slack or an issue tracker. +* Create a scheduled automation for recurring work, such as maintenance or reports. See the [triggers overview](/platform/triggers/) for how schedules and other triggers work across the platform. + +This automation from [`06-common-automations`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/06-common-automations) runs a dependency audit every Monday: + +```markdown title="automations/weekly-dependency-audit/automation.md" +--- +triggers: + - provider: schedule + event: cron_fired + schedule: + name: weekly-dependency-audit + cron: "0 9 * * 1" +--- +Run the weekly dependency audit. List outdated and vulnerable dependencies, +apply safe minor and patch upgrades on a branch, run the tests, and open a +PR with the changes and a summary of anything that needs a human decision. +``` diff --git a/src/content/docs/factories/factory-agents.mdx b/src/content/docs/factories/factory-agents.mdx new file mode 100644 index 000000000..13f324046 --- /dev/null +++ b/src/content/docs/factories/factory-agents.mdx @@ -0,0 +1,116 @@ +--- +title: Factory agents +description: >- + Every factory has a team of default agents: a foreman that coordinates the + work, plus triage, spec, implement, and review agents. +sidebar: + label: "Factory agents" +--- + +:::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. +::: + +Every factory has a **foreman**, the agent you talk to from the tool that sends the request, such as Slack or Linear. Four other default agents each cover one part of the software development lifecycle: triage scopes the request, spec writes the plan, implement writes the code, and review checks it. Together they take a work item from the moment it reaches your factory to a pull request ready for review. + +## The default agents + +Every factory gets a foreman, and you choose one to four other agents to go with it. These defaults are a starting point — you can [add custom agents and automations](#add-custom-agents-and-automations) for work they don't cover. The default agents' prompts, descriptions, and models are reproduced as files in [`00-warp-default-agents`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/00-warp-default-agents) in the [warp-factory-examples](https://github.com/warpdotdev/warp-factory-examples) repository. + +| Agent | What it does | What it produces | +| --- | --- | --- | +| Foreman | Coordinates the work and talks to the requester | Decisions, questions, status updates, and the final handoff | +| Triage | Investigates the request and establishes scope | Evidence, issue context, complexity, and open questions | +| Spec | Turns requirements into a concrete plan with validation criteria | Product and technical specs in a draft pull request | +| Implement | Makes and validates the code change | Code, tests, validation results, and visual evidence | +| Review | Independently checks the finished change | Findings and a recommendation | + +These are responsibilities, not a fixed pipeline. A small, well-understood change can skip the spec stage entirely, and review can send work back to implementation for another pass. By default, work that goes through the spec stage needs a human to approve the spec before implementation starts. + +For the complete lifecycle, see [how Warp Factories work](/factories/how-factories-work/). + +### Foreman + +The **foreman agent** runs the factory floor. It decides which agent a work item goes to next, hands the work over, and keeps the requester informed. It's the only default agent that talks to the requester directly. When another agent needs a human answer, the foreman asks the question and routes the answer back. For revisions and follow-ups, the foreman goes back to the same agent and continues its existing conversation instead of starting a new one, so no context is lost. + +When the work is done, the foreman presents the final pull request and its supporting evidence, then marks the work item complete. Complete means the work was handed to a human, not that the change was merged or deployed. Merging stays with your team. + +### Triage + +Triage researches the codebase and related issues first, and reproduces a problem only when research can't establish the cause. It reports context, scope, complexity, and open questions that the foreman uses to decide whether to ask the requester for clarification, request a spec, or go straight to implementation. + +### Spec + +Spec works through the foreman to define requirements, then writes product and technical specifications in a draft pull request with criteria for validating the change. The implement agent later continues that pull request. By default, the foreman waits for a person to approve the spec before implementation starts. Change that in the foreman's instructions. + +### Implement + +Implement continues the spec's branch and draft pull request rather than starting over. It adds tests, runs the repository's validation, and, when [computer use](/agents/capabilities/computer-use/) is available, captures visual evidence of user-facing changes. If review finds problems, implement revises. It never merges. + +### Review + +Review independently examines the change for unmet requirements, broken conventions, missing or failing tests, security issues, and evidence that doesn't hold up. It reruns or extends validation where the evidence is thin, then recommends accepting, revising, or asking a human to decide. The recommendation is advice — review doesn't approve or merge the pull request. + +## Built-in skills + +Every default agent comes with GitHub skills, and the foreman also comes with a Slack skill. The issue tracker you choose during setup adds to that baseline: choosing Linear or Jira gives the agents that tracker's skill and instructions. If you don't choose a tracker, the agents get only the baseline skills. Define custom procedures with [skills](/agents/capabilities/skills/) to extend what an agent can do beyond the built-in set. + +## Configure agent behavior + +1. In the [factory dashboard](/factories/factory-dashboard/), select your factory and click **Agents** in the sidebar. + + <figure style={{ maxWidth: "563px" }}> + ![The Agents page in the factory dashboard, listing a foreman agent and its four default agents: triage, spec, implement, and review.](../../../assets/factories/factory-agents-list.png) + <figcaption>The Agents page lists a factory's foreman and default agents.</figcaption> + </figure> + +2. Click an agent to open its settings, where you can change its description, model, runner, host, [MCP servers](/platform/mcp/), [secrets](/platform/secrets/), and instructions. + + <figure style={{ maxWidth: "563px" }}> + ![An agent's settings page, showing its description, MCPs, secrets, harness, model, runner, and host fields.](../../../assets/factories/factory-agent-settings.png) + <figcaption>An agent's settings page, where you configure its model, harness, runner, and host.</figcaption> + </figure> + +You can also manage the whole factory as version-controlled code, with [factory definition files](/factories/factory-as-code/) in a Git repository. A few agent settings, such as harness and credential strategy, can only be set in the files. See [where the definition lives](/factories/factory-as-code/#where-the-definition-lives) for how Warp-managed and GitHub-backed factories differ in what you can edit from the factory dashboard. + +Factory setup doesn't choose models for you. To change the model an agent uses, edit that agent. + +## Choose models and harnesses per agent + +Each agent can run on its own model and harness. Supported harnesses include the Warp Agent harness, Claude Code, and Codex, and any agent can use any of them. A foreman running on Claude Code or Codex can still dispatch the factory's other agents, and the runs it starts are still tracked as its children. + +:::note +Third-party harnesses require a Build plan or higher; on the Free plan every agent runs on the Warp Agent harness. See [harnesses](/platform/harnesses/#plan-requirements). +::: + +Default model IDs change over time, so choose based on what each agent has to do well: + +| Agent | What to optimize for | +| --- | --- | +| Foreman | Orchestration, instruction following, and long-running conversations | +| Triage | Research, evidence gathering, and working with connected tools | +| Spec | Synthesizing requirements, technical reasoning, and precise writing | +| Implement | Coding strength, with a harness that fits your repositories and toolchain | +| Review | A different model or harness from the implement agent, so the two don't share blind spots | + +See [model choice for agents](/agents/inference/model-choice/) and [harnesses for cloud agents](/platform/harnesses/) for available options. For a definition that gives each agent its own harness, see [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness). + +## Add custom agents and automations + +Add custom agents for jobs the default agents don't handle, such as documentation, security analysis, migrations, or release checks. A custom agent doesn't have to be a required step for every work item. + +Automations start a chosen agent on a schedule or when an event fires. They're one more way for work to enter your factory; the foreman still coordinates whatever they start. For all the ways to route work into a factory, see [connect your factory](/factories/connect-your-factory/). + +## Human decision points and permissions + +| Decision | Default behavior | What enforces it | +| --- | --- | --- | +| Spec approval | The foreman asks a human to clarify ambiguity and approve every spec | Workflow policy in the foreman's instructions, which your team can change | +| Merging | Agents never merge; the foreman hands the finished pull request to a human | Your repository's permissions decide who can approve and merge | +| Runtime access | Each agent reaches only the repositories, secrets, and MCP servers in its configuration | Platform configuration and the permissions of the connected providers | + +The first two rows are conventions: they live in the foreman's instructions and your repository settings, and your team can change them. Access is different. What an agent can reach comes from its configuration and the permissions of the connected providers, never from its instructions — changing what an agent is told to do doesn't change what it's able to do. + +So enforce with the real controls: branch protection and repository permissions decide who merges, and each agent's configuration decides what it can reach. + +Next, capture these choices in [factory definitions as code](/factories/factory-as-code/). diff --git a/src/content/docs/factories/factory-as-code.mdx b/src/content/docs/factories/factory-as-code.mdx new file mode 100644 index 000000000..ad00c4790 --- /dev/null +++ b/src/content/docs/factories/factory-as-code.mdx @@ -0,0 +1,417 @@ +--- +title: Factory definition syntax +description: >- + Look up every file and key in a factory definition: factory.yaml, agents, + automations, runners, and skills. +sidebar: + label: "Definitions as code" +--- +import { VARS } from '@data/vars'; + +Every factory is defined by files: a `factory.yaml` plus directories of agents, automations, and runners, versioned in a Git repository. The files are the source of truth — when they change, Warp updates the factory to match. This page describes every file and key in a definition. + +Definition files are YAML and Markdown. Keys are case-sensitive. + +For complete working definitions you can copy, see the [warp-factory-examples](https://github.com/warpdotdev/warp-factory-examples) repository. Its examples range from a single-repo quickstart to a full issue-to-PR lifecycle. + +## Where the definition lives + +You choose who hosts the definition repository when you create a factory: + +* **Warp-managed (default)** - Warp hosts the repository for you. You edit the factory in the [{VARS.FACTORY_WEB_APP}](/factories/factory-dashboard/), and every change is validated, committed to the files, and applied in one step. You never interact with the repository directly, and the definition can't end up in an invalid state. +* **GitHub** - The definition lives in a repository you own. The repository is the only way to change the factory: the web app shows the configuration read-only and links back to the files. Open a pull request, and any change merged to the production branch (`main` by default) updates the factory. See [Pull request checks](#pull-request-checks-for-github-backed-factories). + +Both modes use the same files, so everything on this page applies to either. You can also link a GitHub repository to a Warp-managed factory later. + +Definition files describe how the factory is configured, not what it is doing: work items, runs, and metrics live in the web app and are never written to the files. + +{/* VISUAL: The Factory definition tab's file browser for a Warp-managed factory -- this reference page has no screenshots. */} + +## Directory structure + +Each resource takes its name from its path: `agents/reviewer/agent.md` defines an agent named `reviewer`. + +```text +factory.yaml +agents/ + foreman/ + agent.md + skills/ + incident-triage/ + SKILL.md + reviewer/ + agent.md +automations/ + labeled-issue/ + automation.md +runners/ + linux-build.yaml +skills/ + repository-conventions/ + SKILL.md +``` + +Only `factory.yaml` and at least one agent are required. For a complete working definition, see the [example factory definition](#example-factory-definition) below. The smallest complete example tree is [`01-single-repo-quickstart`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/01-single-repo-quickstart); the fullest is [`02-sdlc-issue-to-pr`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/02-sdlc-issue-to-pr). + +## `factory.yaml` + +The factory's root document. It names the factory, scopes it to repositories, and sets the execution defaults every agent inherits. + +```yaml title="factory.yaml" +schemaVersion: v1alpha1 +name: payments-factory +repositories: + - owner: acme + name: payments-service +agentDefaults: + model: auto +``` + +### `schemaVersion` + +Required. The definition schema version. The only supported value is `v1alpha1`. + +### `name` + +Required. The factory's name. + +### `description` + +Optional. What the factory is for. + +### `alias` + +Optional. The handle used to @-mention the factory's foreman on connected platforms like Slack and Linear; the factory dashboard labels this field **Foreman name**. Up to 60 characters: letters, numbers, spaces, `.`, `_`, and `-`. Must be unique across your workspace (compared case-insensitively). + +### `credentialStrategy` + +Optional. Whose credentials the factory's runs execute with: `EXECUTOR` (the principal executing the run, the default) or `CREATOR` (the user who created the run). Agents can override it per role. + +### `repositories` + +Required. The repositories the factory works in, as `owner` and `name` pairs. On a GitLab-backed factory these are the projects you selected under the connected group. + +```yaml +repositories: + - owner: acme + name: payments-service + - owner: acme + name: payments-docs +``` + +### `secrets` + +Optional. Names of [managed secrets](/platform/secrets/) granted to every agent in the factory, in addition to anything individual agents declare. + +### `mcpServers` + +Optional. [MCP servers](/platform/mcp/) granted to every agent, keyed by the name the agent sees. Each entry references a Warp-managed MCP server by `warpId`. + +```yaml +mcpServers: + sentry: + warpId: SENTRY_MCP_SERVER_ID +``` + +### `cloudProviders` + +Optional. Cloud-provider identity federation for agent runs. `gcp` accepts `projectNumber` (quote it so YAML keeps it a string), `workloadIdentityFederationPoolId`, `workloadIdentityFederationProviderId`, and an optional `serviceAccountEmail`. `aws` accepts `roleArn`. + +```yaml +cloudProviders: + aws: + roleArn: arn:aws:iam::123456789012:role/warp-factory +``` + +### `integrations` + +Optional. The integration providers attached to the factory. `type` accepts `slack`, `linear`, or `jira`. 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. + +```yaml +integrations: + - type: slack + - type: linear +``` + +### `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. + +```yaml +agentDefaults: + model: auto + runner: linux-build + environmentId: PAYMENTS_ENVIRONMENT_ID +``` + +### `agentDefaults.model` + +The model that runs execute with, as a `model_id` from [model choice for agents](/agents/inference/model-choice/). `model` is shorthand for running on the Warp Agent harness: + +```yaml +model: auto +``` + +is equivalent to: + +```yaml +harness: + type: oz + model: auto +``` + +`model` and `harness` are mutually exclusive everywhere they appear. + +### `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` (alias `claude-code`), `codex`, or `gemini` — the values the definition schema validates. For what each harness does and which ones your team can run, see [supported harnesses](/platform/harnesses/). + +```yaml +harness: + type: codex + model: gpt-5.3-codex + reasoningLevel: high + auth: + source: managedSecret + secretName: CODEX_API_KEY +``` + +For a third-party harness, `auth` sets where credentials come from: `source: managedSecret` reads the [managed secret](/platform/secrets/) named by `secretName`, and `source: workerEnvironment` reads them from your self-hosted worker's environment (and requires a self-hosted `workerHost`). The `oz` harness supplies its own credentials and takes no `auth` or `reasoningLevel`. + +For a definition that runs a different harness per agent, with managed-secret auth for Claude Code and Codex, see [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness). + +### `agentDefaults.runner` + +The name of a runner defined under [`runners/`](#runnersyaml) that provides the compute for runs. + +### `agentDefaults.environmentId` + +The ID of an existing [environment](/platform/environments/) that runs execute in. Most factories never set this: leave it out, and Warp manages the workspace from the factory's repositories. + +### `agentDefaults.secrets` + +Managed secrets for agents that don't declare their own. An agent that declares `secrets` replaces this list rather than adding to it; factory-wide [`secrets`](#secrets) always apply. + +### `agentDefaults.mcpServers` + +MCP servers for agents that don't declare their own, in the same form as [`mcpServers`](#mcpservers). Like secrets, an agent that declares its own map replaces this one, and factory-wide servers always apply. + +### `agentDefaults.workerHost` + +Where runs execute: `warp` for Warp-hosted compute, or the ID of a connected [self-hosted worker](/platform/self-hosting/). + +## `agents/<name>/agent.md` + +One file per agent. The YAML frontmatter configures how the agent runs, and the Markdown body is the agent's prompt: the durable instructions for its role. The agent's name comes from its directory. + +```markdown title="agents/reviewer/agent.md" +--- +description: Reviews factory-produced pull requests +agentType: REVIEW +--- + +Review each pull request against the repository's standards. Request +changes when tests are missing; never approve your own edits. +``` + +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. +* `model` or `harness`, `runner`, `environmentId`, `secrets`, `mcpServers`, `workerHost` - Optional. The same keys as [`agentDefaults`](#agentdefaults); a key declared here overrides the default for this agent. + +### `agentType` + +The agent's role: `CUSTOM` (the default), `FOREMAN` (alias `MAIN`), `TRIAGE`, `SPEC`, `IMPLEMENT`, `REVIEW`, or `VERIFY`. Every definition declares exactly one foreman — the factory's entry point and the default target for automations. See [factory agents](/factories/factory-agents/) for what each role does. + +## `automations/<name>/automation.md` + +One file per automation. The frontmatter declares when runs start and how they execute, and the Markdown body is the prompt each run starts with. The automation's name comes from its directory. + +```markdown title="automations/labeled-issue/automation.md" +--- +agent: foreman +triggers: + - provider: github + event: issue_labeled + filter: + repos: [acme/payments-service] + labels: [factory-ready] +--- + +Review the labeled issue and decide the next required stage. Return +unresolved product questions to a human. +``` + +### `enabled` + +Optional. Turns the automation on or off. Defaults to `true`. + +### `agent` + +Optional. The name of the agent that handles this automation's runs. Defaults to the foreman. + +### `triggers` + +Required. One or more events that start runs. Each trigger declares a `provider` and an `event`, an optional `filter`, and, for schedules, a `schedule`. + +The providers and their events: + +* `github` - `issue_created`, `issue_labeled`, `issue_assigned`, `issue_mentioned`, `pull_request_opened`, `pull_request_closed`, `pull_request_merged`, `pull_request_labeled`, `pull_request_assigned`, `pull_request_mentioned`, `pull_request_ready`, `pull_request_reopened`, `pull_request_synchronized`, `pull_request_review_requested`, `pull_request_review_submitted`, `push`, `check_suite_completed`, `check_run_rerequested`, `check_suite_rerequested`, `workflow_run_completed` +* `gitlab` - `merge_request`, `bot_mentioned` +* `linear` - `issue_created`, `issue_labeled`, `issue_assigned`, `issue_state_changed`, `comment_created`, `agent_session_created` +* `jira` - `issue_created`, `issue_labeled`, `status_changed`, `agent_session_created` +* `slack` - `app_mention`, `message_posted`, `message_dm`, `message_im`, `message_mpim`, `member_joined_channel`, `reaction_added` +* `schedule` - `cron_fired` +* `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/). + +### `triggers[].filter` + +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. + +### `triggers[].schedule` + +Declares a cron schedule inline on a `schedule` / `cron_fired` trigger: a five-field cron expression or a descriptor like `@daily` or `@every 1h`, always interpreted in UTC. An optional `name` distinguishes multiple schedules on one automation. + +```yaml +triggers: + - provider: schedule + event: cron_fired + schedule: + name: weekday-mornings + cron: "0 9 * * 1-5" +``` + +### Execution overrides + +An automation may also declare `model` or `harness`, `runner`, `environmentId`, `secrets`, `mcpServers`, and `workerHost` (the same keys as [`agentDefaults`](#agentdefaults)) to override the target agent's settings for the runs it starts. + +## `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). + +```yaml title="runners/linux-build.yaml" +description: Linux runner for payments builds and tests +setupCommands: + - corepack enable +instanceShape: + vcpus: 4 + memoryGb: 8 +platform: + os: linux + arch: x86_64 + linux: + dockerImage: ubuntu:22.04 +``` + +### `setupCommands` + +Optional. Shell commands run in order while the sandbox is prepared. + +### `instanceShape` + +Optional. The compute size, as `vcpus` and `memoryGb`. Omit it to take the workspace default. + +### `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"`). + +## Skills + +A skill is a directory containing a `SKILL.md`, not a YAML key. Skills under `skills/` are available to every agent in the factory; skills under `agents/<name>/skills/` are available only to that agent. See [Skills for agents](/agents/capabilities/skills/). + +## Example factory definition + +A complete, working definition: one repository, a foreman, an automation triggered by a GitHub label, and a Linux runner. `PAYMENTS_ENVIRONMENT_ID` and `SENTRY_MCP_SERVER_ID` stand in for the IDs of an existing environment and MCP server. + +The [warp-factory-examples](https://github.com/warpdotdev/warp-factory-examples) repository has more definitions like this one: the default agents as files, the full lifecycle with scorers and skills, a harness per agent, single-agent factories for code review and UI verification, and a catalog of common automations. + +```yaml title="factory.yaml" +schemaVersion: v1alpha1 +name: payments-factory +description: Processes approved work for the payments service +alias: payments +repositories: + - owner: acme + name: payments-service +agentDefaults: + model: auto + runner: linux-build + environmentId: PAYMENTS_ENVIRONMENT_ID +``` + +```markdown title="agents/foreman/agent.md" +--- +description: Routes approved payments work through the factory +agentType: FOREMAN +secrets: + - SENTRY_AUTH_TOKEN +mcpServers: + sentry: + warpId: SENTRY_MCP_SERVER_ID +--- + +Own each work item from intake through human handoff. + +Confirm the request is ready before dispatching implementation. Require +repository validation and independent review before marking work complete. +``` + +```markdown title="automations/labeled-issue/automation.md" +--- +enabled: true +agent: foreman +triggers: + - provider: github + event: issue_labeled + filter: + repos: [acme/payments-service] + labels: [factory-ready] +--- + +Review the labeled issue and decide the next required stage. Preserve the +issue's acceptance criteria and return unresolved product questions to a human. +``` + +```yaml title="runners/linux-build.yaml" +description: Linux runner for payments builds and tests +setupCommands: + - corepack enable +instanceShape: + vcpus: 4 + memoryGb: 8 +platform: + os: linux + arch: x86_64 + linux: + dockerImage: ubuntu:22.04 +``` + +### Routing to a self-hosted worker + +To route this factory's work to a [managed self-hosted worker](/factories/infrastructure-and-security/#choose-an-execution-host) instead of Warp-hosted compute, set `workerHost` on `agentDefaults` (or override it per agent or automation) to the worker's ID: + +```yaml title="factory.yaml" +agentDefaults: + model: auto + runner: linux-build + workerHost: SELF_HOSTED_WORKER_ID +``` + +Pair `workerHost` with a runner whose `platform` matches the worker's operating system and architecture. See [choose an execution host](/factories/infrastructure-and-security/#choose-an-execution-host) for the full setup, including how to deploy and connect the worker. + +## Pull request checks for GitHub-backed factories + +When your definition lives in GitHub, Warp validates every change before it takes effect: + +* Every pull request that targets the production branch gets a **warp/factory-config** check. The check annotates invalid fields and unresolvable references with the file and line that caused them, and summarizes what the change would apply. +* When a change lands on the production branch, Warp applies it as a whole. A definition that fails validation never partially applies: the factory keeps running on its last valid definition until the branch is fixed. + +Warp-managed factories skip all of this. Every edit in the web app is validated when you save it, so the definition can't become invalid. + +## Machine-readable schema + +Warp publishes the definition schema as JSON Schema documents, generated from the same parser that validates your files. Fetch the supported versions from `https://app.warp.dev/api/v1/factory-files/schemas` and the `v1alpha1` documents from `https://app.warp.dev/api/v1/factory-files/schemas/v1alpha1`. Both endpoints are unauthenticated, so editors and agents can validate a definition without a Warp login. diff --git a/src/content/docs/factories/factory-dashboard.mdx b/src/content/docs/factories/factory-dashboard.mdx new file mode 100644 index 000000000..6a94a23ea --- /dev/null +++ b/src/content/docs/factories/factory-dashboard.mdx @@ -0,0 +1,115 @@ +--- +title: Factory dashboard +description: >- + Track work items, inspect runs, read factory metrics, and manage agents, + automations, and settings from the factory dashboard. +sidebar: + label: "Factory dashboard" +--- + +The factory dashboard is the web app for operating a single factory. Use it to track the work your agents are doing, inspect the runs and pull requests they produce, and manage the agents, automations, and settings the factory owns. + +:::note +"Factory dashboard" names the whole surface. **Dashboard**, in bold, is one page inside it: the metrics page you land on when you open a factory. +::: + +## Getting oriented + +Select a factory in the sidebar to open its pages. **Runs**, **MCPs and apps**, **Secrets**, and **Integrations** sit above the factory list and cover your whole team, not a single factory; everything else on this page is scoped to the factory you select. + +A factory opens on its **Dashboard** page, covered next. **Factory definition** appears only on Warp-managed factories, since a factory whose definition lives in your own repository is edited there instead. + +## Read metrics on the Dashboard page + +**Dashboard** is the factory's landing page. It summarizes the factory over a date range you choose: + +* **Autonomy** - The share of the factory's merged PRs that needed no human input beyond an approving review and the merge itself. A PR counts as autonomous only if no person added commits, requested changes, or otherwise edited it before merge. +* **PR cycle time** - The median time the factory's merged PRs took from run kickoff through PR, first review, and merge, with a median for each stage. +* **Cost per PR** - The median cost of PRs opened in the range. Treat it as a lower-bound estimate: it can miss some run usage and does not match billing. See [Measure and improve a factory](/factories/measure-and-improve/) for its limitations. + +The page also charts opened versus merged PRs and a breakdown of runs, and the **Cost per PR** card expands to list the most expensive PRs in the range. When Scorers are set up, Scorer cards summarize recent classification results. + +<figure style={{ maxWidth: "563px" }}> +![The Dashboard page showing a Cost per PR chart broken down by compute, platform, and inference cost, plus two example Scorer cards.](../../../assets/factories/factory-dashboard-metrics.png) +<figcaption>Cost per PR and example Scorer cards on the Dashboard page.</figcaption> +</figure> + +## Track work items on Activity + +**Activity** shows the factory's work items grouped by stage: Triage, Planning, Building, and Reviewing. Finished work items move to two terminal stages, Complete and Cancelled. + +<figure style={{ maxWidth: "563px" }}> +![The Activity page of the factory dashboard, listing work items grouped under Triage, Planning, Building, and Reviewing.](../../../assets/factories/factory-dashboard-activity.png) +<figcaption>Activity groups work items by stage, with counts for each.</figcaption> +</figure> + +By default, Activity shows only work items you created, and only the four active stages. Change the **Created by** filter to see a teammate's work, and add a **Stage** filter for **Complete** or **Cancelled** to see finished work. + +<figure style={{ maxWidth: "563px" }}> +![The Activity page with a Stage filter chip applied above the work item list, plus a search box and results count.](../../../assets/factories/factory-dashboard-activity-filters.png) +<figcaption>Filter Activity by stage, creator, or a text search.</figcaption> +</figure> + +Click a work item to open its detail pane, which includes the prompt that started it, the ticket or thread it came from, the pull requests it produced, and its cost. **View agent** opens the agent's session, **Event history** lists the runs behind the work item, and **Stop task** cancels the current run. + +:::caution +**Stop task** takes effect immediately, with no confirmation prompt. +::: + +## Inspect runs + +A run is a single agent execution. A work item on **Activity** tracks one piece of work through the factory's stages and can span several runs as different agents pick it up. The team-level **Runs** page lists every run you have access to; a factory's **Runs** page lists only runs from that factory's agents. + +Click **New** on a factory's **Runs** page to send a prompt to the factory's foreman agent. Open a run to see its timeline and cost, plus a **Sub-agents** tab for an orchestrator run's child runs. From there you can view the agent's full session, stop or score the run, or turn it into a benchmark task. + +{/* VISUAL: The Runs page with the New button, showing an empty or sample run list. */} + +:::note +Run pages don't include a chat input, but you can still steer a run: **View session** opens its [shared agent session](/platform/viewing-cloud-agent-runs/), where you follow the agent in real time and send follow-up instructions while the run's sandbox is active. After it shuts down, the same button opens the conversation transcript. +::: + +## Manage agents and automations + +**Agents** lists the factory's agents. Create agents and edit their instructions, model or harness, runner, host, secrets, and MCP servers. **Automations** defines the triggers that start runs: a schedule (including custom cron expressions) or a GitHub, Linear, Slack, or Jira event. + +{/* VISUAL: The Automations editor, to complement the Agents list already shown in Configure agent behavior on the factory agents page. */} + +The automation editor doesn't change execution settings; an automation only overrides them through [execution overrides in the definition files](/factories/factory-as-code/#execution-overrides). When the factory's definition lives in an external repository, Agents, Automations, and Scorers are read-only; make changes there through pull requests. + +## Edit definitions in the Factory definition tab + +**Factory definition** is the factory dashboard's view of the definition files that [definitions as code](/factories/factory-as-code/) describes in full. Where the definition lives decides what you get: + +* **Warp-managed** - Browse and edit the definition files. Saving validates the definition and commits all changes together. +* **Managed in GitHub** - The tab doesn't appear. Edit the definition through pull requests in your repository, and **Settings** links back to it. +* **Live-managed** - The factory is managed through the API, so there are no definition files to browse. + +When an agent proposes a change to a Warp-managed definition, its work item on **Activity** links to a review of the branch inside the factory dashboard. From there, comment on the diff, use **Request changes** to send feedback back to the agent, or **Approve & merge**. + +## Score and benchmark + +A Scorer is an LLM judge that classifies completed runs against a rubric you define, scoped to the agents you choose and sampled at a rate you set. Each Scorer has a **Self-improvement** toggle: when it's on, the factory periodically triages the runs that Scorer marks as failing and files fixes for recurring issues. The **Self-improvement** page tracks the pull requests those fixes open, linking each one to the run that produced it. + +**Benchmarks** compares harness, model, and runner configurations against a fixed set of tasks with success criteria. Benchmark results are only as reliable as the Scorers behind them, so read them alongside [Measure and improve a factory](/factories/measure-and-improve/). + +## Change factory settings + +**Settings** holds the configuration the factory owns: + +* **Identity** - The factory's name, avatar, and [**Foreman name**](/factories/factory-as-code/#alias), the handle your team @-mentions. +* **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/#configure-and-review-self-improvement) uses to analyze failed runs. +* **Runners** - The compute the factory's runs execute on. +* **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 + +* [How Warp Factories work](/factories/how-factories-work/) - The lifecycle behind Activity's stages and where humans stay in the loop. +* [Definitions as code](/factories/factory-as-code/) - Define agents, automations, runners, and source ownership in code. +* [Factory agents](/factories/factory-agents/) - What each default agent does and how to configure it. +* [Measure and improve a factory](/factories/measure-and-improve/) - Configure the Scorers and benchmarks behind the **Dashboard** page. +* [Troubleshooting Warp Factories](/factories/troubleshooting/) - Fixes for setup problems, work that doesn't start, and stuck runs. diff --git a/src/content/docs/factories/factory-mcp.mdx b/src/content/docs/factories/factory-mcp.mdx new file mode 100644 index 000000000..6d8ce964c --- /dev/null +++ b/src/content/docs/factories/factory-mcp.mdx @@ -0,0 +1,132 @@ +--- +title: Factory MCP for coding agents +description: >- + Connect any coding agent to your team's factories to send in work, continue + tasks locally, and hand results back. +sidebar: + label: "Factory MCP" +--- + +Factory MCP is a hosted Model Context Protocol (MCP) server that connects coding agents to your team's factories, in both directions: the agent you already work with — in Warp or in any MCP-capable tool — can send work to a factory, or take work over from one by pulling a task down, continuing it locally, and handing the result back. + +The factory keeps a single record of each task throughout. Whether a change happens in the cloud or on your machine, it lands on the same task with the same history and conversation. A task is the factory's work item: the same unit of work that appears in the factory dashboard's [Activity view](/factories/factory-dashboard/#track-work-items-on-activity). + +## What you can use it for + +* **Send work in** - Turn anything from your local session into a factory task: a bug you found, review feedback, or a half-finished change. +* **Continue a task locally** - Pull a task's context into your own checkout, work with your own tools, and return the result to the same task. +* **Stay in sync** - List and search tasks, read a task's conversation, and message its [foreman](/factories/factory-agents/), the agent that orchestrates each task inside the factory. +* **Create a factory** - Set up a new factory when you know the team, repositories, and source-control details. + +Factory MCP is one of several ways work enters a factory, alongside Slack, GitHub, GitLab, Linear, and Jira. See [connect your factory](/factories/connect-your-factory/) for all intake paths and [how Warp Factories work](/factories/how-factories-work/) for how tasks move through a factory. + +## Connect and authenticate + +### In Warp + +There is nothing to configure. When your account has access, Warp connects agent sessions to Factory MCP and handles authentication for you. + +### In other MCP clients + +Factory MCP is a streamable HTTP server at `https://app.warp.dev/api/v1/mcp/factory`. Point any MCP client that supports remote servers at that URL; on first connect, the client opens a browser so you can sign in and approve access. + +With Claude Code: + +```bash +claude mcp add --transport http warp-factory https://app.warp.dev/api/v1/mcp/factory +``` + +In clients that use the `mcpServers` JSON format, such as Cursor: + +```json +{ + "mcpServers": { + "warp-factory": { + "url": "https://app.warp.dev/api/v1/mcp/factory" + } + } +} +``` + +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. + +For unattended automation, skip the browser flow and authenticate with a [Warp API key](/reference/cli/api-keys/) instead. Create the key for a least-privilege cloud agent rather than your personal account, and pass it as a bearer token: + +```json +{ + "mcpServers": { + "warp-factory": { + "url": "https://app.warp.dev/api/v1/mcp/factory", + "headers": { + "Authorization": "Bearer YOUR_API_KEY" + } + } + } +} +``` + +:::caution +Factory MCP has no read-only or per-factory scopes: a connected client acts with the full permissions of the account or agent it authenticates as. Store API keys in your client's secret storage, never in a repository. +::: + +## How it works + +Factory MCP exposes a small set of tools that your agent calls on your behalf. You don't need to learn them to use it: the server publishes its own usage guidance and tool schemas, so agents pick up the correct workflow on their own. Prompts like these are enough: + +* "Send this bug to the factory, including my branch." +* "What's the status of the checkout-flow task?" +* "Pull down ENG-123 so we can finish it here." + +The rest of this page describes what happens behind those prompts. + +## Send new work to a factory + +{/* VISUAL: An MCP client connected to Factory MCP (Warp or Cursor), or a factory task created via send_task -- this page has no product chrome today. */} + +To create a task, your agent calls `send_task` with the target factory, a title, and a note. The note is what the foreman starts from, so a good one states the goal, the relevant context and constraints, and any work already done. The foreman takes it from there and reports progress on the task's conversation. + +If the new task builds on local changes, push the branch or open a pull request first and reference it in the note, so the factory can see that work. + +## Pick up a task and work on it locally + +1. **Find the task.** Your agent locates it with `list_tasks` or `search_task`, or resolves a reference you give it with `get_task`: a task or run URL, a GitHub pull request, a Slack permalink, a Linear or Jira issue, or a branch name. +2. **Pull down the context.** Calling `get_task` with `start_working=true` returns the task's status, run history, and suggested Git commands for setting up an isolated [worktree](/code/git-worktrees/) in a local clone. Factory MCP never modifies your files; your agent runs the setup itself. +3. **Coordinate while you work.** `message_foreman` sends progress, questions, and blockers to the task's foreman, and `get_conversation` reads the replies. Messaging keeps the factory informed but doesn't move the task or hand anything back. +4. **Commit and push.** Validate the change, then push the branch. The factory can't see uncommitted or unpushed work. +5. **Hand the task back.** Your agent calls `send_task` with the task's ID, the pushed branch or pull request URL, and a note covering what changed, what was validated, and what remains. The work returns to the same task, and the foreman decides the next step. + +:::caution +Picking up a task doesn't claim, lock, or pause it, and the factory may keep running its own work on it in the meantime. Check the task's active runs and tell the foreman you're picking it up, so you don't end up with duplicate changes. +::: + +When nothing remains for the factory to do, `complete_task` closes the task out. Handing work back doesn't complete a task by itself. + +## Get notified when a task needs you + +Sending work to a factory means you're no longer watching it. To be notified when a task needs attention or finishes, ask for a notification when sending or returning work: your agent calls `list_notification_routes` to see the destinations available to you in that factory, such as a Slack DM or a Linear issue, and passes your choice to `send_task`. Delivery is best-effort, so treat notifications as a convenience rather than a guarantee. + +## Tool reference + +Your MCP client fetches the full input schemas from the server, and tool results include links that open the corresponding task or run in the factory's [factory dashboard](/factories/factory-dashboard/). + +| Tool | What it does | +| --- | --- | +| `list_factories` | Lists the factories you can access. | +| `create_factory` | Creates a factory for a team, with its repositories and source-control details. | +| `list_tasks` | Lists the tasks in one factory, with filters such as creator, stage, and date. | +| `search_task` | Searches task titles across all factories you can access. | +| `get_task` | Reads a task's status, run history, and outputs. Accepts a task ID or a reference such as a URL, issue, pull request, or branch. With `start_working=true`, also returns local setup guidance. | +| `message_foreman` | Sends a message to a task's foreman. | +| `get_conversation` | Reads a task's foreman conversation. | +| `send_task` | Creates a new task, or hands work back to an existing one. | +| `list_notification_routes` | Lists the notification destinations available to you in a factory. | +| `complete_task` | Marks a task complete. | + +## Related pages + +* [**Connect your factory**](/factories/connect-your-factory/) - Every way work can enter a factory, including the Slack, GitHub, GitLab, Linear, and Jira integrations. +* [**Factory agents**](/factories/factory-agents/) - The foreman and the other agents that carry out a factory's tasks. +* [**How Warp Factories work**](/factories/how-factories-work/) - The task lifecycle and the agents that move work through it. +* [**Warp Factories quickstart**](/factories/quickstart/) - Create a factory and send it its first work item. +* [**Model Context Protocol in Warp**](/agents/capabilities/mcp/) - How MCP servers work in the Warp app, with a catalog of popular MCP servers you can add to Warp directly. +* [**Handoff between local and cloud agents**](/platform/handoff/) - Move workspaces and conversations between local and cloud outside a factory. diff --git a/src/content/docs/factories/how-factories-work.mdx b/src/content/docs/factories/how-factories-work.mdx new file mode 100644 index 000000000..6e2c5fd54 --- /dev/null +++ b/src/content/docs/factories/how-factories-work.mdx @@ -0,0 +1,70 @@ +--- +title: How Warp Factories work +description: >- + A factory's foreman routes each work item through triage, specification, + implementation, and review, with humans making the key decisions. +sidebar: + label: "How factories work" +--- + +:::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. +::: + +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 **work item** is a single request the factory acts on, such as an issue, support request, pull request, or Factory MCP task. It keeps its identity from intake to handoff, however many agents contribute to it along the way. + +## How a work item moves through the factory + +The foreman coordinates every work item. It routes work between the factory's agents, passes each one the context it needs, and continues existing agent conversations instead of starting new ones. See [factory agents](/factories/factory-agents/) for what each agent does. + +Not every work item needs every stage. The foreman picks the shortest path that still meets your quality policy: it skips stages when the work is already well defined, starts partway through when enough context exists, and sends work back to an earlier agent when revisions are needed. + +### Stages + +The diagram below shows the default path through a factory's stages. + +```mermaid +flowchart LR + Intake[Intake] --> Foreman[Foreman] + Foreman --> Triage[Triage] + Triage --> Decision{Specification needed?} + Decision -->|Yes| Spec[Specify] + Decision -->|No| Implement[Implement] + Spec --> Approval["Human review<br/>(default policy)"] + Approval --> Implement + Implement --> Review[Review and verify] + Review --> Revision{Revision needed?} + Revision -->|Yes| Implement + Revision -->|No| Handoff["Human handoff<br/>(default policy)"] + Handoff --> Complete[Complete] +``` + +* **Intake** - A work item enters from a [connected integration](/factories/connect-your-factory/), an automation, a direct run, or the [Factory MCP](/factories/factory-mcp/). It keeps its source context as it moves through later stages. +* **Triage** - The triage agent researches the request, reproduces the problem when needed, and defines the scope and complexity of the change. The foreman skips this stage when the request already explains the problem and what needs to change. +* **Specification** - The specification agent defines product behavior, technical constraints, and validation criteria. The foreman skips this stage for small, well-understood changes. +* **Implementation** - The implementation agent makes the code change on a branch and opens a pull request with test and visual evidence. +* **Review and verification** - The review agent checks the change against the requirements, tests, and security expectations, then sends findings back to implementation. Its verdict is advisory. +* **Human handoff** - The factory presents the result, its evidence, and any findings. A person decides what happens next. +* **Complete or Cancelled** - The work item ends when the factory finishes its work, or stops early if someone cancels it. + +In the [factory dashboard](/factories/factory-dashboard/), the **Activity** view is where you find, filter, and stop work items. It groups these stages under its own names: Triage, Planning (specification), Building (implementation), and Reviewing. Each agent's run within a work item is an ordinary [cloud agent run](/platform/) you can watch and steer. + +## Where your team stays in charge + +A factory is built to pause when there is a decision that needs to be made by a person. By default, that's three places: + +* **Approving the spec** - When work goes through the spec stage, implementation waits until a person signs off on the plan. +* **Answering questions** - When requirements are unclear or a review finding is ambiguous, the foreman asks instead of guessing. +* **Merging** - The factory opens the pull request and hands it off. Whether and when it merges is your team's call. + +The first two are workflow policy, written into the foreman's instructions; edit them to change when the factory checks in. Merging is enforced by your repository, so if you require human-only merges, use branch protection and repository permissions. + +## How the factory improves itself + +Your factory is self-improving, and you define what "better" means. [Scorers](/factories/measure-and-improve/) grade completed runs against criteria you write, and [Self-improvement](/factories/measure-and-improve/#configure-and-review-self-improvement) groups the failures they flag into follow-up runs that propose fixes — to the application code or to the factory's own definition. Every proposal arrives as a change for your review; nothing is adopted on its own. + +The factory's definition is open to the same loop. Anyone on the team, or an agent, can propose changes to its instructions, skills, models, or other [definition files](/factories/factory-as-code/), and definitions stored in GitHub go through pull request review and [configuration checks](/factories/factory-as-code/#pull-request-checks-for-github-backed-factories) before a change reaches the production branch. + +See [measure and improve](/factories/measure-and-improve/) for the evaluation workflow, or [build a self-improving agent](/guides/agent-workflows/build-a-self-improving-agent/) to apply the same pattern to a standalone agent. diff --git a/src/content/docs/factories/index.mdx b/src/content/docs/factories/index.mdx new file mode 100644 index 000000000..6b566f3b8 --- /dev/null +++ b/src/content/docs/factories/index.mdx @@ -0,0 +1,72 @@ +--- +title: Warp Factories overview +description: >- + Warp Factories runs cloud software factories where specialized agents work + engineering requests from intake to a mergeable pull request. +sidebar: + label: "Overview" +--- +import { VARS } from '@data/vars'; + +:::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. +::: + +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. + +## 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. + +A **factory** is one deployed instance of that pattern. It connects 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. + +<figure style={{ maxWidth: "563px" }}> +![A circular diagram of the software factory loop: triage, spec, implement, review, verify, ship, and monitor, with human review checkpoints for the spec, code, and product.](../../../assets/factories/factories-concept-loop.png) +<figcaption>The general software factory loop. Warp Factories' default agents cover triage through review; add custom agents for the rest.</figcaption> +</figure> + +## 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: + +* Process a backlog of issues with a consistent triage and delivery policy. +* Fix defects reported through support channels. +* Review incoming pull requests or maintain services across repositories. + +## What you get with Warp Factories + +* **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, and MCP servers, so factory changes get the same review, history, and rollback as code changes. +* **Integrations and the Factory MCP** - Work flows in from [Slack](/factories/integrations/slack/), [GitHub](/factories/integrations/github/), [GitLab](/factories/integrations/gitlab/), [Linear](/factories/integrations/linear/), and [Jira](/factories/integrations/jira/), plus direct runs and 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/) grade completed work, and [Self-improvement](/factories/measure-and-improve/#configure-and-review-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, scope secrets, and (if eligible) store transcripts, artifacts, and run attachments in their own S3 or GCS buckets. See [infrastructure and security](/factories/infrastructure-and-security/) for the available controls. + +## How Warp Factories relates to other Warp products + +| 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, 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: + +* **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/). +* **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. + +A standalone [cloud agent](/platform/) remains the right tool for a single task or a one-trigger automation. Reach for a factory when the work is a standing, multi-stage process your team wants to route, measure, and improve in one place. + +## Next steps + +* [**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. +* [**Meet the factory agents**](/factories/factory-agents/) - See what each agent does and how to configure its model, harness, and instructions. +* **Adapt the system** - [Define the factory as code](/factories/factory-as-code/) and [connect its work sources](/factories/connect-your-factory/), or start from a working definition in [warp-factory-examples](https://github.com/warpdotdev/warp-factory-examples). diff --git a/src/content/docs/factories/infrastructure-and-security.mdx b/src/content/docs/factories/infrastructure-and-security.mdx new file mode 100644 index 000000000..2a067e2ff --- /dev/null +++ b/src/content/docs/factories/infrastructure-and-security.mdx @@ -0,0 +1,111 @@ +--- +title: Warp Factories infrastructure and security +description: >- + Warp Factories gives you control over inference, hosting, and run data so + you own your factory's infrastructure and outputs. +sidebar: + label: "Infrastructure & security" +--- + +Warp Factories runs on the infrastructure your team chooses. You decide where a factory runs code, which model providers serve its inference requests, where run data such as transcripts and artifacts is stored, and which credentials each agent receives. Warp coordinates the work the same way regardless of these choices. + +## Control plane and execution plane + +Every factory splits responsibilities across two planes: + +* **Control plane** - Warp coordinates runs, identity and configuration, observability, integrations, storage, and inference routing. +* **Execution plane** - A Warp-hosted sandbox or a managed self-hosted worker checks out code, runs setup, invokes tools, builds the project, and executes commands. + +```mermaid +flowchart LR + I["Integrations and triggers"] --> C["Warp control plane<br/>coordination · identity/config<br/>observability · inference routing"] + C --> H["Warp-hosted sandbox"] + C -->|"task, config, and scoped<br/>runtime credentials"| S["Managed self-hosted worker"] + H -->|"results, transcripts,<br/>artifacts, telemetry"| C + S -->|"results, transcripts, attachments,<br/>artifacts, and telemetry<br/>can contain code context"| C + C --> P["Warp-managed or<br/>customer-configured inference"] + C --> D["Warp or supported<br/>customer-owned 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. + +## 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](/platform/runners/) for the available compute options. + +Runners are declared as `runners/*.yaml` files in the definition, and you can define more than one — a Linux runner with more cores and memory for builds, a macOS runner for platform-specific work. Every agent inherits the factory's default (`agentDefaults.runner`), and any agent or automation can name its own `runner` instead, so the foreman can send implementation to a macOS runner while every other agent stays on Linux. For working runner files, see [`02-sdlc-issue-to-pr`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/02-sdlc-issue-to-pr) (three runners selected per agent, including macOS) and [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness) (an `x86_64` and an `aarch64` runner) in the [warp-factory-examples](https://github.com/warpdotdev/warp-factory-examples) repository. + +The **Runners** section of a factory's **Settings** page in the [factory dashboard](/factories/factory-dashboard/) shows each runner's operating system and architecture, setup commands, size, and whether it's the default. Where you edit runners depends on where the factory's source lives: + +* **Externally managed source** - The `runners/*.yaml` files in the connected repository are the source of truth, and edits open in that repository. +* **Warp-managed source** - Authorized users create and edit runner files directly in the factory dashboard. + +Your team's plan sets the default instance shape (vCPUs and memory) for Warp-hosted runners. The same maximum shape applies on every plan, and Warp rejects hosted shapes above it. Enterprise teams that need more can request a higher maximum. Managed self-hosted runners are exempt from the hosted maximum because your team supplies the compute. + +## Choose an execution host + +A factory runs its work on one of two execution hosts: Warp-hosted compute or a managed self-hosted worker. + +| Decision area | Warp-hosted | Managed self-hosted | +| --- | --- | --- | +| **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 | + +To route factory work to a managed self-hosted worker (an Enterprise feature): + +1. **Deploy a worker** - Review the [self-hosting requirements](/platform/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. + +Unmanaged self-hosted agents and other CLI agents can't serve as a factory's execution host, but they can exchange work with a factory through [Factory MCP](/factories/factory-mcp/). + +## Choose execution, inference, and storage independently + +Execution, inference, and storage are independent choices: each moves one boundary and leaves the rest of the run flow with Warp. + +| Team choice | What it changes | What stays with Warp | +| --- | --- | --- | +| **Execution**: Warp-hosted or managed self-hosted | Where checkout, commands, and the sandbox filesystem run | Coordination, configuration, observability, and inference routing | +| **Inference**: Warp-managed or customer-supplied | The provider account, model routing, billing, and provider-side retention | Run coordination and inference routing | +| **Storage**: Warp or customer-owned | Where supported transcripts, artifacts, and run attachments persist | Orchestration, the write path, and other factory and control-plane state | + +:::note +Managed self-hosted execution, customer-supplied inference, and customer-owned storage all require an Enterprise plan. +::: + +Factory runs execute as [cloud agents](/platform/), so customer-supplied inference is limited to providers that support cloud agents. See [team-managed model keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) and [Bring Your Own LLM](/enterprise/enterprise-features/bring-your-own-llm/) for the supported providers. When you supply the provider, provider-side retention follows your provider account and contract; Warp can't configure or enforce it for you. The [security overview](/enterprise/security-and-compliance/security-overview/) covers Warp's broader data handling. + +For storage, Enterprise teams can keep the supported data classes above (transcripts, artifacts, and run attachments) in a customer-owned Amazon S3 or Google Cloud Storage bucket. Warp enables customer-owned storage for your team and writes the applicable data to the bucket you configure; your team owns the bucket's access and lifecycle policies. Customer-owned storage doesn't move all factory state into your account: configuration, run metadata, and other control-plane state stay with Warp. + +## Credential boundaries + +A factory handles four kinds of credentials, each with its own boundary: + +| Credential | Used for | Boundary | +| --- | --- | --- | +| **Inference credentials** | Model provider requests | Used only at the inference boundary; never injected into the sandbox | +| **Execution secrets** | APIs, package registries, and tools an agent uses | Delivered from an explicit per-agent allowlist; factory agents that don't act as a specific user receive no managed secrets by default | +| **Harness authentication** | Third-party harnesses such as Claude Code or Codex | Configured separately from the agent's secret allowlist | +| **Repository identity** | Checking out code and pushing changes | Runs act with the creating user's authorization (changes are attributed to them) or as the agent itself for unattended work; set by the definition's [`credentialStrategy`](/factories/factory-as-code/#credentialstrategy) | + +Scope each credential to the resources and actions its agent needs. Warp redacts known secret values at output boundaries, but redaction is a backstop, not a substitute for narrow external permissions and rotation. See [cloud agent secrets](/platform/secrets/), [harness authentication](/platform/harnesses/authentication/), [secret redaction](/support-and-community/privacy-and-security/secret-redaction/), and [team identity](/platform/team-access-billing-and-identity/) for the underlying controls. + +## Governance and metering + +Factories use your existing [team roles](/enterprise/team-management/roles-and-permissions/): Team Owners and Admins control factory definitions, runners, secrets, and provider configuration. Warp Factories doesn't add a factory-specific approval role, so who reviews specifications and who approves merges stays a workflow and repository policy decision. Treat factory-definition changes as operational code: review them like any other change, and keep merge access with the people responsible for shipping. + +Warp meters hosted compute, Warp-provided inference, and platform services. Managed self-hosted execution moves compute costs to your own infrastructure, and customer-supplied inference bills model usage through your provider account. Platform services consume credits regardless of these choices. See [platform credits](/support-and-community/plans-and-billing/platform-credits/) for details. + +## Deployment checklist + +1. **Classify the workload** - Identify the repositories, data, internal services, and regulated systems the factory can reach. +2. **Choose execution** - Decide where checkout, commands, and the sandbox filesystem must run. +3. **Configure the factory and its runners** - Set the repositories, setup commands, and secrets in the factory's definition, and choose each runner's operating system, architecture, image, and compute. +4. **Choose inference and storage** - Select provider routing and where supported run data persists. +5. **Scope credentials** - Set each agent's secret allowlist, harness authentication, and repository identity. +6. **Set review gates** - Decide where humans review specifications and pull requests, and enforce those gates in workflow and repository policy. +7. **Validate operations** - Test network egress, isolation, rotation, redaction, capacity, observability, and metering before increasing volume. diff --git a/src/content/docs/factories/integrations/github.mdx b/src/content/docs/factories/integrations/github.mdx new file mode 100644 index 000000000..3cab5a3a2 --- /dev/null +++ b/src/content/docs/factories/integrations/github.mdx @@ -0,0 +1,154 @@ +--- +title: Connect GitHub to your factory +description: >- + Connect GitHub to your factory so issues, pull requests, reviews, and CI + events start factory work and results post back to GitHub. +sidebar: + label: "GitHub" +--- +import { VARS } from '@data/vars'; + +When you connect a factory to GitHub, repository activity starts work in your factory. Issues, pull requests, reviews, and CI events can all trigger automations, and the factory posts results back to GitHub as comments, branches, and pull requests. + +## Prerequisites + +* **The Warp GitHub App** - Follow the [GitHub integration setup](/platform/integrations/github/) if you haven't already. One installation serves both the platform integration and factories. +* **A factory with GitHub repositories** - The app must have access to at least one of the factory's repositories. + +## Connect GitHub to a factory + +1. In the <a href={VARS.FACTORY_WEB_APP_URL}>{VARS.FACTORY_WEB_APP}</a>, click **+** next to **Factories** to open the setup wizard, then choose **I want to use repos from GitHub** under **Connect your code host**. +2. Under **Select your repos**, choose the repositories to provide code and context for the factory. + +That's all the setup GitHub needs. A new factory arrives with two automations already switched on, so it responds to GitHub activity right away: + +* **Mentions and assignments** - Start work. See [Mention the factory](#mention-the-factory) below. +* **Pull request merges** - Close out work. Any work items linked to the pull request move to their tracker's completed state. Closing without merging does nothing. + +To confirm the connection works, mention the factory on a test issue and check that a work item starts in the factory's [dashboard](/factories/factory-dashboard/). + +## Add a custom automation + +The defaults cover mentions, assignments, and pull request completion. To start work from any other GitHub activity, such as a failed CI run or a review request, add an automation with a **GitHub** trigger for that event, then narrow it with the filters below. [Automation filters](/factories/automation-filters/#edit-filters-on-an-automation) covers the steps. + +The CI failure triage automation in [`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 starts work when a workflow run fails on the default branch: + +```markdown title="automations/ci-failure-triage/automation.md" +--- +triggers: + - provider: github + event: workflow_run_completed + filter: + repos: [acme/api-service] + branches: [main] + conclusions: [failure] +--- +A workflow run failed on the default branch. Read the run's logs and find +the failing step. If the cause is small and clear, open a fix PR. Otherwise +open an issue with the failing step, the error, and the commit range, and +link the run. +``` + +For a review automation that fires when pull requests open, see [`04-code-review-only`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/04-code-review-only). + +## Supported triggers + +<table> +<colgroup> +<col style="width: 22%" /> +<col /> +</colgroup> +<thead> +<tr><th>Trigger</th><th>Supported activity</th></tr> +</thead> +<tbody> +<tr><td>Issues</td><td>Created, labeled, assigned, or agent mentioned</td></tr> +<tr><td>Pull requests</td><td>Opened, marked ready, reopened, updated with commits, assigned, labeled, mentioned, closed, or merged</td></tr> +<tr><td>Reviews</td><td>Review requested or review submitted</td></tr> +<tr><td>Code and CI</td><td>Push, a completed check suite or workflow run, or a re-run of a Warp check</td></tr> +</tbody> +</table> + +Re-running a check starts work only for checks Warp itself created. GitHub doesn't send re-run events for other providers' checks, so those can't trigger a factory. + +### Automation filters + +Every trigger names the repository it watches. The remaining filters appear only on the event types they apply to: + +| Filter | Matches | Appears on | +| --- | --- | --- | +| **Branches** | The pushed branch, or a CI run's head branch | Push and CI triggers | +| **Base branches** | The branch the pull request targets | Pull request triggers | +| **Paths** | The files the change touches | Push and pull request triggers | +| **Labels** | Labels on the issue or pull request | Issue, pull request, review submitted, and CI triggers | +| **Authors** | Who opened the issue or pull request | Issue, pull request, and CI triggers | +| **Assignees** | Who the issue or pull request is assigned to | Issue and pull request triggers | +| **Mentioned users or teams** | Which user or team is @mentioned | Mention and review submitted triggers | +| **Reviewers** and **Reviewer teams** | Who review was requested from | Review requested triggers | +| **Review states** | Whether the review approved, requested changes, or commented | Review submitted triggers | +| **Workflows** | The GitHub Actions workflow, by name | Workflow run triggers | +| **Conclusions** | The run's result: success, failure, cancelled, and so on | Check suite and workflow run triggers | + +On check suite and workflow run triggers, **Labels** and **Authors** match the pull request linked to the run rather than the run itself. + +Use filters to route work precisely. For example, send failed runs of a specific workflow to a CI-repair automation. + +## Mention the factory + +Handing an issue or pull request to a factory takes two things: + +1. **Add the factory's label.** Each factory has one, named `factory:` followed by its [**Foreman name**](/factories/factory-dashboard/#change-factory-settings). For example, a factory whose foreman is named `payments` uses `factory:payments`. Warp creates the label in every connected repository, so it's already in the list. +2. **Mention or assign @warp-factory**, in the body or in any new comment. + +The factory picks up the request and replies in the same thread. + +{/* VISUAL: An issue with the factory:<alias> label and an @warp-factory mention -- the two-part mention ritual is easy to miss from prose alone. */} + +Both halves matter, because **@warp-factory** is the account every factory listens through. The label is what decides which of your factories answers, so a mention without one doesn't start work. + +Only new content counts as a mention. Edits to existing comments, mentions inside code blocks, and mentions from bots are ignored. + +You can change what the factory answers to. The handle and the label are the starting filters on its mentions automation: edit them to respond to a different handle, such as your own `@org/team` slug, or remove the label filter so that any mention in the factory's repositories starts work. + +## How the factory responds on GitHub + +The factory posts progress comments in the originating issue, pull request, or review thread, with links to the run and to any branches or pull requests it creates. Events without a comment surface, such as a push or a workflow run, report their results on the work item instead. + +New activity on an issue, pull request, or review thread the factory is already working on continues that work item instead of starting a new one. + +Issues and pull requests the factory opens carry its label, the same one you use to mention it. Warp adds the label to each repository you connect and removes it when you disconnect one or delete the factory, so you never create or clean it up by hand. If a label is ever left behind, delete it like any other GitHub label. + +Branches and pull requests the factory creates follow the repository's normal rules: branch protection, required reviews, and merge requirements all still apply. + +## Permissions + +Runs authenticate with the GitHub App installation, not with the account of the person whose activity triggered them: + +* **The app installation decides what agents can reach.** Agents get exactly the repositories and permissions the installation grants, so change the installation to change access. [Automation filters](/factories/automation-filters/) only change when work starts. +* **Anyone who can create matching activity can start work.** The event author doesn't need to be a Warp team member. Use author, label, and branch filters to control what starts runs. + +For the full credential model, see [Permissions and identity](/platform/integrations/github/#permissions-and-identity) on the GitHub integration page. + +## Factory-definition pull request checks + +If the factory's [definition is managed as code](/factories/factory-as-code/) in a GitHub repository, Warp reviews changes to it the way CI reviews code. Open a pull request that touches the definition files and a **warp/factory-config** check runs: it passes with a summary of what the change does, or fails with the specific fields to fix. Require the check in branch protection to stop an invalid definition from merging. + +These checks validate the factory's configuration files only. They don't create work items, and pull requests that don't touch the factory directory don't get the check. + +## Troubleshooting + +### A GitHub event doesn't start work + +Confirm the app installation covers the event's repository, the repository belongs to the factory, and the automation includes that event. Then check each filter; a label, author, branch, workflow, conclusion, or state mismatch prevents routing. + +### Filter options don't load + +Select a repository first. If the automation editor shows **Connect GitHub**, complete the account connection and retry. You can enter a value manually when suggestions are unavailable. + +### An agent can't push a branch or open a pull request + +Check that the installation still covers the target repository and grants the required write permissions. Automation filters don't affect GitHub authorization. + +### A factory-definition check doesn't appear + +The check runs only for factories whose [definition is managed as code](/factories/factory-as-code/) in a GitHub repository. Confirm the pull request targets the branch the factory runs from, that it changes files in the factory's definition directory, and that the GitHub App covers the repository. diff --git a/src/content/docs/factories/integrations/gitlab.mdx b/src/content/docs/factories/integrations/gitlab.mdx new file mode 100644 index 000000000..bb97b345c --- /dev/null +++ b/src/content/docs/factories/integrations/gitlab.mdx @@ -0,0 +1,141 @@ +--- +title: Connect GitLab to your factory +description: >- + Connect GitLab to your factory so merge request events and bot mentions + start factory work and results post back as comments and merge requests. +sidebar: + label: "GitLab" +--- +import { VARS } from '@data/vars'; + +When you connect a factory to GitLab, project activity starts work in your factory. Merge request events and bot mentions trigger automations, and the factory posts results back to GitLab as comments, branches, and merge requests. + +## Prerequisites + +* **GitLab.com** - The integration supports GitLab.com only, not self-managed GitLab instances. To use a self-managed instance with standalone cloud agents instead, see the [GitLab access token setup](/platform/integrations/gitlab/). +* **A top-level GitLab group you own** - Connecting GitLab links one top-level group to your Warp workspace, one-to-one. Creating the link requires the Owner role on the group and workspace admin permissions in Warp. +* **A GitLab plan with service accounts and group webhooks** - Warp provisions service accounts in your group and installs a group webhook; both are GitLab Premium and Ultimate features. On a plan without group webhooks, factory credentials still work, but GitLab cannot trigger runs. + +## Service accounts and access + +Warp manages GitLab access through service accounts it creates in your connected group rather than a marketplace app: + +* **One manager account per workspace** - Created when you connect the group and granted the Owner role on it. Warp uses it to provision factory accounts, mint their run credentials, and maintain the group webhook; its provisioning token is valid for one year. +* **One bot account per factory** - Each factory gets its own service account, named from the factory's alias plus a `-warp-` suffix and a short unique ID (for example, `acme-support-warp-01k2x3y4z5`). The bot holds the Developer role on exactly the projects you select for the factory. It is the factory's identity on GitLab. Runs authenticate as the bot, and its username is the handle you mention. + +The connected group's webhook delivers merge request and comment events to Warp, and matching automations turn them into factory work. + +## Connect GitLab to a factory + +1. In the <a href={VARS.FACTORY_WEB_APP_URL}>{VARS.FACTORY_WEB_APP}</a>, click **+** next to **Factories** to open the setup wizard. +2. Choose **I want to use repos from GitLab** under **Connect your code host**, then authorize with GitLab when prompted. +3. Under **Connect a GitLab group**, pick a top-level group you own and click **Next**. Warp creates the manager service account and installs the group webhook. A group that is already connected shows a **Connected** badge, and the selection is locked to it. +4. Under **Select your repos**, choose the projects to provide code and context for the factory. Projects anywhere under the connected group, including subgroups, are available. +5. In the factory's [dashboard](/factories/factory-dashboard/), click **Automations**. GitLab factories start with an editable default automation, **gitlab-bot-mentions**, that fires when the factory's bot is mentioned. +6. To route merge request events too, create an automation and click **Add trigger**. +7. Choose **GitLab**, then choose **Merge request**. +8. To confirm the connection works, comment on a merge request in a selected project and mention the factory's bot. A work item starts in the factory dashboard, and the factory replies in the same thread. + +## Supported triggers + +<table> +<colgroup> +<col style="width: 22%" /> +<col /> +</colgroup> +<thead> +<tr><th>Trigger</th><th>Fires when</th></tr> +</thead> +<tbody> +<tr><td>Merge request</td><td>A merge request is opened, updated, closed, reopened, merged, or approved</td></tr> +<tr><td>Bot mentioned</td><td>A new comment mentions the factory's bot username</td></tr> +</tbody> +</table> + +### Automation filters + +| Filter | Matches | Appears on | +| --- | --- | --- | +| **Project** | The GitLab project the event came from | Both triggers | +| **Actions** | What happened to the merge request, such as opened, updated, or merged | Merge request | +| **Base branch** | The branch the merge request targets | Merge request | + +On the **Bot mentioned** trigger, the mention username is managed by Warp. It is always the factory's own bot, shown as read-only in the automation editor, and it cannot be set in a definition file. + +## Mention the factory + +Each GitLab factory has its own bot account, so the mention itself routes the request. There is no shared handle or routing label to apply. To mention the factory: + +1. Open a merge request in one of the factory's projects. +2. Post a comment that mentions the factory's bot username and includes an instruction. + +The **gitlab-bot-mentions** automation starts a work item, and the factory replies in the same thread. To find the bot's username, check that automation's trigger in the [factory dashboard](/factories/factory-dashboard/). + +{/* VISUAL: A merge request comment mentioning the factory's bot username, parallel to the GitHub mention visual. */} + +Mentions count only in new comments. Edits and activity from Warp's own service accounts never trigger work, so a factory can't re-trigger itself or a sibling factory. + +## How the factory responds on GitLab + +The factory acts on GitLab as its bot account: + +* **Replies in the thread it was mentioned in** - Its comments link back to the run session and the factory work item. New comments on the same merge request continue that work item instead of starting a new one. +* **Pushes branches and opens draft merge requests** - Branches are named `factory/<slug>`, and merge requests open as drafts that the factory marks ready when the work is done. Commits and comments attribute to the bot's GitLab profile. +* **Labels what it touches** - Merge requests and issues the factory opens or adopts carry its own label, named `factory:` followed by the factory's [**Foreman name**](/factories/factory-dashboard/#change-factory-settings). +* **Posts review feedback as comments** - A review lands as a summary note plus inline discussions on the diff. When a later revision addresses a finding, the factory replies in that discussion and resolves it. + +The factory never merges or approves a merge request; those decisions stay with your team. Branch protection and approval rules apply to everything the bot does. + +## Permissions + +Runs authenticate as the factory's bot account, not as the person whose activity triggered them: + +* **The bot's project membership decides what runs can reach.** Each run gets a short-lived token scoped to the bot's Developer role on the factory's selected projects. Selecting projects for a factory or tightening automation filters changes when work starts, not what a running agent can access. To change access, change the factory's projects. +* **Anyone who can create matching activity can start work.** The commenter doesn't need to be a Warp team member. Use project, action, and base-branch filters to control what starts runs. + +Disconnecting GitLab from the workspace retires the manager and every factory bot it provisioned. + +## Definitions as code + +If the factory's [definition is managed as code](/factories/factory-as-code/), declare GitLab triggers in an automation file: + +```markdown title="automations/gitlab-merge-requests/automation.md" +--- +enabled: true +agent: foreman +triggers: + - provider: gitlab + event: merge_request + filter: + repos: [my-group/my-app] + actions: [open] +--- + +Triage newly opened merge requests and post an initial review. +``` + +A `bot_mentioned` trigger takes only a `repos` filter. Leave `mentioned` out. Warp seeds it with the factory's bot username and rejects definitions that set it. GitLab isn't yet supported as a definition-hosting repository, so declare these triggers in a Warp-managed or GitHub-hosted definition even when the factory's automations and mentions run through GitLab; see [where the definition lives](/factories/factory-as-code/#where-the-definition-lives). + +## Troubleshooting + +### A mention doesn't start work + +Confirm the mention is in a new comment rather than an edit, the username matches the factory's bot exactly, the project is one of the factory's selected projects, and the **gitlab-bot-mentions** automation is enabled. + +### A merge request event doesn't start work + +Confirm an enabled automation includes the **Merge request** trigger and check its project, action, and base-branch filters. Activity authored by Warp's own service accounts is always ignored. + +### Nothing starts work even though GitLab is connected + +Your GitLab plan may not include group webhooks (see [Prerequisites](#prerequisites)). Upgrade your GitLab plan to let GitLab trigger runs. + +### The bot can't push a branch or open a merge request + +Confirm the target project is one of the factory's selected projects and the operation is permitted for the Developer role. Pushes to protected branches follow the project's protection rules. + +### Your group isn't listed when connecting + +Only top-level groups you own appear, and a group already connected to another Warp workspace can't be connected again. If you don't own the group, ask an owner to establish the connection in Warp. + +For the other ways to route work into a factory, see [Connect your factory](/factories/connect-your-factory/). diff --git a/src/content/docs/factories/integrations/jira.mdx b/src/content/docs/factories/integrations/jira.mdx new file mode 100644 index 000000000..d3f7cb3fb --- /dev/null +++ b/src/content/docs/factories/integrations/jira.mdx @@ -0,0 +1,88 @@ +--- +title: Connect Jira to your factory +description: >- + Connect Jira Cloud to your factory so work items assigned to Warp start + factory runs and return results in Jira. +sidebar: + label: Jira +--- +import { VARS } from '@data/vars'; + +Connect Jira Cloud to your factory so your team can start factory work without leaving Jira. When someone assigns or mentions **Warp** on a work item, Jira starts an agent session, a factory automation routes the request to the agent you chose, and the same session shows progress and the final result. + +## Prerequisites + +* **Jira Cloud** - The integration supports Jira Cloud only, not Jira Server or Data Center. +* **A Jira site admin** - Installing the Warp app on a Jira site and connecting it to a Warp workspace requires site admin permissions. +* **A factory** - You need a factory in the connected workspace and permission to edit its [definition](/factories/factory-as-code/). +* **The Warp agent in Jira** - The **Warp** agent must be available on your Jira site so people can assign or mention it on work items. Jira lists it among Atlassian's Rovo agents. + +## Connect Jira and add an automation + +1. **Install the Warp app on your Jira site and connect it to your Warp workspace.** The [Jira integration setup](/platform/integrations/jira/#setup) walks through both. Once connected, every factory in the workspace can use it. (That page's `warp-agent` label flow starts standalone cloud agent runs; factories skip the label and use an automation instead.) + +2. **Connect Jira to this factory.** A workspace connection makes Jira available to your factories, but each one opts in separately: in the factory's **Settings**, connect **Jira** and select the projects that should trigger it. + +3. **Point an automation at Jira.** In the factory's dashboard, open **Automations** and add a trigger for **Jira** > **Agent session created**. Use **Projects** and, optionally, **Keywords** to scope which sessions start a run, and choose the agent that handles them. + + If you picked Jira projects when you created the factory, that automation already exists. Edit it rather than adding a second one. + + To set this up in code instead, declare the `jira` integration in the factory's `factory.yaml` (`integrations: [{type: jira}]`), then add a file under `automations/`, such as `automations/jira-assignment/automation.md`, with an `agent_session_created` trigger: + + ```markdown title="automations/jira-assignment/automation.md" + --- + enabled: true + agent: foreman + triggers: + - provider: jira + event: agent_session_created + filter: + project_keys: [ENG] + keywords: [investigate, fix] + --- + + Handle the Jira assignment and return a concise result. + ``` + + With this automation, the agent named `foreman` handles sessions for work items in the `ENG` project whose assignment text contains `investigate` or `fix`. Commit and push the files to apply them; see [definitions as code](/factories/factory-as-code/) for the full syntax. + +4. **Test it.** Assign or mention **Warp** on a work item and include an instruction. Jira starts an agent session, and the run appears under the matching automation in your factory. + + {/* VISUAL: A Jira work item assigned to Warp, showing the resulting agent session. */} + +## Filter which sessions start runs + +All Jira work reaches the factory through a single event, `agent_session_created`, which fires when someone assigns or mentions **Warp** on a work item. A session starts a run only when it matches an enabled automation. Use the trigger's `filter` to narrow what matches: + +* **`project_keys`** - Match work items in these Jira projects. +* **`keywords`** - Match assignment text that contains any of these words. Matching is case-insensitive. + +A session must match every field you set; within a field, any listed value is a match. Omit a field to match everything. For the matching rules shared by every source, see [automation filters](/factories/automation-filters/). + +:::caution +A Jira event is offered to every automation in the connected workspace, so another team's automation with a broader filter can start its own run on the same work item. Filters decide what *your* automation picks up, not who else can see the event. See [automation filters](/factories/automation-filters/#filters-route-work-they-dont-restrict-access). +::: + +## What happens during a run + +The agent runs in the cloud and starts with the assignment text and the work item it came from. When the factory declares Jira as an integration, the agent can also read the work item's details, comments, and available workflow transitions. + +Jira shows the task's status as it progresses: submitted, working, waiting for input, completed, failed, or cancelled. For more than status updates, open the run under the matching automation in your factory: [cloud agent session sharing](/platform/viewing-cloud-agent-runs/) shows the full run, including every command, log, and output, in real time or after the run finishes. + +Replies in the same agent session continue the same run, even after the agent finishes a turn, so you can answer questions or add direction mid-task. + +When the run finishes, the result appears in the agent session. The agent doesn't comment on the work item unless you ask it to. The agent can act in Jira when asked: update the work item, post or edit comments, change workflow status, add or remove labels, or reassign it. State the actions you want in the automation instructions or the assignment; Jira permissions and valid workflow transitions apply to everything the agent does. + +## Permissions + +* **A connected Jira user becomes the run's creator, not its agent** - [Connect your Jira account to Warp](/platform/integrations/jira/#connecting-your-jira-account-to-warp) so a session you start is attributed to you; an unconnected account gets a prompt to connect instead of a run starting. Either way, the run executes as the agent selected by the automation, not as that Jira user. +* **Jira access doesn't include code access** - Connecting Jira lets agents read and update Jira work items, nothing more. Repository access comes from the factory itself. + +## Troubleshooting + +* **Warp is unavailable in Jira** - Confirm the Warp app is installed on the Jira Cloud site. On the app's **Configure** page, click **Connect to Warp** if the installation isn't connected to a workspace. +* **No run starts** - Confirm an enabled `agent_session_created` automation exists, its agent is available, and its project and keyword filters match the assignment. +* **The session shows no result** - Open the matching automation's run to see whether the agent is still working, waiting for input, or failed. +* **A Jira update fails** - Confirm the app can access the work item's project and that the requested action or workflow transition is valid. + +For the other ways to route work into a factory, see [Connect your factory](/factories/connect-your-factory/). diff --git a/src/content/docs/factories/integrations/linear.mdx b/src/content/docs/factories/integrations/linear.mdx new file mode 100644 index 000000000..52b7f7370 --- /dev/null +++ b/src/content/docs/factories/integrations/linear.mdx @@ -0,0 +1,79 @@ +--- +title: Connect Linear to your factory +description: >- + Connect Linear to your factory so planned issues flow in automatically and + progress flows back to the issue. +sidebar: + label: "Linear" +--- + +Connect Linear to your factory so your team can send issues without leaving Linear. Assign an issue to the factory or tag it in a comment, and the factory picks it up with the issue's full context, then keeps the issue updated as the work moves through [its stages](/factories/how-factories-work/). + +When the factory needs an answer, reply in Linear, or open the live run to steer the agent directly. + +## Prerequisites + +* **A factory** - Create a factory with the agents and repositories needed to handle Linear work. +* **A Linear workspace** - Use a Linear account that can authorize the Warp app for the workspace. +* **A linked Warp account (agent sessions only)** - Anyone who starts a Linear agent session must link their Linear user to their Warp account. If Warp can't identify the session creator, Linear shows an authentication prompt instead of starting work. +* **Code host access** - Configure repository access separately through the factory's [GitHub connection](/platform/integrations/github/). The factory needs it to change code or create a pull request. + +For workspace-level installation, reconnection, and removal steps, see the [Linear integration setup guide](/platform/integrations/linear/). + +## Connect Linear + +You connect Linear either while creating a factory, at the **Connect your issue trackers** step, or afterward from the factory's **Settings**. Either way you do the same two things: + +1. **Authorize Warp for your Linear workspace.** This is Linear's own OAuth flow, and it's only needed once per workspace. +2. **Choose which Linear teams trigger this factory.** + +Warp then adds a default automation that routes new [agent sessions](#route-agent-sessions) from those teams to your factory. Issue and comment activity doesn't start work until you [add triggers](#configure-linear-triggers) for it. + +## Route agent sessions + +When someone mentions, assigns, or delegates the Warp app on an issue, Linear starts an agent session. The default automation created when you connected Linear routes new sessions from your selected teams to the factory, so assigning an issue or tagging the factory in a comment is enough to start work. If a session doesn't match any automation, the [Linear integration](/platform/integrations/linear/) handles it with its default behavior. + +{/* VISUAL: A Linear issue with an assigned or mentioned Warp agent session. */} + +Replies in an existing session continue that run rather than starting a new one. To narrow which sessions reach the factory, such as by creator or keyword, edit the `agent_session_created` trigger in the factory's [definition files](/factories/factory-as-code/); session routing isn't editable from the automation editor. + +## Configure Linear triggers + +Agent sessions cover explicit requests. To start work automatically from issue and comment activity too, add an automation with a **Linear** trigger for one of these events: **Issue created**, **Issue labeled**, **Issue state changed**, **Issue assigned**, or **Comment created**. [Automation filters](/factories/automation-filters/#edit-filters-on-an-automation) covers the steps. + +Every Linear trigger filters on teams and labels, and **More filters** adds project, workflow state, assignee, mentioned user, and, for comment events, a specific issue. For example, a trigger can require that an issue belongs to one team, enters a chosen workflow state, and carries a release label. + +## Supported events and outputs + +Each event determines the context the agent receives and the updates the factory sends back. + +| Linear event | What the agent receives | What the factory sends back | +| --- | --- | --- | +| Issue created, labeled, state changed, or assigned | The issue's title, description, team, project, labels, workflow state, and assignee | Work item progress, issue state or delegate changes, and links to results | +| Comment created | The new comment and its issue's context | An acknowledgment, progress updates, and responses | +| Agent session created | The request that mentioned, assigned, or delegated the Warp app | Live progress in the session, plus links to the run and any pull request | +| Reply in an agent session | The new message and the session history | Continued work in the same session, not a separate work item | + +## Follow-up events on the same issue + +Once a Linear issue is linked to a factory work item, later matching events on that issue continue the same work item instead of creating a new one. + +:::caution +One comment can match two routes: a comment that creates an agent session can also match a **Comment created** trigger. If both point at your factory, a single action starts two runs. Scope your automations so one path owns each kind of request. +::: + +## What the factory can do in Linear + +In an agent session, the factory posts its plan, actions, and results as it works. It can also attach a GitHub pull request to the issue, update the issue's workflow state or delegate, link back to the run, and acknowledge comments it acts on. Its own Linear activity never triggers automations, so a factory can't set itself off in a loop. + +Only agent sessions require a linked Warp account. Issue and comment events from unlinked users still start work, but Warp may not record who requested it. + +Connecting Linear doesn't grant repository access. Branches and pull requests use the factory's code-host credentials, and the pull request still waits for a person to review and merge. + +## Troubleshooting + +* **An agent session shows an authentication prompt** - Complete the prompt to link your Linear user to your Warp account, then retry the request. +* **Teams or filters don't load** - Reconnect Linear by following the [Linear integration setup guide](/platform/integrations/linear/), then confirm the connection can access the workspace and team you expect. +* **An event doesn't start work** - Confirm the automation is enabled, the event type matches, and every filter matches the issue's current values or the state change. +* **One action starts multiple runs** - Look for overlapping agent-session and comment triggers, then narrow or remove one. +* **No pull request appears** - Check the factory's code-host credentials and repository access. Linear authorization alone doesn't allow code changes. diff --git a/src/content/docs/factories/integrations/slack.mdx b/src/content/docs/factories/integrations/slack.mdx new file mode 100644 index 000000000..1704a768f --- /dev/null +++ b/src/content/docs/factories/integrations/slack.mdx @@ -0,0 +1,96 @@ +--- +title: Connect Slack to your factory +description: >- + Connect Slack to your factory so your team can start work with mentions, + direct messages, and automations, and get results back in the same thread. +sidebar: + label: "Slack" +--- + +Connect a factory to Slack so your team can send work without leaving their conversations. Mention the factory in a channel or send it a direct message, and it picks up the request with the conversation as context, then posts progress and results back into the same thread. + +Each factory appears in Slack as its own app with the factory's name and avatar. A channel can host several factories, and you choose which one to mention. + +## Prerequisites + +* **Permission to install Slack apps in the target workspace** - Workspace policy may require administrator approval before the app installs. +* **Permission to update the factory** - Connecting Slack changes the factory's configuration. + +## Connect the factory + +1. **Select Slack while creating a factory**, or connect it later from the factory's **Settings**. Warp installs its Slack app for you. +2. **Complete the install if it can't finish on its own.** This usually happens when your workspace requires administrator approval. Click **Add to Slack** in factory setup to finish. +3. **Invite the app to each channel it should listen in.** Private channels always need an invitation. +4. **Confirm the connection.** Mention the app in one of those channels. It reacts with 👀 to show it picked up the request. + +## Configure factory automations for Slack + +Use a factory automation to start work from Slack activity automatically, without anyone mentioning the app, such as on every message in a triage channel or on a specific emoji reaction. Add a **Slack** trigger to an automation and pick one of these events; [automation filters](/factories/automation-filters/#edit-filters-on-an-automation) covers the steps. + +- **App mentioned** - Filter by joined conversations, authors, and keywords. +- **Direct message received** - Filter by direct-message conversations, authors, and keywords. +- **Message posted in channel** - Filter by joined conversations, authors, and keywords. +- **Reaction added** - Filter by conversations, reactors, keywords, emoji, and reacted-message authors. +- **Member joined channel** - Filter by conversations and members. + +The reaction-intake automation in [`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 files a GitHub issue when someone reacts with `:ticket:`: + +```markdown title="automations/slack-reaction-intake/automation.md" +--- +triggers: + - provider: slack + event: reaction_added + filter: + emojis: [ticket] +--- +Someone reacted with :ticket: to a Slack message. Read the thread, file a +GitHub issue that captures the request with a link back to the thread, and +reply in the thread with the issue link. Do not start the work; this +automation only files it. +``` + +The **Conversations** picker only shows conversations the factory's app has joined. If a channel is missing, invite the app to it; for direct messages, send the app a DM first. Then refresh the automation editor. + +A single Slack message can match more than one automation. For example, if one automation triggers on **App mentioned** and another triggers on **Message posted in channel** in the same channel, a channel message that mentions the app starts two separate runs, one for each automation. To avoid duplicate runs, don't point both triggers at the same channel. + +## Start and continue work from Slack + +Mention the app in a channel or thread, or send it a direct message, to start work. The factory picks up the message, including available thread history and supported attachments, and replies in the same place with an acknowledgment, progress updates, and links to results. + +A plain reply in a thread continues work only if that thread already has a factory work item; to start new work in a channel, mention the app instead. Slack activity that matches an automation starts work the same way, without a mention, using the event details and the automation's assigned agent. + +You can attach files to a request or a follow-up. The factory includes the files it supports, and a file it can't include doesn't stop the text of your request from going through. + +## Follow work and review outputs + +The Slack thread where work started is also where you follow it: the factory posts progress and the final response there. Reply in the thread to add information or attachments while work is active, or to pick the same work item back up later. + +<figure style={{ maxWidth: "563px" }}> +![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) +<figcaption>The factory's Slack app posting progress updates in the thread where work started.</figcaption> +</figure> + +For an overview of the factory's work items, open the app's **Home** tab in Slack. It groups them by the same stages as the factory dashboard's [Activity view](/factories/factory-dashboard/#track-work-items-on-activity) (Triage, Planning, Building, Reviewing, Complete, and Cancelled), offers stage and date filters, and links each work item back to its Slack thread, factory run, issue, or pull request when available. + +Work that starts in Slack still ends at a pull request for a person to review — see [how Warp Factories work](/factories/how-factories-work/). + +## Who can start work + +To start work with a mention or direct message, your Slack account must be linked to an active member of the factory's Warp team. If it isn't, the app prompts you to connect an account instead of starting work. + +Work started by an automation runs as the factory agent you chose for it, not as whoever triggered it. + +## Troubleshooting and reconnection + +- **The app doesn't acknowledge a request** - Confirm Slack is connected for that factory, that you mentioned the right factory's app, and that the app is in the channel. +- **A channel is missing from an automation** - Invite the app to that channel, then reload the **Conversations** picker. +- **Installation is pending** - Ask a Slack workspace administrator to approve the app, then finish the installation. +- **Two runs start for one mention** - Remove or narrow overlapping app-mention and channel-message triggers. + +To disconnect Slack, either delete the factory — which removes its Slack app along with it — or [remove the app from your Slack workspace](https://slack.com/help/articles/360003125231-Remove-apps-and-custom-integrations-from-your-workspace), which stops new Slack requests reaching that factory. To reconnect afterward, click **Add to Slack** in factory setup again. + +To route work into the factory from other tools, see [Connect your factory](/factories/connect-your-factory/). + +## Privacy + +The factory's app reads messages only where it's mentioned, directly messaged, or subscribed by an automation you configured. Message content and supported attachments are used to run the factory's work, and your Slack profile email is used to map you to your Warp account. Data is handled per the [Warp Privacy Policy](https://www.warp.dev/privacy). diff --git a/src/content/docs/factories/measure-and-improve.mdx b/src/content/docs/factories/measure-and-improve.mdx new file mode 100644 index 000000000..d07c50666 --- /dev/null +++ b/src/content/docs/factories/measure-and-improve.mdx @@ -0,0 +1,111 @@ +--- +title: Measure and improve a factory +description: >- + Measure factory activity and costs, evaluate completed conversations, compare + agent configurations, and turn failures into follow-up work. +sidebar: + label: "Measure and improve" +--- + +Warp Factories tracks what your factory produces and how well it performs, so you can spot a problem, test a fix, and decide whether to keep it. + +| Feature | What it tells you | +| --- | --- | +| Dashboard metrics | How much work the factory produced, and what it cost. | +| Scorers | Whether completed conversations meet criteria you define. | +| Benchmarks | How different configurations perform on the same tasks. | +| Self-improvement | Which repeated failures get investigated and turned into follow-up work. | + +## Read metrics on the Dashboard page + +The **Dashboard** page shows activity, cost, autonomy, and evaluation results: + +| Metric | What it shows | +| --- | --- | +| **Total runs** | All agent runs, with breakdowns by agent type, status, source, model, and more. | +| **PRs opened** | Pull requests created from factory work. | +| **PRs merged** | Pull requests that merged. | +| **Autonomy** | The share of the factory's merged PRs that needed no human input beyond an approving review and the merge itself. A PR counts as autonomous only if no person added commits, requested changes, or otherwise edited it before merge. | +| **PR cycle time** | The median time the factory's merged PRs took from run kickoff through PR, first review, and merge, with a median for each stage. | +| **Cost per PR** | An estimate of credits spent per pull request. | +| **Most expensive PRs** | The highest-cost pull requests. | +| **Scorer cards** | Results from your Scorers. | +| **Self-improvement PRs** | The three newest Self-improvement pull requests, regardless of the selected date range. | + +**Cost per PR** is an estimate, not a billing figure: it counts recorded credits and can undercount actual usage. + +:::caution +**PRs merged**, **Autonomy**, **PR cycle time**, and the detail in **Most expensive PRs** require the GitHub App and only cover activity from after you install it. +::: + +Use the **Dashboard** page to pick which runs to investigate, not to conclude what caused a change. **Total runs** includes evaluation, benchmark, and Self-improvement runs, so a higher run count with a flat PR count could mean harder tasks, retries, or measurement activity. + +## Configure Scorers + +A **Scorer** uses an LLM judge to classify completed conversations against criteria you write, such as "did the agent run the tests before opening a PR?" Scorers classify conversations rather than grading them on a numeric scale. Keep each Scorer focused on one question so its failures point to a specific fix. For Scorers defined as files in a factory definition, see the two scorers in [`02-sdlc-issue-to-pr`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/02-sdlc-issue-to-pr) in the [warp-factory-examples](https://github.com/warpdotdev/warp-factory-examples) repository. + +Configure these fields: + +* **Agent(s) to evaluate** - The agents this Scorer applies to. Select at least one. +* **Judge instructions** - The criteria the judge checks for. +* **Judge model** - The model that acts as the judge. +* **Classifications** - The labels the judge can assign, each with a score. +* **Pass threshold** - The score a conversation needs to pass. +* **Sample rate** - The share of the selected agents' completed conversations to evaluate. + +{/* VISUAL: The Scorer create/edit form (judge instructions, judge model, classifications, pass threshold, sample rate). */} + +While the sample rate is above 0, scoring runs automatically: shortly after a sampled conversation completes, the judge evaluates it and records a classification, a score, and its reasoning. To stop automatic scoring, set the sample rate to 0. + +You can also score any single conversation on demand, which is useful for testing new judge instructions before raising the sample rate. Scoring a conversation again replaces its previous result from that Scorer. + +Changing **Pass threshold** updates how past scores display as pass or fail; the recorded results don't change. + +## Compare configurations with benchmarks + +A benchmark compares configurations of a single agent on the same fixed tasks, so you can test a model, harness, or runner change before adopting it. A benchmark suite includes: + +* **Agent** - The agent whose configurations you compare. +* **Tasks** - Fixed prompts with success criteria. +* **Configurations** - The harness, model, and runner combinations to test. +* **Scorers** - Your classification Scorers, applied to every trial. +* **Repetitions** - The number of trials per task and configuration. + +You can create a benchmark task from a completed run's detail pane, and Warp copies the run's input into the task. Add success criteria before you launch. + +Every benchmark also runs **Correctness**, a built-in Scorer that marks each trial as pass or fail against the task's success criteria. Results show pass rates, cost, and quality for each configuration, with per-task detail. Warp doesn't combine these signals into one score or pick a winner; you weigh the results and decide. Benchmark credit totals don't include model usage, so the true cost is higher. + +## Configure and review Self-improvement + +{/* VISUAL: The Self-improvement pull request list, or a Benchmarks suite run -- this section is text-only today. */} + +Turn on **Self-improvement** for each Scorer whose failures you want investigated automatically. Self-improvement groups related failures and files follow-up tasks as ordinary agent runs. A follow-up run can propose changes to application code. It can also improve the factory itself: when you manage your factory as [definitions as code](/factories/factory-as-code/), its prompts, skills, and configuration are version-controlled files, so a follow-up run can open a pull request against the factory definition the same way it would against application code. Nothing is adopted without your review. + +Each Self-improvement pull request includes a **Regressions addressed** section that links the failing runs and Scorer results behind it, so you can trace the change back to its evidence. + +## Run a practical improvement loop + +Change one measurable thing at a time: + +```mermaid +flowchart LR + Define[Define a Scorer] --> Baseline[Collect a baseline] + Baseline --> Inspect[Inspect failures] + Inspect --> Benchmark[Benchmark a candidate] + Benchmark --> Adopt[Review and adopt] + Adopt --> Monitor[Keep monitoring] + Monitor --> Inspect + Inspect -.->|Repeated failures| Improve[Self-improvement] + Improve -.-> Adopt +``` + +1. **Define a Scorer.** Pick one agent and one failure mode you can observe. Write the judge instructions and classifications, then score a few conversations manually and compare the judge's results against your own review. +2. **Collect a baseline.** Let automatic scoring run until results reflect normal work. Record the Scorer settings, date range, and relevant costs. +3. **Inspect failures.** Read the judge's reasoning and the underlying conversations. Look for causes like missing context, unclear instructions, or missing tools. Turn on Self-improvement when the same failure keeps repeating. +4. **Benchmark a candidate.** Compare configurations of that agent on the same tasks, with enough repetitions to trust the difference. +5. **Review and adopt.** If the evidence supports the change, make it. Review Self-improvement pull requests with the same standards as human-authored ones. +6. **Keep monitoring.** Leave the Scorer active and compare new results against your baseline. Revise the Scorer, or set its sample rate to 0, when its criteria no longer match what your team needs. + +## Next step + +Record an adopted change in [factory definitions as code](/factories/factory-as-code/) so your team can review the factory configuration. diff --git a/src/content/docs/factories/quickstart.mdx b/src/content/docs/factories/quickstart.mdx new file mode 100644 index 000000000..948a389fd --- /dev/null +++ b/src/content/docs/factories/quickstart.mdx @@ -0,0 +1,122 @@ +--- +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. +sidebar: + label: "Quickstart" +--- +import { VARS } from '@data/vars'; + +:::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. +::: + +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. + +In this quickstart, you will create a factory and take one small work item from prompt to pull request in less than 10 minutes. + +## 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. + +## 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. + +## Set up your factory + +_~5 minutes_ + +:::note +Already using an agent connected to [Factory MCP](/factories/factory-mcp/)? Ask it to run `create_factory` with the team, repositories, and factory name to create the factory directly, skipping the wizard below. Choose agents and connect your tools afterward in the factory's dashboard. +::: + +Warp walks you through a setup wizard: + +1. Sign in to the <a href={VARS.FACTORY_WEB_APP_URL}>{VARS.FACTORY_WEB_APP}</a>. Next to **Factories**, click **+**. + + <figure style={{ maxWidth: "300px" }}> + ![The Factories section of the sidebar, with the + button used to start a new factory highlighted.](../../../assets/factories/quickstart-open-setup-wizard.png) + <figcaption>Click + next to Factories to open the setup wizard.</figcaption> + </figure> + +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. + + <figure style={{ maxWidth: "563px" }}> + ![The Connect a GitHub organization screen, with an already-connected organization shown as an option.](../../../assets/factories/quickstart-connect-organization.png) + <figcaption>Choose the organization or group whose repositories the factory will use. GitLab shows an equivalent screen for groups.</figcaption> + </figure> + +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. + + <figure style={{ maxWidth: "563px" }}> + ![The Select your repos screen, searching for repositories by name.](../../../assets/factories/quickstart-select-repos.png) + <figcaption>Search for and select the repositories the factory works in.</figcaption> + </figure> + +4. Name the factory. This also sets its [**Foreman name**](/factories/factory-as-code/#alias), the handle your team @-mentions to reach it from Slack and Linear. Keep it short and recognizable, or set your own. + + <figure style={{ maxWidth: "563px" }}> + ![The Give your factory some personality screen, with Factory name and Foreman name fields filled in.](../../../assets/factories/quickstart-name-factory.png) + <figcaption>Name the factory and, optionally, add a description and avatar.</figcaption> + </figure> + +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. + + <figure style={{ maxWidth: "563px" }}> + ![The Pick your factory agents screen, with the Foreman and all four default agents shown as enabled.](../../../assets/factories/quickstart-pick-agents.png) + <figcaption>Toggle which default agents the foreman can dispatch.</figcaption> + </figure> + +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/). + +Warp creates the factory and opens its [dashboard](/factories/factory-dashboard/). + +## Send your first work item + +_~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. + +1. Describe one small, verifiable change and send it: + + ```text title="Example first request" + Add a "Local development" section to README.md that summarizes the setup + steps from CONTRIBUTING.md. Keep the change to that one file, run the + 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. + +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 details in the factory's [dashboard](/factories/factory-dashboard/): + + * **Runs** - The foreman's run and the child runs it dispatches. + * **Activity** - The work item as it moves through its stages. Open it for the event history and pull request artifacts. + + If you connected Slack, you can follow along there instead: + + <figure style={{ maxWidth: "563px" }}> + ![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) + <figcaption>The factory's Slack app posting progress updates back in the thread where you sent the request.</figcaption> + </figure> + +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. + +## 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. +* [**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. diff --git a/src/content/docs/factories/troubleshooting.mdx b/src/content/docs/factories/troubleshooting.mdx new file mode 100644 index 000000000..78d827bda --- /dev/null +++ b/src/content/docs/factories/troubleshooting.mdx @@ -0,0 +1,94 @@ +--- +title: Troubleshooting Warp Factories +description: >- + Fix factory setup problems, events that don't start work, and runs that + stall or need stopping. +sidebar: + label: "Troubleshooting" +--- +import { VARS } from '@data/vars'; + +Fix the problems teams hit most often when setting up a factory and running their first work through it. Each entry below names the symptom you'd see in the {VARS.FACTORY_WEB_APP}. + +## Setting up a factory + +### You don't have access to Warp Factories + +**Cause:** Warp Factories is in Early Access and enabled per team. + +**Fix:** [Request access](https://www.warp.dev/factories/request-access) for your team. If a teammate already has it, ask a team admin to confirm you're on that team. + +### A repository doesn't appear in the picker + +**Cause:** The code host connection doesn't cover the repository. + +**Fix:** + +1. Confirm the connection includes the repository and the intended organization or group. See the [GitHub](/factories/integrations/github/) and [GitLab](/factories/integrations/gitlab/) integration guides for how each connection is scoped. +2. If you can't update it yourself, ask a GitHub organization owner, a GitLab group owner, or a Warp team admin to extend the connection. + +### Setup stops at an agent limit + +**Cause:** Your team's plan limits how many factory agents it can run. + +**Fix:** + +1. Ask a team admin to confirm the team's capacity. +2. If the team needs more agents, [contact sales](https://www.warp.dev/contact-sales). + +## Work isn't starting + +### An event that should start work doesn't + +**Cause:** Nearly always an automation that doesn't match the event, rather than a broken connection. + +**Fix:** + +1. Confirm the automation is enabled and its trigger's event type matches what happened. +2. Check every filter on the trigger. Filters combine with AND, so a single mismatched repository, label, author, or state stops the routing. See [automation filters](/factories/automation-filters/#troubleshooting). +3. Confirm the source is connected to *this* factory. Connecting a provider to your workspace doesn't attach it to every factory in that workspace. + +Then check the causes specific to where the work came from: + +| Source | Common causes | +| --- | --- | +| [Slack](/factories/integrations/slack/#troubleshooting-and-reconnection) | The app isn't in the channel, installation is pending admin approval, or your Slack account isn't linked to a Warp team member | +| [GitHub](/factories/integrations/github/#troubleshooting) | The app installation doesn't cover the repository, or the factory's routing label is missing | +| [GitLab](/factories/integrations/gitlab/#troubleshooting) | The mention was an edit rather than a new comment, or your plan doesn't include the group webhooks that deliver events | +| [Linear](/factories/integrations/linear/#troubleshooting) | The agent session needs a linked Warp account, or teams and filters don't match | +| [Jira](/factories/integrations/jira/#troubleshooting) | The Warp app isn't connected to your workspace, or project and keyword filters don't match | + +### One action starts two runs + +**Cause:** Two automations match the same event — commonly an app-mention trigger and a channel-message trigger pointed at the same place. + +**Fix:** Narrow or remove one of the overlapping triggers so a single path owns each kind of request. See [how matching works](/factories/automation-filters/#how-matching-works). + +## Runs and work items + +### You need to stop a run + +**Fix:** Open **Activity** in your factory's [dashboard](/factories/factory-dashboard/), select the work item, and click **Stop task**. It takes effect immediately, with no confirmation prompt. + +### A work item looks stuck + +**Cause:** The factory is often waiting on a person rather than failing. By default it pauses for spec approval, for answers to clarifying questions, and at the pull request. + +**Fix:** + +1. Open the work item on **Activity** and read its event history to see which agent ran last. +2. Use **View agent** to open that agent's session, where a question waiting on a human is visible and answerable. +3. If the run is still active, you can steer it directly. See [cloud agent session sharing](/platform/viewing-cloud-agent-runs/). + +### No pull request appears + +**Cause:** The factory can't push, or the work never reached implementation. + +**Fix:** Confirm that the **Implement** agent is enabled on the factory, that the code host connection still grants write access to the target repository, and that the work item actually reached the implementation stage. Branch protection rules apply to everything the factory pushes. + +## Related pages + +* [**Warp Factories quickstart**](/factories/quickstart/) - Create a factory and submit your first work item. +* [**Connect your factory**](/factories/connect-your-factory/) - Route work in from Slack threads, Linear issues, and other intake paths. +* [**Automation filters**](/factories/automation-filters/) - The matching rules that decide which events start work. +* [**Factory dashboard**](/factories/factory-dashboard/) - Where to watch work items, runs, and their outputs. diff --git a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-claude-code.mdx b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-claude-code.mdx index 2db68162f..874c72340 100644 --- a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-claude-code.mdx +++ b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-claude-code.mdx @@ -5,15 +5,16 @@ description: >- notifications — or switch from Claude Code to Warp's Agent Mode as your primary coding agent. --- +import { VARS } from '@data/vars'; -Claude Code is different from the other sources in this section: it's not a terminal emulator, it's a CLI agent that runs inside any terminal. Warp is an agentic development environment with a built-in [code editor](/code/code-editor/), [Code Review](/code/code-review/), [team collaboration](/knowledge-and-collaboration/warp-drive/), and [MCP](/agent-platform/capabilities/mcp/) support — so you have two paths to choose from: +Claude Code is different from the other sources in this section: it's not a terminal emulator, it's a CLI agent that runs inside any terminal. Warp is an agentic development environment with a built-in [code editor](/code/code-editor/), [Code Review](/code/code-review/), [team collaboration](/knowledge-and-collaboration/warp-drive/), and [MCP](/agents/capabilities/mcp/) support — so you have two paths to choose from: * **[Using Claude Code inside Warp](#using-claude-code-inside-warp)** - you want to keep using Claude Code as your coding agent and run it in Warp's terminal. -* **[Switching to Agent Mode from Claude Code](#switching-to-agent-mode-from-claude-code)** - you want to replace Claude Code with Warp's built-in [Agent Mode](/agent-platform/local-agents/overview/). +* **[Switching to Agent Mode from Claude Code](#switching-to-agent-mode-from-claude-code)** - you want to replace Claude Code with Warp's built-in [Agent Mode](/agents/). ## Using Claude Code inside Warp -Warp provides first-class support for Claude Code through its [third-party CLI agents](/agent-platform/cli-agents/overview/) integration. Open a new tab and run: +Warp provides first-class support for Claude Code through its [third-party CLI agents](/agents/cli-agents/overview/) integration. Open a new tab and run: ```bash claude @@ -21,18 +22,18 @@ claude Warp auto-detects Claude Code and unlocks IDE-level features on top of the TUI: -* **[Rich input editor](/agent-platform/cli-agents/rich-input/)** (`Ctrl+G`) - compose multi-line prompts with `@` mentions, voice input, and slash commands. -* **[Agent notifications](/agent-platform/capabilities/agent-notifications/)** - in-app and desktop alerts when Claude Code needs your input. Requires a one-time plugin install (Warp prompts you). +* **[Rich input editor](/agents/cli-agents/rich-input/)** (`Ctrl+G`) - compose multi-line prompts with `@` mentions, voice input, and slash commands. +* **[Agent notifications](/agents/capabilities/agent-notifications/)** - in-app and desktop alerts when Claude Code needs your input. Requires a one-time plugin install (Warp prompts you). * **Inline code review** - send review comments directly to the agent from Warp's [Code Review](/code/code-review/) panel. * **[Vertical tabs with agent metadata](/terminal/windows/vertical-tabs/)** - track multiple Claude Code sessions across tabs with status indicators. -* **[Remote control](/agent-platform/cli-agents/remote-control/)** - share or steer a Claude Code session from another device. +* **[Remote control](/agents/cli-agents/remote-control/)** - share or steer a Claude Code session from another device. * **[Tab Configs](/terminal/windows/tab-configs/)** - save and reopen Claude Code session layouts. -For full setup steps (notification plugin, productivity tips, troubleshooting), see [Claude Code in Warp](/agent-platform/cli-agents/claude-code/) and the [How to set up Claude Code](/guides/external-tools/how-to-set-up-claude-code/) guide. +For full setup steps (notification plugin, productivity tips, troubleshooting), see [Claude Code in Warp](/agents/cli-agents/claude-code/) and the [How to set up Claude Code](/guides/external-tools/how-to-set-up-claude-code/) guide. ### Tips -* **Run Claude Code in [terminal mode](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/)**, not Agent Mode. Press `⌘+I` (macOS) or `Ctrl+I` (Linux/Windows) to toggle modes if you're in Agent Mode by accident. +* **Run Claude Code in [terminal mode](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/)**, not Agent Mode. Press `⌘+I` (macOS) or `Ctrl+I` (Linux/Windows) to toggle modes if you're in Agent Mode by accident. * **`Shift+Enter` for newlines.** Use `Shift+Enter` to insert a newline in Claude Code's prompt. If it submits the message instead, check that you're in terminal mode (not Agent Mode) and that you're on a recent Warp version. * **Copy/paste handling.** Warp enables bracketed paste by default, so multi-line pastes into Claude Code work without extra configuration. * **Resuming after a Warp restart.** Warp's [session restoration](/terminal/sessions/session-restoration/) preserves tabs and panes, but not running CLI processes — closing Warp ends Claude Code's session. Use Claude Code's built-in resume options (e.g., `claude --resume`) to continue a conversation after reopening Warp. @@ -46,7 +47,7 @@ Claude Code's authentication (API key or Anthropic account) is handled by Claude If you're ready to replace Claude Code with Warp's built-in Agent, the core workflow is: 1. Open a new tab in Warp. -2. From terminal mode, press `⌘+Enter` (macOS) or `Ctrl+Shift+Enter` (Linux/Windows) to switch to [Agent Mode](/agent-platform/local-agents/overview/). +2. From terminal mode, press `⌘+Enter` (macOS) or `Ctrl+Shift+Enter` (Linux/Windows) to switch to [Agent Mode](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/). 3. Describe what you want in natural language. Warp's Agent reads your codebase, runs commands, and edits files the same way Claude Code does. @@ -57,25 +58,25 @@ A recurring question from Claude Code users: **what files and context does Warp' Warp's Agent also pulls context from several other explicit sources: -* **[Codebase Context](/agent-platform/capabilities/codebase-context/)** - when you open a directory, Warp indexes your Git-tracked files so the Agent can search and reference your code without you pasting snippets. -* **[Rules](/agent-platform/capabilities/rules/)** - global and project-scoped rules. `AGENTS.md` and `WARP.md` are automatically picked up at the project root; additional rules live in Warp Drive. +* **[Codebase Context](/agents/capabilities/codebase-context/)** - when you open a directory, Warp indexes your Git-tracked files so the Agent can search and reference your code without you pasting snippets. +* **[Rules](/agents/capabilities/rules/)** - global and project-scoped rules. `AGENTS.md` and `WARP.md` are automatically picked up at the project root; additional rules live in Warp Drive. * **[Warp Drive](/knowledge-and-collaboration/warp-drive/)** - notebooks, workflows, and environment variables you've saved are available to the Agent as context. * **[Agent Mode context](/knowledge-and-collaboration/warp-drive/agent-mode-context/)** - pin specific files or notebooks to a conversation so the Agent always has them in scope. -* **[MCP](/agent-platform/capabilities/mcp/)** - any MCP servers you've configured give the Agent access to external tools and data. +* **[MCP](/agents/capabilities/mcp/)** - any MCP servers you've configured give the Agent access to external tools and data. ### What to reconfigure -* **Bring over your `CLAUDE.md`.** Rename it to `AGENTS.md` (or copy it into a Warp [Rule](/agent-platform/capabilities/rules/) if you want it scoped beyond the repo). Warp applies it automatically to new conversations. -* **Set up [MCP servers](/agent-platform/capabilities/mcp/)** you relied on in Claude Code. -* **Pick a model** per conversation using the model selector. See [model choice](/agent-platform/inference/model-choice/). Warp supports Claude, GPT, Gemini, and Auto. -* **Configure [agent profiles and permissions](/agent-platform/capabilities/agent-profiles-permissions/)** for what the Agent can auto-execute. +* **Bring over your `CLAUDE.md`.** Rename it to `AGENTS.md` (or copy it into a Warp [Rule](/agents/capabilities/rules/) if you want it scoped beyond the repo). Warp applies it automatically to new conversations. +* **Set up [MCP servers](/agents/capabilities/mcp/)** you relied on in Claude Code. +* **Pick a model** per conversation using the model selector. See [model choice](/agents/inference/model-choice/). Warp supports Claude, GPT, Gemini, and Auto. +* **Configure [agent profiles and permissions](/agents/capabilities/agent-profiles-permissions/)** for what the Agent can auto-execute. ### Key differences from Claude Code * **Tight terminal integration.** Agent Mode runs inside Warp and sees the full state of your terminal session — open files, command history, environment variables — without needing you to paste context. * **Parallel agents.** Warp runs multiple agent conversations across tabs simultaneously, each with its own state, which you can track in the Agent Management Panel. * **Code Review built in.** Agent-generated diffs open in Warp's [Code Review](/code/code-review/) panel, not the terminal. -* **Cloud orchestration.** Long-running or scheduled agent work can be offloaded to [Oz](/platform/). +* **Cloud orchestration.** Long-running or scheduled agent work can be offloaded to the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/). ## Warp-native equivalents @@ -83,9 +84,9 @@ Use this table to find the closest Warp equivalent for Claude Code concepts: | From Claude Code | In Warp | | --- | --- | -| `CLAUDE.md` | `AGENTS.md` (or `WARP.md`) at the project root, picked up as a [Rule](/agent-platform/capabilities/rules/) | -| Claude Code slash commands | Warp's own [slash commands](/agent-platform/capabilities/slash-commands/) (`/init`, `/plan`, `/model`, etc.); save your own as [Warp Drive prompts](/knowledge-and-collaboration/warp-drive/prompts/) | -| Tool definitions | [MCP](/agent-platform/capabilities/mcp/) | +| `CLAUDE.md` | `AGENTS.md` (or `WARP.md`) at the project root, picked up as a [Rule](/agents/capabilities/rules/) | +| Claude Code slash commands | Warp's own [slash commands](/agents/capabilities/slash-commands/) (`/init`, `/plan`, `/model`, etc.); save your own as [Warp Drive prompts](/knowledge-and-collaboration/warp-drive/prompts/) | +| Tool definitions | [MCP](/agents/capabilities/mcp/) | | Resume conversation | Warp persists agent conversations per tab; pair with [tab configs](/terminal/windows/tab-configs/) to reopen the same project layout | -For a deeper tour of Agent Mode, see [Coding in Warp](/getting-started/quickstart/coding-in-warp/) and the [Warp Agents docs](/agent-platform/local-agents/overview/). +For a deeper tour of Agent Mode, see [Coding in Warp](/getting-started/quickstart/coding-in-warp/) and the [Agents overview](/agents/). diff --git a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-cursor.mdx b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-cursor.mdx index de3d1e358..9da6d350d 100644 --- a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-cursor.mdx +++ b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-cursor.mdx @@ -15,7 +15,7 @@ Warp doesn't have a one-click Cursor importer. Cursor is built on the VS Code co The fastest way to bring over your Cursor terminal setup is to ask Warp's Agent to translate your `settings.json` directly. Warp ships a [`settings.toml` file](/terminal/settings/) and a bundled `modify-settings` skill that lets the Agent read your existing config and write equivalent values into Warp's settings. -1. In the Warp app, open a new tab and switch to [Agent Mode](/agent-platform/local-agents/overview/) with `⌘+I` (macOS) or `Ctrl+I` (Linux/Windows). +1. In the Warp app, open a new tab and switch to [Agent Mode](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) with `⌘+I` (macOS) or `Ctrl+I` (Linux/Windows). 2. Copy and paste this prompt into the Agent Mode input, then press `Enter`. > Read my Cursor `settings.json` (`~/Library/Application Support/Cursor/User/settings.json` on macOS) and port the equivalent terminal settings (font, cursor style, default profile) into my Warp `settings.toml` using the `modify-settings` skill. Show me a diff before applying. @@ -34,13 +34,13 @@ Terminal settings in Cursor follow the same schema as VS Code. The migration ste Cursor's Composer and Agent features don't have a one-to-one migration path; they map to different Warp concepts. -* **Composer / Agent** - In Cursor, these features map to Warp's [Agent Mode](/agent-platform/local-agents/overview/). Start an Agent conversation in any tab. -* **Rules files** - Warp uses [Rules](/agent-platform/capabilities/rules/) stored in Warp Drive or committed to your repo as `AGENTS.md` (or `WARP.md`). Run `/init` in Agent Mode to generate an `AGENTS.md`, or copy your `.cursorrules` content directly. -* **MCP servers** - Warp supports MCP natively. See [MCP](/agent-platform/capabilities/mcp/) for configuration. +* **Composer / Agent** - In Cursor, these features map to Warp's [Agent Mode](/agents/). Start an Agent conversation in any tab. +* **Rules files** - Warp uses [Rules](/agents/capabilities/rules/) stored in Warp Drive or committed to your repo as `AGENTS.md` (or `WARP.md`). Run `/init` in Agent Mode to generate an `AGENTS.md`, or copy your `.cursorrules` content directly. +* **MCP servers** - Warp supports MCP natively. See [MCP](/agents/capabilities/mcp/) for configuration. ### Model choice -Cursor lets you pick a model per conversation. Warp does the same; use the model selector in any Agent conversation. See [model choice](/agent-platform/inference/model-choice/). +Cursor lets you pick a model per conversation. Warp does the same; use the model selector in any Agent conversation. See [model choice](/agents/inference/model-choice/). ### Keybindings @@ -53,7 +53,7 @@ Warp's [keyboard shortcuts](/getting-started/keyboard-shortcuts/) differ from Cu Keep Cursor as your editor for tight in-file AI assistance, and use Warp as the terminal you switch to for: * Long-running commands and SSH. -* [Agent Mode](/agent-platform/local-agents/overview/) conversations that execute commands, not just edit files. +* [Agent Mode](/agents/) conversations that execute commands, not just edit files. * [Code Review](/code/code-review/) for managing diffs. * [Warp Drive](/knowledge-and-collaboration/warp-drive/) for team knowledge. @@ -67,12 +67,12 @@ Use this table to find Warp equivalents for Cursor features you might look for a | From Cursor | In Warp | | --- | --- | -| Composer / Agent panel | [Agent Mode](/agent-platform/local-agents/overview/) in any tab (toggle with `⌘+I` on macOS or `Ctrl+I` on Linux/Windows) | -| Agent tabs | Multiple [agents in parallel](/agent-platform/local-agents/overview/) across tabs | -| `.cursorrules` | `AGENTS.md` / `WARP.md` at the project root, picked up as a [Rule](/agent-platform/capabilities/rules/) | -| MCP servers | [MCP](/agent-platform/capabilities/mcp/) | -| Model choice per conversation | [Model selector](/agent-platform/inference/model-choice/) | -| Codebase indexing | [Codebase Context](/agent-platform/capabilities/codebase-context/) | +| Composer / Agent panel | [Agent Mode](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) in any tab (toggle with `⌘+I` on macOS or `Ctrl+I` on Linux/Windows) | +| Agent tabs | Multiple [agents in parallel](/agents/) across tabs | +| `.cursorrules` | `AGENTS.md` / `WARP.md` at the project root, picked up as a [Rule](/agents/capabilities/rules/) | +| MCP servers | [MCP](/agents/capabilities/mcp/) | +| Model choice per conversation | [Model selector](/agents/inference/model-choice/) | +| Codebase indexing | [Codebase Context](/agents/capabilities/codebase-context/) | | Inline diff review | [Code Review](/code/code-review/) | See [Coding in Warp](/getting-started/quickstart/coding-in-warp/) for a tour of the development workflow. diff --git a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-ghostty.mdx b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-ghostty.mdx index 35b7c5ff5..92bd3508f 100644 --- a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-ghostty.mdx +++ b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-ghostty.mdx @@ -16,7 +16,7 @@ Warp doesn't have a one-click Ghostty importer. Because Ghostty stores its confi The fastest way to bring over your Ghostty setup is to ask Warp's Agent to translate your config directly. Warp ships a [`settings.toml` file](/terminal/settings/) and a bundled `modify-settings` skill that lets the Agent read your existing config and write equivalent values into Warp's settings, including translating your Ghostty theme into a Warp [custom theme](/terminal/appearance/custom-themes/). -1. In the Warp app, open a new tab and switch to [Agent Mode](/agent-platform/local-agents/overview/) with `⌘+I` (macOS) or `Ctrl+I` (Linux/Windows). +1. In the Warp app, open a new tab and switch to [Agent Mode](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) with `⌘+I` (macOS) or `Ctrl+I` (Linux/Windows). 2. Paste this prompt into Agent Mode, then press `Enter`. > Read my Ghostty config at `~/.config/ghostty/config` and any referenced theme files in `~/.config/ghostty/themes/`. Port the equivalent settings (theme, font, keybindings, shell) into my Warp `settings.toml` using the `modify-settings` skill, and create a matching custom theme. Show me a diff before applying. @@ -46,7 +46,7 @@ Warp's [default keyboard shortcuts](/getting-started/keyboard-shortcuts/) cover Warp detects your login shell automatically. To override it, open **Settings** > **Features** > **Session** in the Warp app and choose a shell from **Startup shell for new sessions**. -For prompts, choose between Warp's [native prompt](/terminal/appearance/prompt/#warp-prompt) (drag-and-drop context chips) or the [shell prompt (PS1)](/terminal/appearance/prompt/#custom-prompt) if you want to keep your existing prompt configuration. +For prompts, choose between Warp's [native prompt](/terminal/appearance/prompt/#warp-prompt) (drag-and-drop context chips) or the [shell prompt (PS1)](/terminal/appearance/prompt/#shell-prompt-ps1) if you want to keep your existing prompt configuration. ### Quick terminal (Quake mode) @@ -65,6 +65,6 @@ Use this table to find the closest Warp equivalent for Ghostty features you migh | Kitty graphics protocol | Image rendering for most common workflows (see [more features](/terminal/more-features/)) | | Shaders and custom visual effects | Not supported; closest: [size, opacity, and blurring](/terminal/appearance/size-opacity-blurring/) + [pane dimming](/terminal/appearance/pane-dimming/) | -Beyond parity, Warp adds [Agent Mode](/agent-platform/local-agents/overview/), [Code Review](/code/code-review/), and [Warp Drive](/knowledge-and-collaboration/warp-drive/) for AI-assisted development and team collaboration. +Beyond parity, Warp adds [Agent Mode](/agents/), [Code Review](/code/code-review/), and [Warp Drive](/knowledge-and-collaboration/warp-drive/) for AI-assisted development and team collaboration. For more on what you can configure, see [Customizing Warp](/getting-started/quickstart/customizing-warp/). diff --git a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-iterm2.mdx b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-iterm2.mdx index d27f65ecd..d1f426fb6 100644 --- a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-iterm2.mdx +++ b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-iterm2.mdx @@ -36,7 +36,7 @@ To run the importer: If the importer doesn't pick up something you care about, such as a non-default profile, an unusual keybinding, or a specific setting, ask Warp's Agent to translate it directly. Warp ships a [`settings.toml` file](/terminal/settings/) and a bundled `modify-settings` skill that lets the Agent read your iTerm2 plist and write equivalent values into Warp's settings. -1. In the Warp app, switch to [Agent Mode](/agent-platform/local-agents/overview/) with `⌘+I`. +1. In the Warp app, switch to [Agent Mode](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) with `⌘+I`. 2. Paste this prompt into Agent Mode, then press `Enter`. > Read my iTerm2 preferences with `defaults read com.googlecode.iterm2` and port any settings that the importer didn't cover (extra profiles, custom keybindings) into my Warp `settings.toml` using the `modify-settings` skill. Show me a diff before applying. @@ -57,7 +57,7 @@ A few iTerm2 features don't map directly and need a manual pass after import: After the import, choose which [prompt](/terminal/appearance/prompt/) to use: 1. [**Warp prompt**](/terminal/appearance/prompt/#warp-prompt) - Warp's native prompt with drag-and-drop context chips for git branch, directory, timestamps, and more. Configure in **Settings** > **Appearance** > **Prompt**. -2. [**Shell prompt (PS1)**](/terminal/appearance/prompt/#custom-prompt) - inherits your existing shell prompt configuration unchanged. Pick this if you want Warp to match your iTerm2 prompt exactly. +2. [**Shell prompt (PS1)**](/terminal/appearance/prompt/#shell-prompt-ps1) - inherits your existing shell prompt configuration unchanged. Pick this if you want Warp to match your iTerm2 prompt exactly. ## Warp-native equivalents diff --git a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-macos-terminal.mdx b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-macos-terminal.mdx index e40d5e47a..2b67f8a77 100644 --- a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-macos-terminal.mdx +++ b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-macos-terminal.mdx @@ -15,7 +15,7 @@ Warp doesn't have a one-click Terminal.app importer. Because Terminal.app stores The fastest way to bring over a Terminal.app theme is to ask Warp's Agent to translate it directly. Warp ships a [`settings.toml` file](/terminal/settings/) and a bundled `modify-settings` skill that lets the Agent read your Terminal.app preferences and write equivalent values into Warp's settings, including creating a matching [custom theme](/terminal/appearance/custom-themes/). -1. In the Warp app, open a new tab and switch to [Agent Mode](/agent-platform/local-agents/overview/) with `⌘+I`. +1. In the Warp app, open a new tab and switch to [Agent Mode](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) with `⌘+I`. 2. Paste this prompt into Agent Mode, then press `Enter`. > Read my Terminal.app preferences with `defaults read com.apple.Terminal` and port the active profile (theme, font, window size) into my Warp `settings.toml` using the `modify-settings` skill. Create a matching custom theme. Show me a diff before applying. @@ -53,7 +53,7 @@ Configure window appearance in the Warp app from **Settings** > **Appearance** > Terminal.app uses whatever prompt your shell's PS1 (or zsh's PROMPT) defines. In Warp, choose: 1. [**Warp prompt**](/terminal/appearance/prompt/#warp-prompt) - Warp's native prompt with drag-and-drop chips for git branch, directory, and more. -2. [**Shell prompt (PS1)**](/terminal/appearance/prompt/#custom-prompt) - keeps your existing shell prompt exactly as it appears in Terminal.app. +2. [**Shell prompt (PS1)**](/terminal/appearance/prompt/#shell-prompt-ps1) - keeps your existing shell prompt exactly as it appears in Terminal.app. Configure either prompt in the Warp app from **Settings** > **Appearance** > **Prompt**. @@ -70,4 +70,4 @@ Most Terminal.app features have a Warp equivalent with additional capabilities o | Copy-on-select | **Settings** > **Features** > **Session** | | Inspector | [Command inspector](/terminal/editor/command-inspector/) (exit code, duration, working directory) | -Beyond matching Terminal.app, Warp adds [Agent Mode](/agent-platform/local-agents/overview/) for natural-language commands, [blocks](/terminal/blocks/) for structured command output, and [Warp Drive](/knowledge-and-collaboration/warp-drive/) for shared workflows. New to Warp? Start with the [Warp quickstart](/quickstart/). +Beyond matching Terminal.app, Warp adds [Agent Mode](/agents/) for natural-language commands, [blocks](/terminal/blocks/) for structured command output, and [Warp Drive](/knowledge-and-collaboration/warp-drive/) for shared workflows. New to Warp? Start with the [Warp quickstart](/quickstart/). diff --git a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-vs-code-terminal.mdx b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-vs-code-terminal.mdx index 4bb00af1d..02c534220 100644 --- a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-vs-code-terminal.mdx +++ b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-vs-code-terminal.mdx @@ -29,7 +29,7 @@ Warp doesn't have a VS Code importer because it's a standalone application, not The fastest way to bring over your VS Code terminal setup is to ask Warp's Agent to translate `settings.json` directly. Warp ships a [`settings.toml` file](/terminal/settings/) and a bundled `modify-settings` skill that lets the Agent read your existing config and write equivalent values into Warp's settings. -1. In the Warp app, open a new tab and switch to [Agent Mode](/agent-platform/local-agents/overview/) with `⌘+I` (macOS) or `Ctrl+I` (Linux/Windows). +1. In the Warp app, open a new tab and switch to [Agent Mode](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) with `⌘+I` (macOS) or `Ctrl+I` (Linux/Windows). 2. Paste this prompt into Agent Mode, then press `Enter`. > Read my VS Code `settings.json` (`~/Library/Application Support/Code/User/settings.json` on macOS) and port the equivalent terminal settings (`terminal.integrated.*` keys) into my Warp `settings.toml` using the `modify-settings` skill. Show me a diff before applying. @@ -62,7 +62,7 @@ Warp's [default keyboard shortcuts](/getting-started/keyboard-shortcuts/) are la Many developers keep VS Code as their editor and use Warp as the terminal they switch to for long-running commands, SSH sessions, or AI-assisted workflows. You don't need to change VS Code. Install Warp and open it when you want a richer terminal. -VS Code's integrated terminal still works; use it for quick one-off commands, and jump to Warp when you need [blocks](/terminal/blocks/), [Agent Mode](/agent-platform/local-agents/overview/), or [persistent sessions](/terminal/sessions/session-restoration/). +VS Code's integrated terminal still works; use it for quick one-off commands, and jump to Warp when you need [blocks](/terminal/blocks/), [Agent Mode](/agents/), or [persistent sessions](/terminal/sessions/session-restoration/). ### Replace VS Code with Warp diff --git a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-windows-terminal.mdx b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-windows-terminal.mdx index c158be5ff..263f88798 100644 --- a/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-windows-terminal.mdx +++ b/src/content/docs/getting-started/migrate-to-warp/migrate-to-warp-from-windows-terminal.mdx @@ -19,7 +19,7 @@ Warp doesn't have a one-click Windows Terminal importer. Because Windows Termina The fastest way to bring over your Windows Terminal setup is to ask Warp's Agent to translate `settings.json` directly. Warp ships a [`settings.toml` file](/terminal/settings/) and a bundled `modify-settings` skill that lets the Agent read your existing config and write equivalent values into Warp's settings, including translating your color schemes into a Warp [custom theme](/terminal/appearance/custom-themes/). -1. In the Warp app, open a new tab and switch to [Agent Mode](/agent-platform/local-agents/overview/) with `Ctrl+I`. +1. In the Warp app, open a new tab and switch to [Agent Mode](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) with `Ctrl+I`. 2. Paste this prompt into Agent Mode, then press `Enter`. > Read my Windows Terminal `settings.json` at `%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json` and port the active profile and color scheme into my Warp `settings.toml` using the `modify-settings` skill. Create a matching custom theme. Show me a diff before applying. @@ -70,7 +70,7 @@ Use this table to find Warp equivalents for Windows Terminal features you might | Profiles | [Tab configs](/terminal/windows/tab-configs/) + [themes](/terminal/appearance/themes/) + per-session shell settings | | Tabs and panes | [Tabs](/terminal/windows/tabs/), [vertical tabs](/terminal/windows/vertical-tabs/), [split panes](/terminal/windows/split-panes/) | | Command palette | [Command Palette](/terminal/command-palette/) (`Ctrl+Shift+P`) | -| Oh My Posh prompts | Keep using them; pick [Shell prompt (PS1)](/terminal/appearance/prompt/#custom-prompt) in Warp | +| Oh My Posh prompts | Keep using them; pick [Shell prompt (PS1)](/terminal/appearance/prompt/#shell-prompt-ps1) in Warp | | Quake mode | [Global hotkey](/terminal/windows/global-hotkey/) | -Beyond Windows Terminal's feature set, Warp adds [Agent Mode](/agent-platform/local-agents/overview/), [blocks](/terminal/blocks/), and [Warp Drive](/knowledge-and-collaboration/warp-drive/). See [Warp for Windows installation](/getting-started/quickstart/installation-and-setup/) if you haven't installed yet. +Beyond Windows Terminal's feature set, Warp adds [Agent Mode](/agents/), [blocks](/terminal/blocks/), and [Warp Drive](/knowledge-and-collaboration/warp-drive/). See [Warp for Windows installation](/getting-started/quickstart/installation-and-setup/) if you haven't installed yet. diff --git a/src/content/docs/getting-started/quickstart/coding-in-warp.mdx b/src/content/docs/getting-started/quickstart/coding-in-warp.mdx index 289bda15b..2941ad978 100644 --- a/src/content/docs/getting-started/quickstart/coding-in-warp.mdx +++ b/src/content/docs/getting-started/quickstart/coding-in-warp.mdx @@ -45,10 +45,10 @@ If your codebase is large, you can exclude specific files by adding them to a `. You can provide different types of input as context directly to the agent to guide its behavior and improve response quality. This includes: -* [Blocks](/agent-platform/local-agents/agent-context/blocks-as-context/) from your terminal output -* [Images](/agent-platform/local-agents/agent-context/images-as-context/) -* [Files and code](/agent-platform/local-agents/agent-context/using-to-add-context/) (using the @ symbol) -* [Public websites](/agent-platform/local-agents/agent-context/urls-as-context/) via URLs +* [Blocks](/agents/local-agents/agent-context/blocks-as-context/) from your terminal output +* [Images](/agents/local-agents/agent-context/images-as-context/) +* [Files and code](/agents/local-agents/agent-context/using-to-add-context/) (using the @ symbol) +* [Public websites](/agents/local-agents/agent-context/urls-as-context/) via URLs #### Warp Drive as context diff --git a/src/content/docs/getting-started/quickstart/customizing-warp.mdx b/src/content/docs/getting-started/quickstart/customizing-warp.mdx index aa1a77bf9..fe8bd7f95 100644 --- a/src/content/docs/getting-started/quickstart/customizing-warp.mdx +++ b/src/content/docs/getting-started/quickstart/customizing-warp.mdx @@ -63,8 +63,8 @@ Configure how you type and interact with the terminal input. Control how Warp's agents behave and which models they use. -* **[Model choice](/agent-platform/inference/model-choice/)** - Choose your preferred AI model (Claude, GPT, Gemini, or Auto) from the model selector in any agent conversation. -* **[Agent profiles and permissions](/agent-platform/capabilities/agent-profiles-permissions/)** - Configure how much autonomy the agent has: what it can auto-execute, what requires approval, and command allowlists/denylists. +* **[Model choice](/agents/inference/model-choice/)** - Choose your preferred AI model (Claude, GPT, Gemini, or Auto) from the model selector in any agent conversation. +* **[Agent profiles and permissions](/agents/capabilities/agent-profiles-permissions/)** - Configure how much autonomy the agent has: what it can auto-execute, what requires approval, and command allowlists/denylists. * **Default mode for new sessions** - Choose whether new tabs open in terminal mode or Agent Mode by default. Set this in **Settings** > **Agents** > **Warp Agent** > **Input**. ## Import and sync @@ -80,5 +80,5 @@ Bring your existing settings into Warp or keep settings synchronized across mach Now that Warp looks and feels like yours, the next step is to put it to work on a real project. Open a codebase to unlock context-aware agents, or start an agent conversation to see how terminal commands and AI work together. -* **[Codebase Context](/agent-platform/capabilities/codebase-context/)** - Open a project and index your codebase so agents give you context-aware answers about your code. -* **[Terminal and Agent modes](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/)** - Learn how terminal mode and agent conversations work together. +* **[Codebase Context](/agents/capabilities/codebase-context/)** - Open a project and index your codebase so agents give you context-aware answers about your code. +* **[Terminal and Agent modes](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/)** - Learn how terminal mode and agent conversations work together. diff --git a/src/content/docs/getting-started/supported-shells.mdx b/src/content/docs/getting-started/supported-shells.mdx index 86e1a248e..36458afae 100644 --- a/src/content/docs/getting-started/supported-shells.mdx +++ b/src/content/docs/getting-started/supported-shells.mdx @@ -18,7 +18,7 @@ Warp tries to load your login shell by default. Currently, Warp supports bash, f * On Linux, bash is the default shell. :::note -If you run into issues configuring your RC files (`~/.bashrc`, `~/.zshrc`, `config.fish`, `Microsoft.PowerShell_profile.ps1`) with Warp, please see [Configuring and debugging your RC files](/support-and-community/troubleshooting-and-support/known-issues/#configuring-and-debugging-your-rc-files). +If you run into issues configuring your RC files (`~/.bashrc`, `~/.zshrc`, `config.fish`, `Microsoft.PowerShell_profile.ps1`) with Warp, see [Configuring and debugging your RC files](/support-and-community/troubleshooting-and-support/known-issues/#configuring-and-debugging-your-rc-files). ::: ### Changing what shell Warp uses @@ -103,7 +103,7 @@ Set-ExecutionPolicy RemoteSigned -Scope CurrentUser #### Setting up zsh on Warp -By default, macOS ships with [zsh](https://zsh.sourceforge.io/Doc/Release/zsh_toc.html) located in `/bin/zsh`. You can confirm this location by typing `which zsh` in Warp. You can also check the version of zsh installed on your system by simply typing the following: +By default, macOS ships with [zsh](https://zsh.sourceforge.io/Doc/Release/zsh_toc.html) located in `/bin/zsh`. You can confirm this location by typing `which zsh` in Warp. You can also check the version of zsh installed on your system by typing the following: `$ zsh --version` @@ -113,7 +113,7 @@ By default, macOS ships with [zsh](https://zsh.sourceforge.io/Doc/Release/zsh_to While bash and zsh come pre-installed on macOS systems, fish shell does not. So before using fish with Warp, you will need to install it. Install fish 3.6 or above using one of the methods listed below: -1. With Homebrew: If you already have homebrew installed, you can simply type `brew install fish`, and follow the instructions. +1. With Homebrew: If you already have homebrew installed, you can type `brew install fish`, and follow the instructions. 2. Download the installer from the [fish shell website](https://fishshell.com/). #### 2. Switch to fish as the default shell @@ -142,7 +142,7 @@ You can identify where fish is installed by running `which fish`. While bash and zsh come pre-installed on macOS systems, PowerShell does not. So before using PowerShell with Warp, you will need to install it. Install PowerShell 7.0 or above using one of the methods listed below: -1. With Homebrew: If you already have homebrew installed, you can simply type `brew install powershell/tap/powershell`, and follow the instructions. +1. With Homebrew: If you already have homebrew installed, you can type `brew install powershell/tap/powershell`, and follow the instructions. 2. Download from the [official Microsoft website](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell). #### 2. Switch to pwsh as the default shell @@ -173,5 +173,5 @@ On Windows, Warp's default shell is PowerShell 7 (pwsh). Warp for Windows suppor * Git Bash :::note -Windows Command Prompt (cmd.exe) is not currently supported. For more information and updates about cmd.exe support, please see [this GitHub issue](https://github.com/warpdotdev/Warp/issues/5882). +Windows Command Prompt (cmd.exe) is not currently supported. For more information and updates about cmd.exe support, see [this GitHub issue](https://github.com/warpdotdev/Warp/issues/5882). ::: diff --git a/src/content/docs/guides/agent-workflows/build-a-self-improving-agent.mdx b/src/content/docs/guides/agent-workflows/build-a-self-improving-agent.mdx index 03e5c52f3..b8cfe8284 100644 --- a/src/content/docs/guides/agent-workflows/build-a-self-improving-agent.mdx +++ b/src/content/docs/guides/agent-workflows/build-a-self-improving-agent.mdx @@ -1,7 +1,8 @@ --- title: Build a self-improving agent description: >- - Build an outer improvement loop where a scheduled agent reviews past runs, learns from team corrections, and proposes skill file updates — so your factory gets better over time. + Build an outer loop where a scheduled agent reviews past runs, learns from + corrections, and proposes skill file updates. sidebar: label: "Build a self-improving agent" tags: @@ -10,6 +11,7 @@ tags: - "cloud-agents" - "schedules" --- +import { VARS } from '@data/vars'; A self-improving agent is the outer loop of the [software factory](/guides/agent-workflows/set-up-a-software-factory) you've built in the previous guides. It watches how maintainers correct the inner-loop agents — relabeled issues, edited comments, changed code — and opens a pull request to improve the skill files that drive those agents. Every correction from a teammate becomes a proposed improvement to the factory. @@ -23,7 +25,7 @@ The outer loop proposes improvements; it doesn't apply them silently. Every chan * A working inner loop with at least one agent running ([set up your software factory](/guides/agent-workflows/set-up-a-software-factory)) * A Warp account ([sign up at warp.dev](https://www.warp.dev)) -* An Oz cloud environment with access to your repository ([create one](/platform/environments)) +* A cloud environment with access to your repository ([create one](/platform/environments)) ## Why principles beat rules @@ -82,7 +84,7 @@ The [`update-triage`](https://github.com/warpdotdev/oz-for-oss/blob/main/.agents Weekly is a good starting cadence: it processes the previous week's corrections and opens PRs for review at the start of the week. -1. Create a scheduled cloud agent from the Oz CLI: +1. Create a scheduled cloud agent from the {VARS.WARP_AGENT_CLI}: ```bash oz schedule create \ @@ -92,9 +94,9 @@ Weekly is a good starting cadence: it processes the previous week's corrections --cron "0 9 * * 1" ``` - Or, from the Oz web app: open **Agents** > **Schedules**, click **New schedule**, and set the skill, environment, and cron expression. + Or, from the {VARS.WEB_APP}: open **Agents** > **Schedules**, click **New schedule**, and set the skill, environment, and cron expression. -2. Replace `YOUR_ENVIRONMENT_SLUG` with the slug of your Oz environment. +2. Replace `YOUR_ENVIRONMENT_SLUG` with the slug of your {VARS.WARP_AUTOMATION_PLATFORM} environment. See [Scheduled agents](/platform/triggers/scheduled-agents) for the full reference. @@ -118,9 +120,9 @@ Over time, the companion skill accumulates a clear description of how your team ## Next steps -* [What is a software factory?](/platform/software-factory) — How the outer improvement loop fits into the full factory model. +* [Self-improvement in Warp Factories](/factories/measure-and-improve/#configure-and-review-self-improvement) — The managed version of this outer loop, run inside a factory. * [Set up your software factory](/guides/agent-workflows/set-up-a-software-factory) — The inner loop the outer loop improves. -* [Run a software factory in the cloud](/guides/agent-workflows/run-a-software-factory-in-the-cloud) — Move the loop to Oz for team-wide visibility. +* [Run a software factory in the cloud](/guides/agent-workflows/run-a-software-factory-in-the-cloud) — Move the loop to the {VARS.WARP_AUTOMATION_PLATFORM} for team-wide visibility. * [Scheduled agents](/platform/triggers/scheduled-agents) — Full reference for running cloud agents on a cadence. * [`warpdotdev/oz-for-oss`](https://github.com/warpdotdev/oz-for-oss) — The complete reference implementation including all outer-loop skills. -* [Skills](/agent-platform/capabilities/skills) — How skill files work in Warp and Oz. +* [Skills](/agents/capabilities/skills) — How skill files work in Warp and the {VARS.WARP_AUTOMATION_PLATFORM}. 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 5cf182be5..0a8a16fdb 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 @@ -9,15 +9,16 @@ tags: - "cloud-agents" - "software-factory" --- +import { VARS } from '@data/vars'; -Learn how to use Oz to build a triage agent that reviews each new GitHub issue for clarity, applies labels, and flags open questions before implementation begins. After completing the steps in this guide, you will have a working triage skill deployed as a GitHub Action. This is the first agent in your [software factory](/platform/software-factory). +Learn how to use the {VARS.WARP_AUTOMATION_PLATFORM} to build a triage agent that reviews each new GitHub issue for clarity, applies labels, and flags open questions before implementation begins. After completing the steps in this guide, you will have a working triage skill deployed as a GitHub Action. This is the first agent in your [software factory](/factories/). ## Prerequisites * A Warp account ([sign up at warp.dev](https://www.warp.dev)) * A GitHub repository with Issues enabled -* An Oz cloud environment with access to your repository ([create one](/platform/environments#create-an-environment-with-guided-setup-recommended)) -* A Warp API key added to your CI secrets as `WARP_API_KEY` ([create one](/reference/cli/api-keys#from-the-oz-web-app-recommended)) +* A cloud environment with access to your repository ([create one](/platform/environments/#create-an-environment-with-guided-setup-in-warp)) +* A Warp API key added to your CI secrets as `WARP_API_KEY` ([create one](/reference/cli/api-keys/#from-the-web-app-recommended)) ## 1. Define your triage criteria @@ -37,7 +38,7 @@ You will encode these decisions in a skill file in the next step. ## 2. Create the triage skill -A [skill](/agent-platform/capabilities/skills) is a markdown file that defines the agent's behavior. It tells the agent what to analyze, how to classify results, and what to output. +A [skill](/agents/capabilities/skills) is a markdown file that defines the agent's behavior. It tells the agent what to analyze, how to classify results, and what to output. 1. Create a `.agents/skills/triage-issue/` directory in your repository with a `SKILL.md` file. 2. Copy the [`triage-issue` skill from `warpdotdev/oz-for-oss`](https://github.com/warpdotdev/oz-for-oss/blob/main/.agents/skills/triage-issue/SKILL.md) into your repository. This is the production triage skill Warp uses for its own open source repository. @@ -59,7 +60,7 @@ The [`bootstrap-issue-config`](https://github.com/warpdotdev/oz-for-oss/blob/mai ## 3. Test the triage agent locally -Before deploying to GitHub Actions, test the triage agent against a real issue using the Oz CLI: +Before deploying to GitHub Actions, test the triage agent against a real issue using the {VARS.WARP_AGENT_CLI}: ```bash oz agent run \ @@ -70,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 [Oz CLI reference](/reference/cli/). +For the full reference of `oz agent run` flags, see the [{VARS.WARP_AGENT_CLI} reference](/reference/cli/). ## 4. Deploy with GitHub Actions @@ -106,7 +107,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ``` -2. Replace `YOUR_OZ_ENVIRONMENT_SLUG` with the slug of the Oz environment you created in the prerequisites. +2. Replace `YOUR_OZ_ENVIRONMENT_SLUG` with the slug of the {VARS.WARP_AUTOMATION_PLATFORM} environment you created in the prerequisites. 3. Add `WARP_API_KEY` to your repository's GitHub Actions secrets under **Settings** > **Secrets and variables** > **Actions**. @@ -114,13 +115,13 @@ See [GitHub Actions integration](/platform/integrations/github-actions) for the ## 5. Review and improve -Watch the first few runs in the [Oz web app](https://oz.warp.dev) to verify the agent is labeling and commenting correctly. When you disagree with the agent, e.g., when you relabel an issue or edit a comment, note the pattern. Patterns you see repeatedly are signals to update your skill file. +Watch the first few runs in the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> to verify the agent is labeling and commenting correctly. When you disagree with the agent, e.g., when you relabel an issue or edit a comment, note the pattern. Patterns you see repeatedly are signals to update your skill file. Add repo-specific context without forking the core skill by creating a `triage-issue-local` companion skill. This file specializes the base skill for your repository (your label taxonomy, ownership map, and definition of readiness) while keeping the shared skill stable. See the [docs repo example](https://github.com/warpdotdev/docs/blob/main/.agents/skills/triage-issue-local/SKILL.md) for the companion skill pattern. ## Next steps -* [What is a software factory?](/platform/software-factory) — How the triage agent fits into the full development loop. +* [Warp Factories overview](/factories/) — The managed product where a triage role like this scopes every incoming work item. * [Write product and tech specs with agents](/guides/agent-workflows/write-product-and-tech-specs-with-agents) — Add the spec role once your backlog is well-triaged. * [Build a self-improving agent](/guides/agent-workflows/build-a-self-improving-agent) — Automate skill improvement based on your corrections. * [GitHub Actions integration](/platform/integrations/github-actions) — Full documentation for `warpdotdev/oz-agent-action`. diff --git a/src/content/docs/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs.mdx b/src/content/docs/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs.mdx index cfde6116a..519b57dad 100644 --- a/src/content/docs/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs.mdx +++ b/src/content/docs/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs.mdx @@ -10,6 +10,7 @@ tags: - "code-review" - "session-sharing" --- +import { VARS } from '@data/vars'; When an agent helps prepare a pull request, reviewers need the execution context behind the diff: the original prompt, plan, commands, validation results, code changes, and decisions that still need human review. @@ -17,9 +18,9 @@ Add a Warp session or cloud agent run link to the PR description or a PR comment Use these Warp docs and surfaces to collect the right context: -* [Agent Session Sharing](/agent-platform/local-agents/session-sharing/) for local Warp agents or third-party CLI agents running in Warp. -* [Cloud agent session sharing](/platform/viewing-cloud-agent-runs/) for cloud agent runs started from Slack, Linear, GitHub Actions, schedules, the Oz CLI, or the API. -* The [Code Review panel](/code/code-review/) and [Interactive Code Review](/agent-platform/local-agents/interactive-code-review/) to inspect and refine the actual code diff before or after you share the PR. +* [Agent Session Sharing](/agents/local-agents/session-sharing/) for local Warp agents or third-party CLI agents running in Warp. +* [Cloud agent session sharing](/platform/viewing-cloud-agent-runs/) for cloud agent runs started from Slack, Linear, GitHub Actions, schedules, the {VARS.WARP_AGENT_CLI}, or the API. +* The [Code Review panel](/code/code-review/) and [Interactive Code Review](/agents/local-agents/interactive-code-review/) to inspect and refine the actual code diff before or after you share the PR. ## What to include in the PR @@ -65,13 +66,13 @@ If the agent ran locally in Warp, share the session: 4. Copy the shared session link. 5. Paste the link into the PR description or a PR comment. -See [Agent Session Sharing](/agent-platform/local-agents/session-sharing/) for the full sharing flow. +See [Agent Session Sharing](/agents/local-agents/session-sharing/) for the full sharing flow. ### Cloud agent run If the agent ran in the cloud, use the cloud run session link: -1. Open the run from the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app or the [Runs page in the Oz web app](/platform/oz-web-app/#runs). +1. Open the run 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). 2. Confirm the session shows the run context reviewers need. 3. Copy the cloud agent session link. 4. Paste the link into the PR description or a PR comment. @@ -88,7 +89,7 @@ Before asking teammates to review the PR, inspect the code yourself in Warp: 4. Run your project's tests, lint, typecheck, or build. 5. Add validation results to the PR summary. -For a detailed local workflow, see [How to review AI-generated code](/guides/agent-workflows/how-to-review-ai-generated-code/) and [Interactive Code Review](/agent-platform/local-agents/interactive-code-review/). +For a detailed local workflow, see [How to review AI-generated code](/guides/agent-workflows/how-to-review-ai-generated-code/) and [Interactive Code Review](/agents/local-agents/interactive-code-review/). ## 3. Make the agent context easy to review @@ -101,7 +102,7 @@ Reviewers should not have to read an entire transcript to understand what happen * Any failed commands and how they were resolved. * Any assumptions the agent made. -If the PR came from an automated workflow, include the trigger source too. For example: Slack thread, Linear issue, GitHub Actions workflow, scheduled agent, Oz CLI command, or API call. +If the PR came from an automated workflow, include the trigger source too. For example: Slack thread, Linear issue, GitHub Actions workflow, scheduled agent, {VARS.WARP_AGENT_CLI} command, or API call. ## 4. Watch for sensitive context before sharing @@ -129,7 +130,7 @@ Avoid vague asks like "review the agent output." Point reviewers to the decision ## Next steps -* Use [Agent Session Sharing](/agent-platform/local-agents/session-sharing/) to share local or third-party agent sessions. +* Use [Agent Session Sharing](/agents/local-agents/session-sharing/) to share local or third-party agent sessions. * Use [Cloud agent session sharing](/platform/viewing-cloud-agent-runs/) to inspect cloud agent runs. * Use [Code Review panel](/code/code-review/) to review Git diffs in Warp. -* Use [Interactive Code Review](/agent-platform/local-agents/interactive-code-review/) to leave inline comments and send feedback back to an agent. +* Use [Interactive Code Review](/agents/local-agents/interactive-code-review/) to leave inline comments and send feedback back to an agent. diff --git a/src/content/docs/guides/agent-workflows/how-to-review-ai-generated-code.mdx b/src/content/docs/guides/agent-workflows/how-to-review-ai-generated-code.mdx index 1b17d9b3a..3aef0e370 100644 --- a/src/content/docs/guides/agent-workflows/how-to-review-ai-generated-code.mdx +++ b/src/content/docs/guides/agent-workflows/how-to-review-ai-generated-code.mdx @@ -17,7 +17,7 @@ Coding agents can produce hundreds of lines of code in seconds, but shipping tha ## Prerequisites * **A Git-tracked project** — Code review in Warp works on any Git repository. -* **An AI coding agent** — This workflow applies to any CLI agent: [Claude Code](/guides/external-tools/how-to-set-up-claude-code/), [Codex](/guides/external-tools/how-to-set-up-codex-cli/), OpenCode, or Warp's built-in agent. See [Third-party CLI agents](/agent-platform/cli-agents/overview/) for setup. +* **An AI coding agent** — This workflow applies to any CLI agent: [Claude Code](/guides/external-tools/how-to-set-up-claude-code/), [Codex](/guides/external-tools/how-to-set-up-codex-cli/), OpenCode, or Warp's built-in agent. See [Third-party CLI agents](/agents/cli-agents/overview/) for setup. ## Why review matters @@ -115,10 +115,10 @@ If checks fail, you can either fix the issues manually in the Code Review panel ## Productivity tips -* **Attach diffs as context** — Select a diff hunk in the Code Review panel and attach it to your next prompt. This grounds the agent's response in your actual code changes. See [Selection as context](/agent-platform/local-agents/agent-context/selection-as-context/) for details. +* **Attach diffs as context** — Select a diff hunk in the Code Review panel and attach it to your next prompt. This grounds the agent's response in your actual code changes. See [Selection as context](/agents/local-agents/agent-context/selection-as-context/) for details. * **Revert individual hunks** — Don't like one specific change? Revert just that hunk from the Code Review panel without undoing the rest of the agent's work. * **Compare against main** — Switch the diff view to "Changes vs. main" to see how the agent's work fits into the full scope of your branch, not just the latest edits. -* **Use rules to prevent recurring issues** — If you notice the agent repeatedly making the same mistake (wrong import paths, incorrect naming conventions), add a [Rule](/agent-platform/capabilities/rules/) so it learns your project's standards. +* **Use rules to prevent recurring issues** — If you notice the agent repeatedly making the same mistake (wrong import paths, incorrect naming conventions), add a [Rule](/agents/capabilities/rules/) so it learns your project's standards. ## Next steps @@ -131,5 +131,5 @@ Explore related guides and features: * [Run multiple agents at once](/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/) to compare outputs from different agents on the same task * [Claude Code in Warp](https://www.warp.dev/agents/claude-code) | [Codex in Warp](https://www.warp.dev/agents/codex) | [Gemini CLI in Warp](https://www.warp.dev/agents/gemini-cli) | [OpenCode in Warp](https://www.warp.dev/agents/opencode) — agent-specific overviews on the Warp marketing site * [Code Review panel](/code/code-review/) — full reference for all Code Review features -* [Interactive Code Review](/agent-platform/local-agents/interactive-code-review/) — detailed docs on inline comments and batch feedback -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) — all supported agents and Warp's universal agent features +* [Interactive Code Review](/agents/local-agents/interactive-code-review/) — detailed docs on inline comments and batch feedback +* [Third-party CLI agents](/agents/cli-agents/overview/) — all supported agents and Warp's universal agent features diff --git a/src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx b/src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx index 0b11f7d1d..038bdc03f 100644 --- a/src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx +++ b/src/content/docs/guides/agent-workflows/how-to-review-prs-like-a-senior-dev.mdx @@ -70,7 +70,7 @@ Don't treat the agent's output as final. Before leaving review comments: - **Run the tests.** If the agent flags a potential regression, check whether the test suite catches it. - **Read the flagged code yourself.** The agent can miss context or misread intent. Treat its output as a starting checklist, not a verdict. -- **Test behavior changes manually.** For UI or interaction changes, check out the branch and verify in a browser. For cloud agent runs, you can use [Computer use](/agent-platform/capabilities/computer-use/) to let the agent verify behavior in a sandboxed environment. +- **Test behavior changes manually.** For UI or interaction changes, check out the branch and verify in a browser. For cloud agent runs, you can use [Computer use](/agents/capabilities/computer-use/) to let the agent verify behavior in a sandboxed environment. ## 4. Use follow-up prompts to dig deeper 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 49e4bebde..a7a3ff042 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 @@ -11,12 +11,13 @@ tags: --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; Use multiple coding agents, including Warp Agent, Claude Code, Codex, and other CLI agents, when work can be split into independent tasks, reviewed from separate branches, or delegated to cloud agents while you keep working locally. In Warp, you can coordinate agents in three ways: * **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. -* **Oz cloud orchestration** - use `/orchestrate`, `/plan`, the Oz CLI, the Oz web app, or the Oz API 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.API_SDK_NAME} 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. @@ -35,7 +36,7 @@ Plan on about 15 minutes for the local setup. Cloud orchestration takes longer o | Split by file or subsystem | A feature spans independent modules that can be changed in parallel. | Assign each agent a worktree, branch, file boundary, and validation command. | | Builder plus reviewer | One agent implements while another reviews, writes tests, or checks edge cases. | Put the reviewer in a read-only or review-focused tab, or use a separate branch for test-only changes. | | Cloud fan-out | The work is large, slow, or can run away from your laptop. | Use [Multi-agent orchestration](/platform/orchestration/) or [Running orchestrated agents](/platform/orchestration/multi-agent-runs/) to spawn cloud children. | -| Repeatable fleet workflow | You want the same agent pattern on every PR, issue, schedule, or release. | Use a cloud agent with a trigger, skill, or API workflow, then inspect parent and child runs in the [Oz web app](/platform/oz-web-app/). | +| Repeatable fleet workflow | You want the same agent pattern on every PR, issue, schedule, or release. | Use a cloud agent with a trigger, skill, or API workflow, then inspect parent and child runs in the [{VARS.WEB_APP}](/platform/oz-web-app/). | ## Plan the split before launching agents @@ -126,7 +127,7 @@ Notification setup varies by agent: * **OpenCode** — Add the [Warp notification plugin](https://github.com/warpdotdev/opencode-warp) to your `opencode.json` configuration. :::note -Agent notifications are currently supported for Claude Code, Codex, and OpenCode. For setup details, see [Agent notifications](/agent-platform/capabilities/agent-notifications/). For a full breakdown of which features work with each agent, see the [third-party CLI agents feature matrix](/agent-platform/cli-agents/overview/). +Agent notifications are currently supported for Claude Code, Codex, and OpenCode. For setup details, see [Agent notifications](/agents/capabilities/agent-notifications/). For a full breakdown of which features work with each agent, see the [third-party CLI agents feature matrix](/agents/cli-agents/overview/). ::: <figure style={{ maxWidth: "350px" }}> @@ -216,8 +217,8 @@ 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 Oz CLI, the Oz web app, or the Oz API. See [Running orchestrated agents](/platform/orchestration/multi-agent-runs/) for launch options. -4. Inspect parent and child runs from the [Oz web app](/platform/oz-web-app/) or the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app. +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. +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: @@ -254,11 +255,11 @@ 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 Oz CLI, the Oz web app, or the Oz API +* [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} * [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 * [Gemini CLI in Warp](https://www.warp.dev/agents/gemini-cli) — overview of Gemini CLI support in Warp * [OpenCode in Warp](https://www.warp.dev/agents/opencode) — overview of OpenCode support in Warp -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) — all supported agents and universal agent features +* [Third-party CLI agents](/agents/cli-agents/overview/) — all supported agents and universal agent features * [Vertical tabs](/terminal/windows/vertical-tabs/) — full reference for tab features 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 00152c119..0b77b3580 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 @@ -1,8 +1,8 @@ --- title: How to run unattended agents description: >- - Start unattended cloud agents from schedules, Slack, Linear, GitHub Actions, - the Oz CLI, or the Oz API, then inspect every run. + Start unattended cloud agents from schedules, Slack, Linear, GitHub, GitHub + Actions, the {{WARP_AGENT_CLI}}, or the {{WARP_AUTOMATION_PLATFORM}} API, then inspect every run. sidebar: label: "Run unattended agents" featured: true @@ -11,10 +11,11 @@ tags: - "cloud-agents" - "schedules" --- +import { VARS } from '@data/vars'; -Warp cloud agents can run unattended from schedules, team tools, CI, the Oz CLI, or the API. Use them when you want an agent to keep working after you leave your terminal, react to external events, or run recurring maintenance without a human starting each run. +Warp cloud agents can run unattended from schedules, team tools, CI, the {VARS.WARP_AGENT_CLI}, or the API. Use them when you want an agent to keep working after you leave your terminal, react to external events, or run recurring maintenance without a human starting each run. -Every unattended workflow creates a cloud agent run that your team can inspect later. Open runs from the [Runs page in the Oz web app](/platform/oz-web-app/#runs), the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app, or the session link posted back to the tool that triggered the agent. +Every unattended workflow creates a cloud agent run that your team can inspect later. Open runs from the [Runs page in the {VARS.WEB_APP}](/platform/oz-web-app/#runs), the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app, or the session link posted back to the tool that triggered the agent. ## Choose a trigger @@ -22,12 +23,13 @@ Use this table to decide where an unattended agent should start. | Trigger | Use it when | Where to configure | Where to inspect | | ------- | ----------- | ------------------ | ---------------- | -| Scheduled agents | Work should run on a predictable cadence, like weekly triage, nightly dependency checks, or monthly cleanup. | [Scheduled Agents](/platform/triggers/scheduled-agents/) or the [Scheduled Agents quickstart](/platform/triggers/scheduled-agents-quickstart/) | Oz web app Runs page, Agent Management Panel in the Warp app, schedule history, and cloud agent session links | -| Slack | A teammate should delegate work from a Slack message or thread. | [Slack integration](/platform/integrations/slack/) | Slack thread updates, Oz web app Runs page, Agent Management Panel in the Warp app, and the shared run session | -| Linear | An issue, comment, or assignment should start the agent. | [Linear integration](/platform/integrations/linear/) | Linear issue updates, Oz 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, Oz web app, and cloud agent runs | -| Oz CLI | You want to start a named cloud run from a terminal, script, or local automation. | [Oz CLI](/reference/cli/#running-agents-remotely-oz-agent-run-cloud) | CLI output, Oz web app Runs page, Agent Management Panel in the Warp app, and cloud agent session links | -| Oz API or SDK | Your internal system should create, query, or monitor runs programmatically. | [Oz API and SDK](/reference/api-and-sdk/) | Your system, API results, Oz web app, and run sessions | +| Scheduled agents | Work should run on a predictable cadence, like weekly triage, nightly dependency checks, or monthly cleanup. | [Scheduled Agents](/platform/triggers/scheduled-agents/) or the [Scheduled Agents quickstart](/platform/triggers/scheduled-agents-quickstart/) | {VARS.WEB_APP} Runs page, Agent Management Panel in the Warp app, schedule history, and cloud agent session links | +| Slack | A teammate should delegate work from a Slack message or thread. | [Slack integration](/platform/integrations/slack/) | Slack thread updates, {VARS.WEB_APP} Runs page, Agent Management Panel in the Warp app, and the shared run session | +| 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 | ## Choose a workflow pattern @@ -54,14 +56,24 @@ Use [Slack](/platform/integrations/slack/) or [Linear](/platform/integrations/li The agent posts progress updates back to the source thread or issue and provides a shared run link for deeper inspection. +### Delegate work from a GitHub thread + +Use the [GitHub integration](/platform/integrations/github/) when the task starts from an issue, a pull request, or a review comment. Mention `@warp-agent` in the thread and the agent picks up that context, replies in place, and reports any pull request it opens. This fits: + +* asking for a fix from a review comment without leaving the diff +* turning a bug report issue into a pull request +* answering a question about the code in the issue where it was asked + +Mentioning the agent again in the same thread continues the existing run instead of starting a new one. + ### React to GitHub events -Use [GitHub Actions](/platform/integrations/github-actions/) when the trigger should be tied to a repository event. +Use [GitHub Actions](/platform/integrations/github-actions/) when the trigger should be tied to a repository event and the run should happen inside your CI pipeline. For example: * review a PR when it opens -* respond to an `@oz-agent` comment +* respond to an `@warp-agent` comment * summarize issues on a schedule * attempt a fix when CI fails * suggest fixes for review comments @@ -70,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 [Oz CLI](/reference/cli/#running-agents-remotely-oz-agent-run-cloud) for scripts and terminal workflows. Use the [Oz API and SDK](/reference/api-and-sdk/) when another service should create or monitor runs. This is useful for: +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: * internal dashboards * custom webhooks @@ -97,10 +109,10 @@ If the agent can change code or infrastructure, keep the instructions narrow and Unattended does not mean invisible. Use these surfaces to review what happened: -* [Oz web app](/platform/oz-web-app/) - View runs, schedules, run metadata, and session transcripts from a browser or mobile device. +* [{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. -* [Oz API and SDK](/reference/api-and-sdk/) - Query runs and build internal monitoring around status, runtime, or outcomes. +* [{VARS.API_SDK_NAME}](/reference/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. @@ -118,7 +130,8 @@ Start with one narrow workflow before deploying many unattended agents: ## Next steps -* [Scheduled Agents quickstart](/platform/triggers/scheduled-agents-quickstart/) - Create your first recurring agent in the Oz web app. +* [Scheduled Agents quickstart](/platform/triggers/scheduled-agents-quickstart/) - Create your first recurring agent in the {VARS.WEB_APP}. * [Integrations quickstart](/platform/integrations/quickstart/) - Trigger agents from Slack or Linear. +* [GitHub integration](/platform/integrations/github/) - Set up `@warp-agent` mentions on issues and pull requests. * [GitHub Actions quickstart](/platform/integrations/quickstart-github-actions/) - Add an agent to a PR review workflow. * [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/) - Inspect and share unattended run sessions. diff --git a/src/content/docs/guides/agent-workflows/how-to-use-voice-and-images-to-prompt-coding-agents.mdx b/src/content/docs/guides/agent-workflows/how-to-use-voice-and-images-to-prompt-coding-agents.mdx index e7e3bc265..824bdcad4 100644 --- a/src/content/docs/guides/agent-workflows/how-to-use-voice-and-images-to-prompt-coding-agents.mdx +++ b/src/content/docs/guides/agent-workflows/how-to-use-voice-and-images-to-prompt-coding-agents.mdx @@ -15,7 +15,7 @@ Typing detailed prompts for coding agents can be slow. Describing a bug from a s ## Prerequisites * **Warp** — Voice and image input are built into Warp's agent interface. Download from [Warp homepage](https://www.warp.dev). -* **A CLI coding agent** — Voice and image input work with any supported agent: [Claude Code](/guides/external-tools/how-to-set-up-claude-code/), [Codex CLI](/guides/external-tools/how-to-set-up-codex-cli/), OpenCode, Gemini CLI, Amp, or Droid. See [Third-party CLI agents](/agent-platform/cli-agents/overview/) for the full list. +* **A CLI coding agent** — Voice and image input work with any supported agent: [Claude Code](/guides/external-tools/how-to-set-up-claude-code/), [Codex CLI](/guides/external-tools/how-to-set-up-codex-cli/), OpenCode, Gemini CLI, Amp, or Droid. See [Third-party CLI agents](/agents/cli-agents/overview/) for the full list. * **A working microphone** (for voice) — Built-in or external, including Bluetooth audio devices. ## 1. Enable voice input @@ -105,7 +105,7 @@ If you don't see the utility bar, make sure you're on the latest Warp version an * **Use voice for code review feedback** — Instead of typing inline comments, use voice to describe what needs to change while looking at the diff in the [Code Review panel](/code/code-review/). * **Screenshot UI issues** — When you want to change a UI component, just screenshot it, send it to the agent, and describe what you want changed. * **Dictate commit messages** — After reviewing your changes, use voice to describe what you did. The agent can format it as a proper commit message. -* **Use with Rules for consistent results** — Combine image context with [Rules](/agent-platform/capabilities/rules/) that define your project's UI patterns. The agent will match the mockup while following your existing design system. +* **Use with Rules for consistent results** — Combine image context with [Rules](/agents/capabilities/rules/) that define your project's UI patterns. The agent will match the mockup while following your existing design system. ## Next steps @@ -115,6 +115,6 @@ Explore related guides and features: * [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/) to start using third-party agents * [How to review AI-generated code](/guides/agent-workflows/how-to-review-ai-generated-code/) — review the code your agents produce * [Run multiple agents at once](/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/) — combine voice/image prompting with parallel agents -* [Voice input](/agent-platform/local-agents/interacting-with-agents/voice/) — full reference for voice features -* [Images as context](/agent-platform/local-agents/agent-context/images-as-context/) — full reference for image input -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) — all supported agents and universal features +* [Voice input](/agents/local-agents/interacting-with-agents/voice/) — full reference for voice features +* [Images as context](/agents/local-agents/agent-context/images-as-context/) — full reference for image input +* [Third-party CLI agents](/agents/cli-agents/overview/) — all supported agents and universal features 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 69a061237..9d6a8bb3e 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 @@ -1,7 +1,8 @@ --- title: Run a software factory in the cloud description: >- - Set up the Oz-native production path for your software factory: dedicated cloud environments, team-scoped secrets, native event triggers, and full audit trails for every agent run. + Set up the {{WARP_AUTOMATION_PLATFORM}}-native production path for your software factory with cloud + environments, secrets, triggers, and audit trails. sidebar: label: "Run a software factory in the cloud" tags: @@ -10,8 +11,9 @@ tags: - "software-factory" - "orchestration" --- +import { VARS } from '@data/vars'; -The GitHub Actions approach in [Set up your software factory](/guides/agent-workflows/set-up-a-software-factory) gets the four-agent loop working. This guide covers the Oz-native production setup for teams running the factory at scale: cloud environments, secrets and permissions, triggers, and observability. +The GitHub Actions approach in [Set up your software factory](/guides/agent-workflows/set-up-a-software-factory) gets the four-agent loop working. This guide covers the {VARS.WARP_AUTOMATION_PLATFORM}-native production setup for teams running the factory at scale: cloud environments, secrets and permissions, triggers, and observability. To run the same loop as a managed product instead, see [Warp Factories](/factories/). ## Prerequisites @@ -20,20 +22,20 @@ The GitHub Actions approach in [Set up your software factory](/guides/agent-work ## Why cloud agents, not cloud computers -A common approach to cloud-based agents is to spin up a persistent virtual machine, or "cloud computer", that the agent logs into and uses like a developer's laptop. Oz uses a different model where each agent run is a short-lived, scoped execution with its own environment and permissions, similar to a cloud function rather than a long-running server. +A common approach to cloud-based agents is to spin up a persistent virtual machine, or "cloud computer", that the agent logs into and uses like a developer's laptop. The {VARS.WARP_AUTOMATION_PLATFORM} uses a different model where each agent run is a short-lived, scoped execution with its own environment and permissions, similar to a cloud function rather than a long-running server. The practical difference: * **Per-agent permissions** — Your triage agent only needs to read issues and post comments. Your implementation agent needs to push branches and open PRs. Each agent gets exactly the permissions it needs, not a single shared credential that everything uses. * **Audit trails** — Every cloud agent run is logged separately. You can see exactly what the triage agent did versus what the implementation agent did, when it ran, and what it produced. -* **Team visibility** — Any teammate can open a run in the Oz web app to inspect the session transcript, steer a stuck agent, or pick up where the agent left off. +* **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 Oz-hosted, CLI-based, and self-hosted execution patterns. +See [Deployment patterns](/platform/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 -An Oz environment is a Docker-based sandbox with your repository, secrets, and any tools the agents need. If you don't already have one from the previous guides, create one now: run [`/create-environment`](warp://action/create_environment) in Warp and Oz detects your stack, suggests a Docker image, and creates the environment automatically. +A cloud environment is a Docker-based sandbox with your repository, secrets, and any tools the agents need. If you don't already have one from the previous guides, create one now: run [`/create-environment`](warp://action/create_environment) in Warp and the {VARS.WARP_AUTOMATION_PLATFORM} detects your stack, suggests a Docker image, and creates the environment automatically. For repositories that need specific toolchains or dependencies, [`warpdotdev/oz-dev-environments`](https://github.com/warpdotdev/oz-dev-environments) has prebuilt Docker images for common stacks. @@ -60,42 +62,42 @@ Use fine-grained personal access tokens or separate GitHub App installations to ## 3. Configure triggers -With GitHub Actions, your factory already has event-based triggers. Oz also provides first-party integrations that handle triggering without GitHub Actions boilerplate: +With GitHub Actions, your factory already has event-based triggers. The {VARS.WARP_AUTOMATION_PLATFORM} also provides first-party integrations that handle triggering without GitHub Actions boilerplate: * **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). -* **Oz API and SDK** — For custom triggers — webhooks, internal dashboards, other events — use the [Oz API and SDK](/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}](/reference/api-and-sdk) to start runs programmatically. ## 4. Monitor factory runs -Every cloud agent run in your factory appears in the Oz dashboard with: +Every cloud agent run in your factory appears in the {VARS.DASHBOARD} with: * A session transcript showing every action the agent took * Artifacts: PRs, branches, plans, and reports the agent produced * Status history: queued, in progress, succeeded, or failed with error details * A session sharing link any teammate can open to inspect or steer the run -Open runs from [oz.warp.dev](https://oz.warp.dev) or from the **Agent Management Panel** in the Warp app. Include the session link in PR descriptions so reviewers can see exactly how the agent built the change — see [Attach agent context to GitHub PRs](/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs). +Open runs from <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP_URL}</a> or from the **Agent Management Panel** in the Warp app. Include the session link in PR descriptions so reviewers can see exactly how the agent built the change — see [Attach agent context to GitHub PRs](/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs). See [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs) for the full reference. ## 5. Use multi-agent orchestration for large backlogs -When a sprint starts and you want to process many issues in parallel, Oz can fan out to child agents — one per issue — from a single parent run. The parent coordinates; the children execute in parallel, each with their own environment, prompt, and permissions. +When a sprint starts and you want to process many issues in parallel, the {VARS.WARP_AUTOMATION_PLATFORM} can fan out to child agents — one per issue — from a single parent run. The parent coordinates; the children execute in parallel, each with their own environment, prompt, and permissions. See [Multi-agent orchestration](/platform/orchestration) for fan-out, sharding, and result aggregation patterns. ## Productivity tips * **Start with one agent role in the cloud** — Get the triage agent running as a cloud run before moving all four roles. Confirm that the environment, secrets, and permissions work correctly before expanding. -* **Add session links to PR descriptions** — When the implementation agent opens a PR, include the Oz run link so reviewers get the full context. See [Attach agent context to GitHub PRs](/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs) for a template. -* **Monitor credit usage** — Cloud agent runs consume credits. Monitor usage in the Oz web app and adjust run scope if needed. See [Credits](/support-and-community/plans-and-billing/credits). +* **Add session links to PR descriptions** — When the implementation agent opens a PR, include the {VARS.PLATFORM_RUN} link so reviewers get the full context. See [Attach agent context to GitHub PRs](/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs) for a template. +* **Monitor credit usage** — Cloud agent runs consume credits. Monitor usage in the {VARS.WEB_APP} and adjust run scope if needed. See [Credits](/support-and-community/plans-and-billing/credits). ## Next steps -* [What is a software factory?](/platform/software-factory) — The conceptual overview of the full loop. +* [Warp Factories overview](/factories/) — The managed product that runs this same loop end to end. * [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 Oz agent workers on your own infrastructure when code must stay on-premises. +* [Self-hosting](/platform/self-hosting) — Run cloud agent workers on your own infrastructure when code must stay on-premises. diff --git a/src/content/docs/guides/agent-workflows/set-up-a-software-factory.mdx b/src/content/docs/guides/agent-workflows/set-up-a-software-factory.mdx index 74146c7f0..42dd7765e 100644 --- a/src/content/docs/guides/agent-workflows/set-up-a-software-factory.mdx +++ b/src/content/docs/guides/agent-workflows/set-up-a-software-factory.mdx @@ -9,13 +9,14 @@ tags: - "software-factory" - "cloud-agents" --- +import { VARS } from '@data/vars'; -This guide adds the implementation and reviewer agents to the [triage](/guides/agent-workflows/build-a-triage-agent) and [spec](/guides/agent-workflows/write-product-and-tech-specs-with-agents) agents you set up previously, then connects all four into a software factory using GitHub labels as the state machine. Issues flow automatically from triage to a reviewable pull request. +This guide adds the implementation and reviewer agents to the [triage](/guides/agent-workflows/build-a-triage-agent) and [spec](/guides/agent-workflows/write-product-and-tech-specs-with-agents) agents you set up previously, then connects all four into a software factory using GitHub labels as the state machine. Issues flow automatically from triage to a reviewable pull request. To run this same loop as a managed product instead of wiring it yourself, see [Warp Factories](/factories/). ## Prerequisites * A working [triage agent](/guides/agent-workflows/build-a-triage-agent) and [spec agent](/guides/agent-workflows/write-product-and-tech-specs-with-agents), each deployed individually -* An Oz cloud environment with access to your repository ([create one](/platform/environments)) +* A cloud environment with access to your repository ([create one](/platform/environments)) * `warpdotdev/oz-agent-action` installed (see [GitHub Actions integration](/platform/integrations/github-actions)) ## How the loop works @@ -156,14 +157,14 @@ The reviewer agent surfaces issues and inconsistencies; the human makes the fina * **Validate before the reviewer runs** — After the implementation agent opens a PR, run `/validate-changes-match-specs` to check the diff against `PRODUCT.md` and `TECH.md`. This catches any misalignments before the reviewer agent posts comments. The skill is available from [`warpdotdev/common-skills`](https://github.com/warpdotdev/common-skills). * **Start with triage only** — Get your triage agent running well before adding spec and implementation. A groomed, labeled backlog is immediately useful to every developer on the team. -* **Use `@oz-agent` for one-off requests** — Teammates can mention `@oz-agent` in an issue comment to kick off an agent run directly, bypassing the label workflow for urgent requests. -* **Monitor runs in the Oz web app** — Every cloud agent run appears in the [Oz web app](https://oz.warp.dev) with a session link. Use it to inspect what each agent did, steer a stuck run, or hand work back to a local session. +* **Use `@warp-agent` for one-off requests** — Teammates can mention `@warp-agent` in an issue comment to kick off an agent run directly, bypassing the label workflow for urgent requests. +* **Monitor runs in the {VARS.WEB_APP}** — Every cloud agent run appears in the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> with a session link. Use it to inspect what each agent did, steer a stuck run, or hand work back to a local session. ## Next steps -* [What is a software factory?](/platform/software-factory) — The conceptual overview of the full loop. -* [Run a software factory in the cloud](/guides/agent-workflows/run-a-software-factory-in-the-cloud) — Move the loop into a managed Oz deployment. +* [Warp Factories overview](/factories/) — The managed product that runs this same intake-to-review loop, without the workflow wiring. +* [Run a software factory in the cloud](/guides/agent-workflows/run-a-software-factory-in-the-cloud) — Move the loop into a managed {VARS.WARP_AUTOMATION_PLATFORM} deployment. * [Build a self-improving agent](/guides/agent-workflows/build-a-self-improving-agent) — Add the outer improvement loop. * [Review AI-generated code](/guides/agent-workflows/how-to-review-ai-generated-code) — The human review workflow for agent-generated PRs. * [`warpdotdev/oz-for-oss`](https://github.com/warpdotdev/oz-for-oss) — The complete reference implementation. -* [GitHub Actions integration](/platform/integrations/github-actions) — Full documentation for triggering Oz agents from CI. +* [GitHub Actions integration](/platform/integrations/github-actions) — Full documentation for triggering cloud agents from CI. diff --git a/src/content/docs/guides/agent-workflows/warp-for-product-managers.mdx b/src/content/docs/guides/agent-workflows/warp-for-product-managers.mdx index 171b086a4..6a4229b2d 100644 --- a/src/content/docs/guides/agent-workflows/warp-for-product-managers.mdx +++ b/src/content/docs/guides/agent-workflows/warp-for-product-managers.mdx @@ -12,10 +12,10 @@ Most PM work breaks down into three activities: gathering information, synthesiz ## Prerequisites * **Warp** — installed and signed in. See [Installation and setup](/getting-started/quickstart/installation-and-setup/) to get started. -* **MCP servers (optional but recommended)** — Slack, Linear, and Notion all have documented MCP configs in Warp. See [MCP](https://docs.warp.dev/agent-platform/capabilities/mcp/) for setup instructions. Each workflow below notes which MCP servers it uses and includes a fallback for users without MCP. +* **MCP servers (optional but recommended)** — Slack, Linear, and Notion all have documented MCP configs in Warp. See [MCP](https://docs.warp.dev/agents/capabilities/mcp/) for setup instructions. Each workflow below notes which MCP servers it uses and includes a fallback for users without MCP. :::note -These workflows work with Warp's built-in agent or any third-party CLI agent running in Warp, including Claude Code, Codex, OpenCode, and Gemini CLI. See [Third-party CLI agents](https://docs.warp.dev/agent-platform/cli-agents/overview/) for the full list. +These workflows work with Warp's built-in agent or any third-party CLI agent running in Warp, including Claude Code, Codex, OpenCode, and Gemini CLI. See [Third-party CLI agents](https://docs.warp.dev/agents/cli-agents/overview/) for the full list. ::: ## 1. Pull cross-project status updates @@ -123,9 +123,9 @@ The result is a structured first draft from a stream-of-consciousness recording. ## Productivity tips -* **Save Rules for recurring formats** — Save a Rule with your team's status update format, doc templates, or project list so agents start with the right context every time. See [Rules](https://docs.warp.dev/agent-platform/capabilities/rules/). +* **Save Rules for recurring formats** — Save a Rule with your team's status update format, doc templates, or project list so agents start with the right context every time. See [Rules](https://docs.warp.dev/agents/capabilities/rules/). * **Create Saved Prompts for recurring workflows** — Turn your weekly status prompt or meeting prep prompt into a reusable Saved Prompt so you can run it with one click. See [Trigger reusable actions with Saved Prompts](/guides/configuration/trigger-reusable-actions-with-saved-prompts/). -* **Use `Ctrl+G` for complex prompts** — Open the rich input editor for click-to-edit prompt composition instead of navigating with arrow keys. Works with any CLI agent running in Warp. See [Rich Input Editor](https://docs.warp.dev/agent-platform/cli-agents/rich-input/). +* **Use `Ctrl+G` for complex prompts** — Open the rich input editor for click-to-edit prompt composition instead of navigating with arrow keys. Works with any CLI agent running in Warp. See [Rich Input Editor](https://docs.warp.dev/agents/cli-agents/rich-input/). * **Save tab configs for recurring setups** — If you regularly run a research + drafting + review tab layout, save it as a tab config for one-click workspace setup. See [Tab Configs](https://docs.warp.dev/terminal/windows/tab-configs/). ## Next steps @@ -137,6 +137,6 @@ To go deeper on any of the tools used in these workflows, explore the related gu * [Connect agents to MCP servers](/guides/external-tools/using-mcp-servers-with-warp/) — set up Slack, Linear, Notion, and other MCP integrations * [Use voice and images to prompt agents](/guides/agent-workflows/how-to-use-voice-and-images-to-prompt-coding-agents/) — full setup and use cases for multimodal input * [Run multiple AI coding agents](/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/) — multi-tab workflows, tab configs, and Git worktrees -* [MCP](https://docs.warp.dev/agent-platform/capabilities/mcp/) — full reference for MCP server configuration -* [Rules](https://docs.warp.dev/agent-platform/capabilities/rules/) — save persistent context so agents follow your team's conventions -* [Voice input](/agent-platform/local-agents/interacting-with-agents/voice/) — full reference for voice transcription features +* [MCP](https://docs.warp.dev/agents/capabilities/mcp/) — full reference for MCP server configuration +* [Rules](https://docs.warp.dev/agents/capabilities/rules/) — save persistent context so agents follow your team's conventions +* [Voice input](/agents/local-agents/interacting-with-agents/voice/) — full reference for voice transcription features diff --git a/src/content/docs/guides/agent-workflows/write-product-and-tech-specs-with-agents.mdx b/src/content/docs/guides/agent-workflows/write-product-and-tech-specs-with-agents.mdx index fb6e04f87..ad3140496 100644 --- a/src/content/docs/guides/agent-workflows/write-product-and-tech-specs-with-agents.mdx +++ b/src/content/docs/guides/agent-workflows/write-product-and-tech-specs-with-agents.mdx @@ -8,6 +8,7 @@ tags: - "agents" - "software-factory" --- +import { VARS } from '@data/vars'; Once your [triage agent](/guides/agent-workflows/build-a-triage-agent) is labeling issues as `ready-to-spec`, use agents to turn those issues into two spec files: a product spec that describes what the feature should do from the user's perspective, and a tech spec that describes how to implement it. @@ -67,12 +68,12 @@ A tech spec defines how the feature will be implemented, including architecture * **Spec before you code, not after** — The biggest value from specs is catching misaligned assumptions before any code is written. Running `/write-product-spec` first forces that alignment to happen early, when fixing it is cheap. * **Attach Figma mocks** — If your feature has a UI component, attach a Figma screenshot or mockup to your prompt when running `/write-product-spec`. The agent incorporates visual context into the acceptance criteria. -* **Use `/plan` for smaller tasks** — For changes that don't warrant full specs, use Warp's built-in [planning feature](/agent-platform/capabilities/planning). Plans can be saved, versioned, and attached to PRs without a full spec workflow. +* **Use `/plan` for smaller tasks** — For changes that don't warrant full specs, use Warp's built-in [planning feature](/agents/capabilities/planning). Plans can be saved, versioned, and attached to PRs without a full spec workflow. ## Next steps -* [What is a software factory?](/platform/software-factory) — How specs fit into the full development loop. +* [Warp Factories overview](/factories/) — The managed product where a spec stage gates implementation the same way. * [Set up your software factory](/guides/agent-workflows/set-up-a-software-factory) — Connect the spec role to implementation and review. * [`warpdotdev/common-skills`](https://github.com/warpdotdev/common-skills) — The full set of shared skills including `write-product-spec`, `write-tech-spec`, and `validate-changes-match-specs`. -* [Planning](/agent-platform/capabilities/planning) — Warp's built-in planning feature for smaller tasks. -* [Skills](/agent-platform/capabilities/skills) — How skill files work in Warp and Oz. +* [Planning](/agents/capabilities/planning) — Warp's built-in planning feature for smaller tasks. +* [Skills](/agents/capabilities/skills) — How skill files work in Warp and the {VARS.WARP_AUTOMATION_PLATFORM}. diff --git a/src/content/docs/guides/configuration/how-to-set-up-self-serve-data-analytics-with-skills.mdx b/src/content/docs/guides/configuration/how-to-set-up-self-serve-data-analytics-with-skills.mdx index 54926b41e..75407b869 100644 --- a/src/content/docs/guides/configuration/how-to-set-up-self-serve-data-analytics-with-skills.mdx +++ b/src/content/docs/guides/configuration/how-to-set-up-self-serve-data-analytics-with-skills.mdx @@ -10,6 +10,7 @@ tags: --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; Self-serve data analytics means anyone on your team can ask a data question and get a trustworthy answer, without pinging the data team. This guide sets up that workflow using two community Skills that chain together: one resolves vague questions to the right BigQuery tables, and the other structures deep-dive analyses into reproducible folders. Plan on about 10 minutes for initial setup, plus time to customize the model index for your warehouse. @@ -18,7 +19,7 @@ Self-serve data analytics means anyone on your team can ask a data question and * **Warp** — Install from [Warp download page](https://www.warp.dev/download) if you don't already have it. * **A BigQuery data warehouse with dbt models** — The Skills as published assume BigQuery and dbt. You can adapt them to Snowflake, Redshift, Databricks, or a non-dbt setup. See [Adapting to your stack](#adapting-to-your-stack). * **The BigQuery CLI (`bq`)** — Installed as part of the [Google Cloud SDK](https://cloud.google.com/sdk/docs/install). Agents call it directly to query the warehouse, so no MCP server is required. -* **A Git repository where the Agent will work** — Warp auto-discovers Skills from `.agents/skills/` in your current working directory up through the repo root. See [Skills](https://docs.warp.dev/agent-platform/capabilities/skills/) for the full list of supported directories and how discovery works. +* **A Git repository where the Agent will work** — Warp auto-discovers Skills from `.agents/skills/` in your current working directory up through the repo root. See [Skills](https://docs.warp.dev/agents/capabilities/skills/) for the full list of supported directories and how discovery works. ## Walkthrough video @@ -179,11 +180,11 @@ The `analysis-artifacts` Skill is largely stack-agnostic. It structures outputs, You installed two community Skills, customized the model index for your warehouse, and ran both a simple lookup and a full deep-dive analysis. -**Extend to Slack.** Wire the same two Skills into a cloud agent configured with your dbt repo, and your teammates can ask data questions by @-mentioning Oz in a Slack channel, without opening a terminal. The agent clones the repo, picks up the Skills from `.agents/skills/`, and replies in-thread. See the [Slack integration docs](https://docs.warp.dev/platform/integrations/slack/) and [Skills as Agents](https://docs.warp.dev/platform/skills-as-agents/) for setup. +**Extend to Slack.** Wire the same two Skills into a cloud agent configured with your dbt repo, and your teammates can ask data questions by tagging @warp in a Slack channel, without opening a terminal. The agent clones the repo, picks up the Skills from `.agents/skills/`, and replies in-thread. See the [Slack integration docs](https://docs.warp.dev/platform/integrations/slack/) and [Skills as Agents](https://docs.warp.dev/platform/skills-as-agents/) for setup. Explore related guides and features: * [Trigger reusable actions with saved prompts](/guides/configuration/trigger-reusable-actions-with-saved-prompts/) — another reusable Agent primitive, useful for scaffolding frequent data questions * [Create project rules](/guides/configuration/how-to-create-project-rules-for-an-existing-project-astro-typescript-tailwind/) — pair Skills with Rules to steer Agent behavior across your repo -* [Skills](https://docs.warp.dev/agent-platform/capabilities/skills/) — full reference on Skills, discovery, arguments, and slash-command invocation +* [Skills](https://docs.warp.dev/agents/capabilities/skills/) — full reference on Skills, discovery, arguments, and slash-command invocation * [warpdotdev/oz-skills](https://github.com/warpdotdev/oz-skills) — public repo with these two Skills and more diff --git a/src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx b/src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx index af52c5964..0a684f8a7 100644 --- a/src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx +++ b/src/content/docs/guides/configuration/how-to-use-tokens-efficiently-with-ai-coding-agents.mdx @@ -44,7 +44,7 @@ Larger reasoning models process more tokens per turn than lighter ones, so the m * **Reserve high-reasoning models for hard problems** - Save heavier models like Claude Opus for deep debugging, architecture decisions, and planning, where the extra reasoning is worth the cost. * **Pick a model and stay with it** - Switching models mid-conversation can reset prompt caching and reprocess your context. Choose a model at the start of a task and keep it for the duration when you can. -Change models with the model picker in the input, or run `/model`. See [Agent model choice](/agent-platform/inference/model-choice/) for the full model list. +Change models with the model picker in the input, or run `/model`. See [Agent model choice](/agents/inference/model-choice/) for the full model list. ## Automate model selection with custom routers @@ -54,7 +54,7 @@ Use a custom router to automatically choose a model. You define the routing logi * **Route by rules** - Write natural-language rules that pair a description (such as "debugging or fixing failing tests") with a model. Warp matches rules top to bottom and uses the first one that fits. * **Set a cost-efficient default** - Every router falls back to a default model for anything your tiers or rules don't cover, so choose a lighter model for the default. -A router appears in the model picker like any other model and resolves per conversation, so token usage matches whichever model it picks. Create one in the Warp app under **Settings** > **Agents** > **Warp Agent** in the **Custom Routers** section. See [Custom routers](/agent-platform/inference/custom-routers/) for setup steps and YAML examples. +A router appears in the model picker like any other model and resolves per conversation, so token usage matches whichever model it picks. Create one in the Warp app under **Settings** > **Agents** > **Warp Agent** in the **Custom Routers** section. See [Custom routers](/agents/inference/custom-routers/) for setup steps and YAML examples. ## Keep each conversation focused @@ -64,14 +64,14 @@ Because every turn re-sends the current conversation to the model, long or unfoc * **Start a new conversation for a new task** - Run `/new` when you switch topics so unrelated history doesn't ride along in every turn. * **Compact long conversations** - When a useful thread grows long, run `/compact` to summarize the history and free up the context window. Use `/fork-and-compact` to branch into a fresh, summarized copy that keeps the relevant context and trims the rest. -See [Conversation forking](/agent-platform/local-agents/interacting-with-agents/conversation-forking/) and the full [Slash Commands](/agent-platform/capabilities/slash-commands/) reference for more. +See [Conversation forking](/agents/local-agents/interacting-with-agents/conversation-forking/) and the full [Slash Commands](/agents/capabilities/slash-commands/) reference for more. ## Be selective about the context you add Context you attach becomes tokens the model has to process. Adding only what's relevant keeps each turn lean. * **Attach focused snippets, not full dumps** - When sharing logs, code, or command output, include only the relevant portion instead of an entire file or output. -* **Add context deliberately** - Attach the specific [blocks](/agent-platform/local-agents/agent-context/blocks-as-context/), files, or images the agent needs for the task, rather than broad, just-in-case context. +* **Add context deliberately** - Attach the specific [blocks](/agents/local-agents/agent-context/blocks-as-context/), files, or images the agent needs for the task, rather than broad, just-in-case context. ## Let Codebase Context retrieve code for you @@ -80,13 +80,13 @@ When an agent explores your repository by reading files one by one, each read is * **Index your repository** - Run `/index` so Warp can locate relevant code by meaning, reducing the number of exploratory tool calls and the amount of code you paste in manually. * **Let the agent search instead of pasting** - With an indexed codebase, ask about a feature or file directly rather than copying large sections into the prompt. -Learn more in [Codebase Context](/agent-platform/capabilities/codebase-context/). +Learn more in [Codebase Context](/agents/capabilities/codebase-context/). ## Set up Rules and AGENTS.md Without persistent guidance, agents re-derive your preferences every session and sometimes drift off course, which wastes tokens on corrections and rework. Rules encode that guidance once. -* **Capture preferences as Rules** - Store your tools, conventions, and standards as [Rules](/agent-platform/capabilities/rules/) so you don't re-explain them in every conversation. Add one with `/add-rule`. +* **Capture preferences as Rules** - Store your tools, conventions, and standards as [Rules](/agents/capabilities/rules/) so you don't re-explain them in every conversation. Add one with `/add-rule`. * **Add a project AGENTS.md** - Run `/init` to generate a project `AGENTS.md` that gives agents the context they need up front, reducing exploration and missteps. For examples, see [Set coding best practices with Rules](/guides/configuration/how-to-set-coding-best-practices/). @@ -97,7 +97,7 @@ For big or ambiguous tasks, jumping straight to implementation often leads to wr * **Create a plan before executing** - Run `/plan` to have the agent research and outline the work in phases before it changes code. A clear plan reduces wasted exploratory work and backtracking on large tasks. -See [Planning](/agent-platform/capabilities/planning/) for details. +See [Planning](/agents/capabilities/planning/) for details. ## Next steps @@ -106,6 +106,6 @@ Together, these habits help you get more out of every token: match the model to Explore these related guides and references: * [Use Agent Profiles efficiently](/guides/configuration/how-to-use-agent-profiles-efficiently/) -* [Agent model choice](/agent-platform/inference/model-choice/) -* [Custom routers](/agent-platform/inference/custom-routers/) -* [Slash Commands](/agent-platform/capabilities/slash-commands/) +* [Agent model choice](/agents/inference/model-choice/) +* [Custom routers](/agents/inference/custom-routers/) +* [Slash Commands](/agents/capabilities/slash-commands/) diff --git a/src/content/docs/guides/external-tools/how-to-set-up-claude-code.mdx b/src/content/docs/guides/external-tools/how-to-set-up-claude-code.mdx index 443f91063..c0b4afbe7 100644 --- a/src/content/docs/guides/external-tools/how-to-set-up-claude-code.mdx +++ b/src/content/docs/guides/external-tools/how-to-set-up-claude-code.mdx @@ -119,12 +119,12 @@ This lets Claude read files and run your test/lint commands without prompting, w Warp supports agent notifications for Claude Code through a plugin. When you run Claude Code in Warp without the plugin installed, a notification chip appears offering one-click installation. Once installed, Warp surfaces in-app and desktop alerts when Claude Code needs your input. -For manual installation steps, troubleshooting, and SSH/remote setup, see [Claude Code in Warp (docs)](/agent-platform/cli-agents/claude-code/#setting-up-notifications). +For manual installation steps, troubleshooting, and SSH/remote setup, see [Claude Code in Warp (docs)](/agents/cli-agents/claude-code/#setting-up-notifications). ## Productivity tips -* **Use voice to prompt Claude Code** — Instead of typing complex instructions, dictate them. Warp supports [voice transcription](/agent-platform/local-agents/interacting-with-agents/voice/) that works with any CLI agent, including Claude Code. Press the microphone icon or the `fn` key to start recording. -* **Attach images as context** — Paste screenshots of bug reports, design mockups, or error messages directly into your prompt. Warp's [images as context](/agent-platform/local-agents/agent-context/images-as-context/) feature lets Claude Code see what you see. +* **Use voice to prompt Claude Code** — Instead of typing complex instructions, dictate them. Warp supports [voice transcription](/agents/local-agents/interacting-with-agents/voice/) that works with any CLI agent, including Claude Code. Press the microphone icon or the `fn` key to start recording. +* **Attach images as context** — Paste screenshots of bug reports, design mockups, or error messages directly into your prompt. Warp's [images as context](/agents/local-agents/agent-context/images-as-context/) feature lets Claude Code see what you see. * **Review diffs visually** — After Claude Code makes changes, open Warp's [Code Review panel](/code/code-review/) (`⌘+Shift++`) to see a visual diff of every file changed. You can leave inline comments and send them back to Claude Code for corrections. * **Run multiple Claude Code sessions in parallel** — Use [vertical tabs](/terminal/windows/vertical-tabs/) to run different Claude Code tasks side by side, one session fixing bugs while another writes tests. Each tab shows which agent is running and its current status. * **Compose richer prompts** — Press `Ctrl+G` to open Warp's rich input editor for Claude Code. This gives you a full text editor experience for composing prompts — click to position your cursor, select text, and edit naturally instead of navigating with arrow keys. @@ -141,5 +141,5 @@ Explore related guides and features: * [Run multiple agents at once](/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/) — use Claude Code and Codex side by side * [Claude Code documentation](https://docs.anthropic.com/en/docs/claude-code/quickstart) — Anthropic's official reference * [Claude Code in Warp](https://www.warp.dev/agents/claude-code) — overview of Claude Code support in Warp -* [Claude Code in Warp (docs)](/agent-platform/cli-agents/claude-code/) — full reference for Claude Code's Warp integration, including notification setup -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) — all supported agents and Warp's universal agent features +* [Claude Code in Warp (docs)](/agents/cli-agents/claude-code/) — full reference for Claude Code's Warp integration, including notification setup +* [Third-party CLI agents](/agents/cli-agents/overview/) — all supported agents and Warp's universal agent features diff --git a/src/content/docs/guides/external-tools/how-to-set-up-codex-cli.mdx b/src/content/docs/guides/external-tools/how-to-set-up-codex-cli.mdx index f059be1e5..9c3237743 100644 --- a/src/content/docs/guides/external-tools/how-to-set-up-codex-cli.mdx +++ b/src/content/docs/guides/external-tools/how-to-set-up-codex-cli.mdx @@ -113,13 +113,13 @@ Create a `codex.md` or `AGENTS.md` file at your project root to teach Codex your Codex reads this file at the start of every session and follows your conventions automatically. :::note -Warp supports agent notifications for Codex. Add `notification_condition = "always"` under `[tui]` in `~/.codex/config.toml` and restart Codex. See [Codex in Warp (docs)](/agent-platform/cli-agents/codex/#setting-up-notifications) for details. If the config isn't set, Warp displays a setup chip in the terminal. +Warp supports agent notifications for Codex. Add `notification_condition = "always"` under `[tui]` in `~/.codex/config.toml` and restart Codex. See [Codex in Warp (docs)](/agents/cli-agents/codex/#setting-up-notifications) for details. If the config isn't set, Warp displays a setup chip in the terminal. ::: ## Productivity tips -* **Use voice to prompt Codex** — Dictate complex instructions instead of typing them. Warp supports [voice transcription](/agent-platform/local-agents/interacting-with-agents/voice/) that works with any CLI agent, including Codex. -* **Attach images as context** — Paste screenshots of bugs, designs, or error messages into your prompt. Warp's [images as context](/agent-platform/local-agents/agent-context/images-as-context/) feature lets Codex see what you see. +* **Use voice to prompt Codex** — Dictate complex instructions instead of typing them. Warp supports [voice transcription](/agents/local-agents/interacting-with-agents/voice/) that works with any CLI agent, including Codex. +* **Attach images as context** — Paste screenshots of bugs, designs, or error messages into your prompt. Warp's [images as context](/agents/local-agents/agent-context/images-as-context/) feature lets Codex see what you see. * **Review diffs visually** — After Codex makes changes, open Warp's [Code Review panel](/code/code-review/) (`⌘+Shift++`) to see a visual diff. You can leave inline comments and send them back to Codex for corrections. * **Run Codex alongside Claude Code** — Use [vertical tabs](/terminal/windows/vertical-tabs/) to run Claude Code and Codex side by side on the same task. Compare their approaches and pick the best output, or combine elements from both. * **Compose richer prompts** — Press `Ctrl+G` to open Warp's rich input editor for Codex, giving you a full text editor experience instead of raw CLI input. @@ -137,5 +137,5 @@ Explore related guides and features: * [Run multiple agents at once](/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/) — use Codex and Claude Code side by side * [Codex CLI documentation](https://developers.openai.com/codex/cli/) — OpenAI's official reference * [Codex in Warp](https://www.warp.dev/agents/codex) — overview of Codex support in Warp -* [Codex in Warp (docs)](/agent-platform/cli-agents/codex/) — full reference for Codex's Warp integration, including notification setup -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) — all supported agents and Warp's universal agent features +* [Codex in Warp (docs)](/agents/cli-agents/codex/) — full reference for Codex's Warp integration, including notification setup +* [Third-party CLI agents](/agents/cli-agents/overview/) — all supported agents and Warp's universal agent features diff --git a/src/content/docs/guides/external-tools/how-to-set-up-gemini-cli.mdx b/src/content/docs/guides/external-tools/how-to-set-up-gemini-cli.mdx index c54f4ef25..c2b557574 100644 --- a/src/content/docs/guides/external-tools/how-to-set-up-gemini-cli.mdx +++ b/src/content/docs/guides/external-tools/how-to-set-up-gemini-cli.mdx @@ -135,8 +135,8 @@ Gemini CLI does not currently support agent notifications in Warp. You won't rec ## Productivity tips -* **Use voice to prompt Gemini CLI** — Dictate complex instructions instead of typing them. Warp supports [voice transcription](/agent-platform/local-agents/interacting-with-agents/voice/) that works with any CLI agent, including Gemini CLI. -* **Attach images as context** — Paste screenshots of bugs, designs, or error messages into your prompt. Warp's [images as context](/agent-platform/local-agents/agent-context/images-as-context/) feature lets Gemini CLI see what you see. +* **Use voice to prompt Gemini CLI** — Dictate complex instructions instead of typing them. Warp supports [voice transcription](/agents/local-agents/interacting-with-agents/voice/) that works with any CLI agent, including Gemini CLI. +* **Attach images as context** — Paste screenshots of bugs, designs, or error messages into your prompt. Warp's [images as context](/agents/local-agents/agent-context/images-as-context/) feature lets Gemini CLI see what you see. * **Review diffs visually** — After Gemini CLI makes changes, open Warp's [Code Review panel](/code/code-review/) (`⌘+Shift++`) to see a visual diff. You can leave inline comments and send them back to Gemini CLI for corrections. * **Run Gemini CLI alongside other agents** — Use [vertical tabs](/terminal/windows/vertical-tabs/) to run Gemini CLI and Claude Code or Codex side by side on the same task. Compare their approaches and pick the best output. * **Compose richer prompts** — Press `Ctrl+G` to open Warp's rich input editor for Gemini CLI, giving you a full text editor experience instead of raw CLI input. @@ -153,5 +153,5 @@ Explore related guides and features: * [Set up Ollama for local models](/guides/external-tools/how-to-set-up-ollama/) to pair Gemini CLI with local model workflows * [Code Review panel](/code/code-review/) — review and refine agent-generated code * [Gemini CLI in Warp](https://www.warp.dev/agents/gemini-cli) — overview of Gemini CLI support in Warp -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) — all supported agents and Warp's universal agent features +* [Third-party CLI agents](/agents/cli-agents/overview/) — all supported agents and Warp's universal agent features * [Gemini CLI documentation](https://github.com/google-gemini/gemini-cli) — Google's official reference diff --git a/src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx b/src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx index ca8357089..3fd72e513 100644 --- a/src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx +++ b/src/content/docs/guides/external-tools/how-to-set-up-ollama.mdx @@ -177,7 +177,7 @@ Ollama also provides official native libraries if you prefer an SDK built specif Open your app's code in Warp. Ask Warp's agent to locate the OpenAI client initialization, swap in the new values, and test the connection from the same terminal session. :::note -The `http://localhost:11434/v1/` base URL works for code running on the same machine as Ollama. To use Ollama as the inference backend for Warp's own agent, the endpoint must be reachable at a public URL. Run `ngrok http 11434` and use the resulting HTTPS URL in Warp's [Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/) settings. +The `http://localhost:11434/v1/` base URL works for code running on the same machine as Ollama. To use Ollama as the inference backend for Warp's own agent, the endpoint must be reachable at a public URL. Run `ngrok http 11434` and use the resulting HTTPS URL in Warp's [Custom inference endpoint](/agents/inference/custom-inference-endpoint/) settings. ::: ## 6. Customize model behavior @@ -219,7 +219,7 @@ Your custom model is saved locally and available any time you run `ollama run co Next, explore related guides and features: -- [Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/) — connect Warp's agent to your local Ollama instance for a fully local, no-API-cost agent workflow +- [Custom inference endpoint](/agents/inference/custom-inference-endpoint/) — connect Warp's agent to your local Ollama instance for a fully local, no-API-cost agent workflow - [Run multiple agents at once](/guides/agent-workflows/how-to-run-multiple-ai-coding-agents/) — run Ollama and a cloud agent in parallel to compare outputs on the same task - [Ollama model library](https://ollama.com/library) — browse all available models with size and capability details - [Ollama documentation](https://github.com/ollama/ollama/blob/main/README.md) — advanced configuration, GPU setup, and environment variables diff --git a/src/content/docs/guides/external-tools/how-to-set-up-opencode.mdx b/src/content/docs/guides/external-tools/how-to-set-up-opencode.mdx index dffba9de8..839c2da81 100644 --- a/src/content/docs/guides/external-tools/how-to-set-up-opencode.mdx +++ b/src/content/docs/guides/external-tools/how-to-set-up-opencode.mdx @@ -114,12 +114,12 @@ Commit the `AGENTS.md` file to Git so your team shares the same project context. Warp supports agent notifications for OpenCode through a plugin. If the plugin isn't installed, Warp displays an installation chip in the terminal when you run OpenCode, with setup steps you can follow directly. -For manual installation and configuration, see [OpenCode in Warp (docs)](/agent-platform/cli-agents/opencode/#setting-up-notifications). +For manual installation and configuration, see [OpenCode in Warp (docs)](/agents/cli-agents/opencode/#setting-up-notifications). ## Productivity tips -* **Use voice to prompt OpenCode** — Dictate complex instructions instead of typing them. Warp supports [voice transcription](/agent-platform/local-agents/interacting-with-agents/voice/) that works with any CLI agent, including OpenCode. -* **Attach images as context** — Paste screenshots of bugs, designs, or error messages into your prompt. Warp's [images as context](/agent-platform/local-agents/agent-context/images-as-context/) feature lets OpenCode see what you see. +* **Use voice to prompt OpenCode** — Dictate complex instructions instead of typing them. Warp supports [voice transcription](/agents/local-agents/interacting-with-agents/voice/) that works with any CLI agent, including OpenCode. +* **Attach images as context** — Paste screenshots of bugs, designs, or error messages into your prompt. Warp's [images as context](/agents/local-agents/agent-context/images-as-context/) feature lets OpenCode see what you see. * **Review diffs visually** — After OpenCode makes changes, open Warp's [Code Review panel](/code/code-review/) (`⌘+Shift++`) to see a visual diff. You can leave inline comments and send them back to OpenCode for corrections. * **Run OpenCode alongside other agents** — Use [vertical tabs](/terminal/windows/vertical-tabs/) to run OpenCode and Claude Code or Codex side by side on the same task. Compare their approaches and pick the best output. * **Compose richer prompts** — Press `Ctrl+G` to open Warp's rich input editor for OpenCode, giving you a full text editor experience instead of raw CLI input. @@ -135,7 +135,7 @@ Explore related guides and features: * [Set up Ollama for local models](/guides/external-tools/how-to-set-up-ollama/) to run OpenCode with local models * [Code Review panel](/code/code-review/) — review and refine agent-generated code * [OpenCode in Warp](https://www.warp.dev/agents/opencode) — overview of OpenCode support in Warp -* [OpenCode in Warp (docs)](/agent-platform/cli-agents/opencode/) — full reference for OpenCode's Warp integration, including notification setup -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) — all supported agents and Warp's universal agent features +* [OpenCode in Warp (docs)](/agents/cli-agents/opencode/) — full reference for OpenCode's Warp integration, including notification setup +* [Third-party CLI agents](/agents/cli-agents/overview/) — all supported agents and Warp's universal agent features * [OpenCode documentation](https://opencode.ai/docs) — official reference * [opencode-warp plugin](https://github.com/warpdotdev/opencode-warp) — notification plugin source and updates diff --git a/src/content/docs/guides/external-tools/linear-mcp-retrieve-issue-data.mdx b/src/content/docs/guides/external-tools/linear-mcp-retrieve-issue-data.mdx index 345b0fded..1a813d6f1 100644 --- a/src/content/docs/guides/external-tools/linear-mcp-retrieve-issue-data.mdx +++ b/src/content/docs/guides/external-tools/linear-mcp-retrieve-issue-data.mdx @@ -35,7 +35,7 @@ This tutorial covers how to: { "linear": { "command": "npx", - "args": ["-y", "mcp-remote", "https://mcp.linear.app/sse"], + "args": ["-y", "mcp-remote", "https://mcp.linear.app/mcp"], "env": {}, "working_directory": null } 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 e8c665a7a..51a774f9a 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 @@ -10,6 +10,7 @@ tags: featured: true --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; <VideoEmbed url="https://www.youtube.com/watch?v=8vn2brhJrF8" title="Using MCP servers with Warp agents video" /> @@ -18,7 +19,7 @@ MCP servers let Warp agents use external tools and data sources through a standa Warp supports MCP in two places: * **Local agents in the Warp app** use MCP servers configured in **Settings** > **Agents** > **MCP servers**, Warp Drive, or file-based config. -* **Cloud agents** use MCP servers passed through the Oz CLI, agent config files, or Warp-shared MCP server UUIDs. +* **Cloud agents** use MCP servers passed through the {VARS.WARP_AGENT_CLI}, agent config files, or Warp-shared MCP server UUIDs. Use this guide to choose the right setup path, then jump to the source docs for exact configuration syntax. @@ -26,8 +27,8 @@ Use this guide to choose the right setup path, then jump to the source docs for | Workflow | Use it when | Configure MCP with | Source docs | | -------- | ----------- | ------------------ | ----------- | -| 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)](/agent-platform/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](/agent-platform/capabilities/mcp/#file-based-mcp-servers) | +| 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/) | @@ -43,9 +44,9 @@ Example workflow: 2. Start a local agent conversation in the repo. 3. Ask the agent to fetch the issue, inspect linked context, and make a plan. 4. Review changes in the [Code Review panel](/code/code-review/). -5. Use [Agent Session Sharing](/agent-platform/local-agents/session-sharing/) if teammates need to inspect the agent context. +5. Use [Agent Session Sharing](/agents/local-agents/session-sharing/) if teammates need to inspect the agent context. -For setup details, see [Model Context Protocol (MCP)](/agent-platform/capabilities/mcp/). +For setup details, see [Model Context Protocol (MCP)](/agents/capabilities/mcp/). ### Give cloud agents access to developer tools @@ -56,8 +57,8 @@ Example workflow: 1. Create or identify the MCP server the cloud agent should use. 2. Store required credentials as [Agent Secrets](/platform/secrets/) instead of hardcoding tokens in config files. 3. Attach the MCP server with `--mcp`, a config file, or a Warp-shared MCP UUID. -4. Run the cloud agent from the Oz CLI, Slack, Linear, GitHub Actions, a schedule, or the API. -5. Inspect the run in the [Oz web app](/platform/oz-web-app/) or [Cloud agent session sharing](/platform/viewing-cloud-agent-runs/). +4. Run the cloud agent from the {VARS.WARP_AGENT_CLI}, Slack, Linear, GitHub Actions, a schedule, or the API. +5. Inspect the run in the [{VARS.WEB_APP}](/platform/oz-web-app/) or [Cloud agent session sharing](/platform/viewing-cloud-agent-runs/). For schema and cloud-specific limitations, see [MCP Servers for cloud agents](/platform/mcp/). @@ -67,7 +68,7 @@ Use shared MCP servers when multiple teammates or workflows need the same tool c For local agents, share the server from the MCP settings page. Warp scrubs sensitive environment values and prompts teammates to provide their own values when they install it. -For cloud agents, reference a Warp-shared MCP server by UUID with the Oz CLI: +For cloud agents, reference a Warp-shared MCP server by UUID with the {VARS.WARP_AGENT_CLI}: ```sh oz mcp list @@ -118,7 +119,7 @@ Warp supports MCP servers for many developer tools, including: * **Notion** - Retrieve docs, specs, and project notes. * **Internal tools** - Expose your own APIs through a custom MCP server. -For example configurations and demos, see the MCP server examples in [Model Context Protocol (MCP)](/agent-platform/capabilities/mcp/#mcp-server-configuration-examples) and the [MCP guides listed on the Guides page](/guides/). +For example configurations and demos, see the MCP server examples in [Model Context Protocol (MCP)](/agents/capabilities/mcp/#mcp-server-configuration-examples) and the [MCP guides listed on the Guides page](/guides/). ## Security checklist @@ -133,7 +134,7 @@ Before giving an agent tool access through MCP: ## Next steps -* [Model Context Protocol (MCP)](/agent-platform/capabilities/mcp/) - Configure MCP servers for local agents in the Warp app. +* [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. * [Agent Secrets](/platform/secrets/) - Store credentials for cloud agent runs. \ No newline at end of file diff --git a/src/content/docs/guides/getting-started/how-to-customize-warps-appearance.mdx b/src/content/docs/guides/getting-started/how-to-customize-warps-appearance.mdx index e93284c03..dde1606ac 100644 --- a/src/content/docs/guides/getting-started/how-to-customize-warps-appearance.mdx +++ b/src/content/docs/guides/getting-started/how-to-customize-warps-appearance.mdx @@ -44,7 +44,7 @@ Warp’s **input bar** can live in three different positions: ### 3. Managing AI & agent settings -Open **Settings** > **Agents** > **Oz** to control: +Open **Settings** > **Agents** > **Warp Agent** to control: * Which **model** Warp uses (e.g., Claude 3.5 for code generation, GPT-4o for planning). * How much **autonomy** agents have for: diff --git a/src/content/docs/guides/index.mdx b/src/content/docs/guides/index.mdx index 65b3f41fe..0ab75173f 100644 --- a/src/content/docs/guides/index.mdx +++ b/src/content/docs/guides/index.mdx @@ -10,6 +10,8 @@ import GuidesLanding from '@components/GuidesLanding.astro'; Practical, task-oriented walkthroughs that help you get productive with Warp's coding agents. Each guide walks through a real AI coding workflow with actual prompts, code, and reproducible results. +To turn a one-off workflow into a repeatable process run by a team of cloud agents, see [Warp Factories](/factories/). + :::note **New to Warp?** Start with [Welcome to Warp](/guides/getting-started/welcome-to-warp/), then explore [10 Warp Coding Features You Should Know](/guides/getting-started/10-coding-features-you-should-know/). ::: diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index d505a68a6..8565714d8 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -1,18 +1,19 @@ --- -title: Getting started with Warp and Oz +title: Getting started with Warp description: >- - Get started with Warp, the Agentic Development Environment, and Oz, the - orchestration platform for cloud agents. + Get started with Warp, the Agentic Development Environment, and the + {{WARP_AUTOMATION_PLATFORM}}, which orchestrates cloud agents at scale. sidebar: - label: Getting started with Warp and Oz + label: Getting started with Warp --- +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. Warp's agents are powered by **Oz**, the orchestration platform for running agents locally or in the cloud at scale. +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> -![Warp, the Agentic Development Environment: Warp (a modern terminal built for coding with agents) and Oz (the orchestration platform for cloud agents)](../../assets/terminal/warp-oz-welcome.png) -<figcaption>Warp terminal with Oz orchestration.</figcaption> +![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> --- @@ -23,35 +24,39 @@ Warp is where you work — a fast, modern terminal built for coding with agents. **Key capabilities:** -* [**Terminal and Agent modes**](/agent-platform/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. +* [**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**](/agent-platform/cli-agents/overview/): Run third-party CLI agents like Claude Code, Codex, and OpenCode with Warp's agent toolbelt — rich input, code review, notifications, and more. +* [**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" /> --- -## Oz: The orchestration platform for cloud agents +## Three ways to use the Warp Agent -Oz is the orchestration platform for cloud agents that powers all of Warp's intelligent features. Oz is designed to coordinate agents at scale—understanding your codebase, executing tasks autonomously, and adapting to your workflows. Oz is multi-model by design, giving you flexibility to choose the best LLM for each task. +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. -Oz operates in two modes: +### In the Warp app -### Local agents - -Run directly in the Warp app for real-time, interactive coding assistance. +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 -Local agents keep you in control. You can review changes, steer the agent mid-task, and approve actions before they execute. +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 -→ [Get started with local agents](/agent-platform/local-agents/overview/) +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. -### Cloud agents +→ [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. @@ -64,28 +69,42 @@ Cloud agents are ideal for work that doesn't need your immediate attention, like → [Learn about cloud agents](/platform/) +### The platform behind them + +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. + +→ [Learn about the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) + +--- + +## 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) + --- ## How they work together -Warp and Oz provide a unified experience across local and cloud development: +Warp and the {VARS.WARP_AUTOMATION_PLATFORM} provide a unified experience across local and cloud development: -* **Same agent, anywhere**: Whether you're working interactively in Warp or running agents in the cloud, you're using the same underlying agent capabilities. +* **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](/agent-platform/capabilities/rules/), and [MCP servers](/agent-platform/capabilities/mcp/) work across both local and cloud agents, so your team's knowledge and tools are always available. +* **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. --- ## Multi-model support -Oz is multi-model by design. You can [choose your preferred LLM](/agent-platform/inference/model-choice/) from a curated set of top models. +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. --- ## 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 Oz. +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. @@ -104,6 +123,7 @@ Warp's AI features can be globally disabled in **Settings** > **Agents** > **War ## Next steps * [**Quickstart**](/quickstart/): Get Warp installed and start coding -* [**Warp Agents overview**](/agent-platform/local-agents/overview/): Explore all AI features available in Warp +* [**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 -* [**Oz Platform**](/platform/overview/): Learn about the CLI, API, SDK, and infrastructure +* [**{VARS.WARP_AUTOMATION_PLATFORM}**](/platform/overview/): Learn about the CLI, API, SDK, and infrastructure diff --git a/src/content/docs/knowledge-and-collaboration/session-sharing/index.mdx b/src/content/docs/knowledge-and-collaboration/session-sharing/index.mdx index 3a0b1d0e2..8ca5a1d62 100644 --- a/src/content/docs/knowledge-and-collaboration/session-sharing/index.mdx +++ b/src/content/docs/knowledge-and-collaboration/session-sharing/index.mdx @@ -4,8 +4,9 @@ description: >- Share terminal sessions with teammates for collaboration, debugging, and knowledge sharing. --- +import { VARS } from '@data/vars'; -Session sharing documentation has moved to the Agent Platform section. See the articles below for details on sharing sessions: +Session sharing documentation has moved. See the articles below for details on sharing sessions: -* **[Agent Session Sharing](/agent-platform/local-agents/session-sharing/)** - Share agent sessions with your team for review and collaboration. -* **[Viewing Cloud Agent Runs](/platform/viewing-cloud-agent-runs/)** - Share session context from cloud agent runs. +* **[Agent session sharing](/agents/local-agents/session-sharing/)** - Share agent sessions with your team for review and collaboration, on the Agents tab. +* **[Cloud agent session sharing](/platform/viewing-cloud-agent-runs/)** - Share session context from cloud agent runs, on the {VARS.WARP_AUTOMATION_PLATFORM} tab. diff --git a/src/content/docs/knowledge-and-collaboration/teams.mdx b/src/content/docs/knowledge-and-collaboration/teams.mdx index 11f42afaa..45d2d5229 100644 --- a/src/content/docs/knowledge-and-collaboration/teams.mdx +++ b/src/content/docs/knowledge-and-collaboration/teams.mdx @@ -41,7 +41,7 @@ Under **Settings** > **Teams** you can copy the invite link for your Warp team a :::caution If you’re on a paid plan, upgrading will automatically include all team members in your billing. Adding new members after upgrading will also add them as paid seats. -For more details on how team member billing works, please see our [billing FAQs](/support-and-community/plans-and-billing/pricing-faqs/#what-counts-as-a-team-member-and-how-does-billing-work-for-members). +For more details on how team member billing works, see our [billing FAQs](/support-and-community/plans-and-billing/pricing-faqs/#what-counts-as-a-team-member-and-how-does-billing-work-for-members). ::: <figure> @@ -49,11 +49,11 @@ For more details on how team member billing works, please see our [billing FAQs] <figcaption>Teams settings panel.</figcaption> </figure> -When you share this link with your teammates directly (we suggest using a secure channel like Slack or email), they will be able to join your team in Warp. +When you share this link with your teammates directly (we suggest using a secure channel like Slack or email), they can join your team in Warp. ## Restricting team invites by domain -Sometimes you may want to control your team so that people can only join if they also authenticate with a specific email domain, such as your company’s email domain. +You can restrict your team so that people can only join if they also authenticate with a specific email domain, such as your company’s email domain. Toggle on **Restrict by domain** to set an explicit allowlist. @@ -94,7 +94,7 @@ Team admins can transfer their role to another team member by going to **Setting ## Team roles and permissions :::caution -If you're a Team admin, and you choose to [delete your Warp](/support-and-community/privacy-and-security/privacy/#manage-your-data) account, the deletion flow will require that you assign a team member as the new admin. +If you're a Team admin, and you choose to [delete your Warp](/support-and-community/privacy-and-security/privacy/#delete-your-account-and-data) account, the deletion flow will require that you assign a team member as the new admin. ::: | Action | Admin | Member | @@ -107,4 +107,4 @@ If you're a Team admin, and you choose to [delete your Warp](/support-and-commun | Leave a team | | ✓ | | Delete a team | ✓ | | | Transfer admin | ✓ | | -| [Manage billing](/support-and-community/plans-and-billing/plans-pricing-refunds/) | ✓ | | +| [Manage billing](/support-and-community/plans-and-billing/pricing-faqs/#how-do-i-manage-my-billing) | ✓ | | diff --git a/src/content/docs/knowledge-and-collaboration/warp-drive/agent-mode-context.mdx b/src/content/docs/knowledge-and-collaboration/warp-drive/agent-mode-context.mdx index 247cc7f3d..df57055ab 100644 --- a/src/content/docs/knowledge-and-collaboration/warp-drive/agent-mode-context.mdx +++ b/src/content/docs/knowledge-and-collaboration/warp-drive/agent-mode-context.mdx @@ -16,8 +16,8 @@ Agents can automatically pull in relevant context from: * **Workflows** - Saved commands and scripts * **Notebooks** - Documentation and notes * **Environment Variables** - Configuration values -* **Rules** - Guidelines that shape agent behavior (see [Rules](/agent-platform/capabilities/rules/)) -* **MCP Servers** - External tools and data sources (see [MCP](/agent-platform/capabilities/mcp/)) +* **Rules** - Guidelines that shape agent behavior (see [Rules](/agents/capabilities/rules/)) +* **MCP Servers** - External tools and data sources (see [MCP](/agents/capabilities/mcp/)) When a Warp Drive object is pulled as context, it will be displayed in the conversation as a citation under "References" or "Derived from". diff --git a/src/content/docs/knowledge-and-collaboration/warp-drive/ai-objects.mdx b/src/content/docs/knowledge-and-collaboration/warp-drive/ai-objects.mdx index 9d2424188..f75183657 100644 --- a/src/content/docs/knowledge-and-collaboration/warp-drive/ai-objects.mdx +++ b/src/content/docs/knowledge-and-collaboration/warp-drive/ai-objects.mdx @@ -19,7 +19,7 @@ Warp supports two types of rules: * **Project Rules** - Live in your codebase (as `AGENTS.md` or `WARP.md` files) and apply automatically when working within that project :::note -For complete documentation on creating and managing rules, see [Rules](/agent-platform/capabilities/rules/). +For complete documentation on creating and managing rules, see [Rules](/agents/capabilities/rules/). ::: ## MCP Servers @@ -34,7 +34,7 @@ MCP servers can be: * **URL-based** - Remote endpoints using Streamable HTTP or SSE :::note -For complete documentation on configuring and using MCP servers, see [Model Context Protocol (MCP)](/agent-platform/capabilities/mcp/). +For complete documentation on configuring and using MCP servers, see [Model Context Protocol (MCP)](/agents/capabilities/mcp/). ::: ## Skills @@ -47,7 +47,7 @@ Skills are file-based (stored as `SKILL.md` files in your project or home direct * **Global Skills** - Live in `~/.agents/skills/` or similar directories in your home folder :::note -For complete documentation on creating and using skills, see [Skills](/agent-platform/capabilities/skills/). +For complete documentation on creating and using skills, see [Skills](/agents/capabilities/skills/). ::: ## Prompts @@ -77,8 +77,8 @@ For more details on how Warp Drive content serves as agent context, see [Warp Dr ## Related -* [Rules](/agent-platform/capabilities/rules/) - Create guidelines for agent behavior -* [MCP Servers](/agent-platform/capabilities/mcp/) - Connect external tools and data sources -* [Skills](/agent-platform/capabilities/skills/) - Define reusable task workflows +* [Rules](/agents/capabilities/rules/) - Create guidelines for agent behavior +* [MCP Servers](/agents/capabilities/mcp/) - Connect external tools and data sources +* [Skills](/agents/capabilities/skills/) - Define reusable task workflows * [Prompts](/knowledge-and-collaboration/warp-drive/prompts/) - Save and reuse parameterized agent prompts -* [Agent Profiles & Permissions](/agent-platform/capabilities/agent-profiles-permissions/) - Control agent autonomy and tool access +* [Agent Profiles & Permissions](/agents/capabilities/agent-profiles-permissions/) - Control agent autonomy and tool access diff --git a/src/content/docs/knowledge-and-collaboration/warp-drive/environment-variables.mdx b/src/content/docs/knowledge-and-collaboration/warp-drive/environment-variables.mdx index 260ec7424..563bb3822 100644 --- a/src/content/docs/knowledge-and-collaboration/warp-drive/environment-variables.mdx +++ b/src/content/docs/knowledge-and-collaboration/warp-drive/environment-variables.mdx @@ -41,7 +41,7 @@ After you save the environment variable, you can click it to load it into your t When you use static variables, Warp stores them securely in Warp Drive.\ \ -Note: Static variables should not be used to replace a secret manager. Please use dynamic variables for any sensitive information. +Note: Static variables should not be used to replace a secret manager. Use dynamic variables for any sensitive information. ### Dynamic variables @@ -65,7 +65,7 @@ To create a new dynamic variable: #### Integrated password managers -Before you get started, please ensure you have the CLI installed for your tool of choice and follow the instructions to enable the CLI: +Before you get started, ensure you have the CLI installed for your tool of choice and follow the instructions to enable the CLI: * [1Password CLI](https://developer.1password.com/docs/cli/get-started/) * [LastPass CLI](https://github.com/lastpass/lastpass-cli) @@ -80,14 +80,12 @@ The CLI will require you to authenticate and then provide you with a list of ava Selecting a secret name never stores the actual secret. Warp uses your selection to generate a command that dynamically pulls in your selected secret at runtime. ::: -![Selecting a secret name from the password manager CLI's available list of secrets.](https://lh7-rt.googleusercontent.com/docsz/AD_4nXcqiazhpRvaHxxSW5n3Ql6nFRDDRkyVdlRB9E-Q6HE0lpL2KFgwLM1P1PPrJG_i0KIHWuEKp2PMFq4T1auWvQOxXrpuERpLRZG1h2V4DDYmNRZRqShxjPzWyqGR2VfXYNhttAK0HT2-aQNjAt3xdCA9MwE?key=q_xMyXgvJVA02ysqZAH4Jw) - ### How to write a custom secret command Reference the documentation for your external secret manager. Then, write a custom command to retrieve secrets. :::note -Your custom command should return the exact string you want loaded into your environment. Please make sure that you are selecting the exact field you want loaded as many secret manager CLIs provide additional formatting by default. +Your custom command should return the exact string you want loaded into your environment. Make sure you select the exact field you want loaded, as many secret manager CLIs provide additional formatting by default. ::: For example, you can write a command using the [Hashicorp Vault CLI](https://developer.hashicorp.com/vault/docs/commands) to retrieve and load the password field for the staging server. When using secret commands, Warp stores the command but never the actual secrets. The secrets are referenced and loaded into a terminal session at runtime. @@ -96,8 +94,6 @@ For example, you can write a command using the [Hashicorp Vault CLI](https://dev // vault kv get -field=password secret/staging/app/server/creds ``` -![Custom command using the Hashicorp Vault CLI to retrieve a password field at runtime.](https://lh7-rt.googleusercontent.com/docsz/AD_4nXcltckpSwesjA1O84nzZhUKc0Wuie0OH3iN6g0WPBojhtY5pckPSZgOZxqIjiV12ppe9t0jtF9z2Yf7d-fIZJhSu8-tLIT8CoG_Xh_NvCzFbrJgD5FA2ounNtHurq9nDLALiOekjPeVoru-FzeYOWkfm9PN?key=q_xMyXgvJVA02ysqZAH4Jw) - ### Using environment variables There are three ways to invoke your environment variables and load them into a terminal session: @@ -124,10 +120,6 @@ To load environment variables into a subshell, you will need to open [Warp Drive Loading an environment into a subshell reduces the risk of your environment variables accidentally contaminating your workspace. The subshell is clearly defined and once you exit it, any environment variables set by Warp Environment Variables will be cleared, unless they are already present in the parent session. -![Selecting Load in subshell from an environment variable's overflow menu in Warp Drive.](https://lh7-rt.googleusercontent.com/docsz/AD_4nXeqhj2saz5AJTYUCx-PClwCLX421mKEzXelcnnkeHkqvDexelvBDmPpESHOmV_SjAOEuLKk8YgYaIodX-cOuXm1Nm05wUU88zcIv3otd1HRvXO455EiKEfs5tTB5ft9OoW7qxMK9BV1OPAVIc9AhMqsgweK?key=q_xMyXgvJVA02ysqZAH4Jw) - -![Environment variables loaded into a subshell, isolated from the parent terminal session.](https://lh7-rt.googleusercontent.com/docsz/AD_4nXeeXyJEMxJV2DpOBJS7pKOEpBSm6aypAIKd4ygJKT13opDBxeS5k0S5NtM8Cr_Z_lafyj-cn1T-hJ-93AkZhpWTrbvYHYIRs96_V7dr3mfiM3lPx6-kMS_eLjINPHIr6Ex0NaMr-TRCkNQ1fdVv8cApJ0QJ?key=q_xMyXgvJVA02ysqZAH4Jw) - #### Select to load with a workflow Any time you run a workflow, you can select from existing environment variables. This allows you to dynamically inject environment variables into a parameterized workflow so you can use a single workflow command in multiple environments, such as production and staging. @@ -136,8 +128,6 @@ For example, you may have a workflow to create a new team that uses the environm These environment variables will now be present for the remainder of your session until you clear them or overwrite them with a different environment. -![Selecting environment variables from the dropdown when running a parameterized workflow.](https://lh7-rt.googleusercontent.com/docsz/AD_4nXcuOxH8UeVLSvWRpZwvdoVBgbpFhb2rXKbDw2CnZ5BQCTWSgzjwERe-fzKLEYBQZGKzjV-Pdd_z6tB9BTSWYos9ADRaDbChskSg-MZpjaKme0kG8UwWsJ2HBJk7iBu4SKbGZCobZy0uD2nFkrNoVjNZEEOW?key=q_xMyXgvJVA02ysqZAH4Jw) - ### Import and export environment variables in Warp Drive -Please see our [Warp Drive Import and Export](/knowledge-and-collaboration/warp-drive/#import-and-export) instructions. +See our [Warp Drive Import and Export](/knowledge-and-collaboration/warp-drive/#import-and-export) instructions. diff --git a/src/content/docs/knowledge-and-collaboration/warp-drive/notebooks.mdx b/src/content/docs/knowledge-and-collaboration/warp-drive/notebooks.mdx index 8738e2d26..143133b21 100644 --- a/src/content/docs/knowledge-and-collaboration/warp-drive/notebooks.mdx +++ b/src/content/docs/knowledge-and-collaboration/warp-drive/notebooks.mdx @@ -173,4 +173,4 @@ Only one editor is allowed at a given time. Opening the notebook while there is ### Import and export notebooks in Warp Drive -Please see our [Warp Drive Import and Export](/knowledge-and-collaboration/warp-drive/#import-and-export) instructions. +See our [Warp Drive Import and Export](/knowledge-and-collaboration/warp-drive/#import-and-export) instructions. diff --git a/src/content/docs/knowledge-and-collaboration/warp-drive/prompts.mdx b/src/content/docs/knowledge-and-collaboration/warp-drive/prompts.mdx index bc4096fc4..1fca49220 100644 --- a/src/content/docs/knowledge-and-collaboration/warp-drive/prompts.mdx +++ b/src/content/docs/knowledge-and-collaboration/warp-drive/prompts.mdx @@ -11,7 +11,7 @@ Prompts are parameterized natural language queries you can save in Warp Drive an ## What is a prompt? -A prompt is a parameterized natural language query you can name and save in Warp to use with [Agent Mode](/agent-platform/local-agents/interacting-with-agents/). +A prompt is a parameterized natural language query you can name and save in Warp to use with [Agent Mode](/agents/local-agents/interacting-with-agents/). Prompts are searchable and easily accessed from the [Command Palette](/terminal/command-palette/) so you can find and execute them without switching context. They allow you to save and reuse specific and complex AI workflows, making it easier to repeat multi-step tasks with Agent Mode. @@ -59,7 +59,7 @@ Arguments can be one of two types: text or enum. By default, all new arguments a Enums allow you to specify expected inputs to a prompt argument. When you insert a prompt with enums into the input editor, you will be prompted with suggestions for filling in the argument. You can open the suggestions menu by pressing `SHIFT-TAB` while selecting an argument. -For detailed information about creating and using enum type arguments, please see the [Enum type arguments section in Workflows documentation](/knowledge-and-collaboration/warp-drive/workflows/#enum-type-arguments). +For detailed information about creating and using enum type arguments, see the [Enum type arguments section in Workflows documentation](/knowledge-and-collaboration/warp-drive/workflows/#enum-type-arguments). ### Editing prompts with a team @@ -91,4 +91,4 @@ You can make any adjustments you need to the arguments before running the prompt ### Import and export prompts in Warp Drive -Please see our [Warp Drive Import and Export](/knowledge-and-collaboration/warp-drive/#import-and-export) instructions. +See our [Warp Drive Import and Export](/knowledge-and-collaboration/warp-drive/#import-and-export) instructions. diff --git a/src/content/docs/knowledge-and-collaboration/warp-drive/web.mdx b/src/content/docs/knowledge-and-collaboration/warp-drive/web.mdx index ff5aecc2b..800ac10ba 100644 --- a/src/content/docs/knowledge-and-collaboration/warp-drive/web.mdx +++ b/src/content/docs/knowledge-and-collaboration/warp-drive/web.mdx @@ -22,7 +22,7 @@ Warp's web-based viewing experience can currently be accessed via: * The [Warp web app homepage](https://app.warp.dev/app) * [Drive Object](/knowledge-and-collaboration/warp-drive/#sharing-your-drive-objects) Links -* [Session Sharing](/knowledge-and-collaboration/session-sharing/#how-to-allow-access-to-collaborators-in-your-session) Links +* [Session Sharing](/agents/local-agents/session-sharing/#who-can-access-a-shared-session) Links :::caution You can edit and view web-based objects and sessions as normal. The one exception is executing a command from a workflow or notebook since there is no shell session running on the web. @@ -35,14 +35,14 @@ If the Warp app is installed, links will open on the desktop by default. You can :::note The desktop option is only presented if Warp's web service is able to detect the Warp app installed locally. Warp desktop opens localhost port 9277 to accomplish this detection. This is done in a separate process that does not have access to your terminal contents.\ \ -If you would like to use Warp locally and do not have it installed, please visit our [installation guide.](/getting-started/quickstart/installation-and-setup/) +If you would like to use Warp locally and do not have it installed, see our [installation guide.](/getting-started/quickstart/installation-and-setup/) ::: 1. The first time you follow a link, if Warp is not installed, you will be prompted to download it. You can dismiss the popup to stay on the web. ![Popup prompting to download Warp Desktop when viewing a Drive object on the web](../../../../assets/terminal/wd-popup-message.png) -2. This preference can be changed at any point in **Settings** > **Features** > **General** > **Open links in desktop app** Note that this setting is only available while on the web-based version of Warp. +2. This preference can be changed at any point in **Settings** > **Features** > **General** > **Open links in desktop app**. Note that this setting is only available while on the web-based version of Warp. <figure> ![Setting managing how to open links](../../../../assets/terminal/wd-open-links-preference.png) diff --git a/src/content/docs/knowledge-and-collaboration/warp-drive/workflows.mdx b/src/content/docs/knowledge-and-collaboration/warp-drive/workflows.mdx index 4e85db2f3..5c4b00ab7 100644 --- a/src/content/docs/knowledge-and-collaboration/warp-drive/workflows.mdx +++ b/src/content/docs/knowledge-and-collaboration/warp-drive/workflows.mdx @@ -83,7 +83,7 @@ Once a workflow has been created, you can edit it at any time, as long as you ha #### AI autofill -Workflows also have the option to use an [agent](/agent-platform/local-agents/overview/) to automatically generate a title, descriptions, or parameters. +Workflows also have the option to use an [agent](/agents/) to automatically generate a title, descriptions, or parameters. * Create or edit a Workflow, in the edit view you should see the option to AutoFill. * Warp will fill in the fields based on the Workflow you're creating. @@ -135,4 +135,4 @@ If needed, you can continue to access your `.yaml` file workflows using [Command ### Import and export workflows in Warp Drive -Please see our [Warp Drive Import and Export](/knowledge-and-collaboration/warp-drive/#import-and-export) instructions. +See our [Warp Drive Import and Export](/knowledge-and-collaboration/warp-drive/#import-and-export) instructions. diff --git a/src/content/docs/platform/agents.mdx b/src/content/docs/platform/agents.mdx index b438cdee8..f0bd0cf38 100644 --- a/src/content/docs/platform/agents.mdx +++ b/src/content/docs/platform/agents.mdx @@ -1,15 +1,16 @@ --- -title: Cloud agents +title: Cloud agent accounts description: >- Cloud agents are how Warp runs scheduled jobs, integration triggers, CI/CD automation, and API-driven tasks against your team's environments. sidebar: label: "Agents" --- +import { VARS } from '@data/vars'; A **cloud agent** is an agent that runs in Warp's cloud (or on a self-hosted worker) instead of on your local machine. Use a cloud agent when you want to give an automation its own settings, secrets, skills, and permissions instead of having it act as a user on your team. -Every team starts with a default cloud agent, which is what runs when an automation triggers a task with no other configuration. You can optionally create additional cloud agents through the Oz web app's **Agents** page or the public API. See [Managing cloud agents](#managing-cloud-agents) below. +Every team starts with a default cloud agent, which is what runs when an automation triggers a task with no other configuration. You can optionally create additional cloud agents through the {VARS.WEB_APP}'s **Agents** page or the public API. See [Managing cloud agents](#managing-cloud-agents) below. ## How cloud agents get triggered @@ -17,10 +18,10 @@ 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 [Oz API](/reference/api-and-sdk/). -* **CLI** — `oz agent run-cloud` from a developer machine, CI pipeline, or self-hosted worker. See the [Oz CLI](/reference/cli/). +* **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/). -Each run is tracked in the [Oz dashboard](https://oz.warp.dev/runs) with its trigger source, the environment it ran in, and the full transcript. +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 @@ -32,7 +33,7 @@ In the CLI and REST API, a cloud agent is represented as a **service account**. ## Managing cloud agents -Use the [Oz web app's Agents page](/platform/oz-web-app/#agents) for day-to-day management. Use the public API when you need to create or update agents from scripts, CI/CD, or internal tooling. Full request and response formats, including error codes, live on the [API Reference](/api) page under the **agent** tag. +Use the [{VARS.WEB_APP}'s Agents page](/platform/oz-web-app/#agents) for day-to-day management. Use the public API when you need to create or update agents from scripts, CI/CD, or internal tooling. Full request and response formats, including error codes, live on the [API Reference](/api) page under the **agent** tag. | Action | Endpoint | What it does | | --- | --- | --- | @@ -56,17 +57,26 @@ When a team is over its plan limit (for example, after downgrading), the extra a ## Where cloud agents appear in the product -* **Agents page** - The Agents page in the [Oz web app](/platform/oz-web-app/) is where teams view, create, edit, and delete cloud agents. -* **Agent picker** - Forms that start a new run or schedule include an **Agent** dropdown. **Quick run** is the default (runs execute as the calling user); picking a cloud agent runs as the cloud agent instead. +* **Agents page** - The Agents page in the [{VARS.WEB_APP}](/platform/oz-web-app/) is where teams view, create, edit, and delete cloud agents. +* **Agent picker** - Forms that start a new run or schedule include an **Agent** dropdown. **Quick run** is the default: runs execute as the calling user, and pull requests are authored by that person. Picking a cloud agent runs as that agent instead, so with [team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization) configured, pull requests are authored by the **Warp Factories** GitHub App. Choose a cloud agent for any schedule that opens pull requests. See [Run identity and pull request authorship](/platform/triggers/scheduled-agents-quickstart/#run-identity-and-pull-request-authorship). * **Run filters and detail** - The Runs view lets you filter by cloud agent, and individual run detail pages show which agent executed the run. * **Admin Panel** - Billing usage in the [Admin Panel](/knowledge-and-collaboration/admin-panel/) attributes credits consumed by cloud agent runs to the team rather than to a person. +## Capabilities + +Cloud agents — and individual runs — can also be granted specific capabilities: + +* [**Skills as agents**](/platform/skills-as-agents/) - Attach a skill directly to a cloud agent, or pass one at run time, so the agent starts from a reusable, version-controlled prompt instead of an ad hoc one. +* [**MCP servers**](/platform/mcp/) - Connect a run to external tools and services (GitHub, dbt, Sentry, or a custom internal service) via Model Context Protocol. +* [**Secrets**](/platform/secrets/) - Store and inject credentials into cloud agent runs without exposing secret values, scoped to a team, a person, or a specific cloud agent. + ## Related pages * [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. -* [Oz API & SDK](/reference/api-and-sdk/) - Programmatic access to the cloud agent endpoints. +* [{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. -* [Oz web app](/platform/oz-web-app/) - Manage cloud agents and inspect their runs in the web UI. +* [{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/deployment-patterns.mdx b/src/content/docs/platform/deployment-patterns.mdx index 097fb2acb..8ee707406 100644 --- a/src/content/docs/platform/deployment-patterns.mdx +++ b/src/content/docs/platform/deployment-patterns.mdx @@ -2,117 +2,118 @@ title: Deployment patterns description: >- Common architectures for deploying cloud agents, including CLI-only, - Oz-hosted, and self-hosted execution patterns. + {{WARP_AUTOMATION_PLATFORM}}-hosted, and self-hosted execution patterns. 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. -#### Quick mental model +## Quick mental model Cloud agent setups usually have four moving parts: 1. **Trigger**: something happens (CI step, webhook, cron, Slack mention). -2. **Orchestration**: something decides what to run and tracks it (Oz orchestrator, GitHub Actions, your internal system). -3. **Execution**: where the agent actually runs (your runner, Oz-hosted environment, or self-hosted workers). -4. **Visibility**: how the team monitors and intervenes (Oz dashboard, session sharing, APIs). +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). --- -### Pattern 1: CLI-only agents (bring your own orchestrator) +## Pattern 1: CLI-only agents (bring your own orchestrator) 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 +### 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 +### 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 +### 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 +### 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 to monitor/steer runs. +* [Agent Session Sharing](/agents/local-agents/session-sharing/) to monitor/steer runs. * Read-only APIs for tracking and reporting. -* A path to “handoff” workflows (where a run can be continued or inspected in richer surfaces). +* A path to [Handoff](/platform/handoff/) workflows (where a run can be continued or inspected in richer surfaces). -#### Minimal setup checklist +### Minimal setup checklist * A Warp team * A [cloud agent](/platform/agents/) (recommended for automation) -* The Oz CLI installed on the runner / box +* The {VARS.WARP_AGENT_CLI} installed on the runner / box * Any needed credentials (often via secrets + environment variables) --- -### Pattern 2: Oz-hosted agents + Oz orchestration (managed cloud execution) +## Pattern 2: Warp-hosted agents and orchestration (managed cloud execution) -Use this when you want Oz to run agent workloads on Warp-managed infrastructure, typically inside reproducible Docker environments, with built-in lifecycle management. +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. ![Warp enterprise SaaS architecture showing customer infrastructure, isolated tenant sandboxes, Warp backend, and LLM providers](../../../assets/agent-platform/cloud-agents-infra.png) -#### What it looks like +### What it looks like * **Trigger**: first-party integrations, cron schedules, API/SDK calls, or on-demand commands -* **Orchestration**: Oz orchestrator -* **Execution**: Oz-hosted environments (Docker-based) -* **Visibility**: Oz dashboard + session sharing + APIs/SDKs +* **Orchestration**: {VARS.WARP_AUTOMATION_PLATFORM} orchestrator +* **Execution**: {VARS.WARP_AUTOMATION_PLATFORM}-hosted environments (Docker-based) +* **Visibility**: {VARS.DASHBOARD} + session sharing + APIs/SDKs -#### Why teams choose it +### 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. -#### Common ways to trigger +### Common ways to trigger * **First-party integrations (Slack, Linear, etc.)** that create tasks automatically from external events. -* **Scheduled agents** for recurring work (cron-like automation). +* **[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`. -#### Example recipe: daily dead-code cleanup +### Example recipe: daily dead-code cleanup -1. Define an Oz Environment with the repo + toolchain. -2. Create a schedule with a fixed prompt for cleanup. -3. Oz runs the agent on the cadence. -4. Your team monitors runs in the Oz dashboard, reviews artifacts (PRs, plans), and intervenes when needed. +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 +### Example recipe: crash triage via Sentry webhook -1. Define an Oz Environment with the target repo. +1. Define a Warp Environment with the target repo. 2. Register a Sentry webhook to your handler (server, cloud function, Zapier/n8n). -3. Handler extracts crash details, constructs a prompt, and calls the Oz orchestrator API/SDK to start a task. +3. Handler extracts crash details, constructs a prompt, and calls the {VARS.WARP_AUTOMATION_PLATFORM} orchestrator API/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) +### 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 +### 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). --- -### Pattern 3: Self-hosted execution +## Pattern 3: Self-hosted execution -Use this when you need to control where agent execution happens while still using Oz orchestration and visibility. Repositories are cloned and stored only on your infrastructure; orchestration metadata, session transcripts, and LLM inference route through Warp's backend under [ZDR](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr). +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. 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. @@ -122,7 +123,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](/platform/self-hosting/#managed-architecture)** — Oz orchestrates. You run the `oz-agent-worker` daemon; Oz 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. +* **[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. Why teams choose self-hosted execution: diff --git a/src/content/docs/platform/environments.mdx b/src/content/docs/platform/environments.mdx index 4a1a84c74..8d7521d6f 100644 --- a/src/content/docs/platform/environments.mdx +++ b/src/content/docs/platform/environments.mdx @@ -6,6 +6,7 @@ description: >- Environments ensure your cloud agents run with consistent toolchains across all triggers. Learn when to use environments and how to configure them. --- +import { VARS } from '@data/vars'; Environments ensure your [cloud agents](/platform/) run with the same toolchain and setup every time, regardless of where they're triggered from. @@ -29,7 +30,7 @@ Don't want to bring your own image? Warp provides [prebuilt dev images](https:// ## About environments -Environments define _how_ an agent runs, not _what_ it does. They're required for [Oz Platform](/platform/overview/) automation (cloud agents, integrations, API runs) but are not required for interactive local usage. +Environments define _how_ an agent runs, not _what_ it does. They're required for automation on the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) (cloud agents, integrations, API runs) but are not required for interactive local usage. An environment typically includes: @@ -49,14 +50,14 @@ Configuring runtime settings: What an environment is not: * Host – Hosts determine where execution happens (Warp-hosted vs. self-hosted infrastructure). -* [Agent Profile](/agent-platform/capabilities/agent-profiles-permissions/) – Profiles control agent behavior like permissions, model choice, and defaults, not the runtime environment. -* [Rules](/agent-platform/capabilities/rules/) – Rules determine agent responses and decisions but don't define the container or toolchain. +* [Agent Profile](/agents/capabilities/agent-profiles-permissions/) – Profiles control agent behavior like permissions, model choice, and defaults, not the runtime environment. +* [Rules](/agents/capabilities/rules/) – Rules determine agent responses and decisions but don't define the container or toolchain. * [MCP Servers](/platform/mcp/) – connect agents to external tools and data via MCP. * Per-run context – Trigger-specific data like Slack threads, PR metadata, or CI logs attach to individual tasks, not the environment configuration. -## How environments fit into the Oz Platform +## How environments fit into cloud agent runs -An environment is the runtime layer for automated Oz Platform runs. It defines the container image, repos, and setup steps used when a trigger kicks off an agent task. +An environment is the runtime layer for automated {VARS.WARP_AUTOMATION_PLATFORM} runs. It defines the container image, repos, and setup steps used when a trigger kicks off an agent task. Components in the execution flow: @@ -81,7 +82,7 @@ Host options: * **[Self-hosted](/platform/self-hosting/)** – You provide the infrastructure (runners in your cloud or network). Best for compliance requirements, on-premise execution, or custom hardware needs. * Local (coming soon) – Run environments on your local machine for sandbox development and testing. -The same environment can run on different hosts with identical behavior. For more details on hosting options, see [Deployment Patterns](/platform/deployment-patterns/) and [execution hosts](/platform/overview/#execution-hosts). +The same environment can run on different hosts with identical behavior. For more details on hosting options, see [Deployment Patterns](/platform/deployment-patterns/) and [hosts](/platform/overview/#hosts). ### What happens at runtime @@ -122,13 +123,13 @@ Choose an environment if any of the following apply: **Example:** -If your team tags @Oz in Slack to fix a failing CI job, an environment ensures every run uses the same Docker image, clones the same repos, and runs the same setup commands. +If your team tags @warp in Slack to fix a failing CI job, an environment ensures every run uses the same Docker image, clones the same repos, and runs the same setup commands. The fix the agent applies matches what runs in CI and what your teammates see when they review the PR. ### Where to configure environments -You can create environments in three ways: from the Oz web app, using the guided setup in Warp, or through the CLI. +You can create environments in three ways: from the {VARS.WEB_APP}, using the guided setup in Warp, or through the CLI. **Before you begin** @@ -146,15 +147,15 @@ Musl-based Docker images (such as Alpine Linux) are not supported. The agent run Create one environment per codebase, then reuse it across triggers like Slack, Linear, and CLI runs. ::: -### Create an environment from the Oz web app +### Create an environment from the web app <figure> ![Creating a new environment in the Oz Web App.](../../../assets/agent-platform/oz-web-app-new-environment.png) <figcaption>The Create environment panel in the Oz web app.</figcaption> </figure> -1. Open the [Environments page in the Oz web app](https://oz.warp.dev/environments) and click **New environment**. -2. Enter a name, select one or more repositories, and enter a **Docker image reference**. Click **Suggest** to have Oz recommend an image based on your repos, or start from one of [Warp's prebuilt dev images](https://github.com/warpdotdev/oz-dev-environments). +1. Open the <a href={`${VARS.WEB_APP_URL}/environments`}>Environments page in the {VARS.WEB_APP}</a> and click **New environment**. +2. Enter a name, select one or more repositories, and enter a **Docker image reference**. Click **Suggest** to have the {VARS.WARP_AUTOMATION_PLATFORM} recommend an image based on your repos, or start from one of [Warp's prebuilt dev images](https://github.com/warpdotdev/oz-dev-environments). 3. Optionally, add setup commands, configure cloud provider access (AWS or GCP), or add a description. 4. Click **Create environment**. @@ -216,7 +217,7 @@ Key flags: ## Managing environments -Once created, you can use the [Oz CLI](/reference/cli/) to inspect and update environments. +Once created, you can use the [{VARS.WARP_AGENT_CLI}](/reference/cli/) to inspect and update environments. **List environments** @@ -310,3 +311,10 @@ If your setup commands depend on secrets or credentials, configure them through * **Docker image incompatibility** – You see the error: "VM failed before the agent could run. This is likely an issue with your Docker image." * Possible cause: Alpine Linux and other musl-based images are not compatible with the agent runtime, which requires glibc. This can surface as [`environment_setup_failed`](/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/). * Solution: Switch to a glibc-based image such as Debian, Ubuntu, or the default (non-Alpine) variants of official Docker Hub images (e.g. `node`, `python`, `rust`). + +## Related pages + +* [Integrations overview](/platform/integrations/) - Connect environments to Slack, Linear, GitHub, and other triggers that start cloud agents. +* [Scheduled Agents](/platform/triggers/scheduled-agents/) - Run cloud agents on a cron schedule in a fixed environment. +* [Multi-agent orchestration](/platform/orchestration/) - Fan work out to cloud child agents that run in configured environments. +* [Managing cloud agents](/platform/managing-cloud-agents/) - Inspect environment-backed runs by source, status, and owner. diff --git a/src/content/docs/platform/faqs.mdx b/src/content/docs/platform/faqs.mdx index e4f6a0c7f..5eeacb8dd 100644 --- a/src/content/docs/platform/faqs.mdx +++ b/src/content/docs/platform/faqs.mdx @@ -47,7 +47,7 @@ If you're not happy with where it landed, you can take over to finish the task. ### Do cloud agents have access to Codebase Context and indexing? -Yes. [Codebase Context](/agent-platform/capabilities/codebase-context/) is enabled for all cloud agent runs, as long as Codebase Context is enabled for your account. This includes runs triggered from the CLI, API/SDK, integrations (Slack, Linear, GitHub Actions), and schedules. No additional configuration is needed — if Codebase Context is enabled, cloud agents use it automatically. +Yes. [Codebase Context](/agents/capabilities/codebase-context/) is enabled for all cloud agent runs, as long as Codebase Context is enabled for your account. This includes runs triggered from the CLI, API/SDK, integrations (Slack, Linear, GitHub Actions), and schedules. No additional configuration is needed — if Codebase Context is enabled, cloud agents use it automatically. ### Can I access a shell inside a cloud agent environment? Are there limitations (Docker, Playwright, etc.)? @@ -60,7 +60,7 @@ The cloud agents platform supports self-hosting the **agent sandbox** (the execu Self-hosted execution is available on **Enterprise** plans. See [Self-hosting](/platform/self-hosting/) and [Deployment patterns](/platform/deployment-patterns/) for details. :::note -Self-serve [Bring Your Own API Key (BYOK)](/agent-platform/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/). +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. ::: @@ -118,7 +118,7 @@ To learn more about how secrets work in practice, see [Cloud Agent Secrets](/pla The cloud agents platform is intentionally flexible. As the developer, you decide how agents should branch, coordinate, and resolve conflicts. -Interactive agents can plan work and spawn subagents to parallelize tasks. Cloud agents provide the building blocks for running and coordinating multiple concurrent agents, rather than enforcing a fixed workflow. +Interactive agents can plan work and spawn subagents to parallelize tasks. Cloud agents provide the building blocks for [running and coordinating multiple concurrent agents](/platform/orchestration/), rather than enforcing a fixed workflow. ### Why focus on orchestration primitives instead of immediately adopting new agent standards? @@ -221,7 +221,7 @@ Self-hosted agents can use any SCM accessible from your infrastructure. With the ### Do LLM requests still go through Warp with self-hosting? -Yes. LLM inference routes through Warp's backend, which has [Zero Data Retention (ZDR)](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr) agreements with all contracted model providers. Enterprise teams that need full control over 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. BYOLLM currently applies to interactive (local) agents; cloud agent support is coming. +Yes. LLM inference routes through Warp's backend, which has [Zero Data Retention (ZDR)](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr) agreements with all contracted model providers. Enterprise teams that need full control over 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. AWS Bedrock BYOLLM supports both interactive agents and cloud agent runs; [Gemini Enterprise (Vertex AI)](/enterprise/enterprise-features/byollm-gemini-enterprise/) BYOLLM currently applies to interactive agents, with cloud agent support coming. ### What about large monorepos with long environment setup times? @@ -239,7 +239,7 @@ This depends on your cluster configuration and risk profile. Evaluate your pod s ### Do cloud agents support image attachments? -Cloud agent conversations do not currently support image attachments. Image attachment (via the toolbar button, clipboard paste, or drag-and-drop) is only available in [local agent conversations](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/). +Cloud agent conversations do not currently support image attachments. Image attachment (via the toolbar button, clipboard paste, or drag-and-drop) is only available in [local agent conversations](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/). If you need to provide visual context to a cloud agent, you can describe the image contents in your prompt or reference image file paths within the agent's [environment](/platform/environments/). diff --git a/src/content/docs/platform/handoff/cloud-to-cloud.mdx b/src/content/docs/platform/handoff/cloud-to-cloud.mdx index cad8ff257..c1b41171b 100644 --- a/src/content/docs/platform/handoff/cloud-to-cloud.mdx +++ b/src/content/docs/platform/handoff/cloud-to-cloud.mdx @@ -7,6 +7,7 @@ sidebar: label: "Cloud to cloud" --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; Cloud-to-cloud handoff in Warp lets you send follow-up instructions to a finished cloud agent run and continue it in a fresh cloud session. The run keeps the same conversation and restores the prior workspace state, so the agent can pick up where it left off instead of starting over. @@ -17,7 +18,7 @@ Watch this walkthrough to see how cloud-to-cloud handoff continues a cloud agent Use this handoff direction when: * You want to send a follow-up to a cloud agent after its session has ended. -* You want to continue a background cloud agent run, such as a scheduled or integration-triggered run, while preserving it as a single unit of work in the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app and the [Runs page in the Oz web app](/platform/oz-web-app/#runs). +* You want to continue a background cloud agent run, such as a scheduled or integration-triggered run, while preserving it as a single unit of work in the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app and the [Runs page in the {VARS.WEB_APP}](/platform/oz-web-app/#runs). ## What carries over @@ -43,7 +44,7 @@ Cloud-to-cloud handoff relies on a snapshot from the prior session. Older cloud To continue an ended cloud run, open the run in Warp and send the next message in the conversation. When the original session has ended, Warp automatically starts a fresh cloud session and restores the prior workspace state. -1. **Open the ended cloud run.** Find it on the [Runs page](https://oz.warp.dev/runs) in the Oz web app or in the conversation panel in the Warp app. +1. **Open the ended cloud run.** Find it on the <a href={`${VARS.WEB_APP_URL}/runs`}>Runs page</a> in the {VARS.WEB_APP} or in the conversation panel in the Warp app. 2. **Send your follow-up.** Enter the next message in the conversation's input and submit it. The run picks up where it left off, with workspace state restored. @@ -58,9 +59,9 @@ Cloud-to-cloud handoff also works for supported third-party agent runtimes, but ## Inspecting a run that's been handed off -The [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app and the [Runs page in the Oz web app](/platform/oz-web-app/#runs) show one row per run, even when the run spans multiple sessions. +The [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app and the [Runs page in the {VARS.WEB_APP}](/platform/oz-web-app/#runs) show one row per run, even when the run spans multiple sessions. -1. Open the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app or the [Runs page in the Oz web app](/platform/oz-web-app/#runs). +1. Open 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). 2. Select the handed-off run. 3. Review the transcript. Each session appears in order, so you can see where one session ended and the next began. diff --git a/src/content/docs/platform/handoff/index.mdx b/src/content/docs/platform/handoff/index.mdx index af1e45fd9..82b2b7605 100644 --- a/src/content/docs/platform/handoff/index.mdx +++ b/src/content/docs/platform/handoff/index.mdx @@ -6,6 +6,7 @@ description: >- sidebar: label: "Handoff overview" --- +import { VARS } from '@data/vars'; Handoff moves agent work between local Warp sessions and cloud agent runs without making you restart the task. Depending on the direction, Warp carries over conversation history, workspace changes, and attachments so the receiving agent can continue from the prior session instead of starting from scratch. @@ -22,11 +23,23 @@ Handoff supports three directions: * **Cloud to cloud** - Send a follow-up to a cloud run after its session has ended. The run continues in the same conversation, with the prior session's workspace state restored. See [Handoff from cloud to cloud](/platform/handoff/cloud-to-cloud/). * **Cloud to local** - Fork a cloud conversation into a local Warp session with **Continue locally** or `/continue-locally`. See [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/#5-fork-the-session-to-your-local-warp). +```mermaid +flowchart TD + Local("Local Warp session") + Cloud1("Cloud agent run") + Cloud2("Cloud agent run (follow-up)") + NewLocal("New local Warp session") + + Local -- "Local to cloud" --> Cloud1 + Cloud1 -- "Cloud to cloud" --> Cloud2 + Cloud1 -- "Cloud to local" --> NewLocal +``` + ### Third-party agent runtime coverage Handoff coverage depends on which agent is running the conversation: -* **Cloud to cloud** works for the Warp Agent and the [third-party cloud harnesses currently supported in Oz](/platform/harnesses/): Claude Code and Codex. For Claude Code and Codex runs, click **Continue**, then enter your follow-up prompt. Warp Agent runs use the streamlined follow-up input. +* **Cloud to cloud** works for the Warp Agent and the [third-party cloud harnesses currently supported in the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/): Claude Code and Codex. For Claude Code and Codex runs, click **Continue**, then enter your follow-up prompt. Warp Agent runs use the streamlined follow-up input. * **Local to cloud** works for the Warp Agent. It isn't available for third-party CLI agent sessions. ## What carries over @@ -49,8 +62,8 @@ Each direction has a clear motivating workflow. ## Related pages -* [Cloud agents overview](/platform/) - What cloud agents are, when to use them, and how they fit into the Oz Platform. -* [Managing cloud agents](/platform/managing-cloud-agents/) - Inspect handoff runs from the Agent Management Panel in the Warp app or the Runs page in the Oz web app alongside local conversations. +* [Cloud agents overview](/platform/) - What cloud agents are, when to use them, and how they fit into the {VARS.WARP_AUTOMATION_PLATFORM}. +* [Managing cloud agents](/platform/managing-cloud-agents/) - Inspect handoff runs from the Agent Management Panel in the Warp app or the Runs page in the {VARS.WEB_APP} alongside local conversations. * [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/) - Open and continue a cloud run locally with **Continue locally** or `/continue-locally`. -* [Cloud-synced conversations](/agent-platform/local-agents/cloud-conversations/) - How conversations sync between local and cloud so handoff can find them. +* [Cloud-synced conversations](/agents/local-agents/cloud-conversations/) - How conversations sync between local and cloud so handoff can find them. * [Environments](/platform/environments/) - The runtime context a cloud agent runs in after a handoff. diff --git a/src/content/docs/platform/handoff/local-to-cloud.mdx b/src/content/docs/platform/handoff/local-to-cloud.mdx index bfcfd4302..89a2bf42d 100644 --- a/src/content/docs/platform/handoff/local-to-cloud.mdx +++ b/src/content/docs/platform/handoff/local-to-cloud.mdx @@ -7,6 +7,7 @@ sidebar: label: "Local to cloud" --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; Local-to-cloud handoff in Warp promotes an active local Warp Agent conversation into a cloud agent run. Warp forks the conversation, snapshots your uncommitted workspace changes, and sends both to the cloud so the agent can continue the same task with the context and files it needs. @@ -25,7 +26,7 @@ Use this handoff direction when: When you hand off from local to cloud, the receiving cloud agent inherits: -* **A forked conversation** - Warp forks your local conversation so the cloud agent inherits the full transcript without modifying the source. See [Cloud-synced conversations](/agent-platform/local-agents/cloud-conversations/) for related sync behavior. +* **A forked conversation** - Warp forks your local conversation so the cloud agent inherits the full transcript without modifying the source. See [Cloud-synced conversations](/agents/local-agents/cloud-conversations/) for related sync behavior. * **A workspace snapshot** - Warp captures your uncommitted repository changes, including both tracked modifications and untracked files, and packages them for the cloud agent. The cloud agent applies them before answering your follow-up. * **Conversation attachments** - Files attached to the local conversation remain available in the cloud run. @@ -33,9 +34,9 @@ If any changes fail to apply in the cloud run, the cloud agent reports which cha ## Prerequisites -* **An active local conversation** - Have a [Warp Agent](/agent-platform/local-agents/overview/) conversation open in Warp with the work you want to hand off. +* **An active local conversation** - Have a [Warp Agent](/agents/) conversation open in Warp with the work you want to hand off. * **A configured environment** - The cloud agent needs an [environment](/platform/environments/) that includes the same repositories you're working in locally. The environment's repos must match your local checkout so the workspace snapshot applies cleanly. -* **Cloud conversation storage enabled** - In the Warp app, go to **Settings** > **Privacy** and turn on **Store AI conversations in the cloud** so the conversation can be forked. See [Cloud-synced conversations](/agent-platform/local-agents/cloud-conversations/). +* **Cloud conversation storage enabled** - In the Warp app, go to **Settings** > **Privacy** and turn on **Store AI conversations in the cloud** so the conversation can be forked. See [Cloud-synced conversations](/agents/local-agents/cloud-conversations/). * **Sufficient credits** - Cloud agent runs consume credits. See [Credits](/support-and-community/plans-and-billing/credits/) for how credit usage works, and [Access, billing, and identity](/platform/team-access-billing-and-identity/) for team-specific credit requirements. ## Handing off a conversation to the cloud @@ -74,7 +75,7 @@ The cloud agent runs with the same model your local conversation was using. Chan After you submit, the cloud agent applies your workspace snapshot and responds to your follow-up. The local conversation is not modified, so you can keep working in it locally or close it. -To check on the new run, open it from the [Runs page](https://oz.warp.dev/runs) in the Oz web app or the conversation panel in the Warp app. +To check on the new run, open it from the <a href={`${VARS.WEB_APP_URL}/runs`}>Runs page</a> in the {VARS.WEB_APP} or the conversation panel in the Warp app. ## Troubleshooting @@ -92,4 +93,6 @@ The source conversation may not have finished syncing to the cloud when you trig * [Handoff overview](/platform/handoff/) - What handoff is, the directions it supports, and what carries over. * [Handoff from cloud to cloud](/platform/handoff/cloud-to-cloud/) - Continue a finished cloud run with workspace state restored. * [Environments](/platform/environments/) - Configure the repos, image, and setup commands the cloud agent starts in. +* [Multi-agent orchestration](/platform/orchestration/) - Fan the handed-off work across parallel cloud child agents. +* [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/) - Open and steer the cloud run after handoff. * [Cloud agents quickstart](/platform/quickstart/) - Run your first cloud agent from scratch. diff --git a/src/content/docs/platform/handoff/snapshots.mdx b/src/content/docs/platform/handoff/snapshots.mdx index 4f3542c04..5f6600006 100644 --- a/src/content/docs/platform/handoff/snapshots.mdx +++ b/src/content/docs/platform/handoff/snapshots.mdx @@ -7,6 +7,7 @@ description: >- sidebar: label: "Snapshots" --- +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. @@ -230,4 +231,4 @@ Snapshotting is also skipped automatically when cloud conversations are disabled * [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. -* [Oz CLI](/reference/cli/) - Full reference for `oz agent run` and `oz agent run-cloud`. +* [{VARS.WARP_AGENT_CLI}](/reference/cli/) - Full reference for `oz agent run` and `oz agent run-cloud`. diff --git a/src/content/docs/platform/harnesses/authentication.mdx b/src/content/docs/platform/harnesses/authentication.mdx index f024fe89c..3b9fc7410 100644 --- a/src/content/docs/platform/harnesses/authentication.mdx +++ b/src/content/docs/platform/harnesses/authentication.mdx @@ -1,18 +1,19 @@ --- title: Third-party cloud agent authentication description: >- - Connect your Anthropic or OpenAI credentials to Oz, then launch Claude Code - or Codex as cloud agents from the desktop app, Oz web app, or API. + Connect Anthropic or OpenAI credentials to the {{WARP_AUTOMATION_PLATFORM}} to + run Claude Code or Codex as cloud agents. sidebar: label: "Authentication" --- +import { VARS } from '@data/vars'; -Third-party cloud agent authentication in Oz stores provider credentials for cloud runs as Warp-managed secrets. Third-party cloud agents, like [Claude Code](#connecting-claude-code-credentials) and [Codex](#connecting-codex-credentials), call their providers directly, so set up an Anthropic or OpenAI credential once before launching a third-party harness. +Third-party cloud agent authentication in the {VARS.WARP_AUTOMATION_PLATFORM} stores provider credentials for cloud runs as Warp-managed secrets. Third-party cloud agents, like [Claude Code](#connecting-claude-code-credentials) and [Codex](#connecting-codex-credentials), call their providers directly, so set up an Anthropic or OpenAI credential once before launching a third-party harness. Auth secrets can be scoped to a **team** (available to all teammates' runs) or **personal** (only your own runs), like any other Warp-managed secret. :::note -[Bring Your Own Key (BYOK)](/agent-platform/inference/bring-your-own-api-key/) configured in the Warp desktop app applies to local agent runs only. Cloud runs of Claude Code and Codex always use Warp-managed secrets. +[Bring Your Own Key (BYOK)](/agents/inference/bring-your-own-api-key/) configured in the Warp desktop app applies to local agent runs only. Cloud runs of Claude Code and Codex always use Warp-managed secrets. ::: ## Connecting Claude Code credentials @@ -26,24 +27,24 @@ Claude Code is Anthropic's agentic coding tool. For more on Claude Code authenti 3. Navigate to the API keys section, then click **Get API key**. 4. Create a new API key and copy the value. -Oz also supports Bedrock-routed credentials (**Anthropic Bedrock API key** and **Anthropic Bedrock access key**) if your team consumes Anthropic models through AWS. +The {VARS.WARP_AUTOMATION_PLATFORM} also supports Bedrock-routed credentials (**Anthropic Bedrock API key** and **Anthropic Bedrock access key**) if your team consumes Anthropic models through AWS. -### Store API key in Oz +### Store the API key #### Warp desktop app Start a new cloud agent run and choose **Claude Code** from the **Agent harness** dropdown. In the harness auth secret field, add or select your Anthropic credential. -#### Oz web app +#### Web app -Start a [new run](https://oz.warp.dev/runs/new), choose **Claude Code** as the harness, and add a new key in the Claude Code auth secret dialog. +Start a <a href={`${VARS.WEB_APP_URL}/runs/new`}>new run</a>, choose **Claude Code** as the harness, and add a new key in the Claude Code auth secret dialog. <figure style={{ maxWidth: "563px" }}> ![The Oz web app dialog for adding a new Claude Code auth secret.](../../../../assets/agent-platform/claude-code-auth-secret-setup.png) <figcaption>The Claude Code auth secret dialog.</figcaption> </figure> -#### Oz CLI +#### CLI ```bash oz secret create claude api-key --team <KEY_NAME> @@ -69,17 +70,17 @@ A ChatGPT subscription (Plus, Pro, Team) does not include API access. You need a 4. In the **Create new secret key** dialog, choose the owner, project, and permissions for the key. 5. Click **Create secret key**, then copy the value. -### Store API key in Oz +### Store the API key #### Warp desktop app Start a new cloud agent run and choose **Codex** from the **Agent harness** dropdown. In the harness auth secret field, add or select your OpenAI credential. -#### Oz web app +#### Web app -Start a [new run](https://oz.warp.dev/runs/new), choose **Codex** as the harness, and add a new key in the Codex auth secret dialog. +Start a <a href={`${VARS.WEB_APP_URL}/runs/new`}>new run</a>, choose **Codex** as the harness, and add a new key in the Codex auth secret dialog. -#### Oz CLI +#### CLI ```bash oz secret create codex api-key --team <KEY_NAME> @@ -114,7 +115,7 @@ Deleting an auth secret breaks any scheduled or integration-triggered run that r ## Troubleshooting **Claude Code or Codex run fails with an authentication error.**\ -Confirm the run was started with a harness auth secret selected. From the Oz web app's run detail pane, the **Harness auth secret** field shows which secret (if any) was used. Re-launch the run with the correct secret selected, or create one if your team doesn't have one yet. +Confirm the run was started with a harness auth secret selected. From the {VARS.WEB_APP}'s run detail pane, the **Harness auth secret** field shows which secret (if any) was used. Re-launch the run with the correct secret selected, or create one if your team doesn't have one yet. **The harness auth secret dropdown is empty.**\ The dropdown only lists secrets whose type matches the selected harness — Anthropic types for Claude Code, OpenAI for Codex. If you stored the credential as a raw value, recreate it using the typed flow above. @@ -124,7 +125,7 @@ Your team admin has disabled the harness for your workspace. Contact your admin ## Related pages -* [Harnesses in Oz](/platform/harnesses/) — overview of third-party harnesses in Oz. -* [Claude Code in Warp](/agent-platform/cli-agents/claude-code/) — run Claude Code locally in the Warp terminal. -* [Codex CLI in Warp](/agent-platform/cli-agents/codex/) — run Codex locally in the Warp terminal. +* [Harnesses in the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/) — overview of third-party harnesses in the {VARS.WARP_AUTOMATION_PLATFORM}. +* [Claude Code in Warp](/agents/cli-agents/claude-code/) — run Claude Code locally in the Warp terminal. +* [Codex CLI in Warp](/agents/cli-agents/codex/) — run Codex locally in the Warp terminal. * [Cloud agent secrets](/platform/secrets/) — the full Warp-managed secrets reference. diff --git a/src/content/docs/platform/harnesses/claude-code.mdx b/src/content/docs/platform/harnesses/claude-code.mdx index 11b58e0e6..68a33c955 100644 --- a/src/content/docs/platform/harnesses/claude-code.mdx +++ b/src/content/docs/platform/harnesses/claude-code.mdx @@ -1,21 +1,22 @@ --- -title: Claude Code with Oz +title: Claude Code with the {{WARP_AUTOMATION_PLATFORM}} description: >- - Run Claude Code with Oz. Strong at code review, deep bug investigation, large + Run Claude Code with the {{WARP_AUTOMATION_PLATFORM}}. Strong at code review, deep bug investigation, large feature planning, and frontend or UI work. sidebar: label: "Claude Code" --- +import { VARS } from '@data/vars'; -Claude Code is Anthropic's agentic coding tool. Running it with Oz puts Claude Code inside a Warp-managed environment and connects it to the rest of the Oz platform — including triggers, environments, secrets, observability, and governance — while still behaving like the Claude Code your team already uses. +Claude Code is Anthropic's agentic coding tool. Running it with the {VARS.WARP_AUTOMATION_PLATFORM} puts Claude Code inside a Warp-managed environment and connects it to the rest of the {VARS.WARP_AUTOMATION_PLATFORM} — including triggers, environments, secrets, observability, and governance — while still behaving like the Claude Code your team already uses. :::note -This page covers Claude Code as a **cloud** harness, dispatched and orchestrated by Oz. To run Claude Code locally in your Warp terminal, see [Claude Code in Warp](/agent-platform/cli-agents/claude-code/) instead. +This page covers Claude Code as a **cloud** harness, dispatched and orchestrated by the {VARS.WARP_AUTOMATION_PLATFORM}. To run Claude Code locally in your Warp terminal, see [Claude Code in Warp](/agents/cli-agents/claude-code/) instead. ::: ## Key features -* **Cloud orchestration** - Launch Claude Code from any Oz trigger: the Warp app, the Oz web app, the Oz CLI, the REST API, schedules, Slack mentions, Linear issues, or GitHub Actions. +* **Cloud orchestration** - Launch Claude Code from any {VARS.WARP_AUTOMATION_PLATFORM} trigger: the Warp app, the {VARS.WEB_APP}, the {VARS.WARP_AGENT_CLI}, the REST API, schedules, Slack mentions, Linear issues, or GitHub Actions. * **Claude model picker** - Choose the Claude model the harness uses, including the latest pinned Opus, Sonnet, and Haiku releases, the `best`/`opus`/`sonnet`/`haiku` aliases, and 1M-context variants. * **First-class subagent** - A Warp Agent parent can dispatch Claude Code subagents to handle steps that require code review or nuanced judgment within a larger orchestration. @@ -26,11 +27,11 @@ The Claude Code harness exposes Anthropic's coding-tuned model lineup. Common ch * `best` - Resolves to the current top-of-line Claude model. * `opus`, `sonnet`, `haiku` - Aliases that resolve to the current default for that family. -For the full list — including 1M-context variants for very large codebases and planning-tuned models — open the model picker in the Warp app's Cloud Mode or the **Model** field on the Oz web app's new-run pane. +For the full list — including 1M-context variants for very large codebases and planning-tuned models — open the model picker in the Warp app's Cloud Mode or the **Model** field on the {VARS.WEB_APP}'s new-run pane. ## Credentials and billing -Claude Code calls Anthropic directly using credentials your team provides. Oz supports three Anthropic credential types, stored as [Warp-managed secrets](/platform/secrets/): +Claude Code calls Anthropic directly using credentials your team provides. The {VARS.WARP_AUTOMATION_PLATFORM} supports three Anthropic credential types, stored as [Warp-managed secrets](/platform/secrets/): * **Anthropic API key** - For direct Anthropic API access. * **Anthropic Bedrock API key** - For Bedrock-routed inference using an API key. @@ -43,13 +44,13 @@ For setup steps, see [Connecting Claude Code credentials](/platform/harnesses/au ## Starting a Claude Code run * **Warp app** - In Cloud Mode, click the **Agent harness** dropdown above the input and choose **Claude Code**. -* **Oz 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. +* **{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` and the Anthropic secret name on the matching auth-secret field. See the [API reference](/reference/api-and-sdk/). ## Related pages -* [Harnesses in Oz](/platform/harnesses/) — choose between Warp Agent, Claude Code, and Codex. +* [Harnesses in the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/) — choose between Warp Agent, Claude Code, and Codex. * [Authentication](/platform/harnesses/authentication/) — store Anthropic credentials as Warp-managed secrets. -* [Warp Agent with Oz](/platform/harnesses/warp-agent/) — Oz's default harness, the only one that can orchestrate Claude Code subagents. -* [Codex with Oz](/platform/harnesses/codex/) — Codex as a cloud harness. -* [Claude Code in Warp](/agent-platform/cli-agents/claude-code/) — Claude Code in your local Warp terminal. +* [Warp Agent with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/warp-agent/) — the {VARS.WARP_AUTOMATION_PLATFORM}'s default harness, the only one that can orchestrate Claude Code subagents. +* [Codex with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/codex/) — Codex as a cloud harness. +* [Claude Code in Warp](/agents/cli-agents/claude-code/) — Claude Code in your local Warp terminal. diff --git a/src/content/docs/platform/harnesses/codex.mdx b/src/content/docs/platform/harnesses/codex.mdx index 00baa881c..9c72f4051 100644 --- a/src/content/docs/platform/harnesses/codex.mdx +++ b/src/content/docs/platform/harnesses/codex.mdx @@ -1,21 +1,22 @@ --- -title: Codex with Oz +title: Codex with the {{WARP_AUTOMATION_PLATFORM}} description: >- - Run Codex with Oz for codebase migrations, release coordination, batch test + Run Codex with the {{WARP_AUTOMATION_PLATFORM}} for codebase migrations, release coordination, batch test generation, and backend or DevOps automation. sidebar: label: "Codex" --- +import { VARS } from '@data/vars'; -Codex is OpenAI's coding agent. Running it with Oz puts Codex inside a Warp-managed environment and connects it to the rest of the Oz platform — including triggers, environments, secrets, observability, and governance — while still behaving like the Codex CLI your team already uses. +Codex is OpenAI's coding agent. Running it with the {VARS.WARP_AUTOMATION_PLATFORM} puts Codex inside a Warp-managed environment and connects it to the rest of the {VARS.WARP_AUTOMATION_PLATFORM} — including triggers, environments, secrets, observability, and governance — while still behaving like the Codex CLI your team already uses. :::note -This page covers Codex as a **cloud** harness, dispatched and orchestrated by Oz. To run Codex locally in your Warp terminal, see [Codex CLI in Warp](/agent-platform/cli-agents/codex/) instead. +This page covers Codex as a **cloud** harness, dispatched and orchestrated by the {VARS.WARP_AUTOMATION_PLATFORM}. To run Codex locally in your Warp terminal, see [Codex CLI in Warp](/agents/cli-agents/codex/) instead. ::: ## Key features -* **Cloud orchestration** - Launch Codex from any Oz trigger: the Warp app, the Oz web app, the Oz CLI, the REST API, schedules, Slack mentions, Linear issues, or GitHub Actions. +* **Cloud orchestration** - Launch Codex from any {VARS.WARP_AUTOMATION_PLATFORM} trigger: the Warp app, the {VARS.WEB_APP}, the {VARS.WARP_AGENT_CLI}, the REST API, schedules, Slack mentions, Linear issues, or GitHub Actions. * **Codex model picker** - Choose the OpenAI model Codex uses, including the GPT-5 lineup, Codex-tuned variants, and a `default` option that lets Codex pick its own recommended model. * **First-class subagent** - A Warp Agent parent can dispatch Codex subagents to handle high-volume or well-defined coding steps inside a larger orchestration. @@ -27,11 +28,11 @@ The Codex harness exposes OpenAI's Codex-tuned and general coding models. Common * `gpt-5.5`, `gpt-5.4` - Recent strong coding models from OpenAI with a configurable reasoning level. * `gpt-5.4-mini` - A faster, lower-cost option for lighter coding tasks or subagents. -For the full list, including Codex-tuned and general models, open the model picker on the Oz web app's new-run pane. For details on each model, see [OpenAI's Codex model docs](https://developers.openai.com/codex/models). +For the full list, including Codex-tuned and general models, open the model picker on the {VARS.WEB_APP}'s new-run pane. For details on each model, see [OpenAI's Codex model docs](https://developers.openai.com/codex/models). ## Credentials and billing -Codex calls OpenAI directly using credentials your team provides. Oz supports one credential type today, stored as a [Warp-managed secret](/platform/secrets/): +Codex calls OpenAI directly using credentials your team provides. The {VARS.WARP_AUTOMATION_PLATFORM} supports one credential type today, stored as a [Warp-managed secret](/platform/secrets/): * **OpenAI API key** - The Codex harness authenticates to OpenAI using this key for every run. @@ -42,13 +43,13 @@ For setup steps, see [Connecting Codex credentials](/platform/harnesses/authenti ## Starting a Codex run * **Warp app** - In Cloud Mode, click the **Agent harness** dropdown above the input and choose **Codex**. -* **Oz 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. +* **{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/). ## Related pages -* [Harnesses in Oz](/platform/harnesses/) — choose between Warp Agent, Claude Code, and Codex. +* [Harnesses in the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/) — choose between Warp Agent, Claude Code, and Codex. * [Authentication](/platform/harnesses/authentication/) — store OpenAI credentials as Warp-managed secrets. -* [Warp Agent with Oz](/platform/harnesses/warp-agent/) — Oz's default harness, the only one that can orchestrate Codex subagents. -* [Claude Code with Oz](/platform/harnesses/claude-code/) — Claude Code as a cloud harness. -* [Codex CLI in Warp](/agent-platform/cli-agents/codex/) — Codex in your local Warp terminal. +* [Warp Agent with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/warp-agent/) — the {VARS.WARP_AUTOMATION_PLATFORM}'s default harness, the only one that can orchestrate Codex subagents. +* [Claude Code with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/claude-code/) — Claude Code as a cloud harness. +* [Codex CLI in Warp](/agents/cli-agents/codex/) — Codex in your local Warp terminal. diff --git a/src/content/docs/platform/harnesses/index.mdx b/src/content/docs/platform/harnesses/index.mdx index 1e0939b19..f5756f81c 100644 --- a/src/content/docs/platform/harnesses/index.mdx +++ b/src/content/docs/platform/harnesses/index.mdx @@ -1,5 +1,5 @@ --- -title: Harnesses in Oz +title: Harnesses in the {{WARP_AUTOMATION_PLATFORM}} description: >- Run third-party harnesses such as Claude Code or Codex as cloud agents. They inherit the same triggers, environments, secrets, and observability as Warp @@ -8,21 +8,26 @@ sidebar: label: "Overview" --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; -Oz 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. +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. 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 Oz - Claude Code, Codex, or Warp 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`} /> ## What stays the same -Third-party harnesses inherit the same Oz platform features as Warp Agent: +Third-party harnesses inherit the same {VARS.WARP_AUTOMATION_PLATFORM} features as Warp Agent: * **Triggers** — Slack, Linear, schedules, CI, and API [triggers](/platform/triggers/) launch any harness. * **Environments and secrets** — Reuse the same [environments](/platform/environments/) and [agent secrets](/platform/secrets/). -* **Skills and Rules** — Saved [Skills](/agent-platform/capabilities/skills/) and [Rules](/agent-platform/capabilities/rules/) apply across harnesses. -* **Observability** — Every run produces a transcript and shareable session in the [Oz dashboard](/platform/managing-cloud-agents/). +* **Skills and Rules** — Saved [Skills](/agents/capabilities/skills/) and [Rules](/agents/capabilities/rules/) apply across harnesses. +* **Observability** — Every run produces a transcript and shareable session in the [{VARS.DASHBOARD}](/platform/managing-cloud-agents/). + +## Plan requirements + +Third-party harnesses require a Build plan or higher. On the Free plan, cloud agent runs use Warp Agent, and choosing another harness returns an upgrade prompt. See [Warp pricing](https://www.warp.dev/pricing) for what each plan includes. ## Billing @@ -43,7 +48,7 @@ In Cloud Mode, choose a harness from the **Agent harness** dropdown above the in You can enter Cloud Mode by creating a new **Cloud Agent** tab or by using the `/cloud-agent` slash command. ::: -### Oz web app +### Web app On the new run or new schedule pane, choose the harness in the **Harness** field. @@ -53,8 +58,8 @@ Set the `harness` field on the agent config. See the [API reference](/reference/ ## Related pages -* [Warp Agent with Oz](/platform/harnesses/warp-agent/) — Oz's default first-party harness. -* [Claude Code with Oz](/platform/harnesses/claude-code/) — Claude Code as a cloud harness. -* [Codex with Oz](/platform/harnesses/codex/) — Codex as a cloud harness. +* [Warp Agent with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/warp-agent/) — the {VARS.WARP_AUTOMATION_PLATFORM}'s default first-party harness. +* [Claude Code with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/claude-code/) — Claude Code as a cloud harness. +* [Codex with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/codex/) — Codex as a cloud harness. * [Authentication](/platform/harnesses/authentication/) — connect credentials and launch Claude Code or Codex. -* [Third-party CLI agents in the Warp terminal](/agent-platform/cli-agents/overview/) — run Claude Code, Codex, and other CLI agents locally. +* [Third-party CLI agents in the Warp terminal](/agents/cli-agents/overview/) — run Claude Code, Codex, and other CLI agents locally. diff --git a/src/content/docs/platform/harnesses/warp-agent.mdx b/src/content/docs/platform/harnesses/warp-agent.mdx index c3092f4a2..c5d112cca 100644 --- a/src/content/docs/platform/harnesses/warp-agent.mdx +++ b/src/content/docs/platform/harnesses/warp-agent.mdx @@ -1,34 +1,35 @@ --- -title: Warp Agent with Oz +title: Warp Agent with the {{WARP_AUTOMATION_PLATFORM}} description: >- - Warp Agent is Oz's default harness. It routes across leading models, has full - terminal access, and is the only harness that can orchestrate subagents. + Warp Agent is the default {{WARP_AUTOMATION_PLATFORM}} harness, with multi-model + routing, full terminal access, and cross-harness subagent orchestration. sidebar: label: "Warp Agent" --- +import { VARS } from '@data/vars'; -Warp Agent is the harness Warp builds and ships with Oz. It's the default for every cloud agent run unless you pick another harness, and it's the only harness that can spawn cross-harness subagents (for example, a Warp Agent parent dispatching a Claude Code or Codex child). +Warp Agent is the harness Warp builds and ships with the {VARS.WARP_AUTOMATION_PLATFORM}. It's the default for every cloud agent run unless you pick another harness, and it's the only harness that can spawn cross-harness subagents (for example, a Warp Agent parent dispatching a Claude Code or Codex child). Warp Agent is the same agent runtime that powers Agent Mode in the Warp terminal. Running it as a cloud harness gives you the same behavior — model routing, tool access, Skills, Rules, Memory — without tying execution to a single laptop. ## Key features -* **Multi-model auto-routing** - Routes between Anthropic, OpenAI, Google, and Fireworks-hosted models. Choose a specific model, or let Warp pick via `auto`, `auto-efficient`, `auto-genius`, or `auto-open`. See [Model choice](/agent-platform/inference/model-choice/) for the full catalog. +* **Multi-model auto-routing** - Routes between Anthropic, OpenAI, Google, and Fireworks-hosted models. Choose a specific model, or let Warp pick via `auto`, `auto-efficient`, `auto-genius`, or `auto-open`. See [Model choice](/agents/inference/model-choice/) for the full catalog. * **Full terminal and tool access** - Runs commands, edits files, reads logs, executes tests, navigates repos, and calls MCP servers, giving cloud runs the same toolbelt Warp Agent uses locally. -* **Platform-native context** - Reads [Codebase Context](/agent-platform/capabilities/codebase-context/), applies [Rules](/agent-platform/capabilities/rules/), reuses saved [Skills](/agent-platform/capabilities/skills/), and respects Memory and Warp Drive context with no extra setup. +* **Platform-native context** - Reads [Codebase Context](/agents/capabilities/codebase-context/), applies [Rules](/agents/capabilities/rules/), reuses saved [Skills](/agents/capabilities/skills/), and respects Memory and Warp Drive context with no extra setup. * **Multi-repo execution** - Clones every repo configured on the [environment](/platform/environments/) and works across them in a single run. * **Cross-harness orchestration parent** - A Warp Agent parent run can spawn Claude Code or Codex [subagents](/platform/) and coordinate their outputs. Other harnesses cannot act as parents in a multi-harness orchestration. * **No extra credentials** - Warp Agent uses your existing Warp account and credits. There's no separate API key to configure. ## How it works -Warp Agent is the same agent runtime as Agent Mode in the Warp terminal: it plans, calls tools, edits code, runs tests, and reports progress. The cloud platform adds the [environment](/platform/environments/), triggers, observability, and team governance around the run, and the transcript is inspectable in real time and replayable afterward from the [Oz dashboard](/platform/managing-cloud-agents/). +Warp Agent is the same agent runtime as Agent Mode in the Warp terminal: it plans, calls tools, edits code, runs tests, and reports progress. The cloud platform adds the [environment](/platform/environments/), triggers, observability, and team governance around the run, and the transcript is inspectable in real time and replayable afterward from the [{VARS.DASHBOARD}](/platform/managing-cloud-agents/). Team admins can disable any harness for their workspace. Users on that team can only start runs with the harnesses that remain enabled. ### Available models -Warp Agent supports the full Warp model catalog. Configure the model per [Agent Profile](/agent-platform/capabilities/agent-profiles-permissions/), or pick one at run time. See [Model choice](/agent-platform/inference/model-choice/) for the supported model IDs, including the `auto`, `auto-efficient`, `auto-genius`, and `auto-open` routing options. +Warp Agent supports the full Warp model catalog. Configure the model per [Agent Profile](/agents/capabilities/agent-profiles-permissions/), or pick one at run time. See [Model choice](/agents/inference/model-choice/) for the supported model IDs, including the `auto`, `auto-efficient`, `auto-genius`, and `auto-open` routing options. ### Cross-harness orchestration @@ -53,17 +54,17 @@ Subagents run in the same environment as the parent and share the same secrets, 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**. -* **Oz web app** - On a new run or new schedule pane, leave the **Harness** field set to **Warp Agent**. -* **Oz CLI** - Run `oz agent run-cloud --prompt "..."` with no `--harness` flag, or pass `--harness oz` explicitly. +* **{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/). For a complete walkthrough, see the [Cloud agents quickstart](/platform/quickstart/). ## Related pages -* [Harnesses in Oz](/platform/harnesses/) — choose between Warp Agent, Claude Code, and Codex. -* [Claude Code with Oz](/platform/harnesses/claude-code/) — Claude Code as a cloud harness. -* [Codex with Oz](/platform/harnesses/codex/) — Codex as a cloud harness. -* [Model choice](/agent-platform/inference/model-choice/) — the model catalog Warp Agent routes across. -* [Agent Profiles and permissions](/agent-platform/capabilities/agent-profiles-permissions/) — configure the default model, autonomy, and tool access for Warp Agent. +* [Harnesses in the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/) — choose between Warp Agent, Claude Code, and Codex. +* [Claude Code with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/claude-code/) — Claude Code as a cloud harness. +* [Codex with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/codex/) — Codex as a cloud harness. +* [Model choice](/agents/inference/model-choice/) — the model catalog Warp Agent routes across. +* [Agent Profiles and permissions](/agents/capabilities/agent-profiles-permissions/) — configure the default model, autonomy, and tool access for Warp Agent. * [Skills as agents](/platform/skills-as-agents/) — turn a saved skill into a reusable Warp Agent run. diff --git a/src/content/docs/platform/index.mdx b/src/content/docs/platform/index.mdx index 04a4cd550..b02f064b5 100644 --- a/src/content/docs/platform/index.mdx +++ b/src/content/docs/platform/index.mdx @@ -6,15 +6,22 @@ description: >- sidebar: label: "Cloud agents overview" --- +import { VARS } from '@data/vars'; import VideoEmbed from '@components/VideoEmbed.astro'; +{/* Transition notice for the 2026-08-18 rename. Remove after 2026-09-15, 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 September 15, 2026. +::: + 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. ### 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 Oz 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. +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. For a full walkthrough, see [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/). If the run came from Slack, Linear, GitHub Actions, a schedule, the CLI, or the API, it still produces a reviewable cloud agent run record. @@ -33,7 +40,7 @@ Cloud agents are designed for situations where: * **You want agents to operate continuously as part of engineering infrastructure.** * This includes [scheduled maintenance tasks](/platform/triggers/scheduled-agents/) and integration-driven automation. -![Oz use cases across the development lifecycle: Plan, Prototype, Build, Validate, Review + Merge, Deploy + Monitor](../../../assets/agent-platform/oz-use-cases.png) +![Cloud agent use cases across the development lifecycle: Plan, Prototype, Build, Validate, Review + Merge, Deploy + Monitor](../../../assets/agent-platform/oz-use-cases.png) --- @@ -55,7 +62,7 @@ If you are evaluating whether something should be a cloud agent, a good test is ### How cloud agents work -Cloud agents run on the [Oz Platform](/platform/overview/), which provides the primitives for triggering work, orchestrating tasks, executing agents (optionally in environments), injecting secrets, and inspecting results. +Cloud agents run on the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/), which provides the primitives for triggering work, orchestrating tasks, executing agents (optionally in environments), injecting secrets, and inspecting results. * Something **triggers** an agent task. * The **orchestrator creates** and tracks the task. @@ -63,23 +70,23 @@ Cloud agents run on the [Oz Platform](/platform/overview/), which provides the p 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. -For teams that need execution to stay within their network boundary, self-hosting supports two architectures: a **managed** worker daemon that lets Oz 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](/platform/self-hosting/) for details. ### What you get by default -Because cloud agents run on the [Oz Platform](/platform/overview/), each run is tracked and produces a persistent record that can be observed, shared, and reviewed (even if execution happens outside the Warp app). +Because cloud agents run on the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/), each run is tracked and produces a persistent record that can be observed, shared, and reviewed (even if execution happens outside the Warp app). #### Codebase Context -Cloud agent runs automatically benefit from [Codebase Context](/agent-platform/capabilities/codebase-context/) for semantic code understanding and search, as long as Codebase Context is enabled for your account. See [Codebase Context in cloud agent runs](/agent-platform/capabilities/codebase-context/#codebase-context-in-cloud-agent-runs) for details. +Cloud agent runs automatically benefit from [Codebase Context](/agents/capabilities/codebase-context/) for semantic code understanding and search, as long as Codebase Context is enabled for your account. See [Codebase Context in cloud agent runs](/agents/capabilities/codebase-context/#codebase-context-in-cloud-agent-runs) for details. #### Observability and steerability Cloud agent tasks are designed to be inspectable by the team: -* The [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app and the [Runs page in the Oz web app](/platform/oz-web-app/#runs) surface task status, source, trigger, creator, history, and credit usage. +* The [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app and the [Runs page in the {VARS.WEB_APP}](/platform/oz-web-app/#runs) surface task status, source, trigger, creator, history, and credit usage. * [Cloud agent session sharing](/platform/viewing-cloud-agent-runs/) opens the run transcript so teammates can inspect the prompt, plan, commands, logs, files changed, outputs, and follow-up messages where available. -* [Agent Session Sharing](/agent-platform/local-agents/session-sharing/) lets authorized teammates share, monitor, and steer live local or third-party agent sessions. +* [Agent Session Sharing](/agents/local-agents/session-sharing/) lets authorized teammates share, monitor, and steer live local or third-party agent sessions. #### Centralized configuration @@ -91,7 +98,7 @@ For details on configuring MCP servers for cloud agents, see [MCP Servers](/plat #### API access to tasks -The Oz Platform exposes task visibility via the [**Oz API and SDKs**](/reference/api-and-sdk/), so teams can: +The {VARS.WARP_AUTOMATION_PLATFORM} exposes task visibility via the [**{VARS.API_SDK_NAME}**](/reference/api-and-sdk/), so teams can: * Query which tasks are running or have run. * Fetch task metadata and outcomes. @@ -99,11 +106,11 @@ The Oz Platform exposes task visibility via the [**Oz API and SDKs**](/reference ### Using cloud agents with or without the Warp app -Cloud agents do not require the Warp app. Teams can deploy and operate them through the [Oz Platform](/platform/overview/) using: +Cloud agents do not require the Warp app. Teams can deploy and operate them through the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) using: -* [Oz CLI](/reference/cli/) — run agents from scripts, CI, or the terminal -* [Oz web app](/platform/oz-web-app/) — visual interface for managing runs, schedules, environments, and integrations (works on mobile) -* [Agent Session Sharing](/agent-platform/local-agents/session-sharing/) — attach to running tasks to monitor or steer +* [{VARS.WARP_AGENT_CLI}](/reference/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 @@ -113,10 +120,10 @@ If your team also uses Warp's terminal, you get an additional workflow: tasks la ### Billing and plan requirements -Cloud agents and [integrations](/platform/integrations/) run on the [Oz Platform](/platform/overview/) control plane, and usage is billed using credits. +Cloud agents and [integrations](/platform/integrations/) run on the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) control plane, and usage is billed using credits. :::note -[Bring Your Own API Key (BYOK)](/agent-platform/inference/bring-your-own-api-key/) is not supported for cloud agent runs. BYOK keys are stored locally on your device and are not accessible to cloud-hosted agents. All cloud agent runs consume Warp credits. +[Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/) is not supported for cloud agent runs. BYOK keys are stored locally on your device and are not accessible to cloud-hosted agents. All cloud agent runs consume Warp credits. ::: #### For cloud agents via CLI/API @@ -148,14 +155,14 @@ 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. -* [Oz Platform](/platform/overview/) — CLI, Oz API/SDK, orchestration, tasks, environments, hosts, integrations, and more. +* [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) — CLI, {VARS.API_SDK_NAME}, orchestration, tasks, environments, hosts, integrations, and more. * [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. * [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. -* [Oz 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}](/reference/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. -* [Oz API and SDK](/reference/api-and-sdk/) — documents the REST API for creating, querying, and monitoring agent tasks programmatically. +* [{VARS.API_SDK_NAME}](/reference/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. diff --git a/src/content/docs/platform/integrations/azure-devops.mdx b/src/content/docs/platform/integrations/azure-devops.mdx index a7cbf7702..539a2a895 100644 --- a/src/content/docs/platform/integrations/azure-devops.mdx +++ b/src/content/docs/platform/integrations/azure-devops.mdx @@ -6,8 +6,9 @@ description: >- Connect cloud agents to Azure DevOps repos using personal access tokens and Warp-managed secrets. --- +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 Oz trigger—Slack, Linear, schedules, or the CLI. +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. 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. @@ -19,9 +20,9 @@ This approach works for both Azure DevOps Services (dev.azure.com) and Azure Dev ## Prerequisites -* A Warp account ([create an account at oz.warp.dev](https://oz.warp.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 [Oz CLI](/reference/cli/) installed and authenticated +* The [{VARS.WARP_AGENT_CLI}](/reference/cli/) installed and authenticated --- @@ -121,8 +122,8 @@ oz agent run-cloud --environment <ENV_ID> --prompt "Your task here" With your environment configured, you can connect it to any Warp trigger exactly as you would with a GitHub-backed environment: -* **Slack** — Tag **@Oz** in a message to start an agent run against your Azure DevOps repo. See [Slack](/platform/integrations/slack/). -* **Linear** — Tag **@Oz** on an issue to kick off a workflow. See [Linear](/platform/integrations/linear/). +* **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 diff --git a/src/content/docs/platform/integrations/bitbucket.mdx b/src/content/docs/platform/integrations/bitbucket.mdx index 632cfcd8c..3e2c47da4 100644 --- a/src/content/docs/platform/integrations/bitbucket.mdx +++ b/src/content/docs/platform/integrations/bitbucket.mdx @@ -6,8 +6,9 @@ description: >- Connect cloud agents to Bitbucket repos using access tokens and Warp-managed secrets. --- +import { VARS } from '@data/vars'; -Cloud agents work with any Git repository, including those hosted on Bitbucket. Unlike GitHub, Bitbucket does not have a native Warp integration, but you can grant agents access to your Bitbucket repositories using an access token and Warp-managed secrets. Once configured, your environment works with any Oz trigger—Slack, Linear, schedules, or the CLI. +Cloud agents work with any Git repository, including those hosted on Bitbucket. Unlike GitHub and GitLab, Bitbucket does not have a native Warp integration, but you can grant agents access to your Bitbucket repositories using an 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 a Bitbucket access token, store it securely, and configure a cloud agent environment that clones your repository at runtime. @@ -22,9 +23,9 @@ Follow the section that matches your setup. ## Prerequisites -* A Warp account ([create an account at oz.warp.dev](https://oz.warp.dev)) +* 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 [Oz CLI](/reference/cli/) installed and authenticated +* The [{VARS.WARP_AGENT_CLI}](/reference/cli/) installed and authenticated --- @@ -185,11 +186,11 @@ Setup commands run on a fresh container for every agent run. Write them to be id --- -## Step 4: Test your environment +## Test your environment -Before connecting to integrations, verify the environment works by running a one-off agent. +Before connecting to integrations, verify the environment works by running a one-off agent. This applies to both Bitbucket Cloud and Bitbucket Data Center / Server. -1. Run the following command, replacing `<ENV_ID>` with the environment ID from Step 3: +1. Run the following command, replacing `<ENV_ID>` with the environment ID from Step 3 of whichever setup you followed: ```bash oz agent run-cloud --environment <ENV_ID> --prompt "Your task here" @@ -201,8 +202,8 @@ oz agent run-cloud --environment <ENV_ID> --prompt "Your task here" With your environment configured, you can connect it to any Warp trigger exactly as you would with a GitHub-backed environment: -* **Slack** — Tag **@Oz** in a message to start an agent run against your Bitbucket repo. See [Slack](/platform/integrations/slack/). -* **Linear** — Tag **@Oz** on an issue to kick off a workflow. See [Linear](/platform/integrations/linear/). +* **Slack** — Tag **@warp** in a message to start an agent run against your Bitbucket 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 diff --git a/src/content/docs/platform/integrations/cloud-providers.mdx b/src/content/docs/platform/integrations/cloud-providers.mdx index 675b7bf07..5a7ae511a 100644 --- a/src/content/docs/platform/integrations/cloud-providers.mdx +++ b/src/content/docs/platform/integrations/cloud-providers.mdx @@ -5,6 +5,7 @@ description: >- sidebar: label: "AWS, GCP, and other cloud providers" --- +import { VARS } from '@data/vars'; Cloud agents can securely access AWS, GCP, and other cloud providers using short-lived OpenID Connect (OIDC) credentials. Configure your cloud agent environment to automatically authenticate to your cloud provider without storing long-lived keys, using Warp's built-in OIDC federation support. @@ -12,7 +13,7 @@ Cloud agents can securely access AWS, GCP, and other cloud providers using short ## Prerequisites -* A Warp account. You can [create an account in the Oz web app](https://oz.warp.dev). +* A Warp account. You can <a href={VARS.WEB_APP_URL}>create an account in the {VARS.WEB_APP}</a>. * A cloud provider account Follow the section for your cloud provider. @@ -23,7 +24,7 @@ Follow the section for your cloud provider. ### Step 1: Create an OIDC identity provider -The first step is to configure your AWS account to trust OIDC tokens produced by Oz. +The first step is to configure your AWS account to trust OIDC tokens produced by the {VARS.WARP_AUTOMATION_PLATFORM}. 1. Open the [AWS IAM console](https://console.aws.amazon.com/iam). 2. Click **Identity Providers**, then click **Add provider**. @@ -126,23 +127,23 @@ To allow multiple specific principals, use a list of subjects: Finally, configure the cloud agent environment to use your new AWS role. -1. Open the [Oz web app](https://oz.warp.dev). +1. Open the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a>. 2. Create or edit an environment. See [Environments](/platform/oz-web-app/#environments) for instructions. 3. Expand the **AWS** section and enter the AWS role ARN from Step 2. 4. Save the environment. :::caution -Currently, AWS federation can only be configured in the Oz web app, not the CLI. +Currently, AWS federation can only be configured in the {VARS.WEB_APP}, not the CLI. ::: Agents running in this environment will now automatically assume the configured role when using the `aws` CLI or a compatible SDK. :::note -Oz uses the [**Assume role with web identity**](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html#cli-configure-role-oidc) +The {VARS.WARP_AUTOMATION_PLATFORM} uses the [**Assume role with web identity**](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html#cli-configure-role-oidc) AWS authentication mechanism. The following environment variables are set while the agent is running: * `AWS_ROLE_ARN`: the ARN of the role configured above -* `AWS_WEB_IDENTITY_TOKEN_FILE`: the path to a temporary file containing the agent's Oz OIDC token +* `AWS_WEB_IDENTITY_TOKEN_FILE`: the path to a temporary file containing the agent's {VARS.WARP_AUTOMATION_PLATFORM} OIDC token * `AWS_ROLE_SESSION_NAME`: a derived session name, of the form `Oz_Run_<run-id>`. ::: @@ -152,10 +153,10 @@ AWS authentication mechanism. The following environment variables are set while ### Step 1: Create a Workload Identity Pool and Provider -The Oz GCP integration uses [Workload Identity Federation](https://docs.cloud.google.com/iam/docs/workload-identity-federation). -You will need to configure a pool and provider to trust OIDC tokens produced by Oz. +The {VARS.WARP_AUTOMATION_PLATFORM} GCP integration uses [Workload Identity Federation](https://docs.cloud.google.com/iam/docs/workload-identity-federation). +You will need to configure a pool and provider to trust OIDC tokens produced by the {VARS.WARP_AUTOMATION_PLATFORM}. -These instructions use the `gcloud` tool. You may also follow the OIDC instructions in +These instructions use the `gcloud` tool. You can also follow the OIDC instructions in [Configure Workload Identity Federation with other identity providers](https://docs.cloud.google.com/iam/docs/workload-identity-federation-with-other-providers) to use the GCP console or Terraform. @@ -201,7 +202,7 @@ for example, you would run: ```bash gcloud projects add-iam-policy-binding <project-id> \ - --member "principalSet://iam.googleapis.com/projects/<project-number>/locations/global/workloadIdentityPools/<pool-id>/attribute.teams/<team-id>" \ + --member "principalSet://iam.googleapis.com/projects/<project-number>/locations/global/workloadIdentityPools/<pool-id>/group/<team-uid>" \ --role "roles/compute.viewer" ``` @@ -212,43 +213,59 @@ for the full syntax supported. Finally, configure the cloud agent environment to use your Workload Identity Federation provider. -1. Open the [Oz web app](https://oz.warp.dev). +1. Open the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a>. 2. Create or edit an environment. See [Environments](/platform/oz-web-app/#environments) for instructions. 3. Expand the **GCP** section and enter the project number, pool ID, and provider ID from Step 1. 4. Save the environment. :::caution -Currently, Workload Identity Federation can only be configured in the Oz web app, not the CLI. +Currently, Workload Identity Federation can only be configured in the {VARS.WEB_APP}, not the CLI. ::: Agents running in this environment will now automatically configure [Application Default Credentials](https://docs.cloud.google.com/docs/authentication/application-default-credentials) to use the configured pool. Both the `GOOGLE_APPLICATION_CREDENTIALS` and `CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE` -environment variables are set, so both the `gcloud` CLI and official Google SDKs will use the Oz -federated credentials. Oz uses +environment variables are set, so both the `gcloud` CLI and official Google SDKs will use the {VARS.WARP_AUTOMATION_PLATFORM} +federated credentials. The {VARS.WARP_AUTOMATION_PLATFORM} uses [**executable-sourced credentials**](https://docs.cloud.google.com/iam/docs/workload-identity-federation-with-other-providers#create-credential-config) to configure ADC for automatic token rotation. +#### Automatic `gcloud` sign-in + +Environment variables alone are enough for the Google SDKs, but `gcloud` reports no active account until +it signs in through its own auth system, and some tooling depends on an active account. During provider +setup, the {VARS.WARP_AUTOMATION_PLATFORM} therefore also runs `gcloud auth login` against the federated credential file so `gcloud` reports +the federated identity as its active account. + +This step is best-effort and never blocks the run: + +* **`gcloud` isn't installed** - The {VARS.WARP_AUTOMATION_PLATFORM} skips the sign-in. The ADC environment variables still provide credentials to the Google SDKs. +* **Sign-in fails or times out** - The {VARS.WARP_AUTOMATION_PLATFORM} logs the failure and continues. The ADC environment variables still work, so a run only loses the active-account convenience. + +To confirm the account inside a run, use `gcloud auth list`. + ## Other providers -To authenticate from Oz to another provider that supports OIDC federation, you can issue tokens +To authenticate from the {VARS.WARP_AUTOMATION_PLATFORM} to another provider that supports OIDC federation, you can issue tokens directly. Within the agent environment, use the `oz federate issue-token` command to produce an OIDC token with your provider as the audience: ```bash -oz federate issue-token --audience your-provider.com --output-format json +oz federate issue-token --run-id <RUN_ID> --audience your-provider.com --output-format json ``` -Optionally, add `--duration <duration>` to customize the token validity. This cannot exceed the -maximum runtime of an agent. +Replace `<RUN_ID>` with the current agent run's ID. + +Optionally, add `--duration <duration>` to customize the token validity. Tokens are valid for +between 5 minutes and 3 hours. -You may then exchange this token for provider-specific credentials. +You can then exchange this token for provider-specific credentials. ## OIDC token claims -All Oz OIDC tokens include standard claims like `iss` (issuer) and `iat` (issued at). +All {VARS.WARP_AUTOMATION_PLATFORM} OIDC tokens include standard claims like `iss` (issuer) and `iat` (issued at). ### Audience @@ -265,7 +282,7 @@ By default, the `sub` claim uses the format `<principal-type>:<principal-id>`: * `user:abc123def456`: Identifies a user with ID `abc123def456` * `service_account:abc123def456`: Identifies your autogenerated team account -When authenticating to AWS, Oz will use a different `sub` claim format, because AWS trust policies cannot +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: * `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. @@ -283,7 +300,7 @@ Team ID: xyz789 Team Name: My Team ``` -You can also check the user IDs from past runs using the Oz API: +You can also check the user IDs from past runs using the {VARS.API_SDK_NAME}: ```bash curl https://app.warp.dev/api/v1/agent/runs -H "Authorization: Bearer $WARP_API_KEY" @@ -304,10 +321,11 @@ curl https://app.warp.dev/api/v1/agent/runs -H "Authorization: Bearer $WARP_API_ ### Team -Every token includes a `teams` claim. The value will be a list with your team UID - currently, this -list only ever contains a single value. +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. -### Oz run +### Run The following claims are derived from an agent run: diff --git a/src/content/docs/platform/integrations/github-actions.mdx b/src/content/docs/platform/integrations/github-actions.mdx index a9f0a4dd3..f519e47ad 100644 --- a/src/content/docs/platform/integrations/github-actions.mdx +++ b/src/content/docs/platform/integrations/github-actions.mdx @@ -5,6 +5,7 @@ description: >- CI fixes. --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; Run agents directly in your GitHub Actions workflows using `oz-agent-action`. The agent integrates seamlessly into your CI pipeline, automating tasks like code review, issue triage, bug fixing, and maintenance using your repository context and GitHub permissions. This page covers how the integration works, how to set it up, and common automation patterns for development teams. @@ -12,7 +13,11 @@ Run agents directly in your GitHub Actions workflows using `oz-agent-action`. Th **Getting started?** See the [GitHub Actions quickstart](/platform/integrations/quickstart-github-actions/) to set up your first workflow, or visit the [oz-agent-action repository](https://github.com/warpdotdev/oz-agent-action) for detailed setup instructions and ready-to-use workflow templates. ::: -If you're comparing GitHub Actions with schedules, Slack, Linear, the Oz CLI, or API-triggered runs, see [Run agents unattended with schedules and triggers](/guides/agent-workflows/how-to-run-unattended-agents/). +:::note +GitHub Actions is different from the [GitHub integration](/platform/integrations/github/). GitHub Actions runs agents inside workflows you define in your repository, and you control the trigger, permissions, and prompt in YAML. The GitHub integration starts agents when someone mentions `@warp-agent` on an issue, pull request, or review comment, using the Warp Factories GitHub App with no workflow file. +::: + +If you're comparing GitHub Actions with schedules, Slack, Linear, the GitHub integration, the {VARS.WARP_AGENT_CLI}, or API-triggered runs, see [Run agents unattended with schedules and triggers](/guides/agent-workflows/how-to-run-unattended-agents/). Watch this demo to see the integration in action: @@ -29,7 +34,7 @@ In this demo ### What the GitHub Actions integration does -The `oz-agent-action` is a GitHub Action that wraps the Oz CLI and: +The `oz-agent-action` is a GitHub Action that wraps the {VARS.WARP_AGENT_CLI} and: * Runs an agent inside an Actions job * Caches package installation for faster builds @@ -51,7 +56,7 @@ To use agents in GitHub Actions, you need: ### Using Skills -Skills provide reusable instructions for agents. You can use pre-built skills from the [oz-skills repository](https://github.com/warpdotdev/oz-skills) or create custom [skills](/agent-platform/capabilities/skills/) for your specific workflows. Skills can also be deployed as [standalone agents](/agent-platform/capabilities/skills/#skills-as-agents) to run on a schedule or in response to events. +Skills provide reusable instructions for agents. You can use pre-built skills from the [oz-skills repository](https://github.com/warpdotdev/oz-skills) or create custom [skills](/agents/capabilities/skills/) for your specific workflows. Skills can also be deployed as [standalone agents](/platform/skills-as-agents/) to run on a schedule or in response to events. #### How to use skills @@ -107,6 +112,10 @@ The `oz-agent-action` supports several automation patterns commonly used in CI. * **File**: [`examples/respond-to-comment.yml`](https://github.com/warpdotdev/oz-agent-action/blob/main/examples/respond-to-comment.yml) * **Use case**: Add "@oz-agent fix this typo" or similar comments to a PR or Issue. +:::note +The [GitHub integration](/platform/integrations/github/) responds to `@warp-agent` mentions without a workflow file. Use this Actions pattern when you want the run to happen inside your CI pipeline with workflow-scoped permissions; use the GitHub integration when you want mention-triggered runs on every repository the Warp Factories GitHub App can access. +::: + What it does: * Listens for comments containing a trigger phrase diff --git a/src/content/docs/platform/integrations/github.mdx b/src/content/docs/platform/integrations/github.mdx new file mode 100644 index 000000000..6c0231acf --- /dev/null +++ b/src/content/docs/platform/integrations/github.mdx @@ -0,0 +1,215 @@ +--- +title: GitHub integration +sidebar: + label: "GitHub" +description: >- + Mention @warp-agent on a GitHub issue, pull request, or review comment to start + a cloud agent that replies in the thread and opens pull requests. +--- +import { VARS } from '@data/vars'; + +The GitHub integration lets your team start cloud agents from GitHub itself. Mention **@warp-agent** in an issue comment, a pull request review comment, or the body of a new pull request, and Warp starts a cloud agent that reads the surrounding context, works the task in your codebase, and posts its progress and results back into the same thread. + +The integration is powered by the **Warp Factories** GitHub App. Once a team admin installs the app and enables the GitHub organization, every teammate who has connected their GitHub account can trigger agents from GitHub without leaving a review or an issue. + +:::note +This page covers the native GitHub App integration. It is distinct from two other GitHub surfaces: + +* [GitHub Actions](/platform/integrations/github-actions/) runs agents inside your own CI workflows with the `oz-agent-action` workflow step. You control the trigger, permissions, and prompt in YAML. +* [Team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization) is how agents authenticate to GitHub to clone repos and open pull requests, regardless of where a run started. +::: + +--- + +## What the GitHub integration does + +* **@warp-agent mentions** - Mention the agent in a comment or pull request body to start a cloud agent run with the issue or pull request as context. +* **In-thread status** - Warp posts a status comment carrying the run link, then follows up with progress comments and a final summary in the same issue, pull request, or review thread. +* **Thread-aware follow-ups** - Mention the agent again in the same thread and Warp continues the existing run instead of starting a new one. +* **Automatic repository access** - The repository the event came from is cloned for the run, alongside any repositories in the environment you configure for the integration. +* **Team-scoped configuration** - A Warp team admin controls which GitHub organizations are enabled, and which environment, model, agent, and prompt GitHub-triggered runs use. + +## How it works + +When you mention `@warp-agent`, GitHub sends the event to Warp through the Warp Factories GitHub App installation. Warp then: + +1. Confirms the comment or pull request body contains the `@warp-agent` mention and that the author is a person rather than a bot. +2. Maps the GitHub App installation to a Warp team using the organizations enabled in the Admin Panel. +3. Maps the GitHub account that posted the mention to a Warp account, so the run is attributed to that person. +4. Posts a status comment in the thread and starts the cloud agent run with the issue, pull request, or review thread as context. +5. Posts progress updates and a final summary back into the thread, including any pull requests the agent opened and branches it pushed. + +The agent replies through Warp's status comments, which are posted by the GitHub App. Agent replies aren't posted from the triggering user's account. + +### Supported triggers + +The integration starts or continues a run for these GitHub events when the text contains `@warp-agent`: + +* **Issue comments** - A new comment on an issue. Warp reads the issue title, description, labels, state, and the recent comment thread. +* **Pull request comments** - A new top-level comment on a pull request. These continue the pull request's existing run when one exists. +* **Pull request review comments** - A new inline review comment or a reply in a review thread. Warp reads the pull request, the review thread, and the diff of the commented file, and replies inside the same review thread. +* **New pull requests** - A pull request opened with `@warp-agent` in its description. Warp reads the title, description, and the head and base branches. + +Mentions in other places don't start a run. Editing a comment to add the mention, mentioning the agent in an issue or pull request title, and mentions posted by bots are all ignored. + +### Follow-ups and existing runs + +Warp groups events into a single conversation per issue, pull request, or review thread: + +* Comments on the same issue continue that issue's run. +* Top-level pull request comments continue that pull request's run, including a run started from the pull request description. +* Replies in a review thread continue that thread's run. + +When a run for that thread is already in flight, a new mention is delivered to the running agent as a follow-up instruction rather than starting a second agent. + +## Requirements + +* **Team membership** - The GitHub integration requires a [Warp team](/knowledge-and-collaboration/teams/). Configuration is team-scoped, and runs are owned by the team associated with the GitHub App installation. +* **Plan and credits** - Your team must have cloud agents enabled and credits available. On Enterprise plans, runs draw from a team credit pool per your contract. See [Access, billing, and identity](/platform/team-access-billing-and-identity/). +* **Warp Factories GitHub App** - A GitHub organization owner installs the [Warp Factories](https://github.com/apps/warp-factories) GitHub App on the organization or account that owns the repositories, granting it access to all repositories or a selected set. The installation's repository access is what agents act with, so scope it deliberately. +* **An enabled GitHub organization** - A Warp team admin adds the organization under **Enabled GitHub Orgs** in the Admin Panel so the installation maps to your Warp team. +* **A connected GitHub account** - Each teammate connects their GitHub account to Warp once, so Warp can identify who triggered the run and which team to bill. The connection identifies the requester; it doesn't determine what the agent can reach on GitHub. + +## Setting up the GitHub integration + +Complete steps 1 through 3 once per team. Step 4 is per teammate. + +### 1. Install the GitHub App + +Install the app so GitHub can deliver issue and pull request events to Warp, and so agents can read repository context and post comments. + +A user with admin permissions on the GitHub organization installs the [Warp Factories](https://github.com/apps/warp-factories) GitHub App and grants it access to **all repositories** or **selected repositories**. Each installation covers a single GitHub organization or personal account, so install the app separately for every organization your team works in. + +<figure style={{ maxWidth: "563px" }}> +![Warp Factories GitHub App installation page showing repository access options](../../../../assets/agent-platform/oz-github-app-installation.png) +<figcaption>Installing the Warp Factories GitHub App.</figcaption> +</figure> + +The agent can only act on repositories included in this installation. + +### 2. Enable the GitHub organization for your Warp team + +Enabling the organization is what tells Warp which team owns the runs triggered from those repositories. + +In the Warp app, a team admin goes to **Settings** > **Admin Panel** > **Platform** and adds the GitHub organization under **Enabled GitHub Orgs**. + +<figure style={{ maxWidth: "563px" }}> +![Enabled GitHub Orgs setting in the Admin Panel Platform section](../../../../assets/agent-platform/admin-panel-enabled-github-orgs.png) +<figcaption>Enabled GitHub Orgs setting in the Admin Panel.</figcaption> +</figure> + +Until the organization is enabled, mentions in its repositories return a comment asking a Warp workspace admin to configure GitHub repository access in the Admin Panel. + +### 3. Configure how GitHub-triggered runs execute + +Configure the integration so every GitHub-triggered run uses the environment and settings your team expects. + +1. Open the <a href={`${VARS.WEB_APP_URL}/integrations`}>Integrations page in the {VARS.WEB_APP}</a>. The **GitHub integration** row shows whether an installation is connected to your team. +2. Open the row's settings and choose the [environment](/platform/environments/) the runs use, plus an optional model, [agent](/platform/agents/), prompt, and secrets. +3. Save the configuration. + +The repository that triggered the event is always cloned for the run, so an environment is optional. Configure one when runs need additional repositories, a specific Docker image, or setup commands. Pick a GitHub environment whose repositories the same installation covers, since the run authenticates with that installation's token. + +:::note +Unlike Slack and Linear, the GitHub integration isn't created with `oz integration create`. It appears once the Warp Factories GitHub App installation is associated with your team in the Admin Panel. +::: + +### 4. Connect your GitHub account + +Each teammate connects their GitHub account so Warp can match the mention to a Warp account, attribute the run to that person, and bill it to the right team. Warp doesn't start a run for a GitHub account it can't match. + +Connect the account from the GitHub integration row in the {VARS.WEB_APP}, or the first time you trigger a run: when Warp can't match your GitHub account, it replies in the thread with a link to connect. + +## Using @warp-agent in GitHub + +Mention the agent and describe the task in the same comment: + +> @warp-agent this test is flaky on CI. Find the race condition and open a PR with a fix. + +On a pull request review comment, the agent also receives the diff for the file you commented on, so you can ask for a targeted change: + +> @warp-agent rename this helper to `parseRepoRef` and update the call sites. + +Warp responds in the thread with a status comment that links to the run, then posts progress updates as the agent works, and finally posts the agent's summary along with any pull requests it opened and branches it pushed. + +## Monitoring runs + +Every GitHub-triggered run is a cloud agent run: + +* **In the thread** - The status comment links to the run in the {VARS.WEB_APP} and, once available, to the live conversation. +* **In the {VARS.WEB_APP}** - The <a href={`${VARS.WEB_APP_URL}/runs`}>Runs page</a> shows the full transcript, status, and metadata. See [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/). +* **In the Warp app** - GitHub-triggered runs appear alongside the rest of your team's runs in the [Agent Management Panel](/platform/managing-cloud-agents/). + +## Permissions and identity + +GitHub-triggered runs separate **what the agent can do on GitHub** from **who the run belongs to**. + +**Access comes from the GitHub App installation.** A run started by an `@warp-agent` mention authenticates with a token minted for the Warp Factories GitHub App installation that delivered the event, not with the mentioning user's GitHub authorization. Cloning, branches, commits, pull requests, and the status comments all use that installation token, so on GitHub the work is attributed to the Warp Factories GitHub App rather than to the person who wrote the mention. The boundary on what the agent can reach is the installation's repository selection, optionally narrowed further by the repository access a Warp admin grants the team in the Admin Panel. Adjust the installation in your [GitHub settings](https://github.com/settings/installations). + +**Identity comes from the account connection.** Warp matches the GitHub account that posted the mention to the Warp account that connected it, not by email address. That binding decides who the run is attributed to in Warp, which team owns it, and whose credits pay for it. The person must be a member of the Warp team that enabled the organization. + +:::caution +Because the run uses the installation's access rather than the mentioner's, anyone who can comment in a repository covered by the installation — and who has a connected GitHub account on that Warp team — can start an agent that acts with all the repository access granted to that team. Grant the app, and the team, only the repositories your team wants agents to work in. +::: + +For fully automated workflows that run without a triggering user, such as scheduled agents or runs started with an agent API key, see [Team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization). + +## Limitations + +* **Mentions only start runs from comments and pull request descriptions.** Issue and pull request titles, commit messages, and edits to an existing comment don't trigger the agent. +* **Bots can't trigger the agent.** Mentions posted by GitHub bots or apps are ignored, so an agent can't start another agent from a comment. +* **One run per thread at a time.** While a run for an issue, pull request, or review thread is active, further mentions become follow-ups to that run. +* **The installation must map to a Warp team.** Repositories in an organization that no Warp team has enabled can't start runs. +* **Installations are scoped to one organization each.** Install the app separately for every GitHub organization whose repositories your team works in. +* **Everything on GitHub is done by the app.** Comments, commits, branches, and pull requests come from Warp Factories rather than the person who mentioned the agent, so the run can't reach anything the installation can't reach, and it isn't narrowed to what that person can reach either. +* **The configured environment must be a GitHub environment.** A GitHub-triggered run rejects an environment built for another provider, such as GitLab or Bitbucket, and asks you to configure a GitHub environment instead. +* **Environment repositories outside the installation stay out of reach.** The installation token only covers the repositories the app is installed on, so a repository in the environment that the installation doesn't cover isn't available to the agent. + +## Troubleshooting + +### Nothing happens after mentioning @warp-agent + +The event never reached Warp, or it was filtered out. Check in this order: + +1. The comment body contains `@warp-agent`, spelled exactly, rather than only the issue or pull request title. +2. The Warp Factories GitHub App is installed on the organization and has access to that repository. +3. The mention was posted by a person. Bot-authored comments are ignored. +4. The comment is new. Editing an existing comment to add the mention doesn't start a run. + +### "Your GitHub account is not connected to Warp" + +Warp received the mention but couldn't match your GitHub account to a Warp account. Use the link in the reply to connect your GitHub account, then mention the agent again. + +### "This repository is not enabled for a Warp team" + +The app is installed, but no Warp team has access to that repository. A Warp workspace admin configures GitHub repository access in **Settings** > **Admin Panel** > **Platform** in the Warp app. + +### "Your Warp account is not a member of any team with access to this repository" + +Your GitHub account is connected, but your Warp account isn't in a team with access to that repository. Ask a team admin to add you to the Warp team. + +### The run starts but fails immediately + +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. + +### The agent finished but opened no pull request + +Confirm the Warp Factories GitHub App installation covers the repository and still grants write access to it. Because the run acts with the installation's token, removing a repository from the installation, or narrowing the app's permissions, stops the agent from pushing branches or opening pull requests there. + +## Removing or changing the integration + +* **Change repository access** - Edit the Warp Factories installation in your [GitHub settings](https://github.com/settings/installations). +* **Stop runs for an organization** - A Warp team admin removes the organization from **Enabled GitHub Orgs** in the Admin Panel. Mentions in its repositories stop starting runs. +* **Remove the integration entirely** - Uninstall the Warp Factories GitHub App from the GitHub organization. GitHub stops delivering events to Warp for every repository in that installation. + +## Related resources + +* [GitHub Actions](/platform/integrations/github-actions/) - Run agents from your own CI workflows with `oz-agent-action`. +* [Integrations overview](/platform/integrations/) - The full set of first-party integrations. +* [Access, billing, and identity](/platform/team-access-billing-and-identity/) - Team GitHub authorization, identity mapping, and credit usage. +* [Environments](/platform/environments/) - Configure the runtime context for cloud agents. +* [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/) - Inspect and share the runs a mention starts. diff --git a/src/content/docs/platform/integrations/gitlab.mdx b/src/content/docs/platform/integrations/gitlab.mdx index 6586594f3..36ca120ba 100644 --- a/src/content/docs/platform/integrations/gitlab.mdx +++ b/src/content/docs/platform/integrations/gitlab.mdx @@ -3,29 +3,41 @@ title: GitLab integration sidebar: label: "GitLab" description: >- - Connect cloud agents to GitLab repos using personal access tokens and - Warp-managed secrets. + Connect cloud agents to GitLab.com repos natively, or use access tokens and + Warp-managed secrets for self-managed instances. --- +import { VARS } from '@data/vars'; -Cloud agents work with any Git repository, including those hosted on GitLab. Unlike GitHub, GitLab does not have a native Warp integration, but you can grant agents access to your GitLab repositories using a personal access token and Warp-managed secrets. Once configured, your environment works with any Oz trigger—Slack, Linear, schedules, or the CLI. +{/* OPEN QUESTION for tech review (PR #549): confirm whether a native OAuth-based GitLab.com integration actually exists today. Our branch's prior copy claimed GitLab has no native integration (token-only); main@79f77e55 (below) claims native GitLab.com support exists. Verify against the product before merging. */} +Cloud agents work natively with repositories hosted on GitLab.com. Connect your GitLab account when you create an environment in the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a>, select the projects agents need, and Warp handles the rest at runtime: repositories are cloned automatically, your GitLab credentials are injected into the run, the `glab` CLI is authenticated, and agents can push branches and open merge requests on your behalf. Merge requests the agent opens are reported as run outputs. -This page explains how to generate a GitLab personal access token, store it securely, and configure a cloud agent environment that clones your repository at runtime. +For self-managed GitLab instances, native connection isn't available yet. Instead, grant agents access using a personal access token and Warp-managed secrets, as described in [Self-managed GitLab instances](#self-managed-gitlab-instances). :::note -This approach works for both GitLab.com and self-hosted GitLab instances. +To route GitLab activity into a factory — merge request events and bot mentions triggering work — see the [GitLab factory integration](/factories/integrations/gitlab/) instead. This page covers standalone cloud agent environments. ::: --- -## Prerequisites +## Connect GitLab.com natively -* A Warp account ([create an account at oz.warp.dev](https://oz.warp.dev)) -* A repository hosted on GitLab (cloud or self-hosted) -* The [Oz CLI](/reference/cli/) installed and authenticated +1. In the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a>, create or edit an [environment](/platform/environments/). +2. Choose GitLab as the repository source and authorize with your GitLab account when prompted. Warp requests the `api` and `read_user` scopes, which grant read and write access to your projects. +3. Select the projects the agent should clone, then finish configuring the environment (Docker image, setup commands). + +At the start of each run, Warp clones the selected repositories and injects your GitLab token, so agents can fetch, push branches, and open merge requests without extra setup. Once configured, the environment works with any {VARS.WARP_AUTOMATION_PLATFORM} trigger—Slack, Linear, schedules, or the CLI. + +:::note +Native GitLab environment creation is available in the {VARS.WEB_APP} only. The `--repo` flag on `oz environment create` accepts GitHub repositories; to script GitLab environments, use the web app or the setup-command approach below. +::: --- -## Step 1: Generate a personal access token +## Self-managed GitLab instances + +Native connection supports GitLab.com only. For a self-managed GitLab instance, generate a personal access token, store it securely, and configure an environment that clones your repository at runtime. + +### Step 1: Generate a personal access token :::note These steps generate a personal access token tied to your GitLab account. If your team prefers a shared bot user, [GitLab project access tokens](https://docs.gitlab.com/user/project/settings/project_access_tokens/) work the same way. @@ -35,18 +47,16 @@ These steps generate a personal access token tied to your GitLab account. If you 2. Click your avatar in the top-right corner, then click **Edit profile**. 3. In the left sidebar, click **Access**, then click **Personal access tokens**. 4. Click **Add new token**. -5. Enter a descriptive name for the token (e.g. `warp-oz-agent`), and choose an expiration date that matches your team's rotation policy. +5. Enter a descriptive name for the token (e.g. `warp-agent`), and choose an expiration date that matches your team's rotation policy. 6. Under **Select scopes**, select **read\_repository**. 7. Click **Generate token**. 8. Copy the token value immediately. GitLab will not show it again. :::note -**read\_repository** is the minimum required scope to clone a repository. If a future workflow requires the agent to push commits or open merge requests, you will also need **write\_repository**. +**read\_repository** is the minimum required scope to clone a repository. If a workflow requires the agent to push commits or open merge requests, you also need **write\_repository**. ::: ---- - -## 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,11 +80,9 @@ If you need to update a secret value, run: oz secret update --value GITLAB_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 GitLab repo via a setup command instead. +Create an environment that uses your token to clone the repository at the start of each agent run. 1. Run the following command: @@ -82,7 +90,7 @@ Create an environment that uses your token to clone the repository at the start oz environment create \ --name "my-gitlab-env" \ --docker-image <image> \ - --setup-command 'git clone https://oauth2:$GITLAB_TOKEN@gitlab.com/your-group/your-repo.git' \ + --setup-command 'git clone https://oauth2:$GITLAB_TOKEN@gitlab.example.com/your-group/your-repo.git' \ --setup-command 'cd your-repo && <install dependencies>' ``` @@ -92,8 +100,7 @@ Use single quotes around setup commands that reference secrets. Double quotes ca 2. Replace the following placeholders: * `<image>` with your Docker image (for example, `node:22`, `python:3.12`, or a [Warp prebuilt dev image](https://github.com/warpdotdev/oz-dev-environments)) - * `gitlab.com/your-group/your-repo.git` with your actual repository URL - * For a self-hosted GitLab instance, replace `gitlab.com` with your server's hostname. + * `gitlab.example.com/your-group/your-repo.git` with your server's hostname and repository path * 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 @@ -102,9 +109,7 @@ Setup commands run on a fresh container for every agent run. Write them to be id 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. @@ -118,12 +123,8 @@ oz agent run-cloud --environment <ENV_ID> --prompt "Your task here" ## Next steps -With your environment configured, you can connect it to any Warp trigger exactly as you would with a GitHub-backed environment: +With your environment configured, you can connect it to any Warp trigger: -* **Slack** — Tag **@Oz** in a message to start an agent run against your GitLab repo. See [Slack](/platform/integrations/slack/). -* **Linear** — Tag **@Oz** on an issue to kick off a workflow. See [Linear](/platform/integrations/linear/). +* **Slack** — Tag **@warp** in a message to start an agent run against your GitLab 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 GitLab merge requests from agent-generated changes is planned as a future enhancement. -::: diff --git a/src/content/docs/platform/integrations/index.mdx b/src/content/docs/platform/integrations/index.mdx index 3f1f45ad4..bd981d9e3 100644 --- a/src/content/docs/platform/integrations/index.mdx +++ b/src/content/docs/platform/integrations/index.mdx @@ -6,20 +6,21 @@ description: >- development workflows. --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; -Warp integrations let your team trigger agents directly from the terminal, or from tools like [Slack](/platform/integrations/slack/), [Linear](/platform/integrations/linear/), and [Jira](/platform/integrations/jira/). Once set up, agents can: +Warp integrations let your team trigger agents directly from the terminal, or from tools like [Slack](/platform/integrations/slack/), [Linear](/platform/integrations/linear/), [Jira](/platform/integrations/jira/), and [GitHub](/platform/integrations/github/). Once set up, agents can: * Read conversation or issue context * Run code inside your codebase in a remote environment * Open pull requests and perform other multi-step agent workflows on your behalf -If you're deciding whether an agent should run from a schedule, Slack, Linear, GitHub Actions, the Oz CLI, or the API, see [Run agents unattended with schedules and triggers](/guides/agent-workflows/how-to-run-unattended-agents/). +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 -For a full walkthrough of Warp's integrations and configurable environments, please refer to [Integration setup](/reference/cli/integration-setup/). +Warp has two distinct GitHub surfaces. The [GitHub integration](/platform/integrations/github/) starts agents when someone mentions `@warp-agent` on an issue, pull request, or review comment, using the Warp Factories GitHub App. [GitHub Actions](/platform/integrations/github-actions/) runs agents inside workflows you define in your own CI pipeline. ::: -All of this is powered by the [Oz CLI](/reference/cli/). +Integrations run on the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) (formerly Oz), which handles the trigger, the [environment](/platform/environments/) the agent executes in, and the record of each run. --- @@ -32,7 +33,9 @@ Use the setup walkthrough below for a quick look at how environments connect to * [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. * [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. -* [GitLab](/platform/integrations/gitlab/), [Bitbucket](/platform/integrations/bitbucket/), and [Azure DevOps](/platform/integrations/azure-devops/) - Connect non-GitHub repositories with tokens and Warp-managed secrets. +* [GitLab](/platform/integrations/gitlab/) - Connect GitLab.com repos natively, or self-managed instances with tokens and Warp-managed secrets. +* [Bitbucket](/platform/integrations/bitbucket/) and [Azure DevOps](/platform/integrations/azure-devops/) - Connect repositories with tokens and Warp-managed secrets. * [AWS, GCP, and other cloud providers](/platform/integrations/cloud-providers/) - Give cloud agents short-lived access to cloud services. * [Managing cloud agents](/platform/managing-cloud-agents/) - Monitor and review integration-triggered runs across your team by source, status, or creator. diff --git a/src/content/docs/platform/integrations/jira.mdx b/src/content/docs/platform/integrations/jira.mdx index 3113df95e..6363debb7 100644 --- a/src/content/docs/platform/integrations/jira.mdx +++ b/src/content/docs/platform/integrations/jira.mdx @@ -5,6 +5,7 @@ sidebar: description: >- Trigger cloud agent runs directly from Jira issues using the warp-agent label. --- +import { VARS } from '@data/vars'; The Jira integration lets your team kick off cloud agent runs directly from Jira Cloud issues. When you add the `warp-agent` label to an issue, an agent starts in the cloud and gets to work — then posts status updates and a summary as Jira comments when it's done. @@ -16,7 +17,7 @@ The Jira integration lets your team kick off cloud agent runs directly from Jira * **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. -* **Jira site admin** - Installing the Oz app in Jira requires site admin permissions. +* **Jira site admin** - Installing the Warp app on your Jira site requires site admin permissions. --- @@ -24,15 +25,15 @@ The Jira integration lets your team kick off cloud agent runs directly from Jira #### 1. Open the Jira app installation page -In the [Oz web app](https://oz.warp.dev/integrations), find Jira and click **Set up**. On the Atlassian installation page, click **Get app**. +In the <a href={`${VARS.WEB_APP_URL}/integrations`}>{VARS.WEB_APP}</a>, find Jira and click **Set up**. On the Atlassian installation page, click **Get app**. -#### 2. Install Oz on your Jira site +#### 2. Install the app on your Jira site -Choose the Jira Cloud site you want to connect, review the requested permissions, and install Oz. Only Jira site admins can install apps. +Choose the Jira Cloud site you want to connect, review the requested permissions, and install the Warp app. Only Jira site admins can install apps. -#### 3. Open the Oz configuration page +#### 3. Open the app configuration page -In your Jira site, open **Manage apps**. Find Oz, open its three-dot actions menu, then click **Configure**. +In your Jira site, open **Manage apps**. Find **Warp**, open its three-dot actions menu, then click **Configure**. The configuration page URL for the production app follows this pattern: @@ -50,19 +51,19 @@ The confirmation page displays **Jira connected** when the connection succeeds. #### 5. (Optional) Configure the default environment, model, and harness -Return to the [Integrations page in the Oz web app](https://oz.warp.dev/integrations), then click **Edit Jira** to set the default [environment](/platform/environments/), model, harness, and agent for Jira-triggered runs. If you don't change these settings, Oz uses your workspace's default configuration. +Return to the <a href={`${VARS.WEB_APP_URL}/integrations`}>Integrations page in the {VARS.WEB_APP}</a>, then click **Edit Jira** to set the default [environment](/platform/environments/), model, harness, and agent for Jira-triggered runs. If you don't change these settings, Jira-triggered runs use your workspace's default configuration. --- ### How to start a run -Add the label **`warp-agent`** to any Jira issue. Oz will pick it up, post a comment to let you know it's started, and begin working through the task using the issue title, description, and recent comments as context. +Add the label **`warp-agent`** to any Jira issue. Warp will pick it up, post a comment to let you know it's started, and begin working through the task using the issue title, description, and recent comments as context. -When the run finishes, Oz posts a summary comment to the issue with links to any pull requests or branches it created, along with a link to the full conversation in Warp. To track runs across your team, open the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app, where Jira-triggered runs appear in the **All** tab. +When the run finishes, Warp posts a summary comment to the issue with links to any pull requests or branches it created, along with a link to the full conversation in Warp. To track runs across your team, open the [Agent Management Panel](/platform/managing-cloud-agents/) in the Warp app, where Jira-triggered runs appear in the **All** tab. #### Connecting your Jira account to Warp -This step is for any user who triggers runs — it doesn't require Jira admin permissions. The first time you trigger a run, Oz posts a comment prompting you to connect your Jira account to Warp. Connecting attributes your Jira-triggered runs to your Warp account; the run doesn't start until your account is connected. After connecting, re-add the `warp-agent` label to start the run. +This step is for any user who triggers runs — it doesn't require Jira admin permissions. The first time you trigger a run, Warp posts a comment prompting you to connect your Jira account to Warp. Connecting attributes your Jira-triggered runs to your Warp account; the run doesn't start until your account is connected. After connecting, re-add the `warp-agent` label to start the run. 1. Follow the link in the comment to open the Warp page in your Jira personal settings. The link for the production app follows this pattern: @@ -78,13 +79,13 @@ The page displays **Jira account connected** when the link succeeds, and the set ### Troubleshooting -If Oz doesn't respond after adding the label, check that: +If Warp doesn't respond after adding the label, check that: -* The Oz app is installed and the workspace is connected (see the app's **Configure** screen in Jira). +* The Warp app is installed on your Jira site and the workspace is connected (see the app's **Configure** screen in Jira). * The issue is in Jira Cloud (not Server or Data Center). :::note -When a Jira-triggered run fails to start, Oz updates its comment on the issue to say it could not start the task. Re-add the `warp-agent` label to try again; a new attempt starts a new comment thread. +When a Jira-triggered run fails to start, Warp updates its comment on the issue to say it could not start the task. Re-add the `warp-agent` label to try again; a new attempt starts a new comment thread. ::: For other issues, reach out to your Warp contact or join the [Warp community on Slack](https://go.warp.dev/join-preview). diff --git a/src/content/docs/platform/integrations/linear.mdx b/src/content/docs/platform/integrations/linear.mdx index 791ee47f4..a29aa1765 100644 --- a/src/content/docs/platform/integrations/linear.mdx +++ b/src/content/docs/platform/integrations/linear.mdx @@ -7,8 +7,9 @@ description: >- pull requests on your behalf. --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; -The Linear integration lets your team delegate development work directly to agents from inside Linear. When you tag @Oz on an issue or comment, an agent will spin up in the cloud, clone the repos defined in your environment, and begin working through the task. +The Linear integration lets your team delegate development work directly to agents from inside Linear. When you tag @warp on an issue or comment, an agent will spin up in the cloud, clone the repos defined in your environment, and begin working through the task. Agents keep you updated inside Linear, generate pull requests using your GitHub account, and provide a link to join a live remote session so you can watch or steer the workflow in real time. @@ -18,18 +19,18 @@ This guide explains what the integration does, how it works end-to-end, and how --- -### Using Oz inside Linear +### Triggering agents inside Linear -Tagging @Oz on an issue or in a Linear comment starts an agent run. Oz clones the repositories defined in your environment, sets up your development environment using your Docker image and setup commands, and begins working through the task with full context from your codebase and the Linear issue. Agents post updates as they progress, including a task list, elapsed time, and checkpoints, so you can follow along without leaving Linear. +Tagging @warp on an issue or in a Linear comment starts an agent run. Warp clones the repositories defined in your environment, sets up your development environment using your Docker image and setup commands, and begins working through the task with full context from your codebase and the Linear issue. Agents post updates as they progress, including a task list, elapsed time, and checkpoints, so you can follow along without leaving Linear. Agents also share a link to an interactive remote session using Warp's [cloud agent session sharing](/platform/viewing-cloud-agent-runs/). Opening this link lets you view the live terminal output for the running agent in Warp or in the browser. From there, you can interrupt or guide the agent with additional instructions when needed. Once the agent finishes, it will create a pull request on your behalf — using your GitHub permissions — and post a summary of its work and the PR link back into Linear. You can start an agent in two ways: -* **Tag @Oz in a comment** and describe what you want done. -* **Assign the issue to Oz** as if it were a teammate. +* **Tag @warp in a comment** and describe what you want done. +* **Assign the issue to @warp** as if it were a teammate. -Oz will acknowledge the request directly in the Linear issue and begin working. +The agent will acknowledge the request directly in the Linear issue and begin working. Agents keep you informed through: @@ -68,9 +69,9 @@ Because PRs are created as _you_, this makes code review, auditing, and team col ### Requirements * **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 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. +* **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. -* **Identity** - You must be logged into Warp with the same email as your Linear workspace. +* **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. * You must have write access to the repo if you want Warp to create PRs on your behalf. @@ -79,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 [Oz CLI](/reference/cli/). For more instructions, see [Integrations Overview](/platform/integrations/). +Setup involves two steps powered by the [{VARS.WARP_AGENT_CLI}](/reference/cli/). For more instructions, see [Integrations Overview](/platform/integrations/). #### 1. Create an environment @@ -92,7 +93,7 @@ An environment defines everything the agent needs to run your code: You can create an environment via: * The CLI -* The guided flow using `/create-environment` ([Slash Commands](/agent-platform/capabilities/slash-commands/)) +* The guided flow using `/create-environment` ([Slash Commands](/agents/capabilities/slash-commands/)) For full instructions, see our [Environment Setup](/platform/integrations/) docs. @@ -101,7 +102,7 @@ For full instructions, see our [Environment Setup](/platform/integrations/) docs Once your environment exists, create the integration. :::note -For easier setup, use the [Oz web app](https://oz.warp.dev) to configure integrations with a guided flow. +For easier setup, use the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> to configure integrations with a guided flow. ::: Alternatively, you can use the CLI: @@ -110,7 +111,7 @@ Alternatively, you can use the CLI: oz integration create linear --environment <ENV_ID> ``` -The CLI will open a browser window prompting you to install the Oz app into your Linear workspace. After installation, the integration becomes available to all members of your Warp team. +The CLI will open a browser window prompting you to install the Warp app into your Linear workspace. After installation, the integration becomes available to all members of your Warp team. :::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: @@ -123,12 +124,12 @@ If the integration cannot be created or a Linear-triggered run cannot start, use ### Uninstallation instructions -To remove the Oz integration from Linear: +To remove the Warp app from Linear: 1. Only a Linear team admin can manage app permissions. 2. In Linear, go to **Settings**. 3. Navigate to Agents under the Features section. -4. Select Oz from the list of installed agents. +4. Select **Warp** from the list of installed agents. 5. Click **Revoke access** to remove the integration for your workspace. <VideoEmbed url="https://www.loom.com/share/2f1648586d8148dc80561c00a09ca334" title="Uninstalling the Warp Linear integration video" /> @@ -137,4 +138,4 @@ After revoking access, Warp will no longer be able to read issues, receive trigg ### Troubleshooting -If something isn't working as expected—missing repos, PR failures, Linear not detecting Oz, or environment issues—see our [Integrations Troubleshooting](/platform/integrations/#troubleshooting) page for detailed guidance on GitHub permissions, environment configuration, and common setup problems. +If something isn't working as expected—missing repos, PR failures, Linear not detecting @Oz, or environment issues—see [common environment issues](/platform/environments/#common-issues) for guidance on GitHub permissions, repo access, Docker images, and setup failures. diff --git a/src/content/docs/platform/integrations/quickstart-github-actions.mdx b/src/content/docs/platform/integrations/quickstart-github-actions.mdx index db41a2bac..54830ef12 100644 --- a/src/content/docs/platform/integrations/quickstart-github-actions.mdx +++ b/src/content/docs/platform/integrations/quickstart-github-actions.mdx @@ -6,6 +6,7 @@ description: >- sidebar: label: "Quickstart" --- +import { VARS } from '@data/vars'; Add agents to your GitHub Actions workflows with [`oz-agent-action`](https://github.com/warpdotdev/oz-agent-action). This quickstart walks you through setting up your first GitHub Actions integration: a PR review workflow that automatically analyzes pull requests and posts inline review comments. @@ -13,7 +14,7 @@ Add agents to your GitHub Actions workflows with [`oz-agent-action`](https://git ## Prerequisites -* **Warp API key** - Create one in the [Oz web app](https://oz.warp.dev/settings). 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](/reference/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. --- @@ -35,7 +36,7 @@ This workflow triggers an agent whenever a PR is opened or marked ready for revi Create `.github/workflows/oz-pr-review.yml` in your repository with the following content: ```yaml -name: Oz PR review +name: Warp PR review on: pull_request: @@ -51,7 +52,7 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Review PR with Oz + - name: Review PR with Warp uses: warpdotdev/oz-agent-action@v1 with: prompt: | @@ -71,14 +72,14 @@ Create a new pull request in your repository to trigger the workflow. To verify the workflow ran: 1. Go to the **Actions** tab in your repository. -2. Click **Oz PR review** in the list of workflows. +2. Click **Warp PR review** in the list of workflows. 3. Select the most recent run to see the agent's output in the job logs. ## 4. View the run -Each `oz-agent-action` step creates a cloud agent run you can inspect from the Oz dashboard: +Each `oz-agent-action` step creates a run you can inspect from the {VARS.DASHBOARD}: -* **Oz web app** - Go to the [Runs page in the Oz web app](https://oz.warp.dev/runs) to see the full run transcript: status, commands executed, files changed, and agent output. See [Viewing Cloud Agent Runs](/platform/viewing-cloud-agent-runs/) for a complete walkthrough. +* **{VARS.WEB_APP}** - Go to the <a href={`${VARS.WEB_APP_URL}/runs`}>Runs page in the {VARS.WEB_APP}</a> to see the full run transcript: status, commands executed, files changed, and agent output. See [Viewing Cloud Agent Runs](/platform/viewing-cloud-agent-runs/) for a complete walkthrough. * **Warp app** - Open the conversations panel to see the run alongside your other agent activity. When the run completes, the agent posts feedback as inline review comments on the PR. @@ -90,5 +91,5 @@ When the run completes, the agent posts feedback as inline review comments on th ## Next steps * **Explore more workflow patterns** - The [oz-agent-action repository](https://github.com/warpdotdev/oz-agent-action) includes ready-to-use consumer workflow templates for responding to `@oz-agent` comments, auto-fixing labeled issues, daily issue summaries, fixing failing CI checks, and suggesting review fixes. Copy any template from `consumer-workflows/` into `.github/workflows/` in your repo. -* **Use skills for reusable behavior** - Replace the inline `prompt` with a `skill` parameter to apply consistent, version-controlled instructions across all your CI workflows. See [Skills](/agent-platform/capabilities/skills/). +* **Use skills for reusable behavior** - Replace the inline `prompt` with a `skill` parameter to apply consistent, version-controlled instructions across all your CI workflows. See [Skills](/agents/capabilities/skills/). * **Read the full reference** - [GitHub Actions](/platform/integrations/github-actions/) covers all action inputs, output handling, session sharing for debugging, and troubleshooting. diff --git a/src/content/docs/platform/integrations/quickstart.mdx b/src/content/docs/platform/integrations/quickstart.mdx index b4b4103b8..1db093854 100644 --- a/src/content/docs/platform/integrations/quickstart.mdx +++ b/src/content/docs/platform/integrations/quickstart.mdx @@ -6,18 +6,19 @@ description: >- sidebar: label: "Quickstart" --- +import { VARS } from '@data/vars'; -Oz integrations let you trigger cloud agents directly from the tools your team already uses. This guide walks you through connecting Oz to Slack. Once set up, anyone on your team can tag @Oz in a message or thread to kick off a cloud agent that runs the task and posts results back to the conversation. +{VARS.WARP_AUTOMATION_PLATFORM} integrations let you trigger cloud agents directly from the tools your team already uses. This guide walks you through connecting Warp to Slack. Once set up, anyone on your team can tag @warp in a message or thread to kick off a cloud agent that runs the task and posts results back to the conversation. :::note -**Want to connect with Linear instead?** The setup is the same — just substitute `slack` with `linear` in the CLI commands, or select Linear in the Oz web app. See [Linear](/platform/integrations/linear/) for details. +**Want to connect with Linear instead?** The setup is the same — just substitute `slack` with `linear` in the CLI commands, or select Linear in the {VARS.WEB_APP}. See [Linear](/platform/integrations/linear/) for details. ::: --- ## Prerequisites -* **Eligible plan** - The Slack integration requires a Warp team on Build, Max, or Business plan with at least 20 credits available. See [Access, Billing, and Identity](/platform/team-access-billing-and-identity/). +* **Eligible team** - The Slack integration requires a Warp team with cloud agents enabled and credits available. See [Access, Billing, and Identity](/platform/team-access-billing-and-identity/). * **A cloud environment** - Agents run inside a configured environment that includes repos and other dependencies. If you don't have one yet, follow the [Cloud Agents Quickstart](/platform/quickstart/) or run `/create-environment` in Warp. * **GitHub authorization** - Warp needs access to your repos to clone code and open PRs. You'll be prompted to authorize the Warp GitHub app when you first create the integration. @@ -25,15 +26,15 @@ Oz integrations let you trigger cloud agents directly from the tools your team a ## 1. Connect the Slack integration -The simplest way to set up the integration is **using the Oz web app**: +The simplest way to set up the integration is **using the {VARS.WEB_APP}**: -1. Navigate to the [Integrations page in the Oz web app](https://oz.warp.dev/integrations). +1. Navigate to the <a href={`${VARS.WEB_APP_URL}/integrations`}>Integrations page in the {VARS.WEB_APP}</a>. 2. Click **Slack**. -3. Follow the guided flow to select your environment and authorize Oz in your Slack workspace. +3. Follow the guided flow to select your environment and authorize the Warp app in your Slack workspace. All members of your Warp team can now use the integration. -**Using the Oz CLI instead:** +**Using the {VARS.WARP_AGENT_CLI} instead:** Run `oz integration create` to connect the Slack integration: @@ -41,7 +42,7 @@ Run `oz integration create` to connect the Slack integration: oz integration create slack --environment <ENV_ID> ``` -Replace `<ENV_ID>` with your environment ID (see [Environments](/platform/environments/) if you need to create one). Find it with `oz environment list` on the Oz CLI or in the [Oz web app](https://oz.warp.dev). The CLI opens a browser window to authorize the Oz app in your workspace. +Replace `<ENV_ID>` with your environment ID (see [Environments](/platform/environments/) if you need to create one). Find it with `oz environment list` on the {VARS.WARP_AGENT_CLI} or in the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a>. The CLI opens a browser window to authorize the Warp app in your workspace. :::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: @@ -58,31 +59,31 @@ oz integration create slack \ --prompt "Always open a draft PR and request review from the team-leads group." ``` -## 2. Tag @Oz in Slack +## 2. Tag the agent in Slack -In any channel or thread in your Slack workspace, tag @Oz with a task: +In any channel or thread in your Slack workspace, tag @warp with a task: -> @Oz scan the authentication module for security issues and summarize what you find +> @warp scan the authentication module for security issues and summarize what you find -Oz acknowledges the request immediately and starts an agent run in the cloud. You'll see progress updates appear in the thread as the agent works. +Warp acknowledges the request immediately and starts an agent run in the cloud. You'll see progress updates appear in the thread as the agent works. -You can also tag @Oz inside an existing thread. Oz picks up the full thread history as context automatically, so you can tag it mid-discussion without repeating background. +You can also tag @warp inside an existing thread. Warp picks up the full thread history as context automatically, so you can tag it mid-discussion without repeating background. ## 3. Watch the run While the agent works, progress updates appear directly in the Slack thread. To inspect the run in more detail: -* **Click the session link** - Oz posts a link in the thread to open a live terminal view of the agent. Watch in real time, add follow-up instructions, or let it run to completion. -* **Go to the [Runs page in the Oz web app](https://oz.warp.dev/runs)** - See the full run transcript: status, commands executed, files changed, and agent output. See [Viewing Cloud Agent Runs](/platform/viewing-cloud-agent-runs/) for a complete walkthrough. +* **Click the session link** - Warp posts a link in the thread to open a live terminal view of the agent. Watch in real time, add follow-up instructions, or let it run to completion. +* **Go to the <a href={`${VARS.WEB_APP_URL}/runs`}>Runs page in the {VARS.WEB_APP}</a>** - See the full run transcript: status, commands executed, files changed, and agent output. See [Viewing Cloud Agent Runs](/platform/viewing-cloud-agent-runs/) for a complete walkthrough. -When the task is complete, Oz posts a summary back to the original Slack thread. +When the task is complete, Warp posts a summary back to the original Slack thread. -**Breaking it down:** Oz reads the Slack thread as context, runs the agent inside the environment you configured — with your repos cloned and Docker image running — and returns results where the conversation started, in Slack, without anyone leaving the thread. +**Breaking it down:** Warp reads the Slack thread as context, runs the agent inside the environment you configured — with your repos cloned and Docker image running — and returns results where the conversation started, in Slack, without anyone leaving the thread. --- ## Next steps -* **Customize agent behavior** - Use a [skill](/platform/skills-as-agents/) as the base prompt for your integration to give Oz consistent, reusable instructions across every run. +* **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. * **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 f35c19add..6f44c9b63 100644 --- a/src/content/docs/platform/integrations/slack.mdx +++ b/src/content/docs/platform/integrations/slack.mdx @@ -6,22 +6,38 @@ description: >- Trigger agents from Slack to run cloud tasks, track progress, and create pull requests. --- +import { VARS } from '@data/vars'; -The Slack integration lets your team trigger cloud agents directly from Slack conversations. Tag @Oz in a message or DM the bot to start a cloud agent that clones your repos, works through the task, posts progress updates, and opens pull requests back into the same thread. +The Slack integration lets your team trigger cloud agents directly from Slack conversations. Tag @Warp in a message or DM the bot to start a cloud agent that clones your repos, works through the task, posts progress updates, and opens pull requests back into the same thread. -### Overview +### Get started -The Slack integration lets your team trigger agents directly from conversations in Slack. When you tag **@Oz** in a message or DM the bot, Warp will start an agent in the cloud, clone the repositories defined in your environment, and begin working through the task with full context from your codebase and the Slack thread. +#### Installation -Agents keep you updated as they work, generate pull requests using your GitHub account, and share a link to a live remote session so you can watch or guide the workflow in real time. +1. Log in to the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> and go to the <a href={`${VARS.WEB_APP_URL}/integrations`}>Integrations page</a>. +2. Click **Connect** next to **Slack**. You'll be prompted to install the Warp app into your Slack workspace. +3. After installing, you're returned to the Integrations page to finish setup: choose the [environment](/platform/environments/) agents should use, which defines the repos, Docker image, and setup commands. +4. Start using Warp in Slack by mentioning **@Warp** with a task. -This page explains what the integration does, how it behaves inside Slack, and how to configure it for your Warp team. +Alternatively, install via the [{VARS.WARP_AGENT_CLI}](/reference/cli/): + +``` +oz integration create slack --environment <ENV_ID> +``` + +The CLI opens a browser window to install the Warp app into your Slack workspace. After installation, the integration is available to all members of your Warp team. + +#### Requirements + +* **Team membership** - The Slack integration requires you to be part of a [Warp team](/knowledge-and-collaboration/teams/). Teams can be created on any plan, including Free. +* **Plan and credits** - Your team must 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. --- -### Using Oz inside Slack +### Using Warp inside Slack -Tagging @Oz in a message or thread starts an agent run. The agent clones the repositories in your environment, sets up your development environment using your Docker image and setup commands, and begins working with the context from the Slack conversation. Oz posts updates back into the thread as it progresses so you can follow along without opening your terminal. +Tagging @Warp in a message or thread starts an agent run. The agent clones the repositories in your environment, sets up your development environment using your Docker image and setup commands, and begins working with the context from the Slack conversation. The bot posts updates back into the thread as it progresses so you can follow along without opening your terminal. Agents also share a link to an interactive remote session using Warp's [cloud agent session sharing](/platform/viewing-cloud-agent-runs/). Opening this link gives you a live terminal view of the cloud agent running your code. You can interrupt or steer the agent by providing additional instructions, and the agent will pick up where it left off with the new context. @@ -31,26 +47,25 @@ When the work is complete, Warp will create a pull request on your behalf using You can start an agent in three ways: -* **Tag @Oz in a channel message** +* **Tag @Warp in a channel message** - Describe the task, and Oz will begin working with full context from the thread. -* **Tag @Oz inside a thread** + Describe the task, and Warp will begin working with full context from the thread. +* **Tag @Warp inside a thread** - Oz will automatically collect the thread's prior messages and use them as context. -* **DM Oz directly** + Warp will automatically collect the thread's prior messages and use them as context. +* **DM the Warp bot directly** Useful for private tasks or experimentation. -Oz will acknowledge the request in Slack and start running the task immediately. +The bot will acknowledge the request in Slack and start running the task immediately. ### Monitoring agent progress Agents keep you informed directly in Slack via: * Activity updates showing progress throughout the run -* An evolving task list and timeline * Checkpoints indicating major steps completed -* A direct link to the Oz run in the [Oz web app](/platform/oz-web-app/), where you can view the full run transcript and metadata +* A direct link to the {VARS.PLATFORM_RUN} in the [{VARS.WEB_APP}](/platform/oz-web-app/), where you can view the full run transcript and metadata * A session-sharing link that opens a live terminal view of the remote agent [Cloud agent session sharing](/platform/viewing-cloud-agent-runs/) works in Warp or in your browser and supports multiple teammates joining the same live session. @@ -59,7 +74,7 @@ To monitor Slack-triggered runs alongside the rest of your team's agents, open t ### Joining the live remote session -Selecting **View Agent** opens the active agent session. Inside the session you’ll see: +Selecting **View conversation** opens the active agent session. Inside the session you’ll see: * The agent’s full execution log * The plan/task list @@ -81,19 +96,7 @@ Because PRs are created as you, the workflow slots seamlessly into your team’s --- -### Requirements - -* **Team membership** - The Slack integration requires you to be part of a [Warp team](/knowledge-and-collaboration/teams/). Teams can be created on any plan, including Free. -* **Plan and credits** - Your team must be on a plan that supports integrations (Build, Max, or Business) and have at least 20 credits available. See [Access, Billing, and Identity](/platform/team-access-billing-and-identity/) for details. -* **Infrastructure** - By default, agents run on Warp-hosted infrastructure. Enterprise teams can [self-host agents](/platform/self-hosting/) on their own infrastructure. -* **Identity** - You must be logged into Warp with the same email used in your Slack workspace. -* **GitHub authorization** - You must authorize the **Warp GitHub app** the first time you trigger a Slack integration request. - * The repositories involved must be included in your environment and accessible to the Warp GitHub app. - * You must have write access for Warp to open PRs on your behalf. - -### How to configure the Slack integration - -Setup involves two steps, powered by the [Oz CLI](/reference/cli/). +### Configuration #### 1. Create an environment @@ -105,7 +108,7 @@ An environment defines everything the agent needs to run your code in the cloud: Create an environment via: -* **Oz CLI** +* **{VARS.WARP_AGENT_CLI}** ```bash oz environment create \ @@ -115,28 +118,22 @@ oz environment create \ --setup-command "<command>" ``` -* **Guided setup using `/create-environment`** ( [Slash Commands](/agent-platform/capabilities/slash-commands/)) +* **Guided setup using `/create-environment`** ( [Slash Commands](/agents/capabilities/slash-commands/)) This flow analyzes your repos, recommends a Docker image, suggests setup commands, and can build + push a custom image if needed. -See the [Environment Setup](/platform/integrations/) docs for detailed instructions. - -#### 2. Create the Slack integration - -Once your environment is ready, create the integration. +See the [Environments](/platform/environments/) docs for detailed instructions. -:::note -For easier setup, use the [Oz web app](https://oz.warp.dev) to configure integrations with a guided flow. -::: +#### 2. Optional: custom prompt -Alternatively, use the CLI: +You can attach a custom prompt that is applied to every agent run: ``` -oz integration create slack --environment <ENV_ID> +oz integration create slack \ + --environment <ENV_ID> \ + --prompt "Always prefix PR titles with '[WARP]' and include detailed test steps." ``` -The CLI will open a browser window to install the Oz app into your Slack workspace. After installation, the integration becomes available to all members of your Warp team. - :::tip If the integration cannot be created or a Slack-triggered run cannot start, use the returned error code to narrow the fix. Common errors include: @@ -144,49 +141,46 @@ If the integration cannot be created or a Slack-triggered run cannot start, use * [`external_authentication_required`](/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/) (missing GitHub or Slack authorization) ::: -You can optionally attach a custom prompt that is applied to every agent run: - -``` -oz integration create slack \ - --environment <ENV_ID> \ - --prompt "Always prefix PR titles with '[WARP]' and include detailed test steps." -``` - ### Identity mapping and team access * Integrations are scoped to your Warp team. * Any teammate in the same Slack workspace and Warp team can use the integration. -* Warp maps Slack users to Warp accounts by email address. +* The first time you mention the bot or DM it, Warp sends you a link to connect your Slack identity to your Warp account. * Teammates must individually authorize GitHub on their first run. --- +### Privacy + +The Warp app reads Slack messages only where it is mentioned or directly messaged: the triggering message, its thread history (used as task context), and your Slack profile information. Message content is used to run the agent task and is handled per the [Warp Privacy Policy](https://www.warp.dev/privacy), which describes how Warp collects, manages, and stores third-party data. + ### Uninstallation instructions -To remove the Oz app from your Slack workspace: +To remove the Warp app from your Slack workspace: 1. Open Slack and go to **Apps** in the left sidebar. -2. Search for Oz. +2. Search for Warp. 3. Select the app, then open the **About** tab. 4. Click **Configuration**. This will open your workspace’s app configuration page in the browser. 5. Scroll to the bottom and select **Remove App**. 6. Confirm the removal. <figure> -![Warpy is just an internal Slackbot, your Warp slackbot should be called Oz.](../../../../assets/agent-platform/delete-warpy.png) -<figcaption>The Oz Slackbot in Slack.</figcaption> +![The Warp Slackbot in a Slack workspace.](../../../../assets/agent-platform/delete-warpy.png) +<figcaption>The Warp Slackbot in Slack.</figcaption> </figure> -![Confirmation dialog to remove the Oz app from a Slack workspace.](../../../../assets/agent-platform/remove-slack-app.png) +![Confirmation dialog to remove the Warp app from a Slack workspace.](../../../../assets/agent-platform/remove-slack-app.png) Once removed, Slack will immediately disable the integration for all teammates. Events for a disabled integration can return [`integration_disabled`](/reference/api-and-sdk/troubleshooting/errors/integration-disabled/). ### Troubleshooting -If something isn't working—missing repos, Slack not detecting @Oz, PR failures, or environment configuration issues—see the [Integrations Troubleshooting](/platform/integrations/#troubleshooting) page. It covers: +If something isn't working—missing repos, Slack not detecting @Warp, PR failures, or environment configuration issues—see [common environment issues](/platform/environments/#common-issues). It covers: * GitHub authorization and repo access -* Docker image pull errors -* Environment visibility -* Email and identity mismatches -* Integration installation issues +* Docker image incompatibility +* Missing credentials and secrets +* Setup commands that fail on a fresh container + +For identity mismatches and installation problems, see [identity mapping and team access](/platform/integrations/slack/#identity-mapping-and-team-access) above. diff --git a/src/content/docs/platform/managing-cloud-agents.mdx b/src/content/docs/platform/managing-cloud-agents.mdx index aadee771c..46b1cdbc2 100644 --- a/src/content/docs/platform/managing-cloud-agents.mdx +++ b/src/content/docs/platform/managing-cloud-agents.mdx @@ -2,21 +2,22 @@ title: Managing cloud agents description: >- Monitor and manage agent activity across your team with Warp's Agent - Management Panel and the Oz web app's Runs page. + Management Panel and the {{WEB_APP}}'s Runs page. sidebar: label: "Managing cloud agents" --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; -Warp provides two management surfaces for tracking and observing agent activity across your account and, where applicable, your team: the **Agent Management Panel** in the Warp app and the [**Runs** page in the Oz web app](/platform/oz-web-app/#runs), which also works on mobile devices. +Warp provides two management surfaces for tracking and observing agent activity across your account and, where applicable, your team: the **Agent Management Panel** in the Warp app and the [**Runs** page in the {VARS.WEB_APP}](/platform/oz-web-app/#runs), which also works on mobile devices. 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. -The Agent Management Panel and Oz web app Runs page are designed to answer, at a glance: +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. * Which runs are working, blocked, failed, succeeded, or canceled. -* Where an agent run was triggered from, such as a local agent conversation, the Oz CLI, Slack, Linear, a schedule, or the API. +* Where an agent run was triggered from, such as a local agent conversation, the {VARS.WARP_AGENT_CLI}, Slack, Linear, a schedule, or the API. * How parent and child runs relate in orchestrated workflows. * Which session to open when you need prompt, plan, command, log, output, or follow-up context. * How many credits those runs consumed. @@ -34,7 +35,7 @@ These management surfaces include your **local (interactive) agents** and [cloud ### What appears in the agent management surfaces -The Agent Management Panel and Oz web app Runs page include two categories of agent activity. +The Agent Management Panel and {VARS.WEB_APP} Runs page include two categories of agent activity. #### Interactive agents @@ -58,7 +59,7 @@ In the **Personal** tab, you can view all of the interactive and cloud agent con ### Inspect or review an agent run -Use the Agent Management Panel or Oz web app Runs page as the starting point when a teammate asks, "What did the agent do?" +Use the Agent Management Panel or {VARS.WEB_APP} Runs page as the starting point when a teammate asks, "What did the agent do?" 1. In the agents list, use the filter menu to filter by source, day, creator, or status. 2. Select the matching row to open the shared session or local conversation. @@ -66,13 +67,13 @@ Use the Agent Management Panel or Oz web app Runs page as the starting point whe 4. Share the session link with teammates if they need to review the same context. 5. For PR-producing workflows, include the session link alongside the PR link so reviewers can inspect both the code diff and the agent's execution context. -For cloud agent runs, the session opens in [Cloud agent session sharing](/platform/viewing-cloud-agent-runs/). For local interactive agents, the conversation opens in Warp and can be shared with [Agent Session Sharing](/agent-platform/local-agents/session-sharing/). +For cloud agent runs, the session opens in [Cloud agent session sharing](/platform/viewing-cloud-agent-runs/). For local interactive agents, the conversation opens in Warp and can be shared with [Agent Session Sharing](/agents/local-agents/session-sharing/). --- ### The agents list -Each row represents a single item in the agents list (either an interactive conversation or a cloud agent run). The list is intended to be scannable: you should be able to understand “what happened” without opening anything. +Each row represents a single item in the agents list (either an interactive conversation or a cloud agent run). The list is scannable: you can understand “what happened” without opening anything. #### Fields you’ll see @@ -80,8 +81,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](/agent-platform/local-agents/overview/) started in the Warp app -* **CLI**: a local run triggered by the [Oz CLI](/reference/cli/) +* **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/) * **Slack / Linear**: runs triggered by [integrations](/platform/integrations/) * **Scheduled**: runs triggered on a [cron schedule](/platform/triggers/scheduled-agents/) @@ -127,9 +128,9 @@ When a parent agent spawns one or more child agents through [multi-agent orchest * **Local children in the Warp app** - while you're viewing the parent agent, an orchestration pill bar above the agent view header shows one pill per child with a live status badge. Click a child pill to switch the pane to that child's conversation in place; click the parent pill - or the breadcrumb that replaces the pill bar while you're viewing a child - to return. Local children don't appear as separate rows in the Agent Management Panel list. * **Cloud children in the Warp app** - appear in the Agent Management Panel list as their own rows alongside the parent and other runs. Filter by source, status, or creator to isolate them. -* **Cloud children in the [Oz web app](/platform/oz-web-app/)** - grouped under the parent's row on the Runs page, and surfaced together inside the parent's detail pane on a **Sub-agents** tab. +* **Cloud children in the [{VARS.WEB_APP}](/platform/oz-web-app/)** - grouped under the parent's row on the Runs page, and surfaced together inside the parent's detail pane on a **Sub-agents** tab. -The parent's own status reflects only its work - a parent can finish successfully while a child is still running or has failed. To verify that an orchestration completed, check each child individually from the pill bar (in the Warp app) or the **Sub-agents** tab (in the Oz web app). +The parent's own status reflects only its work - a parent can finish successfully while a child is still running or has failed. To verify that an orchestration completed, check each child individually from the pill bar (in the Warp app) or the **Sub-agents** tab (in the {VARS.WEB_APP}). ## Related pages @@ -137,4 +138,4 @@ The parent's own status reflects only its work - a parent can finish successfull * [Multi-agent orchestration](/platform/orchestration/) — Parent/child model, run state transitions, and common orchestration patterns. * [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/) — Open and inspect a remote cloud agent run. * [Handoff between local and cloud agents](/platform/handoff/) — Move agent work between local and cloud, or continue a finished cloud run. -* [Oz web app](/platform/oz-web-app/) — Manage runs and schedules from any browser. +* [{VARS.WEB_APP}](/platform/oz-web-app/) — Manage runs and schedules from any browser. diff --git a/src/content/docs/platform/mcp.mdx b/src/content/docs/platform/mcp.mdx index 7dab1dc02..742f964f6 100644 --- a/src/content/docs/platform/mcp.mdx +++ b/src/content/docs/platform/mcp.mdx @@ -6,8 +6,9 @@ description: >- sidebar: label: "MCP servers" --- +import { VARS } from '@data/vars'; -Cloud agents can call external tools through [Model Context Protocol (MCP) servers](/agent-platform/capabilities/mcp/). This lets agents reach beyond the terminal to automatically interact with systems like GitHub, dbt, Sentry, or any custom internal service, whenever the workflow requires it. +Cloud agents can call external tools through [Model Context Protocol (MCP) servers](/agents/capabilities/mcp/). This lets agents reach beyond the terminal to automatically interact with systems like GitHub, dbt, Sentry, or any custom internal service, whenever the workflow requires it. ## When to use MCP servers @@ -32,20 +33,20 @@ Each MCP server entry is keyed by a name you choose. A server config must have * | Transport | Field(s) | When to use | |-----------|----------|-------------| -| Warp-shared server | `warp_id` | Reference an MCP server already configured in Warp by its UUID | +| Warp-shared server | `warp_id` | Reference an MCP server already configured in Warp by its UUID, or a Warp-managed integration server by its id | | Stdio (local process) | `command`, `args` | Launch a local executable as an MCP server | | Streamable HTTP / SSE | `url` | Connect to a remote or locally hosted MCP endpoint | ### Supported fields -* **`warp_id`** — UUID of a Warp-shared MCP server (find UUIDs with `oz mcp list` or from **Settings** > **Agents** > **MCP servers**) +* **`warp_id`** — UUID of a Warp-shared MCP server (find UUIDs with `oz mcp list` or from **Settings** > **Agents** > **MCP servers**), or the id of a Warp-managed integration server: `linear`, `slack`, or `jira` * **`command`** — Executable to launch (stdio transport) * **`args`** — Arguments passed to `command` (only valid with `command`) * **`env`** — Environment variables passed to the process (only valid with `command`) * **`url`** — HTTP or HTTPS endpoint URL (streamable HTTP or SSE transport) * **`headers`** — HTTP headers sent with requests (only valid with `url`) -You may define any number of MCP servers in a single config. +You can define any number of MCP servers in a single config. ### Example configuration @@ -66,7 +67,7 @@ You may define any number of MCP servers in a single config. ``` :::note -If the config passes through a system that pre-processes `{{...}}` before it reaches Oz (for example, Jira/Atlassian Automation), use JSON unicode escapes for the braces: `\u007b\u007bMY_SECRET\u007d\u007d` decodes to `{{MY_SECRET}}`, which Oz resolves normally. +If the config passes through a system that pre-processes `{{...}}` before it reaches the {VARS.WARP_AUTOMATION_PLATFORM} (for example, Jira/Atlassian Automation), use JSON unicode escapes for the braces: `\u007b\u007bMY_SECRET\u007d\u007d` decodes to `{{MY_SECRET}}`, which the {VARS.WARP_AUTOMATION_PLATFORM} resolves normally. ::: ## Using MCP servers in an agent config file @@ -107,6 +108,7 @@ oz agent run-cloud --environment <ENV_ID> -f my-agent-config.json --prompt "Chec * If `mcp_servers` is omitted, the agent runs with no MCP servers enabled. * Each server name must be unique and non-empty. * The `warp_id` transport is validated against your Warp account. Referenced servers must be accessible to you. +* A `warp_id` that names a Warp-managed integration server (`linear`, `slack`, or `jira`) resolves against your team's [integration](/platform/integrations/) connection, but only for a run executing inside a [Warp Factory](/factories/) (`jira` also resolves for a run triggered directly by a Jira event). Outside those cases, or when the integration isn't connected, the server is skipped and the run continues without it. ## Limitations @@ -120,6 +122,6 @@ As a workaround, you can pass Figma mockups as **image context** to the agent, w * [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 -* [Model Context Protocol (MCP)](/agent-platform/capabilities/mcp/) — configuring MCP servers in Warp for local agents +* [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 b8a4d49ab..d21e1f3c3 100644 --- a/src/content/docs/platform/orchestration/index.mdx +++ b/src/content/docs/platform/orchestration/index.mdx @@ -1,12 +1,13 @@ --- title: Multi-agent orchestration -description: Coordinate parent and child agents across local and cloud runs to build supervisor/worker, fan-out, critic, DAG, and swarm workflows on the Oz Platform. +description: Coordinate parent and child agents across local and cloud runs to build supervisor/worker, fan-out, critic, DAG, and swarm workflows in Warp. sidebar: label: "Orchestration" --- 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 [Oz CLI](/reference/cli/), and the [Oz API](/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}](/reference/cli/), and the [{VARS.API_SDK_NAME}](/reference/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. @@ -21,18 +22,18 @@ 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 [Oz web app](/platform/oz-web-app/), and the [Oz API](/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}](/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. ### Where parent and child agents can run The parent and child don't have to run in the same place. Orchestration supports four combinations: -* **Local → local** - a [Warp Agent](/agent-platform/local-agents/overview/) conversation in the Warp app spawns child Warp Agent conversations on the same machine. Useful for trying orchestration patterns without spinning up cloud infrastructure. +* **Local → local** - a [Warp Agent](/agents/) conversation in the Warp app spawns child Warp Agent conversations on the same machine. Useful for trying orchestration patterns without spinning up cloud infrastructure. * **Local → cloud** - a local parent spawns one or more cloud children that run in [environments](/platform/environments/) on Warp-hosted or self-hosted infrastructure. The parent keeps working while children execute in parallel. * **Cloud → cloud** - a cloud parent spawns cloud children that each run in their own environment. This is the canonical pattern for review swarms, large fan-outs, and any orchestration triggered from Slack, Linear, a schedule, or the API. * **Cloud → cloud-local** - a cloud parent spawns children that run inside the parent's own cloud environment, rather than each child getting its own environment. Useful when children need to share state with the parent (a filesystem, a long-running process, a shell session) or when spinning up an environment per child would be wasteful. -Children can also run with a different agent runtime than the parent. A parent running with the default Warp Agent can spawn children that run with [Claude Code](/agent-platform/cli-agents/claude-code/) or [Codex](/agent-platform/cli-agents/codex/), and vice versa. +Children can also run with a different agent runtime than the parent. A parent running with the default Warp Agent can spawn children that run with [Claude Code](/agents/cli-agents/claude-code/) or [Codex](/agents/cli-agents/codex/), and vice versa. ## Run state transitions @@ -51,8 +52,8 @@ 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 Oz web app** - cloud children appear under the parent on the [Runs page](https://oz.warp.dev/runs) and in the parent's **Sub-agents** tab, with their status updating live. -* **The Oz 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. +* **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. ## Messaging between agents @@ -62,7 +63,7 @@ This is how parallel agents stay consistent without sharing mutable state. Each The same messaging infrastructure works across every combination of agent runtimes and execution locations: -* **Harness-agnostic** - the mailbox is the same whether the recipient runs the default Warp Agent, [Claude Code](/agent-platform/cli-agents/claude-code/), [Codex](/agent-platform/cli-agents/codex/), or another agent runtime. A parent running with one harness can message a child running with another, in either direction. +* **Harness-agnostic** - the mailbox is the same whether the recipient runs the default Warp Agent, [Claude Code](/agents/cli-agents/claude-code/), [Codex](/agents/cli-agents/codex/), or another agent runtime. A parent running with one harness can message a child running with another, in either direction. * **Cross-location** - the agent ID is the only address that matters. A local parent can message a cloud child, a cloud parent can message a local-to-cloud child running inside its own environment, and cloud parents can fan out messages to cloud children running in different environments. * **Resumable** - a child whose current run has reached a terminal state (`SUCCEEDED`, `FAILED`, `CANCELLED`, or `ERROR`) is not gone. It is still addressable by its agent ID and will wake up to handle follow-up instructions when the parent sends a new message. @@ -112,14 +113,14 @@ In both cases, approval is required before the parent launches children. Approvi Because every parent and child is tracked as its own conversation or run, the existing observability surfaces work without changes: * **[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. -* **[Oz 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. -* **[Oz API](/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). -* **[Agent notifications](/agent-platform/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. +* **[{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). +* **[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. -* [Oz API and SDK](/reference/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 Oz Platform. +* [{VARS.API_SDK_NAME}](/reference/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. diff --git a/src/content/docs/platform/orchestration/multi-agent-runs.mdx b/src/content/docs/platform/orchestration/multi-agent-runs.mdx index 469cc1150..4cdcdb3d0 100644 --- a/src/content/docs/platform/orchestration/multi-agent-runs.mdx +++ b/src/content/docs/platform/orchestration/multi-agent-runs.mdx @@ -1,12 +1,13 @@ --- title: Running orchestrated agents -description: Start multi-agent orchestrations from the Warp app, the Oz CLI, the Oz web app, or the Oz API, 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 {{API_SDK_NAME}}, 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 Oz CLI, the Oz web app, or the Oz 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. +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. Watch this walkthrough to see how to start and inspect an orchestrated agent run from Warp. @@ -17,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 Oz CLI (`oz agent run-cloud`), the [Oz API](/reference/api-and-sdk/), or any integration (Slack, Linear, schedule). 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}](/reference/api-and-sdk/), or any integration (Slack, Linear, schedule). 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. @@ -63,9 +64,9 @@ This is the recommended way to fan work out from the CLI: the parent decides how If you need to fan out from a script and want each child linked to a specific parent, use the [API](#starting-an-orchestrated-run-from-the-api). `oz agent run-cloud` doesn't currently accept a parent run ID flag, so script-launched runs from the CLI are independent runs. ::: -## Starting an orchestrated run from the Oz web app +## Starting an orchestrated run from the web app -In the Oz web app's [**Runs** page](https://oz.warp.dev/runs): +In the {VARS.WEB_APP}'s <a href={`${VARS.WEB_APP_URL}/runs`}>**Runs** page</a>: 1. Click **New run** in the header. 2. Select an environment and, optionally, a skill that performs orchestration. @@ -118,7 +119,7 @@ Content-Type: application/json } ``` -Setting `parent_run_id` is what links the child to its parent across the Agent Management Panel in the Warp app, the Oz web app Runs page, and the descendants query (`?ancestor_run_id=`). +Setting `parent_run_id` is what links the child to its parent across the Agent Management Panel in the Warp app, the {VARS.WEB_APP} Runs page, and the descendants query (`?ancestor_run_id=`). A scripted fan-out, including parent linking, looks like this: @@ -148,7 +149,7 @@ done ## Retrieving conversations and artifacts -Every parent and child started through the Oz API is tracked as an Oz 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.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: * **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`. @@ -190,7 +191,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. -* [Oz CLI](/reference/cli/) - command reference for `oz agent run-cloud` and `oz run`. -* [Oz API and SDK](/reference/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 Oz web app. +* [{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. +* [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}. * [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 fe714627f..2e0fe0882 100644 --- a/src/content/docs/platform/overview.mdx +++ b/src/content/docs/platform/overview.mdx @@ -1,299 +1,84 @@ --- -title: Oz Platform overview +title: "{{WARP_AUTOMATION_PLATFORM}} overview" description: >- - The Oz Platform provides the CLI, API/SDK, orchestration, environments, and - observability for cloud agents. + How cloud agent runs work on the {{WARP_AUTOMATION_PLATFORM}}: triggers start + tasks, tasks run in environments on a host, and every run leaves a record. sidebar: - label: "Oz platform" + label: "{{WARP_AUTOMATION_PLATFORM}}" --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; -Cloud agents run on the **Oz Platform**. The platform gives you a consistent way to **trigger work**, **orchestrate and track tasks**, **execute agents** (in an optional [environment](/platform/environments/), on a host), and inspect outcomes with team visibility. First-party [integrations](/platform/integrations/) connect external events — like Slack messages, GitHub PRs, or CI failures — to cloud agents automatically. +[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. -<VideoEmbed url="https://youtu.be/poLkJhO7fdo" title="Oz Platform cloud agents overview video" /> +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-09-15, when + the CLI and web app take their new names and the old one stops appearing. */} :::note -**New to cloud agents?** Start with the [Cloud agents quickstart](/platform/quickstart/) to run your first agent in ~10 minutes. -::: - -**Most production setups follow the same flow:** - -1. A **trigger** fires (schedule, integration event, CI step, webhook, API call, or manual run). -2. Warp's **orchestration layer** creates a cloud agent task and tracks its lifecycle. -3. The agent executes on a **host**, optionally inside an environment, using the required configuration and credentials. -4. The task produces a **persistent record** (status, metadata, transcript, outputs) your team can review and manage. - -![Oz Platform architecture showing Trigger, Agent, Environment, and Artifacts components](../../../assets/agent-platform/most-flexible-platform-for-building-with-agents.png) - -![Oz Platform detailed architecture showing components, triggers, orchestrator, and agent runners](../../../assets/agent-platform/oz-diagram.png) - -The sections below describe the Oz Platform primitives that power this flow, and how they compose. - ---- - -### Key concepts - -Before diving into the components, it helps to align on a few terms: - -* **Trigger**: The event that starts work (for example: cron, Slack mention, PR opened, CI failure, “run now”). -* **Task:** The unit of work Warp tracks. A task includes inputs, state, metadata, and an execution record (where it ran, what it did, and what it produced). -* **Context**: Additional inputs attached to a task (for example: a Slack message, PR metadata, CI logs, repository diffs). -* **Outputs:** What the task produced (for example: created a PR, posted a Slack reply, emitted a report, or just a transcript + summary). - -In practice: **triggers create tasks; tasks execute on a host (optionally in an environment); tasks produce outputs.** - ---- - -### Oz CLI - -The [Oz CLI](/reference/cli/) is the **headless interface** for running agents in non-interactive mode. It's commonly used in CI, scripts, and server environments where there is no interactive UI. For interactive workflows, use the [agent](/agent-platform/local-agents/overview/) embedded in Warp's desktop app. - -A key property of the CLI is that it is **cloud-connected**. Even when an agent is started on a local machine or in CI, it reports progress to Warp’s servers. This enables team visibility, session sharing (where supported), and programmatic tracking through the API. - -#### When to use the CLI - -Use the CLI when: - -* You want to run an agent anywhere (local machine, CI runner, remote dev box, server). -* An external system is orchestrating runs (for example GitHub Actions, custom automation, incident tooling). -* You want task observability and auditing without requiring Warp desktop. - -#### How it fits in the Oz Platform - -Depending on the command, the CLI typically: - -* Authenticates as you (or as a member of your team, if applicable). -* Starts work by creating a task in the orchestrator (either directly via CLI commands, or indirectly via an integration/schedule). -* Streams progress back to Warp for live observability and a persistent record. -* Optionally attaches an environment and other configuration. - -#### Example (no environment) - -You can also run an agent locally without an environment using a command like: - -```bash -oz agent run ... -``` - ---- - -### Warp Orchestrator - -The orchestration layer manages the lifecycle of cloud agent tasks. It creates tasks, tracks state transitions, and is the system of record for what’s running and what ran. - -#### What the orchestrator does - -The orchestrator: - -* Runs on Warp's servers (cloud control plane). -* Creates tasks when triggers fire (integrations, schedules, API calls, or explicit starts). -* Tracks lifecycle state (created → running → completed/failed) and associated metadata. -* Exposes task lifecycle operations via the [Oz CLI](/reference/cli/) and a [REST API](/reference/api-and-sdk/) (create tasks, query history, and inspect status/outputs). -* Powers SDKs (TypeScript/Python) for programmatic usage on top of the orchestrator API. -* Supports [multi-agent orchestration](/platform/orchestration/) for parent/child workflows, fan-out, and review swarms. - -#### When teams use the API/SDK - -Teams typically use the API/SDK when: - -* Triggering agents from custom internal systems (incident tools, bots, internal automation). -* Building internal dashboards or monitoring (success rates, runtime, failure reasons). -* Coordinating many runs (fanout, sharding, queueing, retries, rate limiting at the app layer). -* Creating higher-level workflows that treat tasks as building blocks. - ---- - -### Environments - -[Environments](/platform/environments/) define the execution context an agent should run in. - -**An Environment typically includes:** - -* A Docker image (toolchain and runtime). -* One or more repositories (or a workspace definition). -* Startup commands and configuration (setup steps, dependency install, bootstrapping). -* Optional environment variables and other runtime settings. - -:::note -Environments are how teams make agent runs consistent across triggers (Slack, CI, schedules) and across hosts. -::: - -#### Environments are optional - -Agents can run without an environment (for example, against an existing local checkout or a CI workspace). Teams usually move to environments when they want stronger reproducibility, isolation, and standardization. +**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. -#### When to use environments - -Environments are recommended when: - -* The agent needs a consistent toolchain (linters, build tools, language runtimes). -* You want repeatable execution across CI and cloud execution. -* You want standard execution across a team (same repo state rules, same setup steps). -* You want to reduce “works on my machine” variability across tasks. - ---- - -### Oz API and SDK - -The Oz [Agent API](/reference/api-and-sdk/) is the HTTP interface to the Oz Platform. It lets you create and inspect cloud agent tasks from any system (CI, cron, backend services, internal tools), without requiring the Warp desktop app. - -**What you can do with the API** - -* Run an agent by submitting a prompt plus optional configuration (model, environment, MCP servers, base prompt, etc.). -* Monitor execution by listing tasks and tracking state transitions over time (for example: `QUEUED` → `INPROGRESS` → `SUCCEEDED/FAILED`). -* Inspect results and provenance by fetching a task’s full details, including the original prompt, creator/source metadata, session link, and resolved agent configuration. - -**Oz SDKs** - -Oz provides official [Python](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript SDKs](https://github.com/warpdotdev/oz-sdk-typescript) that wrap the Oz API with: - -* Typed requests/responses (autocomplete, fewer schema mistakes) -* Built-in retries and timeouts (with per-request overrides) -* Consistent error types mapped to API status codes -* Helpers for raw responses when you need headers/status/custom parsing - -If you’re building an integration (CI, Slack bots, internal tooling, orchestrators), the [SDKs](/reference/api-and-sdk/) are typically the quickest and safest starting point. - -**SDK vs raw REST** - -* 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. - -:::note -For full endpoint semantics and schema definitions, please refer to the dedicated [API docs](/reference/api-and-sdk/) and Models/Schema reference, plus the [Python SDK](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript SDK](https://github.com/warpdotdev/oz-sdk-typescript) repos for the latest usage/examples. +The `oz` CLI and the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> keep the Oz name until September 15, 2026, which is why you'll still see it in commands and URLs. ::: ---- - -### Execution hosts +<VideoEmbed url="https://youtu.be/poLkJhO7fdo" title={`${VARS.WARP_AUTOMATION_PLATFORM} cloud agents overview video`} /> -A host describes where the agent actually executes. Warp supports multiple execution models depending on your security, compliance, and operational requirements. +## How a run works -#### Warp-hosted execution +Every run follows the same path, whatever starts it: -With Warp hosting: +1. A **trigger** fires: a schedule, an integration event like a Slack mention or a CI failure, an API call, or a manual start. +2. Warp creates a **task**, the tracked record of the run. The trigger's context travels with it: the Slack thread, the PR metadata, the CI logs. +3. The agent executes on a **host**, optionally inside an [environment](/platform/environments/) that defines its image, repos, and setup. +4. The task produces **outputs**: a pull request, a Slack reply, a report, or just a transcript and summary. -* Warp runs the environment on Warp-managed infrastructure. -* This is the default model for teams that want the simplest setup and do not need execution to occur inside their network boundary. -* For more details, see [Warp-hosted execution](/platform/warp-hosting/). +![Flow diagram: a trigger kicks off an agent, which runs in an environment and creates artifacts, on either Warp-hosted or self-hosted infrastructure](../../../assets/agent-platform/most-flexible-platform-for-building-with-agents.png) -#### Self-hosted execution +## Integrations and triggers -With self-hosting: - -* The agent runs on customer-managed infrastructure. -* Oz orchestrator still manages lifecycle and observability. -* This is used when teams want code and execution to remain on their own systems rather than being cloned or executed in Warp's cloud. - -:::note -**Enterprise feature**: Self-hosted execution requires an Enterprise plan. See [Self-hosting](/platform/self-hosting/) for setup instructions. -::: - ---- +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. -### Integrations +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. -[Integrations](/platform/integrations/) connect external events to cloud agent tasks. When an event occurs in a third-party system, Warp creates a task with the relevant context and starts it automatically. +## Tasks and tracking -Warp supports two integration models: - -* **First-party integrations** — Warp manages the event subscription and context extraction end to end. -* **Custom integrations** — you handle event ingestion and filtering, then call the API or SDK to create tasks. - -#### First-party integrations - -First-party integrations can be configured with a simple setup flow (for example via CLI): - -```bash -oz integration create … -``` - -Warp registers webhooks with the third-party system, receives events, extracts context (payload, metadata, links, logs), and creates a task — optionally in an [Environment](/platform/environments/). - -Examples of context extracted by first-party integrations: - -* [Slack](/platform/integrations/slack/): message text, channel, thread, and user identity -* [GitHub](/platform/integrations/github-actions/): PR metadata, diffs, labels, and check results -* CI: logs, job metadata, and artifacts - -#### Custom integrations - -With custom integrations, you own the webhook and event-handling logic. Your system receives an event, applies any filtering or enrichment you need, and then calls the Oz API (directly or via an SDK) to create a task. The resulting task is still a full cloud agent run — observable, manageable, and auditable like any other. - -Custom integrations are a good fit when: - -* You have internal event sources (custom tooling, proprietary systems). -* You need custom filtering, routing, or enrichment before triggering an agent. -* You want to implement your own permissioning, queueing, or governance around triggers. - ---- - -### Secrets - -Cloud agents often need credentials to access external systems (APIs, cloud providers, databases, internal tools, MCP servers). Warp provides a [secrets store](/platform/secrets/) that can inject secrets at runtime so agents can use authenticated tools without exposing secret values in logs or UI. - -#### What secrets are for - -In most deployments, secrets power: - -* API keys and tokens (GitHub, Slack, Linear, internal APIs). -* Shared team credentials (cloud providers, CI identities). -* Database credentials (read-only query bots, reporting). -* Credentials required by MCP servers (static tokens/keys). - -#### Scoping and control - -Today, secrets support two scopes: - -* **Team secrets:** shared credentials available to the team (useful for shared infrastructure). -* **Personal secrets**: credentials tied to an individual (useful when actions must be attributable to a specific person). - ---- +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. -### Management and observability +To fan work out across parent and child agents, see [multi-agent orchestration](/platform/orchestration/). -Cloud agents are designed so task execution is visible to the team. +## Environments -While a task is executing, the agent reports progress and status back to Warp. After completion, the task retains a persistent record for review and debugging. +An [environment](/platform/environments/) defines what a run needs: a Docker image with your toolchain, the repositories to clone, and setup commands. Automated runs (integrations, schedules, API calls) use an environment so every run starts from the same setup; interactive local runs use your machine as-is and don't need one. Define one environment per codebase and reuse it across triggers. -Warp provides multiple surfaces for observability: +## Hosts -* [Management UI](/platform/managing-cloud-agents/): lists tasks, status, timing, metadata, and history. -* [Agent Session Sharing](/agent-platform/local-agents/session-sharing/): authorized teammates can attach to a running task to monitor and, where supported, steer it. -* [APIs](/reference/api-and-sdk/) and SDKs: query task history, build monitoring, and generate reports. +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. -#### Access control +![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) -**Access control is part of the model:** +## The CLI -* Teams can restrict who can run, view, or intervene in agent tasks. -* At the same time, organizations can enable system-wide visibility where appropriate for auditing and operations. +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/). -### Centralized configuration +## API and SDKs -Cloud agent setups often include shared configuration such as: +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. -* [MCP Servers](/platform/mcp/) -* [rules / guardrails](/agent-platform/capabilities/rules/) -* [saved prompts](/knowledge-and-collaboration/warp-drive/prompts/) -* [environment variables](/knowledge-and-collaboration/warp-drive/environment-variables/) -* [secrets](/platform/secrets/) +## Secrets -Warp supports centralized configuration so these settings apply consistently regardless of where a task is launched. +Agents often need credentials for APIs, cloud providers, databases, and MCP servers. Store them as [secrets](/platform/secrets/), and Warp injects them at runtime without exposing the values in logs or the UI. Secrets can be scoped to the whole team or to one person. -This is especially useful when the same workflow can be triggered from multiple places (for example Slack, CI, and schedules). Instead of duplicating setup across systems, teams can keep configuration in one place and reuse it across triggers. +## Shared configuration -### Using the Oz Platform with or without the Warp app +Runs pick up your team's shared setup no matter what triggered them: [MCP servers](/platform/mcp/), [rules](/agents/capabilities/rules/), [saved prompts](/knowledge-and-collaboration/warp-drive/prompts/), and [environment variables](/knowledge-and-collaboration/warp-drive/environment-variables/). Configure these once and every trigger uses them. -[Cloud agents](/platform/) do not require Warp's desktop terminal. Teams can operate cloud agent workflows using: +## Warp Factories -* [Oz CLI](/reference/cli/) — run agents from scripts, CI, or the terminal -* [Oz web app](/platform/oz-web-app/) — visual interface for managing runs, schedules, environments, and integrations from any browser, including mobile -* [Session sharing](/agent-platform/local-agents/session-sharing/) — attach to running tasks to monitor or steer -* [Management UI](/platform/managing-cloud-agents/) — view agent activity and run history -* [APIs and SDKs](/reference/api-and-sdk/) — programmatic access for custom integrations +[Warp Factories](/factories/) builds on these pieces to run persistent, multi-agent development workflows: specialized cloud agents move each work item through triage, specification, implementation, and review. It's in Early Access. [Request access](https://www.warp.dev/factories/request-access) to use it with your team. -**If your team also uses Warp’s terminal, you gain an additional workflow:** +## Where to go next -* Tasks launched via the CLI can be handed off into an interactive session for review, edits, or continuation. -* This is useful when you want a human checkpoint (final edits, validation, merge decisions) without losing the audit trail from the cloud agent run. +* [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. diff --git a/src/content/docs/platform/oz-web-app.mdx b/src/content/docs/platform/oz-web-app.mdx index 26a4235b9..b40860d23 100644 --- a/src/content/docs/platform/oz-web-app.mdx +++ b/src/content/docs/platform/oz-web-app.mdx @@ -1,25 +1,26 @@ --- -title: Oz web app for cloud agents +title: "{{WEB_APP}} for cloud agents" description: >- - Use the Oz web app to manage cloud agents, view runs, create schedules, and + Use the {{WEB_APP}} to manage cloud agents, view runs, create schedules, and configure environments and integrations from any browser or mobile device. sidebar: - label: "Oz web app" + label: "{{WEB_APP}}" --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; -The [Oz web app](https://oz.warp.dev) provides a visual interface for managing cloud agents. You can start runs, browse agents and skills, create schedules, configure environments, and set up integrations—all without installing Warp or using the CLI. +The <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> provides a visual interface for managing cloud agents. You can start runs, browse agents and skills, create schedules, configure environments, and set up integrations—all without installing Warp or using the CLI. :::note -The Oz web app works on mobile devices, so you can monitor and manage your cloud agents from anywhere. +The {VARS.WEB_APP} works on mobile devices, so you can monitor and manage your cloud agents from anywhere. ::: -Watch this short demo to create an environment and run an agent using the Oz web app: -<VideoEmbed url="https://youtu.be/h9Wd77leIYg" title="Oz web app cloud agents walkthrough" /> +Watch this short demo to create an environment and run an agent using the {VARS.WEB_APP}: +<VideoEmbed url="https://youtu.be/h9Wd77leIYg" title={`${VARS.WEB_APP} cloud agents walkthrough`} /> ## Quick reference -<table><thead><tr><th width="150">Page</th><th width="120">Path</th><th>What you can do</th></tr></thead><tbody><tr><td><strong>Runs</strong></td><td><code>/runs</code></td><td>View all runs, filter by status/source/creator, start new runs, inspect transcripts</td></tr><tr><td><strong>Agents</strong></td><td><code>/agents</code></td><td>Browse saved agents, create agents, configure defaults, and start runs</td></tr><tr><td><strong>Skills</strong></td><td><code>/skills</code></td><td>Browse skills from your environments, view suggested skills, create skills for agents, and start runs</td></tr><tr><td><strong>Schedules</strong></td><td><code>/schedules</code></td><td>Create scheduled agents, pause/enable schedules, view run history</td></tr><tr><td><strong>Environments</strong></td><td><code>/environments</code></td><td>Create and manage environments with repos, Docker images, and setup commands</td></tr><tr><td><strong>Secrets</strong></td><td><code>/secrets</code></td><td>Create and manage Warp-managed secrets for cloud agent runs</td></tr><tr><td><strong>Integrations</strong></td><td><code>/integrations</code></td><td>Connect Slack and Linear to trigger agents from external tools</td></tr></tbody></table> +<table><thead><tr><th width="150">Page</th><th width="120">Path</th><th>What you can do</th></tr></thead><tbody><tr><td><strong>Runs</strong></td><td><code>/runs</code></td><td>View all runs, filter by status/source/creator, start new runs, inspect transcripts</td></tr><tr><td><strong>Agents</strong></td><td><code>/agents</code></td><td>Browse saved agents, create agents, configure defaults, and start runs</td></tr><tr><td><strong>Skills</strong></td><td><code>/skills</code></td><td>Browse skills from your environments, view suggested skills, create skills for agents, and start runs</td></tr><tr><td><strong>Schedules</strong></td><td><code>/schedules</code></td><td>Create scheduled agents, pause/enable schedules, view run history</td></tr><tr><td><strong>Environments</strong></td><td><code>/environments</code></td><td>Create and manage environments with repos, Docker images, and setup commands</td></tr><tr><td><strong>Secrets</strong></td><td><code>/secrets</code></td><td>Create and manage Warp-managed secrets for cloud agent runs</td></tr><tr><td><strong>Integrations</strong></td><td><code>/integrations</code></td><td>Connect Slack, Linear, and GitHub to trigger agents from external tools</td></tr></tbody></table> <figure style={{ maxWidth: "563px" }}> ![The Oz web app's Runs page.](../../../assets/agent-platform/oz-web-app-runs-view.png) @@ -28,26 +29,26 @@ Watch this short demo to create an environment and run an agent using the Oz web ## When to use the web app -The Oz web app is ideal when you want to: +The {VARS.WEB_APP} is ideal when you want to: * **Monitor agent activity** — View runs, check status, and inspect outputs from any device * **Start quick runs** — Dispatch agents without opening a terminal * **Manage agents and skills** — Create saved agents, browse skills from connected repositories, and start runs from either configuration * **Manage schedules visually** — Create and edit scheduled agents with a guided interface * **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 +* **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 [Oz CLI](/reference/cli/) or [API](/reference/api-and-sdk/). +For scripting, automation, and CI/CD workflows, use the [{VARS.WARP_AGENT_CLI}](/reference/cli/) or [API](/reference/api-and-sdk/). ## Getting started -When you first sign in to the Oz web app, you'll see a guided onboarding flow that helps you get started based on your goals. +When you first sign in to the {VARS.WEB_APP}, you'll see a guided onboarding flow that helps you get started based on your goals. -The onboarding asks "What brings you to Oz?" and offers three paths: +The onboarding asks "What brings you to the {VARS.WARP_AUTOMATION_PLATFORM}?" and offers three paths: * **Create an agent automation** — Walks you through setting up a scheduled agent, integration-triggered agent, or other automation * **Run Cloud Agents in Warp** — Opens the Warp app (or takes you to the download page) to run cloud agents interactively -* **Build an app that uses agents** — Links to the [Oz Platform](/platform/overview/) docs for using the CLI, SDK, or API +* **Build an app that uses agents** — Links to the [{VARS.WARP_AUTOMATION_PLATFORM}](/platform/overview/) docs for using the CLI, SDK, or API You can skip onboarding at any time to go directly to the Runs page. @@ -82,7 +83,7 @@ To start a new run: ### Inspecting orchestrated runs -The Oz web app renders [multi-agent orchestrations](/platform/orchestration/) as nested rows on the **Runs** page, so you can follow parent and child execution together. +The {VARS.WEB_APP} renders [multi-agent orchestrations](/platform/orchestration/) as nested rows on the **Runs** page, so you can follow parent and child execution together. Open a parent run from the Runs page. When the run has children, the detail pane adds a **Sub-agents** tab next to **Details**: @@ -147,7 +148,7 @@ To create a skill for agents: <figcaption>Creating a skill in the Oz web app.</figcaption> </figure> -After the PR is merged, refresh skills so the new skill appears in the Oz web app. +After the PR is merged, refresh skills so the new skill appears in the {VARS.WEB_APP}. ## Schedules @@ -221,11 +222,11 @@ For advanced environment configuration, see [Environments](/platform/environment ## Integrations -The **Integrations** page (`/integrations`) lets you configure first-party integrations with Slack and Linear. +The **Integrations** page (`/integrations`) lets you configure first-party integrations with Slack, Linear, and GitHub. ### Available integrations -<table><thead><tr><th width="120">Integration</th><th>Description</th></tr></thead><tbody><tr><td><strong>Slack</strong></td><td>Tag @Oz in messages or threads to trigger agents directly from Slack conversations</td></tr><tr><td><strong>Linear</strong></td><td>Tag @Oz on issues to trigger agents from your issue tracker</td></tr></tbody></table> +<table><thead><tr><th width="120">Integration</th><th>Description</th></tr></thead><tbody><tr><td><strong>Slack</strong></td><td>Tag @warp in messages or threads to trigger agents directly from Slack conversations</td></tr><tr><td><strong>Linear</strong></td><td>Tag @warp on issues to trigger agents from your issue tracker</td></tr><tr><td><strong>GitHub</strong></td><td>Mention @warp-agent on issues, pull requests, and review comments to trigger agents from GitHub</td></tr></tbody></table> <figure style={{ maxWidth: "563px" }}> ![The Integrations page in the Oz web app.](../../../assets/agent-platform/oz-web-app-integrations.png) @@ -236,8 +237,10 @@ The **Integrations** page (`/integrations`) lets you configure first-party integ Click an integration to start the guided setup flow. You'll authorize Warp to connect with the external service, select an environment, and configure any integration-specific settings. +The GitHub row works differently. Instead of an authorization flow started here, it reflects the Warp Factories GitHub App installation that a team admin enables in the Admin Panel. Once the installation is associated with your team, use the row to choose the environment, model, agent, prompt, and secrets that GitHub-triggered runs use. + :::note -For detailed integration setup instructions, see [Slack](/platform/integrations/slack/) and [Linear](/platform/integrations/linear/). +For detailed integration setup instructions, see [Slack](/platform/integrations/slack/), [Linear](/platform/integrations/linear/), and [GitHub](/platform/integrations/github/). ::: ## Related resources @@ -248,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 -* [Oz CLI](/reference/cli/) — Command-line interface for running agents -* [Oz API & SDK](/reference/api-and-sdk/) — Programmatic access to 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 diff --git a/src/content/docs/platform/quickstart.mdx b/src/content/docs/platform/quickstart.mdx index 90252574d..b597b592c 100644 --- a/src/content/docs/platform/quickstart.mdx +++ b/src/content/docs/platform/quickstart.mdx @@ -7,8 +7,9 @@ description: >- sidebar: label: "Quickstart" --- +import { VARS } from '@data/vars'; -**Cloud agents** run in a remote environment and can be triggered from events, schedules, integrations, or manually. This enables scaling agents off your laptop, automating development tasks, and building apps on top of agents. Oz handles the orchestration, execution, and observability. +**Cloud agents** run in a remote environment and can be triggered from events, schedules, integrations, or manually. This enables scaling agents off your laptop, automating development tasks, and building apps on top of agents. The {VARS.WARP_AUTOMATION_PLATFORM} handles the orchestration, execution, and observability. Cloud agents can run interactively (where you steer them in real-time) or autonomously (as background tasks). Each run creates a persistent session that your team can inspect, share, and query through the Warp app, the CLI, web app, or API. @@ -16,7 +17,7 @@ This guide walks you through running your first cloud agent with an environment **Common use cases for cloud agents:** -* Launch parallel cloud coding agents to multithread complex development tasks +* Launch [parallel cloud coding agents](/platform/orchestration/) to multithread complex development tasks * Automate repetitive development tasks (e.g., feature-flag cleanup, documentation updates, fixing server crashes) * Build apps on top of agents, like bug triage and incident response systems @@ -27,7 +28,7 @@ This guide walks you through running your first cloud agent with an environment Before you begin, make sure you have: * **Warp desktop app** - Download from the [Warp website](https://www.warp.dev) -* **Warp account** - Create an account from the [Oz web app](https://oz.warp.dev) +* **Warp account** - Create an account from the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> :::note New to Warp? You'll get credits to try cloud agents. You need at least 20 credits available to run cloud agents and integrations. @@ -82,10 +83,10 @@ You can continue conversing with the agent in real-time, watch its progress, and ### 5. View run details You can view details of your agent's run, including commands executed, files changed, and environment used, several different ways: -* In the Warp app, open the [conversations panel](/agent-platform/local-agents/interacting-with-agents/#conversation-panel) to see all your agent runs. +* In the Warp app, open the [conversations panel](/agents/local-agents/interacting-with-agents/#conversation-panel) to see all your agent runs. * Click the session link in your terminal output. -* Go to the [Oz web app](https://oz.warp.dev) and navigate to the **Runs** tab. -* Access from mobile via the [Oz web app](/platform/oz-web-app/). +* Go to the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> and navigate to the **Runs** tab. +* Access from mobile via the [{VARS.WEB_APP}](/platform/oz-web-app/). **Breaking it down:** Every cloud agent run is auto-tracked. You get a shareable link, a run record, and full visibility into what the agent did. You or your teammates can watch the agent's progress in real-time and even steer it if needed. The run record persists after completion so you can review it later. @@ -101,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 [Oz CLI quickstart](/reference/cli/quickstart/) for CLI-based workflows. +**Prefer using the CLI?** See the [{VARS.WARP_AGENT_CLI} quickstart](/reference/cli/quickstart/) for CLI-based workflows. --- @@ -110,9 +111,10 @@ Follow the prompts to save your task definition. Once created, you can run it ag Now that you've run your first cloud agent, try these next steps: * [**Schedule recurring work**](/platform/triggers/scheduled-agents-quickstart/) - Create a scheduled agent for maintenance tasks like dependency checks, cleanup, or triage. -* [**Trigger agents from Slack or Linear**](/platform/integrations/quickstart/) - Connect Oz to team tools so mentions and issue updates can launch cloud agent runs. +* [**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 Oz API or SDKs. +* [**Build programmatic automations**](/reference/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: diff --git a/src/content/docs/platform/runners.mdx b/src/content/docs/platform/runners.mdx index d5f4f2f22..e37047646 100644 --- a/src/content/docs/platform/runners.mdx +++ b/src/content/docs/platform/runners.mdx @@ -3,10 +3,10 @@ title: Cloud agent runners sidebar: label: "Runners" description: >- - Runners define the compute a cloud agent runs on—operating system, CPU - architecture, instance size, and sandbox image. Learn when to use runners and - how to manage them with the Oz CLI. + Runners define the OS, architecture, instance size, and sandbox image cloud + agents run on, managed with the {{WARP_AGENT_CLI}}. --- +import { VARS } from '@data/vars'; 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. @@ -25,7 +25,7 @@ What runners give you: * **Flexible OS targets** – Run agents on Linux with a custom Docker image. macOS runners are in limited preview. * **Independent of environments** – Override an environment's default runner per run without changing the environment itself. -## How runners fit into the Oz Platform +## How runners fit into cloud agent runs A runner is the compute layer for a cloud agent run. When a run starts, Warp provisions a sandbox on the runner's shape, then prepares the workspace defined by the environment (cloning repos and executing setup commands) before the agent begins. @@ -37,7 +37,7 @@ Each environment has a default runner. Specifying a runner for a run overrides t ## Managing runners with the CLI -Use the [Oz 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}](/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. ### Create a runner @@ -118,4 +118,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. -* [Oz CLI reference](/reference/cli/) – Full command-line reference for the Oz platform. +* [{VARS.WARP_AGENT_CLI} reference](/reference/cli/) – Full command-line reference for runners and every other cloud agent command. diff --git a/src/content/docs/platform/secrets.mdx b/src/content/docs/platform/secrets.mdx index 76bf48a56..48e427b8b 100644 --- a/src/content/docs/platform/secrets.mdx +++ b/src/content/docs/platform/secrets.mdx @@ -6,6 +6,7 @@ description: >- Securely store, scope, and inject credentials for Warp cloud agents across CLI, Slack, Linear, and scheduled runs—without ever exposing secret values. --- +import { VARS } from '@data/vars'; Cloud agents often need to interact with external systems such as APIs, databases, cloud providers, or internal tooling. To do this safely, Warp provides Warp-managed **agent secrets**, a secure way to store, scope, and inject credentials into cloud agent runs without exposing secret values to users or logs. @@ -82,13 +83,13 @@ Personal secrets belong to an **individual user**. --- -## Creating secrets in the Oz web app +## Creating secrets in the web app -The [Oz web app](/platform/oz-web-app/) provides a guided side pane for creating Warp-managed secrets. Use it when you want a point-and-click flow without leaving the browser; the CLI flow below remains available for scripting and automation. +The [{VARS.WEB_APP}](/platform/oz-web-app/) provides a guided side pane for creating Warp-managed secrets. Use it when you want a point-and-click flow without leaving the browser; the CLI flow below remains available for scripting and automation. To create a secret in the web app: -1. In the Oz web app (oz.warp.dev), open the **Secrets** page. +1. In the {VARS.WEB_APP} ({VARS.WEB_APP_URL}), open the **Secrets** page. 2. Click **Add secret** to open the **Add secret** side pane. 3. Enter a **Name** (for example, `OPENAI_API_KEY`). This becomes the environment variable name injected into runs. 4. Enter the **Value**. The value is encrypted in your browser before it is sent to the server; Warp never sees the plaintext. @@ -100,7 +101,7 @@ The new secret appears in the Secrets list immediately. Its value is never reada --- -## Managing agent secrets with the Oz CLI +## Managing agent secrets with the CLI Secrets are managed using the `oz secret` command family. @@ -221,7 +222,7 @@ Which secrets an agent receives depends on how the agent was triggered. When an agent is triggered by a specific user, such as: -* Oz CLI +* {VARS.WARP_AGENT_CLI} * Slack mentions * Linear updates @@ -257,9 +258,9 @@ A [cloud environment](/platform/environments/) can declare its own list of secre #### Attach secrets to an environment -Use the environment form in the [Oz web app](/platform/oz-web-app/) to attach secrets to an environment: +Use the environment form in the [{VARS.WEB_APP}](/platform/oz-web-app/) to attach secrets to an environment: -1. In the Oz web app (oz.warp.dev), open the **Environments** page. +1. In the {VARS.WEB_APP} ({VARS.WEB_APP_URL}), open the **Environments** page. 2. Click an existing environment to edit it, or click **New environment** to create one. 3. In the environment form, open the **Secrets** section. 4. Select the team and personal secrets the environment should contribute to each run. Only secret names already in your scope are selectable; values are never displayed. @@ -281,7 +282,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 [Oz API & SDK 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](/reference/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 index 34a4714a4..df73af7ad 100644 --- a/src/content/docs/platform/self-hosting/index.mdx +++ b/src/content/docs/platform/self-hosting/index.mdx @@ -1,10 +1,10 @@ --- title: Self-hosting overview description: >- - Run cloud agents on your own infrastructure. Choose between a managed - worker daemon orchestrated by Oz or unmanaged CLI-based execution you - control. + 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. @@ -20,14 +20,14 @@ Self-hosting lets your team run cloud agent workloads on your own infrastructure 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** — Oz orchestrates agent runs. You run the `oz-agent-worker` daemon on your infrastructure; it connects to Oz and waits for work. Slack mentions, Linear comments, schedules, 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. Oz provides session tracking and observability for each run, but does not start or stop agents for you. +* **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 mentions, Linear comments, schedules, 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** | Oz (Slack, Linear, schedules, API, `run-cloud`) | Your system (CI, cron, scripts) | +| **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 | @@ -46,12 +46,12 @@ If your security requirement is "repository clones and execution must stay on ou With any self-hosted architecture: -* **Agent runs are tracked and steerable** — View status, metadata, and session transcripts in the [Oz dashboard](https://oz.warp.dev), the Warp app, or via the [API/SDK](/reference/api-and-sdk/). Authorized teammates can attach to running sessions to monitor or steer agents. +* **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. BYOLLM currently applies to interactive (local) agents; cloud agent support is coming. +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. ::: --- @@ -67,7 +67,7 @@ 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 Oz to handle starting and stopping agents** (from Slack, the web interface, the Warp app, schedules, or the API)? +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?** @@ -99,13 +99,13 @@ The managed architecture supports three backends for task execution: ## Managed architecture -With the managed architecture, you run the `oz-agent-worker` daemon on your infrastructure. The daemon connects to Oz's backend, waits for tasks to be assigned to it, and executes those tasks on its host using one of three backends: +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 Oz — it can remotely start agents via Slack, Linear, the [Oz web app](https://oz.warp.dev), 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. +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 @@ -158,7 +158,7 @@ All tasks created through that integration route to your self-hosted worker. ### From the API and SDKs -When creating a run via the [Oz API](/reference/api-and-sdk/), include `worker_host` in the config: +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 \ @@ -175,7 +175,7 @@ curl -X POST https://app.warp.dev/api/v1/agent/run \ ### From the web UI -When creating a run, schedule, or integration in the [Oz web app](https://oz.warp.dev), select your self-hosted worker from the host dropdown. +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. --- @@ -197,9 +197,9 @@ Musl-based Docker images (such as Alpine Linux) are not supported as task images Self-hosted runs have the same observability as Warp-hosted runs: -* **Oz dashboard** — View task status, history, and metadata from the [Oz web app](https://oz.warp.dev). +* **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>. * **Session sharing** — Authorized teammates can attach to running tasks to monitor progress. -* **APIs and SDKs** — Query task history and build monitoring using the [Oz API](/reference/api-and-sdk/). +* **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. diff --git a/src/content/docs/platform/self-hosting/managed-direct.mdx b/src/content/docs/platform/self-hosting/managed-direct.mdx index e1b744e94..a2cef140a 100644 --- a/src/content/docs/platform/self-hosting/managed-direct.mdx +++ b/src/content/docs/platform/self-hosting/managed-direct.mdx @@ -1,13 +1,14 @@ --- title: "Managed: Direct backend" description: >- - Run the Oz managed worker with the Direct backend to execute cloud agent + Run the {{WARP_AUTOMATION_PLATFORM}} managed worker with the Direct backend to execute cloud agent tasks directly on the host, without Docker or Kubernetes. sidebar: label: "Managed: Direct" --- +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. Oz 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. +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/). @@ -38,8 +39,8 @@ 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 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 [Oz web app](https://oz.warp.dev/settings) so the worker can authenticate to Oz. 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}** 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. --- @@ -47,7 +48,7 @@ The Direct backend does not provide per-task container isolation. Each task runs ### 1. Set your API key -Export the API key so the worker can authenticate to Oz: +Export the API key so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}: ```bash export WARP_API_KEY="your_agent_api_key" @@ -70,7 +71,7 @@ backend: workspace_root: "/var/lib/oz/workspaces" ``` -**Expected outcome:** The worker connects to Oz and begins listening for tasks. Each assigned task runs in a freshly-created subdirectory of `workspace_root`. +**Expected outcome:** The worker connects to the {VARS.WARP_AUTOMATION_PLATFORM} and begins listening for tasks. Each assigned task runs in a freshly-created subdirectory of `workspace_root`. --- diff --git a/src/content/docs/platform/self-hosting/managed-docker.mdx b/src/content/docs/platform/self-hosting/managed-docker.mdx index 85e26543c..1b083678f 100644 --- a/src/content/docs/platform/self-hosting/managed-docker.mdx +++ b/src/content/docs/platform/self-hosting/managed-docker.mdx @@ -1,13 +1,14 @@ --- title: "Managed: Docker backend" description: >- - Run the Oz managed worker daemon with the Docker backend to execute cloud + Run the {{WARP_AUTOMATION_PLATFORM}} managed worker daemon with the Docker backend to execute cloud agent tasks in isolated containers on your infrastructure. sidebar: label: "Managed: Docker" --- +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 Oz (Slack, Linear, schedules, API, `oz agent run-cloud`). +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/). @@ -26,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 [Oz web app](https://oz.warp.dev/settings) so the worker can authenticate to Oz. 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](/reference/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. @@ -46,7 +47,7 @@ docker info ## Set your API key -Export your agent API key so the worker can authenticate to Oz: +Export your agent API key so the worker can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM}: ```bash export WARP_API_KEY="your_agent_api_key" @@ -70,7 +71,7 @@ docker run -v /var/run/docker.sock:/var/run/docker.sock \ warpdotdev/oz-agent-worker --worker-id "my-worker" ``` -**Expected outcome:** The worker connects to Oz and logs that it's listening for tasks. +**Expected outcome:** The worker connects to the {VARS.WARP_AUTOMATION_PLATFORM} and logs that it's listening for tasks. ### Option 2: Go install @@ -88,9 +89,9 @@ go build -o oz-agent-worker ./oz-agent-worker --api-key "$WARP_API_KEY" --worker-id "my-worker" ``` -Once started, the worker connects to Oz, waits for tasks routed to its `--worker-id`, runs each task in an isolated Docker container, and reports status and results back. The worker automatically reconnects if the connection drops. +Once started, the worker connects to the {VARS.WARP_AUTOMATION_PLATFORM}, waits for tasks routed to its `--worker-id`, runs each task in an isolated Docker container, and reports status and results back. The worker automatically reconnects if the connection drops. -You can run multiple workers with the same `--worker-id` for redundancy — Oz distributes tasks across connected workers. +You can run multiple workers with the same `--worker-id` for redundancy — the {VARS.WARP_AUTOMATION_PLATFORM} distributes tasks across connected workers. --- diff --git a/src/content/docs/platform/self-hosting/managed-kubernetes.mdx b/src/content/docs/platform/self-hosting/managed-kubernetes.mdx index cddee1a43..f13bb13b3 100644 --- a/src/content/docs/platform/self-hosting/managed-kubernetes.mdx +++ b/src/content/docs/platform/self-hosting/managed-kubernetes.mdx @@ -1,16 +1,17 @@ --- title: "Managed: Kubernetes backend" description: >- - Deploy the Oz managed worker into a Kubernetes cluster with the included + Deploy the {{WARP_AUTOMATION_PLATFORM}} managed worker into a Kubernetes cluster with the included Helm chart. Each agent task runs as a Kubernetes Job in your cluster. sidebar: label: "Managed: Kubernetes" --- +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. Oz orchestrates runs end to end (Slack, Linear, schedules, API, `oz agent run-cloud`); your cluster provides the compute, scheduling, and policy enforcement. +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 self-hosted workers](/platform/self-hosting/managed-docker/#routing-runs-to-self-hosted-workers). +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). ::: ## When to use the Kubernetes backend @@ -38,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 [Oz web app](https://oz.warp.dev/settings) so the worker can authenticate to Oz. 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](/reference/cli/api-keys/) for the full creation flow. --- @@ -267,7 +268,7 @@ See [Monitoring](/platform/self-hosting/monitoring/) for the full list of Helm v * [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 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. +* [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. * [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. diff --git a/src/content/docs/platform/self-hosting/monitoring.mdx b/src/content/docs/platform/self-hosting/monitoring.mdx index a66d52f47..9b372cd87 100644 --- a/src/content/docs/platform/self-hosting/monitoring.mdx +++ b/src/content/docs/platform/self-hosting/monitoring.mdx @@ -3,12 +3,12 @@ title: Self-hosted worker monitoring sidebar: label: "Monitoring" description: >- - Monitor self-hosted Oz workers with OpenTelemetry metrics. Export to - Prometheus, OTLP, or console to track worker health, task throughput, - and saturation. + Monitor self-hosted {{WARP_AUTOMATION_PLATFORM}} workers with OpenTelemetry + metrics via Prometheus, OTLP, or console export. --- +import { VARS } from '@data/vars'; -The `oz-agent-worker` daemon exports infrastructure-level metrics over [OpenTelemetry](https://opentelemetry.io/), giving your team real-time visibility into worker health, task throughput, and capacity. Combine these metrics with the [Oz dashboard](https://oz.warp.dev) for full observability across both the orchestration plane and your self-hosted compute. +The `oz-agent-worker` daemon exports infrastructure-level metrics over [OpenTelemetry](https://opentelemetry.io/), giving your team real-time visibility into worker health, task throughput, and capacity. Combine these metrics with the <a href={VARS.WEB_APP_URL}>{VARS.DASHBOARD}</a> for full observability across both the orchestration plane and your self-hosted compute. :::note When running the binary directly, metrics export follows the [OpenTelemetry autoexport](https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/exporters/autoexport) default — if `OTEL_METRICS_EXPORTER` is unset, the worker pushes OTLP to `localhost:4318`. Set `OTEL_METRICS_EXPORTER=none` to disable export. The Helm chart is opt-in: it only enables export when `metrics.enabled=true`. @@ -136,7 +136,7 @@ metrics: All metrics use the `oz_worker_` prefix. Each worker process emits a distinct set of series, identified by the resource attributes `service.name`, `service.version`, `worker.id`, and `worker.backend`. -* **`oz_worker_connected`** (gauge) — `1` while the worker has an active WebSocket connection to Oz's backend, `0` otherwise. +* **`oz_worker_connected`** (gauge) — `1` while the worker has an active WebSocket connection to the {VARS.WARP_AUTOMATION_PLATFORM}'s backend, `0` otherwise. * **`oz_worker_tasks_active`** (gauge / UpDownCounter) — Tasks currently executing on this worker. * **`oz_worker_tasks_max_concurrent`** (gauge) — Configured concurrency limit (`0` means unlimited). * **`oz_worker_tasks_claimed_total`** (counter) — Total tasks accepted since process start. diff --git a/src/content/docs/platform/self-hosting/quickstart.mdx b/src/content/docs/platform/self-hosting/quickstart.mdx index a7cd3a2b6..67deebce4 100644 --- a/src/content/docs/platform/self-hosting/quickstart.mdx +++ b/src/content/docs/platform/self-hosting/quickstart.mdx @@ -1,16 +1,17 @@ --- title: Self-hosting quickstart description: >- - Get a managed self-hosted Oz worker running on Docker and route your first + Get a managed self-hosted {{WARP_AUTOMATION_PLATFORM}} worker running on Docker and route your first cloud agent run to it in under 10 minutes. sidebar: label: "Quickstart" --- +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 Oz 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](/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. ::: --- @@ -19,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 [Oz web app](https://oz.warp.dev/settings) so the worker can authenticate to Oz. 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 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](/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). --- @@ -30,7 +31,7 @@ _~10 minutes_ ### 1. Export your API key -Export the agent API key so the worker container can authenticate to Oz automatically: +Export the agent API key so the worker container can authenticate to the {VARS.WARP_AUTOMATION_PLATFORM} automatically: ```bash export WARP_API_KEY="your_agent_api_key" @@ -46,7 +47,7 @@ docker run -v /var/run/docker.sock:/var/run/docker.sock \ warpdotdev/oz-agent-worker --worker-id "my-worker" ``` -**Expected outcome:** The worker connects to Oz and begins listening for tasks. You should see log output confirming the connection (something like `Connected to Oz` / `Waiting for tasks`). +**Expected outcome:** The worker connects to the {VARS.WARP_AUTOMATION_PLATFORM} and begins listening for tasks. You should see log output confirming the connection (something like `Connected to Oz` / `Waiting for tasks`). :::caution For production deployments, pin to a specific image digest (e.g., `warpdotdev/oz-agent-worker@sha256:...`) instead of the `latest` tag. @@ -54,17 +55,17 @@ For production deployments, pin to a specific image digest (e.g., `warpdotdev/oz ### 3. Route a run to your worker -In a separate terminal on any machine with the Oz CLI, route a cloud agent run to your worker by passing `--host` with the worker ID you chose: +In a separate terminal on any machine with the {VARS.WARP_AGENT_CLI}, route a cloud agent run to your worker by passing `--host` with the worker ID you chose: ```bash oz agent run-cloud --prompt "List the files in the current directory" --host "my-worker" ``` -**Expected outcome:** Oz 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 [Oz dashboard](https://oz.warp.dev) with status moving from `QUEUED` → `INPROGRESS` → `SUCCEEDED`. +**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`. ### 4. Verify the run -Open the [Oz dashboard](https://oz.warp.dev), 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](/agent-platform/local-agents/session-sharing/) to monitor or steer it. +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. --- @@ -73,7 +74,7 @@ Open the [Oz dashboard](https://oz.warp.dev), find the new task, and confirm the * [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. * [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 Oz web app. +* [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. diff --git a/src/content/docs/platform/self-hosting/security-and-networking.mdx b/src/content/docs/platform/self-hosting/security-and-networking.mdx index 0ae922c6e..5b22cef4a 100644 --- a/src/content/docs/platform/self-hosting/security-and-networking.mdx +++ b/src/content/docs/platform/self-hosting/security-and-networking.mdx @@ -1,7 +1,7 @@ --- title: Security and networking description: >- - Security model, data boundaries, and network requirements for self-hosted Oz + Security model, data boundaries, and network requirements for self-hosted {{WARP_AUTOMATION_PLATFORM}} cloud agents — including per-backend considerations and BYOLLM. --- @@ -29,7 +29,7 @@ Self-hosted execution keeps repository clones, source files, build artifacts, ru * LLM inference requests and responses, which include code context from the agent's interactions. :::note -While repositories are cloned and stored only on your infrastructure, code content appears in session transcripts and LLM prompts as part of normal agent operation. All data routed through Warp's backend is covered by [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. +Repositories are cloned and stored only on your infrastructure, but code content can still appear in session transcripts, artifacts, and LLM prompts as part of normal agent operation. Warp does not persistently store your source code or train on it. For retention with customer-supplied inference, see [LLM inference and BYOLLM](#llm-inference-and-byollm). ::: --- @@ -49,11 +49,13 @@ Self-hosted agents **do not require any network ingress**. They require outbound Tasks use the following Docker images: * [`warpdotdev/warp-agent:latest`](https://hub.docker.com/r/warpdotdev/warp-agent) -* [`warpdotdev/warp-xvfb-sidecar:latest`](https://hub.docker.com/r/warpdotdev/warp-xvfb-sidecar) (only if [computer use](/agent-platform/capabilities/computer-use/) is enabled) +* [`warpdotdev/warp-xvfb-sidecar:latest`](https://hub.docker.com/r/warpdotdev/warp-xvfb-sidecar) (only if [computer use](/agents/capabilities/computer-use/) is enabled) * [`warpdotdev/warp-claude-cli-sidecar:latest`](https://hub.docker.com/r/warpdotdev/warp-claude-cli-sidecar) (only if using Claude Code) * [`warpdotdev/warp-codex-cli-sidecar:latest`](https://hub.docker.com/r/warpdotdev/warp-codex-cli-sidecar) (only if using Codex) * The base image specified by your [environment](/platform/environments/) +**Google Cloud Storage (`storage.googleapis.com`)** — port 443, for downloading managed Docker Sandbox tooling sidecar archives (Warp CLI, computer use, and coding CLI tooling), uploading conversation transcripts so conversations can be resumed locally, and providing attachments to the agent. + **GitHub (`github.com`)** — only with the managed architecture, when using a Warp [environment](/platform/environments/) with configured GitHub repositories. **Linux distribution-specific package repositories** — only with the managed architecture, when using a Warp environment whose base image does not have Git pre-installed. The exact repositories depend on the package manager configuration in the environment's base image. @@ -102,9 +104,7 @@ See [GitLab](/platform/integrations/gitlab/) and [Bitbucket](/platform/integrati ## LLM inference and BYOLLM -LLM inference routes through Warp's backend, which has [ZDR](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr) agreements with all contracted model providers. Enterprise teams that need full control over 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. - -BYOLLM currently applies to interactive (local) agents; cloud agent BYOLLM support is coming. +LLM inference routes through Warp's backend. With Warp-managed inference, requests go to contracted providers covered by [ZDR](/enterprise/security-and-compliance/security-overview/#zero-data-retention-zdr) agreements. With customer-supplied inference, provider-side retention follows your team's agreement with that provider. Enterprise teams that want inference routed and billed through their own accounts can use [team-managed model keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/) or [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/); cloud agent support varies by provider, so check each provider's page. --- diff --git a/src/content/docs/platform/self-hosting/troubleshooting.mdx b/src/content/docs/platform/self-hosting/troubleshooting.mdx index 6ad79eeb8..2a53f2b64 100644 --- a/src/content/docs/platform/self-hosting/troubleshooting.mdx +++ b/src/content/docs/platform/self-hosting/troubleshooting.mdx @@ -1,11 +1,12 @@ --- title: Self-hosting troubleshooting description: >- - Diagnose and fix common problems with self-hosted Oz worker daemons across + Diagnose and fix common problems with self-hosted {{WARP_AUTOMATION_PLATFORM}} worker daemons across Docker, Kubernetes, and Direct backends. sidebar: label: "Troubleshooting" --- +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. @@ -45,19 +46,19 @@ The steps below apply to the [managed architecture](/platform/self-hosting/#mana **Fix:** -1. Install the Oz 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](/reference/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. --- ## Worker won't connect -**Cause:** The API key is invalid, expired, or the host cannot reach Oz's backend. +**Cause:** The API key is invalid, expired, or the host cannot reach the {VARS.WARP_AUTOMATION_PLATFORM}'s backend. **Fix:** 1. Confirm your API key is correct, not expired, and has team scope. -2. Regenerate the API key in **Settings** > **Cloud platform** > **Oz Cloud API Keys** if you suspect it's invalid. +2. Regenerate the API key in **Settings** > **Cloud platform** > **API keys** if you suspect it's invalid. 3. Ensure the host has outbound internet access to `oz.warp.dev:443`. 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. @@ -102,7 +103,7 @@ See [Monitoring](/platform/self-hosting/monitoring/) for the full setup guide. **Fix (all backends):** -1. Review task logs in the [Oz dashboard](https://oz.warp.dev) or via [session sharing](/agent-platform/local-agents/session-sharing/). +1. Review task logs in the <a href={VARS.WEB_APP_URL}>{VARS.DASHBOARD}</a> or via [session sharing](/agents/local-agents/session-sharing/). 2. Use `--no-cleanup` to keep the container, Job, or workspace around for inspection after failure. 3. Use `--log-level debug` to see detailed execution logs. 4. Ensure the worker machine or cluster has sufficient resources (CPU, memory, disk). @@ -123,7 +124,7 @@ See [Monitoring](/platform/self-hosting/monitoring/) for the full setup guide. ### Direct backend (task failures) -1. Verify the Oz CLI is accessible. +1. Verify the {VARS.WARP_AGENT_CLI} is accessible. 2. Verify the workspace root directory has write permissions for the user running the worker. --- @@ -152,4 +153,4 @@ See [Monitoring](/platform/self-hosting/monitoring/) for the full setup guide. * [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. -* [Agent Session Sharing](/agent-platform/local-agents/session-sharing/) — Attach to running tasks to debug interactively. +* [Agent Session Sharing](/agents/local-agents/session-sharing/) — Attach to running tasks to debug interactively. diff --git a/src/content/docs/platform/self-hosting/unmanaged.mdx b/src/content/docs/platform/self-hosting/unmanaged.mdx index 25f4f1e72..49cf1d397 100644 --- a/src/content/docs/platform/self-hosting/unmanaged.mdx +++ b/src/content/docs/platform/self-hosting/unmanaged.mdx @@ -6,11 +6,12 @@ description: >- sidebar: label: "Unmanaged" --- +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 Oz 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](/platform/self-hosting/#managed-architecture) instead. ::: ## When to use unmanaged @@ -28,12 +29,12 @@ Unmanaged works on any platform Warp supports (Linux, macOS, Windows) with no de _~5 minutes_ -No Docker, no worker daemon, no environment required — just the Oz CLI on any host that can reach the internet. +No Docker, no worker daemon, no environment required — just the {VARS.WARP_AGENT_CLI} on any host that can reach the internet. ### Prerequisites -* **The Oz 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 [Oz web app](https://oz.warp.dev/settings). 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](/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. ### 1. Authenticate @@ -51,7 +52,7 @@ Invoke `oz agent run` in the directory where you want the agent to operate. The oz agent run --prompt "Refactor the authentication module" --share team ``` -**Expected outcome:** The agent starts immediately in the current working directory, and a tracked session appears in the [Oz dashboard](https://oz.warp.dev). +**Expected outcome:** The agent starts immediately in the current working directory, and a tracked session appears in the <a href={VARS.WEB_APP_URL}>{VARS.DASHBOARD}</a>. ### 3. Control sharing @@ -120,9 +121,9 @@ Whether Kubernetes pods provide sufficient sandboxing for agents depends on your Unmanaged agents are tracked on Warp's backend. Each run creates a persistent session that your team can: -* **View** in the [Oz dashboard](https://oz.warp.dev). -* **Attach to** via [Agent Session Sharing](/agent-platform/local-agents/session-sharing/) to monitor or steer. -* **Query** through the [Oz API/SDK](/reference/api-and-sdk/) for custom dashboards or monitoring. +* **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. 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. @@ -135,5 +136,5 @@ Unmanaged runs don't ship with the bundled declarations script, so end-of-run wo * [Self-hosting overview](/platform/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. -* [Oz CLI](/reference/cli/) — Full CLI reference for `oz agent run` and related commands. -* [Agent Session Sharing](/agent-platform/local-agents/session-sharing/) — Attach to running sessions to monitor or steer them. +* [{VARS.WARP_AGENT_CLI}](/reference/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/skills-as-agents.mdx b/src/content/docs/platform/skills-as-agents.mdx index c6ee42253..e2e7d5ed7 100644 --- a/src/content/docs/platform/skills-as-agents.mdx +++ b/src/content/docs/platform/skills-as-agents.mdx @@ -2,12 +2,13 @@ title: Skills as Agents description: >- Run agents based on skills for consistent, repeatable workflows. Use skills - with local or cloud agents from the CLI, Oz web app, API, or on a schedule. + with local or cloud agents from the CLI, {{WEB_APP}}, API, or on a schedule. sidebar: label: "Skills as agents" --- +import { VARS } from '@data/vars'; -You can start an agent from a [skill](/agent-platform/capabilities/skills/)—a reusable set of instructions that defines what the agent should do. When you run an agent based on a skill, the skill provides the base prompt and behavior, while you supply additional context for that specific run. +You can start an agent from a [skill](/agents/capabilities/skills/)—a reusable set of instructions that defines what the agent should do. When you run an agent based on a skill, the skill provides the base prompt and behavior, while you supply additional context for that specific run. Skills work with both **local agents** (running on your machine) and **cloud agents** (running in Warp's infrastructure). @@ -46,34 +47,52 @@ For cloud agent runs (`oz agent run-cloud`), skills are discovered from reposito **Discovery workflow:** -1. **Create a skill** in your repository (see [Creating skills](/agent-platform/capabilities/skills/#creating-skills)) +1. **Create a skill** in your repository (see [Creating skills](/agents/capabilities/skills/#creating-skills)) 2. **Add the repository** to an environment -3. **The skill appears** in the Agents list in the Oz web app +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 [Oz API](/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}](/reference/api-and-sdk/) reference for details. ::: +### Extra skill directories in cloud runs + +Skills that don't live in a cloned repository's standard skill directories can still be indexed. Set the `WARP_SKILL_DIRS` environment variable to a comma-separated list of skill directories, and a cloud run picks them up alongside the skills it discovers from your repositories. This is useful for skills baked into a custom Docker image, mounted from shared storage, or installed by a setup step outside a repo. + +Set the variable in the environment's Docker image so it's present when the agent starts: + +```dockerfile title="Dockerfile" +ENV WARP_SKILL_DIRS="/opt/team-skills,tooling/skills" +``` + +How the value is interpreted: + +* **Directory layout** - Each entry is a skills directory whose direct children are skill folders containing a `SKILL.md`, the same layout as `.agents/skills/`. Point the variable at the parent directory, not at an individual skill folder. +* **Path resolution** - A leading `~` expands to the home directory. Relative entries resolve against the run's working directory rather than the agent process's current directory, so they stay stable even when setup steps change directories. +* **Precedence** - Skills loaded this way are treated as personal (home) skills, so they stay in scope for the whole run regardless of which directory the agent is working in. Repository skills of the same name still appear separately, as described in [skill name conflicts](/agents/capabilities/skills/#skill-name-conflicts). + +The Warp Agent harness reads `WARP_SKILL_DIRS` directly. For [third-party harnesses](/platform/harnesses/) such as Claude Code and Codex, a cloud run publishes each of these skills into that harness's own skill root before launch, so the harness discovers them through its native skill system. + --- ## Running skill-based agents You can start an agent from a skill using multiple entry points. -### Oz web app +### Web app -Use the [Oz web app](/platform/oz-web-app/) to run skill-based agents from a visual interface. From the web app, you can: +Use the [{VARS.WEB_APP}](/platform/oz-web-app/) to run skill-based agents from a visual interface. From the web app, you can: * Browse all skills available from your environments on the **Agents** page * View suggested agents from Warp's public [oz-skills repository](https://github.com/warpdotdev/oz-skills) * Start a new run by selecting a skill, environment, and prompt * Create scheduled agents that run skills on a cron schedule -For a complete walkthrough of the web app interface, see [Oz Web App](/platform/oz-web-app/). +For a complete walkthrough of the web app interface, see [{VARS.WEB_APP}](/platform/oz-web-app/). ### CLI -Use the `--skill` flag with the Oz CLI: +Use the `--skill` flag with the {VARS.WARP_AGENT_CLI}: ```sh # Run locally with a skill @@ -125,7 +144,7 @@ oz schedule create \ --prompt "Scan for dead code and unused feature flags. Open a PR with removals." ``` -You can also create schedules from the [Oz web app](/platform/oz-web-app/) using the **New schedule** action. +You can also create schedules from the [{VARS.WEB_APP}](/platform/oz-web-app/) using the **New schedule** action. For full scheduling documentation, see [Scheduled Agents](/platform/triggers/scheduled-agents/). @@ -133,7 +152,7 @@ For full scheduling documentation, see [Scheduled Agents](/platform/triggers/sch ## Suggested Skills -The [Oz web app](/platform/oz-web-app/) displays suggested agents from the public [warpdotdev/oz-skills](https://github.com/warpdotdev/oz-skills) repository. These are pre-built skills that demonstrate common use cases and can be used as starting points for your own workflows. +The [{VARS.WEB_APP}](/platform/oz-web-app/) displays suggested agents from the public [warpdotdev/oz-skills](https://github.com/warpdotdev/oz-skills) repository. These are pre-built skills that demonstrate common use cases and can be used as starting points for your own workflows. Suggested skills appear on the Agents page under the **Suggested** filter. @@ -141,9 +160,9 @@ Suggested skills appear on the Agents page under the **Suggested** filter. ## Related resources -* [Skills](/agent-platform/capabilities/skills/) — How to create skills and skill file format +* [Skills](/agents/capabilities/skills/) — How to create skills and skill file format * [Environments](/platform/environments/) — Configure repositories and runtime context for cloud agents * [Scheduled Agents](/platform/triggers/scheduled-agents/) — Run agents automatically on a cron schedule -* [Oz Web App](/platform/oz-web-app/) — Visual interface for managing cloud agents -* [Oz CLI](/reference/cli/) — Command-line interface for running agents -* [Oz API & SDK](/reference/api-and-sdk/) — Programmatic access to cloud agents +* [{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 diff --git a/src/content/docs/platform/software-factory.mdx b/src/content/docs/platform/software-factory.mdx deleted file mode 100644 index 113f4f437..000000000 --- a/src/content/docs/platform/software-factory.mdx +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: Software factory -description: >- - A software factory uses specialized agents to take new issues through triage, spec, implementation, and review, producing pull requests for your team to merge. -sidebar: - label: "Software factory" ---- - -A software factory is a development system where specialized agents take new issues through triage, spec, implementation, and review, producing pull requests for your team to merge. Instead of every developer executing every step — reading each issue, writing specs, implementing changes, reviewing output — agents execute and humans review. The team's job shifts from doing the work to defining the process and raising the quality bar over time. - -Warp uses this model to build Warp itself. The [agent dashboard at build.warp.dev](https://build.warp.dev) shows the work Warp's agents are tackling across the open source repository in real time. - -Read on to learn about the two loops that make up a software factory, the agent roles involved, and how to decide if this model is right for your team. - -## The two loops - -A software factory has two loops that work together. - -**The inner loop** is the execution loop: a triage agent, spec agent, implementation agent, and reviewer agent work in sequence, turning a new issue into a pull request for human review. - -**The outer loop** is the improvement loop: a scheduled agent reviews past inner-loop runs, observes where maintainers made corrections, and opens a pull request to update the skill files that drive the inner-loop agents. Over time, the factory gets better without anyone manually rewriting prompts. - -The inner loop ships software. The outer loop improves the factory that ships it. - -## Agent roles - -A software factory delegates work to specialized agents, each with a narrow responsibility: - -* **Triage agent** - Reviews new issues for clarity and completeness. Labels issues as ready to implement, needs more information, or a duplicate. Flags open questions for the reporter before implementation begins, so the backlog stays clean and actionable. -* **Spec agent** - Drafts a product spec (user stories and acceptance criteria) and a tech spec (implementation strategy, relevant code locations, and edge cases). The specs serve as the blueprint for the implementation agent and the review criteria for the reviewer agent. -* **Implementation agent** - Builds against approved specs. Uses spec context to make better architectural decisions and raises a blocked status when specs are missing or ambiguous rather than guessing. -* **Reviewer agent** - Checks the implementation against specs, code conventions, and security requirements. Posts inline review comments and validates that acceptance criteria are met before a human reviewer opens the PR. - -The [`warpdotdev/oz-for-oss`](https://github.com/warpdotdev/oz-for-oss) repository is the complete reference implementation with all four roles deployed in a working system. - -## How it works - -Each agent role is backed by a **skill**, a markdown file checked into a Git repository that defines the agent's behavior: what to check, how to classify results, what to output, and when to escalate. Skills are versioned, reviewed as code changes, and composable across repositories. - -The inner loop runs when a new issue is filed: - -1. A webhook or GitHub Action triggers the triage agent. The agent runs in a cloud environment, analyzes the issue, and applies labels and comments. -2. When the issue is labeled `ready-to-spec`, the spec agent creates `PRODUCT.md` and `TECH.md` in a `specs/` directory in the repository. -3. A human reviews and approves the specs. -4. When the implementation label is applied, the implementation agent opens a PR that includes the spec files alongside the code. - -Oz orchestrates each agent as a cloud run. Every run has its own environment (repository checkout, secrets, toolchain), its own permissions, and a session link your team can use to inspect what the agent did, steer it mid-run, or hand work back to a local session. - -The outer loop runs on a schedule, not in response to events. - -A scheduled cloud agent collects signals from past inner-loop runs and generates a diff to the relevant skill files. That diff goes through a normal pull request review before merging. Humans decide what improves; agents propose it. - -## When to use a software factory - -A software factory is a strong fit when: - -* Your team has a repeatable development workflow: a backlog of issues with consistent shape, and a process you can write down and teach to an agent. -* The cost of a missed edge case in agent output is recoverable. The agent opens a pull request, not a deploy, so humans stay in control of what ships. -* You want to scale throughput without scaling headcount linearly, or you want to move faster on a large backlog with a small team. - -Start with one agent role. Most teams start with a triage agent, which is the simplest loop to close correctly. A well-groomed backlog immediately benefits every developer on the team. Add spec, implementation, and reviewer agents as you build confidence in each step. - -## Reference implementation - -[`warpdotdev/oz-for-oss`](https://github.com/warpdotdev/oz-for-oss) is Warp's open-source software factory platform for GitHub-hosted repositories. It includes a Vercel webhook layer, GitHub App, and skill files for every agent role in the loop: triage, spec, implementation, review, verification, and self-improvement. Get started with the [onboarding guide](https://github.com/warpdotdev/oz-for-oss/blob/main/docs/onboarding.md). - -## Related pages - -* [Build a triage agent for your issue backlog](/guides/agent-workflows/build-a-triage-agent) — Start the series with the simplest agent role. -* [Write product and tech specs with agents](/guides/agent-workflows/write-product-and-tech-specs-with-agents) — Write specs that guide implementation agents. -* [Set up your software factory](/guides/agent-workflows/set-up-a-software-factory) — Connect the four roles into a working loop. -* [Run a software factory in the cloud](/guides/agent-workflows/run-a-software-factory-in-the-cloud) — Move the loop off your laptop with Oz. -* [Build a self-improving agent](/guides/agent-workflows/build-a-self-improving-agent) — Add the outer improvement loop. -* [Skills](/agent-platform/capabilities/skills) — How skill files work in Warp and Oz. -* [Cloud agents overview](/platform) — Setting up cloud agents on Oz. -* [Deployment patterns](/platform/deployment-patterns) — Common architectures for cloud agent deployment. 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 2d38e7d9a..1a98c73c7 100644 --- a/src/content/docs/platform/team-access-billing-and-identity.mdx +++ b/src/content/docs/platform/team-access-billing-and-identity.mdx @@ -7,6 +7,7 @@ description: >- sidebar: label: "Access, billing, and identity" --- +import { VARS } from '@data/vars'; This page explains how access to cloud agents works for both individual users and teams, how billing and credits apply, and how Warp maps user identities across integrations. @@ -20,11 +21,11 @@ Cloud agents can be used in two ways: * Can run cloud agents via CLI or API * Can use Warp credits, including [cloud agent credits](/support-and-community/plans-and-billing/credits/#compute-credits) * Agents run on Warp-hosted infrastructure -* Cannot use integrations (Slack, Linear) or self-hosted agents +* Cannot use integrations (Slack, Linear, Jira, GitHub) or self-hosted agents **Teams** (users who are part of a [Warp team](/knowledge-and-collaboration/teams/)): * All individual capabilities, plus: -* Can use integrations (Slack, Linear) to trigger agents +* Can use integrations (Slack, Linear, Jira, and the [GitHub integration](/platform/integrations/github/)) to trigger agents * Can self-host agents on their own infrastructure (Enterprise only) * Share team-level configuration (environments, secrets, integrations) * Team must be on Build, Max, or Business plan with at least 20 credits for cloud agents and integrations @@ -37,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 Oz API +* Run agents using `oz agent run-cloud` or the {VARS.API_SDK_NAME} * Credits are drawn from your Warp credits (including cloud agent credits, when applicable) * Agents execute on Warp-hosted infrastructure @@ -49,7 +50,7 @@ Individual users can run cloud agents via the CLI or API without being part of a **What requires a team:** -* Integrations (Slack, Linear) +* Integrations (Slack, Linear, Jira, and the [GitHub integration](/platform/integrations/github/)) * Self-hosted agent execution * Team secrets and shared configuration @@ -61,12 +62,12 @@ A [Warp team](/knowledge-and-collaboration/teams/) is a group of users who share **What teams enable:** -* **Integrations** - Create Slack and Linear integrations that all team members can use +* **Integrations** - Create Slack, Linear, and Jira integrations that all team members can use, and enable the [GitHub integration](/platform/integrations/github/) so teammates can start agents with an `@warp-agent` mention * **Shared configuration** - Team-level environments, secrets, and settings * **Self-hosting** - Run agents on your own infrastructure (Enterprise only) * **Team visibility** - Shared observability into agent runs and history -Integrations are created at the team level, not per-user. Once a Slack or Linear integration is installed, everyone on your Warp team can use **@Oz** in the connected workspace. The integration behaves the same way for all teammates, and everyone shares the same underlying environment configuration. +Integrations are created at the team level, not per-user. Once a Slack or Linear integration is installed, everyone on your Warp team can use **@warp** in the connected workspace. The integration behaves the same way for all teammates, and everyone shares the same underlying environment configuration. The GitHub integration is team-level in the same way: once an admin enables the GitHub organization, any teammate with a connected GitHub account can start a run by mentioning **@warp-agent**. When someone triggers a cloud agent for the first time, Warp may prompt them to grant GitHub authorization so the agent can open pull requests or push branches under their identity. This allows each run to use the correct permissions without requiring additional setup from an admin. @@ -97,40 +98,41 @@ Warp needs a reliable way to know which person a cloud agent run is acting for, * Slack uses a dedicated account-linking flow to map a Slack user to their Warp account. This is the recommended path for Slack-triggered agents, since it doesn’t rely on email matching. * Linear currently maps identities using email address matching. Your Linear email must match your Warp account email for Warp to correctly attribute and scope agent runs. +* The [GitHub integration](/platform/integrations/github/) maps the GitHub account that mentioned `@warp-agent` to the Warp account that connected it, rather than by email. Until a teammate connects their GitHub account, Warp replies in the thread with a link to connect instead of starting a run. That binding sets run attribution, team ownership, and billing; the run's GitHub access comes from the app installation instead. * Each teammate must authorize GitHub before an agent can write PRs or push branches on their behalf -* Agents always operate using the GitHub permissions of the triggering user +* For Slack-triggered, Linear-triggered, and locally triggered runs, agents operate using the GitHub permissions of the triggering user -This ensures runs are scoped to what the user is allowed to see and modify, and that ownership of PRs remains clear across teams and repositories. +This ensures runs are scoped to what the user is allowed to see and modify, and that ownership of PRs remains clear across teams and repositories. The two exceptions are agent API key runs with [team GitHub authorization](#team-github-authorization) and runs started from an `@warp-agent` mention, which both authenticate as the Warp Factories GitHub App installation. --- ## Team GitHub authorization -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 **Oz by Warp** GitHub App instead, so agents can clone repositories and open pull requests without relying on any individual's token. +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. ### How it works -When an agent task is initiated with an agent API key, there is no individual user to authenticate on behalf of. Instead, Warp uses tokens issued by the **Oz by Warp** GitHub App installation to authenticate directly with GitHub. +When an agent task is initiated with an agent API key, there is no individual user to authenticate on behalf of. Instead, Warp uses tokens issued by the **Warp Factories** GitHub App installation to authenticate directly with GitHub. The GitHub App token gives the agent access to the repositories included in the app installation — it can clone repos, create branches, push commits, and open pull requests. During installation, you choose whether the app can access **all repositories** or only **selected repositories** in your GitHub organization, and this controls what agent API key runs can access. ### Setting up team GitHub authorization -1. **Install the Oz by Warp GitHub App.** A user with admin permissions on the GitHub organization installs the [Oz by Warp](https://github.com/apps/oz-by-warp) GitHub App. During installation, grant the app access to **all repositories** or **selected repositories** in your org. +1. **Install the Warp Factories GitHub App.** A user with admin permissions on the GitHub organization installs the [Warp Factories](https://github.com/apps/warp-factories) GitHub App. During installation, grant the app access to **all repositories** or **selected repositories** in your org. :::note There are two places you may encounter this installation flow: - * During the first-time experience for Oz, when you connect your GitHub account. + * During the first-time experience for the {VARS.WARP_AUTOMATION_PLATFORM}, when you connect your GitHub account. * When you click **Configure access on GitHub** in the repository selector while creating an environment. Each installation is scoped to a single GitHub organization or personal account — you can install the app to multiple orgs separately. ::: <figure> - ![Oz by Warp GitHub App installation page showing repository access options](../../../assets/agent-platform/oz-github-app-installation.png) - <figcaption>Installing the Oz by Warp GitHub App.</figcaption> + ![Warp Factories GitHub App installation page showing repository access options](../../../assets/agent-platform/oz-github-app-installation.png) + <figcaption>Installing the Warp Factories GitHub App.</figcaption> </figure> 2. **Enable the GitHub org for your Warp team.** A Warp team admin opens the Admin Panel in the Warp app (**Settings** > **Admin Panel** > **Platform**) and adds the GitHub organization under **Enabled GitHub Orgs**. This associates the GitHub App installation with your Warp team. @@ -140,7 +142,7 @@ There are two places you may encounter this installation flow: <figcaption>Enabled GitHub Orgs setting in the Admin Panel.</figcaption> </figure> -3. **Use an agent API key.** Tasks initiated with an agent API key on the team now use tokens from the GitHub App installation to clone repos and push changes. No individual GitHub authorization is needed. On GitHub, commits and pull requests are opened by the Oz by Warp GitHub App rather than any individual user; in the Oz dashboard, the run is attributed to the bound [cloud agent](/platform/agents/). +3. **Use an agent API key.** Tasks initiated with an agent API key on the team now use tokens from the GitHub App installation to clone repos and push changes. No individual GitHub authorization is needed. On GitHub, commits and pull requests are opened by the Warp Factories GitHub App rather than any individual user; in the {VARS.DASHBOARD}, the run is attributed to the bound [cloud agent](/platform/agents/). ### How this relates to environments @@ -149,16 +151,17 @@ An [environment](/platform/environments/) is a template for a cloud agent's sand The environment configuration and the **Enabled GitHub Orgs** setting in the Admin Panel serve different purposes: * **Environment repo list** - "This agent needs repos A, B, and C." -* **Enabled GitHub Orgs** - "This team can use the Oz by Warp GitHub App to access repos in this GitHub organization." +* **Enabled GitHub Orgs** - "This team can use the Warp Factories GitHub App to access repos in this GitHub organization." ### Personal tokens vs. GitHub App tokens Team GitHub authorization is complementary to the existing personal token flow: -* **User-triggered runs** (personal API key, Slack, Linear, Warp app) - The agent authenticates as Oz acting on the triggering user's behalf. PRs and commits are attributed to that user. -* **Agent API key runs with GitHub App authorization** - The agent authenticates as the GitHub App installation. On GitHub, PRs and commits are attributed to the Oz by Warp GitHub App rather than any individual user. In the Oz dashboard, the run is attributed to the bound [cloud agent](/platform/agents/), which controls run filtering and audit attribution on the Warp side. +* **User-triggered runs** (personal API key, Slack, Linear, Warp app) - The agent authenticates using the triggering user's personal token. PRs and commits are attributed to that user. +* **Agent API key runs with GitHub App authorization** - The agent authenticates as the GitHub App installation. On GitHub, PRs and commits are attributed to the Warp Factories GitHub App rather than any individual user. In the {VARS.DASHBOARD}, the run is attributed to the bound [cloud agent](/platform/agents/), which controls run filtering and audit attribution on the Warp side. +* **[GitHub integration](/platform/integrations/github/) runs** (an `@warp-agent` mention on an issue or pull request) - The agent authenticates as the installation that delivered the event, so its repository access and its GitHub attribution match the agent API key flow. In the {VARS.DASHBOARD} the run is still attributed to the teammate who wrote the mention, and their team is billed. -Both flows can coexist on the same team. Personal tokens are still used for user-triggered runs, and the GitHub App installation token is used when a task is initiated with an agent API key. +These flows can coexist on the same team. Personal tokens are still used for user-triggered runs from a personal API key, Slack, Linear, and the Warp app, and the GitHub App installation token is used for agent API key runs and for GitHub integration runs. :::caution GitHub App installation tokens are scoped to a single GitHub organization at a time. If your team works across repos in multiple GitHub organizations, the agent can only use the installation token for the organization enabled in the Admin Panel. Repos in other organizations require user-triggered runs with a personal API key. @@ -174,14 +177,14 @@ To change which repositories the GitHub App can access, edit the app installatio #### Slack / Linear -Installing the Oz app gives Warp access to the Slack channels or Linear teams where the app is installed. +Installing the {VARS.WARP_AUTOMATION_PLATFORM} app gives Warp access to the Slack channels or Linear teams where the app is installed. **When a run is triggered, Warp receives:** * The content of the tagged thread or issue * Relevant surrounding context used to build the agent prompt -Warp stores only the content required for the agent to complete its task. You can message @Oz directly, mention it in channels, or tag it on specific issues depending on the integration. +Warp stores only the content required for the agent to complete its task. You can message @warp directly, mention it in channels, or tag it on specific issues depending on the integration. #### GitHub @@ -199,6 +202,8 @@ Warp’s behavior in GitHub is defined by two layers of control: * Are included in the environment configuration * Are accessible to both the GitHub app and the triggering user. +Runs triggered by an `@warp-agent` mention through the [GitHub integration](/platform/integrations/github/) follow the first layer only. Warp receives the content of the issue, pull request, or review thread that carried the mention, including the recent comments and the diff of a commented file, and the run authenticates with the GitHub App installation that delivered the event. Cloning, commits, branches, pull requests, and status comments all use that installation's access rather than the mentioning user's, so the installation's repository selection is the only boundary on what those runs can reach. The repository that triggered the mention is cloned alongside any repositories in the configured environment, and only the repositories that installation covers are available to the agent. + --- ## Additional notes: how cloud agents use credits @@ -225,7 +230,7 @@ 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 owner's add-on credits. With auto-reload off, the request is blocked when both pools are depleted. With auto-reload on, usage can trigger a reload on the owner's add-on credit 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 Oz by Warp 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](/reference/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/). diff --git a/src/content/docs/platform/triggers/index.mdx b/src/content/docs/platform/triggers/index.mdx index a72fc16dc..a16756bc2 100644 --- a/src/content/docs/platform/triggers/index.mdx +++ b/src/content/docs/platform/triggers/index.mdx @@ -4,18 +4,21 @@ description: >- Configure triggers to run cloud agents automatically based on schedules or events. --- +import { VARS } from '@data/vars'; -Triggers allow you to run cloud agents automatically without manual intervention. You can set up agents to run on schedules, in response to webhooks, or through other automation patterns. +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. 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 Actions, the Oz CLI, or the API, start with [Run agents unattended with schedules and triggers](/guides/agent-workflows/how-to-run-unattended-agents/). +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/). ## 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 Oz CLI. +* **[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. -* **[Integrations](/platform/integrations/)** - Trigger agents from external services like Slack, Linear, or GitHub Actions. +* **[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. -After a trigger fires, track and review the resulting runs across your team from the [Agent Management Panel and Oz web app Runs page](/platform/managing-cloud-agents/), where you can filter by source, status, day, or creator. +After a trigger fires, track and review the resulting runs across your team from the [Agent Management Panel and {VARS.WEB_APP} Runs page](/platform/managing-cloud-agents/), where you can filter by source, status, day, or creator. diff --git a/src/content/docs/platform/triggers/scheduled-agents-quickstart.mdx b/src/content/docs/platform/triggers/scheduled-agents-quickstart.mdx index ca1a342fc..9ef9ae73e 100644 --- a/src/content/docs/platform/triggers/scheduled-agents-quickstart.mdx +++ b/src/content/docs/platform/triggers/scheduled-agents-quickstart.mdx @@ -7,8 +7,9 @@ sidebar: label: "Quickstart" --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; -Scheduled agents are cloud agents that run on a recurring cron schedule, handling recurring tasks automatically without manual triggers. This guide walks you through setting up an agent that triages your GitHub bug reports every week, checks whether each issue has enough detail to investigate, and posts follow-up comments when information is missing. You'll use a prebundled skill and the Oz web app; no CLI or custom code required. +Scheduled agents are cloud agents that run on a recurring cron schedule, handling recurring tasks automatically without manual triggers. This guide walks you through setting up an agent that triages your GitHub bug reports every week, checks whether each issue has enough detail to investigate, and posts follow-up comments when information is missing. You'll use a prebundled skill and the {VARS.WEB_APP}; no CLI or custom code required. Watch this short demo of creating and testing a scheduled agent: <VideoEmbed url="https://youtu.be/M-zyyrGt2ug" title="Scheduled agents quickstart walkthrough" /> @@ -24,14 +25,28 @@ Watch this short demo of creating and testing a scheduled agent: ## 1. Set up a scheduled agent -1. From the [Schedules page](https://oz.warp.dev/schedules) in the Oz web app, click **New schedule**. -2. Enter a name, e.g. `Weekly bug report triage`. -3. Under **Agent**, select **github-bug-report-triage** from the suggested skills. -4. Choose your environment. -5. Under **Frequency**, choose a preset or enter a custom cron expression (e.g., `0 9 * * 1` for every Monday at 9 AM). -6. Click **Create schedule**. +1. From the <a href={`${VARS.WEB_APP_URL}/schedules`}>Schedules page</a> in the {VARS.WEB_APP}, click **New schedule**. +2. Enter a schedule name, e.g. `Weekly bug report triage`. +3. Expand **General**, then under **Agent**, choose the identity that will run the schedule. **Quick run** is the default and runs every execution as you. See [Run identity and pull request authorship](#run-identity-and-pull-request-authorship) before you decide. +4. Under **Skills**, select **github-bug-report-triage**. +5. Choose your environment. +6. Under **Frequency**, choose a preset or enter a custom cron expression (e.g., `0 9 * * 1` for every Monday at 9 AM). +7. Click **Create schedule**. -**Breaking it down:** The schedule lives in Oz's cloud infrastructure. Unlike a local cron job, it fires even when your machine is off. Each run starts a fresh, isolated session with no state carried over from previous executions, and every run is tracked and reviewable in the [Oz web app](/platform/oz-web-app/). +**Breaking it down:** The schedule lives in the {VARS.WARP_AUTOMATION_PLATFORM}'s cloud infrastructure. Unlike a local cron job, it fires even when your machine is off. Each run starts a fresh, isolated session with no state carried over from previous executions, and every run is tracked and reviewable in the [{VARS.WEB_APP}](/platform/oz-web-app/). + +### Run identity and pull request authorship + +The **Agent** setting controls the identity behind every run, which determines how the agent authenticates to GitHub: + +* **Quick run** (default) - Runs execute as the user who created the schedule, using that person's GitHub credentials. Pull requests the agent opens are authored by that person. +* **Cloud agent** - Runs execute as the [cloud agent](/platform/agents/) you select. With [team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization) configured, the agent authenticates as the **Warp Factories** GitHub App, so pull requests are authored by the app instead of an individual. + +Choose a cloud agent for any schedule that opens pull requests. Pull requests authored by the app are clearly attributable to automation, and anyone on the team can review and approve them — including the person who created the schedule, who cannot approve a pull request authored by their own account. + +:::caution +The {VARS.WARP_AGENT_CLI} has no **Agent** flag, so a schedule created with `oz schedule create` always runs as its creator. To run it as a cloud agent, set **Agent** on the schedule in the {VARS.WEB_APP} after creating it. +::: --- @@ -39,12 +54,12 @@ Watch this short demo of creating and testing a scheduled agent: To verify your setup without waiting for the schedule to fire, trigger a test run now: -1. From the [Schedules page](https://oz.warp.dev/schedules) in the Oz web app, click the schedule you just created. +1. From the <a href={`${VARS.WEB_APP_URL}/schedules`}>Schedules page</a> in the {VARS.WEB_APP}, click the schedule you just created. 2. Click ⋮ and select **Run now**, then click **Run** to confirm. -Your test run will appear under **All** on the [Runs page](https://oz.warp.dev/runs). Once the schedule fires on its cron, those runs will appear under **Recurring**. +Your test run will appear under **All** on the <a href={`${VARS.WEB_APP_URL}/runs`}>Runs page</a>. Once the schedule fires on its cron, those runs will appear under **Recurring**. -Runs are also accessible from the conversation panel view in the Warp app and on mobile via the Oz web app. +Runs are also accessible from the conversation panel view in the Warp app and on mobile via the {VARS.WEB_APP}. :::note **Prefer the CLI?** See [Scheduled Agents](/platform/triggers/scheduled-agents/) for `oz schedule create`, `oz schedule list`, and full schedule management commands. To use a custom skill instead of a prebundled one, see [Skills as Agents](/platform/skills-as-agents/). @@ -55,6 +70,6 @@ Runs are also accessible from the conversation panel view in the Warp app and on ## Next steps * **Choose the right unattended trigger** - Compare schedules, Slack, Linear, GitHub Actions, CLI, and API workflows in [Run agents unattended with schedules and triggers](/guides/agent-workflows/how-to-run-unattended-agents/). -* **Trigger agents from your tools** - Connect Oz to Slack or Linear to trigger agents from mentions or issue updates. See [Integrations Quickstart](/platform/integrations/quickstart/). +* **Trigger agents from your tools** - Connect the {VARS.WARP_AUTOMATION_PLATFORM} to Slack or Linear to trigger agents from mentions or issue updates. See [Integrations Quickstart](/platform/integrations/quickstart/). * **Manage and refine your schedule** - Change the frequency, swap skills, or pause and resume the schedule. See [Scheduled Agents](/platform/triggers/scheduled-agents/) for the full reference. * **Share with your team** - Schedules and environments are shared across your Warp team, so everyone benefits automatically. diff --git a/src/content/docs/platform/triggers/scheduled-agents.mdx b/src/content/docs/platform/triggers/scheduled-agents.mdx index 109d13bd9..f9e8b71f6 100644 --- a/src/content/docs/platform/triggers/scheduled-agents.mdx +++ b/src/content/docs/platform/triggers/scheduled-agents.mdx @@ -7,6 +7,7 @@ sidebar: label: "Scheduled agents" --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; Warp's Scheduled Agents let you run cloud agents automatically on a **recurring schedule**. They are designed for routine, repeatable tasks that should happen without manual intervention, such as dead code cleanup, dependency maintenance, issue triage, or periodic refactors. @@ -14,9 +15,9 @@ Warp's Scheduled Agents let you run cloud agents automatically on a **recurring Scheduled Agents run in the background on Warp’s infrastructure. Each run starts from a clean session, executes a fixed prompt, and produces its own task and session history that can be inspected after the fact. -For a guided, no-CLI walkthrough that creates a recurring agent from the Oz web app, see the [Scheduled Agents quickstart](/platform/triggers/scheduled-agents-quickstart/). This page is the full reference for managing schedules with the Oz CLI. +For a guided, no-CLI walkthrough that creates a recurring agent from the {VARS.WEB_APP}, see the [Scheduled Agents quickstart](/platform/triggers/scheduled-agents-quickstart/). This page is the full reference for managing schedules with the {VARS.WARP_AGENT_CLI}. -If you're deciding whether to use a schedule, Slack or Linear trigger, GitHub Actions, the Oz CLI, or the API, see [Run agents unattended with schedules and triggers](/guides/agent-workflows/how-to-run-unattended-agents/). +If you're deciding whether to use a schedule, Slack or Linear trigger, GitHub Actions, the {VARS.WARP_AGENT_CLI}, or the API, see [Run agents unattended with schedules and triggers](/guides/agent-workflows/how-to-run-unattended-agents/). --- @@ -29,7 +30,7 @@ A Scheduled Agent is a [cloud agent](/platform/) that runs on a cron-based sched * Runs automatically based on a cron expression. * Uses a fixed prompt defined at schedule creation time. * Starts a fresh agent session for every run. -* Executes in a specific Warp Environment, if provided. +* Executes in a specific Warp [Environment](/platform/environments/), if provided. * Consumes credits when it runs. * Can be paused, updated, or deleted at any time. @@ -52,11 +53,11 @@ Because each run is isolated, Scheduled Agents are safe to use for tasks that be --- -### Scheduling agents with the Oz CLI +### Scheduling agents with the CLI -Oz scheduled agents are managed through the Oz `schedule` family of CLI commands. +{VARS.WARP_AUTOMATION_PLATFORM} scheduled agents are managed through the {VARS.WARP_AUTOMATION_PLATFORM} `schedule` family of CLI commands. -All scheduling operations require the Oz CLI and an authenticated session. +All scheduling operations require the {VARS.WARP_AGENT_CLI} and an authenticated session. #### Creating a schedule @@ -93,7 +94,11 @@ oz schedule create \ * `--file <PATH>` — load schedule configuration from a YAML or JSON file. :::note -Environments are optional — if you don't specify one, the scheduled agent runs in a barebones sandbox. Without an environment, the agent won't have access to your code repositories, pre-installed tools, or setup commands, so this is only suited for tasks that don't need your codebase. +[Environments](/platform/environments/) are optional — if you don't specify one, the scheduled agent runs in a barebones sandbox. Without an environment, the agent won't have access to your code repositories, pre-installed tools, or setup commands, so this is only suited for tasks that don't need your codebase. +::: + +:::caution +`oz schedule create` has no **Agent** flag, so a schedule created with the CLI runs as its creator and opens pull requests under that person's GitHub account. To run it as a [cloud agent](/platform/agents/) instead, set **Agent** on the schedule from the <a href={`${VARS.WEB_APP_URL}/schedules`}>Schedules page</a> in the {VARS.WEB_APP} after creating it. See [Run identity and pull request authorship](/platform/triggers/scheduled-agents-quickstart/#run-identity-and-pull-request-authorship). ::: **Example** @@ -206,7 +211,7 @@ Once unpaused, the agent resumes running according to its original cron schedule You can modify an existing schedule using `oz schedule update`. -You may update one or more properties at a time, including: +You can update one or more properties at a time, including: * The schedule name. * The cron schedule. @@ -215,6 +220,8 @@ You may update one or more properties at a time, including: * The environment used for execution. * The model, MCP, and host configuration used for future runs. +The **Agent** setting can't be changed with this command. Change it from the <a href={`${VARS.WEB_APP_URL}/schedules`}>Schedules page</a> in the {VARS.WEB_APP}. + #### Command ```bash @@ -305,3 +312,10 @@ Scheduled Agents are best when work should happen on a predictable cadence. If you want an agent to run in response to an event, such as a Slack mention, PR update, or issue change, use [integrations](/platform/integrations/) to trigger cloud agents instead. Many teams use both together: [triggers](/platform/triggers/) for reactive workflows, and Scheduled Agents for proactive maintenance. + +## Related pages + +* [Environments](/platform/environments/) — configure the repo, image, and setup commands scheduled runs execute with +* [Viewing cloud agent runs](/platform/viewing-cloud-agent-runs/) — inspect transcripts, logs, and outputs from each scheduled run +* [Skills as Agents](/platform/skills-as-agents/) — run a reusable skill definition on a schedule +* [Run unattended agents](/guides/agent-workflows/how-to-run-unattended-agents/) — compare schedules with Slack, Linear, GitHub Actions, CLI, and API triggers diff --git a/src/content/docs/platform/viewing-cloud-agent-runs.mdx b/src/content/docs/platform/viewing-cloud-agent-runs.mdx index 8bb3d84be..12cb6f3b1 100644 --- a/src/content/docs/platform/viewing-cloud-agent-runs.mdx +++ b/src/content/docs/platform/viewing-cloud-agent-runs.mdx @@ -7,8 +7,9 @@ sidebar: label: "Viewing cloud agent runs" --- 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 [Oz 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}](/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. 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. @@ -103,5 +104,7 @@ You get consistent visibility into the work regardless of where you open it. ### Related pages * [Managing cloud agents](/platform/managing-cloud-agents/) — Find cloud agent runs by source, status, trigger, or owner. +* [Multi-agent orchestration](/platform/orchestration/) — Inspect parent and child cloud runs that fan work out in parallel. +* [Remote Control](/agents/cli-agents/remote-control/) — Publish a third-party CLI agent session to monitor and steer it from another device. * [Attach agent session context to GitHub PRs](/guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs/) — Share a run link with a PR so reviewers can inspect the agent's execution context. -* [Agent Session Sharing](/agent-platform/local-agents/session-sharing/) — Share local Warp agent or third-party CLI agent sessions. +* [Agent Session Sharing](/agents/local-agents/session-sharing/) — Share local Warp agent or third-party CLI agent sessions. diff --git a/src/content/docs/platform/warp-hosting.mdx b/src/content/docs/platform/warp-hosting.mdx index 13cf9741d..3b7ee8010 100644 --- a/src/content/docs/platform/warp-hosting.mdx +++ b/src/content/docs/platform/warp-hosting.mdx @@ -5,10 +5,11 @@ description: >- sidebar: label: "Warp-hosted agents" --- +import { VARS } from '@data/vars'; Warp's managed infrastructure lets your team run cloud agent workloads in fast, secure sandboxes. -Use Warp-hosted agents to quickly get started with Oz, without needing to configure compute resources or maintain services. +Use Warp-hosted agents to quickly get started with the {VARS.WARP_AUTOMATION_PLATFORM}, without needing to configure compute resources or maintain services. ## Sandbox environment @@ -50,5 +51,5 @@ Warp's hosted agents have network egress enabled by default. Outgoing requests m ## Related pages -* [Oz Platform](/platform/overview/) - Learn how Warp-hosted agents fit into the Oz Platform. +* [{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. diff --git a/src/content/docs/quickstart.mdx b/src/content/docs/quickstart.mdx index b23b17b9c..980e0bc65 100644 --- a/src/content/docs/quickstart.mdx +++ b/src/content/docs/quickstart.mdx @@ -90,7 +90,7 @@ Learn more about [Autosuggestions](/terminal/command-completions/autosuggestions ## 5. Ask your first agent question -Everything you've done so far has been in **terminal mode**, running shell commands the way you normally would. Warp also has **Agent Mode**, a dedicated conversation view where you interact with Oz, Warp's built-in agent, using natural language. +Everything you've done so far has been in **terminal mode**, running shell commands the way you normally would. Warp also has **Agent Mode**, a dedicated conversation view where you interact with the Warp Agent, Warp's built-in agent, using natural language. Start an agent conversation by pressing `⌘↩` (macOS) or `Ctrl+Shift+Enter` (Windows/Linux). Then type a prompt: @@ -98,15 +98,15 @@ Start an agent conversation by pressing `⌘↩` (macOS) or `Ctrl+Shift+Enter` ( Explain the architecture of this project ``` -Oz reads your codebase, understands its structure, and responds with a context-aware explanation. From here you can ask follow-up questions, have Oz write or refactor code, debug errors, or run commands on your behalf — all within the same conversation. +The Warp Agent reads your codebase, understands its structure, and responds with a context-aware explanation. From here you can ask follow-up questions, have the Warp Agent write or refactor code, debug errors, or run commands on your behalf — all within the same conversation. :::note You don't always need to switch modes manually. If you type a natural-language prompt in terminal mode, Warp auto-detects it and offers to send it to an agent. ::: -Warp also works with third-party CLI agents like Claude Code and Codex. Learn more about [third-party CLI agents](/agent-platform/cli-agents/overview/). +Warp also works with third-party CLI agents like Claude Code and Codex. Learn more about [third-party CLI agents](/agents/cli-agents/overview/). -To learn more about switching between modes, see [Terminal and Agent modes](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/). +To learn more about switching between modes, see [Terminal and Agent modes](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/). --- @@ -115,6 +115,6 @@ To learn more about switching between modes, see [Terminal and Agent modes](/age Now that you have the basics, check out the features that make Warp a full development environment: * **[Customizing Warp](/getting-started/quickstart/customizing-warp/)** — Pick a theme, configure your prompt, choose your AI model, and import keybindings from another terminal. -* **[Codebase Context](/agent-platform/capabilities/codebase-context/)** — Index your Git repositories so agents understand your code and give context-aware answers across large, multi-repo systems. +* **[Codebase Context](/agents/capabilities/codebase-context/)** — Index your Git repositories so agents understand your code and give context-aware answers across large, multi-repo systems. * **[Cloud agents](/platform/)** — Run agents in the background for PR review, issue triage, dependency updates, and other tasks that don't need your immediate attention. * **[Keyboard shortcuts](/getting-started/keyboard-shortcuts/)** — The full shortcut reference for power users. diff --git a/src/content/docs/reference/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx b/src/content/docs/reference/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx index 1f246efb1..3bdfd4c2f 100644 --- a/src/content/docs/reference/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx +++ b/src/content/docs/reference/api-and-sdk/demo-sentry-monitoring-with-sdk.mdx @@ -5,10 +5,11 @@ description: >- and create draft PRs. --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; ### Turn production errors into draft PRs with Cloud Agents + TypeScript SDK -<VideoEmbed url="https://www.youtube.com/watch?feature=youtu.be&v=fHQXLg9ybi4" title="Monitoring Sentry with the Oz SDK demo video" /> +<VideoEmbed url="https://www.youtube.com/watch?feature=youtu.be&v=fHQXLg9ybi4" title="Monitoring Sentry with the TypeScript SDK demo video" /> :::note Example repository: [**Sentry monitor example repository**](https://github.com/warpdotdev/warp-agents-sdk-demo-sentry-monitor) diff --git a/src/content/docs/reference/api-and-sdk/index.mdx b/src/content/docs/reference/api-and-sdk/index.mdx index 56632f84a..8c611490b 100644 --- a/src/content/docs/reference/api-and-sdk/index.mdx +++ b/src/content/docs/reference/api-and-sdk/index.mdx @@ -1,18 +1,19 @@ --- -title: "Oz API & SDK reference" +title: "{{API_SDK_NAME}} reference" sidebar: - label: "Oz API & SDK" + label: "{{API_SDK_NAME}}" description: >- - Create and inspect cloud agent runs over HTTP with the Oz API, or use the - Python and TypeScript SDKs for typed requests, retries, and error handling. + Create and inspect 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 Oz API and SDKs let 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 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. -### Oz API +### API overview -The Oz API 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. +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. **With the API you can:** @@ -26,9 +27,9 @@ 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). ::: -### Oz SDK +### SDK overview -Oz provides official [Python](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript](https://github.com/warpdotdev/oz-sdk-typescript) SDKs that wrap the Oz API 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.API_SDK_NAME} with: * **Typed requests and responses** (editor autocomplete, fewer schema mistakes) * **Built-in retries and timeouts** (with per-request overrides) @@ -37,7 +38,7 @@ Oz 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="Oz API and SDK reference overview video" /> +<VideoEmbed url="https://www.youtube.com/watch?v=0cf7383MZSk" title={`${VARS.API_SDK_NAME} reference overview video`} /> **SDK vs raw REST** @@ -50,7 +51,7 @@ For the full SDK surface area and latest usage, refer to the GitHub repos: [**Py --- -## Oz API +## API reference ### REST API base URL @@ -80,11 +81,11 @@ See the [**Agents API Reference**](/api) for details on how runs are created and You can influence how an agent runs using AmbientAgentConfig, including: -* `name` — a human-readable label for grouping, filtering, and traceability. When you run an agent from a [skill](/agent-platform/capabilities/skills/), `name` is automatically set to the skill name. You can also set `name` explicitly via the API, SDK, or CLI (`--name`) to categorize runs by intent — for example, grouping all runs of a particular workflow regardless of how they were triggered. Use the `name` query parameter on `GET /agent/runs` to filter runs by config name. +* `name` — a human-readable label for grouping, filtering, and traceability. When you run an agent from a [skill](/agents/capabilities/skills/), `name` is automatically set to the skill name. You can also set `name` explicitly via the API, SDK, or CLI (`--name`) to categorize runs by intent — for example, grouping all runs of a particular workflow regardless of how they were triggered. Use the `name` query parameter on `GET /agent/runs` to filter runs by config name. * `model_id` for LLM selection * `base_prompt` to shape behavior * `environment_id` to choose a `CloudEnvironment` -* `skill_spec` to use a [skill](/agent-platform/capabilities/skills/) as the base prompt (format: `owner/repo:skill-name` or `owner/repo:path/to/SKILL.md`) +* `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 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. @@ -135,11 +136,11 @@ The API shares a set of reusable models across endpoints. Detailed JSON schemas, --- -## Oz SDKs +## SDKs ### Python SDK -The Python SDK is the recommended way to call the Oz API from Python services and scripts. It provides: +The Python SDK is the recommended way to call the API from Python services and scripts. It provides: * Sync + async clients * Typed request/response models @@ -149,7 +150,7 @@ See the [**Python SDK GitHub repo**](https://github.com/warpdotdev/oz-sdk-python ### TypeScript SDK -The TypeScript SDK is the recommended way to call the Oz API from Node.js services and modern TS/JS runtimes. It provides: +The TypeScript SDK is the recommended way to call the API from Node.js services and modern TS/JS runtimes. It provides: * Fully typed params/responses * First-class error handling, retries/timeouts diff --git a/src/content/docs/reference/api-and-sdk/quickstart.mdx b/src/content/docs/reference/api-and-sdk/quickstart.mdx index 52d9b7721..00107985e 100644 --- a/src/content/docs/reference/api-and-sdk/quickstart.mdx +++ b/src/content/docs/reference/api-and-sdk/quickstart.mdx @@ -1,24 +1,25 @@ --- title: "API & SDK quickstart" description: >- - Create and monitor your first cloud agent run via the Oz API or SDK in ~5 + Create and monitor your first cloud agent run via the {{API_SDK_NAME}} in ~5 minutes. sidebar: label: "Quickstart" --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; -The Oz API 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.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. 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="Oz API and SDK quickstart video" /> +<VideoEmbed url="https://youtu.be/N6qMe641K34" title={`${VARS.API_SDK_NAME} quickstart video`} /> --- ## Prerequisites -* **A Warp API key** - Create one in the [Oz web app](https://oz.warp.dev/settings) 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. -* **An Oz 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. +* **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 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. --- @@ -48,7 +49,7 @@ curl -X POST https://app.warp.dev/api/v1/agent/run \ }' ``` -Replace `<ENV_ID>` with your environment ID. Find it with `oz environment list` on the Oz CLI or in the [Oz web app](https://oz.warp.dev). +Replace `<ENV_ID>` with your environment ID. Find it with `oz environment list` on the {VARS.WARP_AGENT_CLI} or in the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a>. :::note Prefer typed requests? The official [Python SDK](https://github.com/warpdotdev/oz-sdk-python) and [TypeScript SDK](https://github.com/warpdotdev/oz-sdk-typescript) wrap the same API with typed models, retries, and error handling. @@ -85,13 +86,13 @@ curl "https://app.warp.dev/api/v1/agent/runs" \ Once the run reaches `SUCCEEDED`, the response includes a `session_link` — a direct URL to the full run transcript, including commands executed, files changed, and agent output. -You can also view and manage all runs in the [Oz dashboard](https://oz.warp.dev/runs). +You can also view and manage all runs in the <a href={`${VARS.WEB_APP_URL}/runs`}>{VARS.DASHBOARD}</a>. --- ## Next steps -* **Read the full API reference** - [Oz API](/reference/api-and-sdk/) documents all endpoint parameters, query filters, and response schemas. +* **Read the full API reference** - [{VARS.API_SDK_NAME}](/reference/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. * **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/authentication-required.mdx b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/authentication-required.mdx index ec348aefd..37e3adcd9 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/authentication-required.mdx +++ b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/authentication-required.mdx @@ -4,6 +4,7 @@ description: >- The API key in the request is invalid, expired, or missing. Generate a new key and update your client configuration. --- +import { VARS } from '@data/vars'; The `authentication_required` error occurs when the API request lacks valid authentication credentials. @@ -48,7 +49,7 @@ This error is returned when: ## How to resolve -1. Generate a new API key from the [Oz web app](https://oz.warp.dev) or via the Oz CLI. +1. Generate a new API key from the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> or via the {VARS.WARP_AGENT_CLI}. 2. Update your client configuration with the new key. 3. Retry the request. @@ -56,5 +57,5 @@ This error is returned when: ## Related -* [Oz API & SDK](/reference/api-and-sdk/) — API authentication -* [Oz Platform](/platform/overview/) — API key management +* [{VARS.API_SDK_NAME}](/reference/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/conflict.mdx b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/conflict.mdx index f13e52c50..489a0620a 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/conflict.mdx +++ b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/conflict.mdx @@ -6,6 +6,7 @@ description: >- The request conflicts with the current state of the resource. Wait for the resource to reach the expected state and retry. --- +import { VARS } from '@data/vars'; The `conflict` error occurs when a request cannot be completed because the resource is in a state that conflicts with the requested operation. @@ -56,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 -* [Oz API & SDK](/reference/api-and-sdk/) — API reference for managing agent tasks +* [{VARS.API_SDK_NAME}](/reference/api-and-sdk/) — API reference for managing agent tasks diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx index 9089edb9f..82872f987 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx +++ b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/external-authentication-required.mdx @@ -66,7 +66,7 @@ This error includes extra fields beyond the standard response format: "error": "User does not have access to the following repositories in the environment: acme/backend (inaccessible repos: acme/backend)", "retryable": false, "provider": "github", - "auth_url": "https://github.com/apps/warp-dev/installations/new", + "auth_url": "https://github.com/apps/oz-by-warp/installations/new", "inaccessible_repos": ["acme/backend"] } ``` diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/index.mdx b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/index.mdx index e8f2a92fc..af4046131 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/index.mdx +++ b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/index.mdx @@ -1,12 +1,13 @@ --- title: Errors Overview description: >- - Reference for all error codes returned by the Oz platform API. Each error + Reference for all error codes returned by the {{API_SDK_NAME}}. Each error includes an HTTP status, machine-readable code, and actionable resolution steps. --- +import { VARS } from '@data/vars'; -When the Oz 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, 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, a human-readable message, and metadata to help you diagnose and resolve the issue. --- @@ -86,6 +87,6 @@ When an error response includes a `trace_id`, you can include it when [contactin ## Related -* [Oz API & SDK](/reference/api-and-sdk/) — API reference for creating and managing agent tasks +* [{VARS.API_SDK_NAME}](/reference/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/integration-disabled.mdx b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-disabled.mdx index 1573fcebc..91cdccec5 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-disabled.mdx +++ b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-disabled.mdx @@ -1,11 +1,12 @@ --- title: integration_disabled description: >- - The integration (Slack, Linear, etc.) is currently disabled in the Oz - settings. Enable it to continue. + The integration (Slack, Linear, etc.) is currently disabled in the + {{WARP_AUTOMATION_PLATFORM}} settings. Enable it to continue. --- +import { VARS } from '@data/vars'; -The `integration_disabled` error occurs when a task targets an integration that is currently disabled in the Oz settings. +The `integration_disabled` error occurs when a task targets an integration that is currently disabled in the {VARS.WARP_AUTOMATION_PLATFORM} settings. --- @@ -21,7 +22,7 @@ The `integration_disabled` error occurs when a task targets an integration that This error is returned when: -* A Slack message, Linear issue, or other integration event triggers a cloud agent, but the corresponding integration has been disabled in the Oz settings +* A Slack message, Linear issue, or other integration event triggers a cloud agent, but the corresponding integration has been disabled in the {VARS.WARP_AUTOMATION_PLATFORM} settings * The integration was previously active but has been turned off by a team admin --- @@ -43,7 +44,7 @@ This error is returned when: ## How to resolve -1. Go to the [Oz integrations page](https://oz.warp.dev/integrations). +1. Go to the <a href={`${VARS.WEB_APP_URL}/integrations`}>{VARS.WARP_AUTOMATION_PLATFORM} integrations page</a>. 2. Enable the integration that was disabled. 3. Retry the triggering event or task. @@ -52,4 +53,4 @@ This error is returned when: ## Related * [Integrations](/platform/integrations/) — Configuring Slack, Linear, and GitHub integrations -* [Oz Web App](/platform/oz-web-app/) — Managing integrations via the web interface +* [{VARS.WEB_APP}](/platform/oz-web-app/) — Managing integrations via the web interface diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx index 23d638cb0..24b249f9f 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx +++ b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/integration-not-configured.mdx @@ -4,6 +4,7 @@ description: >- The integration's setup is incomplete. Visit the setup URL to finish configuring the integration. --- +import { VARS } from '@data/vars'; The `integration_not_configured` error occurs when a task requires an integration whose setup has not been completed (for example, missing OAuth tokens or unfinished configuration steps). @@ -55,7 +56,7 @@ This error includes extra fields beyond the standard response format: ## How to resolve -1. Visit the `setup_url` provided in the response metadata (or go to the [Oz integrations page](https://oz.warp.dev/integrations)). +1. Visit the `setup_url` provided in the response metadata (or go to the <a href={`${VARS.WEB_APP_URL}/integrations`}>{VARS.WARP_AUTOMATION_PLATFORM} integrations page</a>). 2. Complete all setup steps for the integration. 3. Retry the triggering event or task. diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/invalid-request.mdx b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/invalid-request.mdx index 86a83033e..dc807a2fd 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/invalid-request.mdx +++ b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/invalid-request.mdx @@ -4,6 +4,7 @@ description: >- The request body is malformed, missing required fields, or contains invalid parameter values. --- +import { VARS } from '@data/vars'; The `invalid_request` error occurs when the API request is malformed or contains invalid parameters. @@ -57,4 +58,4 @@ The `detail` field in the response will describe the specific validation issue. ## Related -* [Oz API & SDK](/reference/api-and-sdk/) — API request format and parameters +* [{VARS.API_SDK_NAME}](/reference/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/reference/api-and-sdk/troubleshooting/errors/not-authorized.mdx index 5e7e1917a..964bbfc17 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/not-authorized.mdx +++ b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/not-authorized.mdx @@ -4,6 +4,7 @@ description: >- The authenticated user or API key does not have permission to perform the requested operation. --- +import { VARS } from '@data/vars'; The `not_authorized` error occurs when the authenticated principal (user or API key) does not have sufficient permissions to perform the requested operation. @@ -55,4 +56,4 @@ This error is returned when: ## Related * [Access, Billing, and Identity](/platform/team-access-billing-and-identity/) — Permission model and identity -* [Oz API & SDK](/reference/api-and-sdk/) — API authentication and authorization +* [{VARS.API_SDK_NAME}](/reference/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/reference/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx index 8dae9b3c4..eaabaa540 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx +++ b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/operation-not-supported.mdx @@ -4,6 +4,7 @@ description: >- The requested operation is not supported for this resource or its current state. --- +import { VARS } from '@data/vars'; The `operation_not_supported` error occurs when you attempt an operation that is not currently supported for the given resource or its current state. @@ -56,4 +57,4 @@ This error is returned when: * [Cloud Agents Overview](/platform/) — How cloud agent tasks work * [Self-hosting](/platform/self-hosting/) — Self-hosted agent configuration -* [Oz API & SDK](/reference/api-and-sdk/) — API reference for managing agent tasks +* [{VARS.API_SDK_NAME}](/reference/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/reference/api-and-sdk/troubleshooting/errors/resource-not-found.mdx index 45cc276ab..e3f7f36f3 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/errors/resource-not-found.mdx +++ b/src/content/docs/reference/api-and-sdk/troubleshooting/errors/resource-not-found.mdx @@ -4,6 +4,7 @@ description: >- The requested resource (task, environment, schedule, agent, etc.) does not exist or has been deleted. --- +import { VARS } from '@data/vars'; The `resource_not_found` error occurs when a referenced resource cannot be found. This typically means the resource ID is incorrect, the resource has been deleted, or it belongs to a different team. @@ -48,7 +49,7 @@ The `detail` field in the response will describe which resource was not found. ## How to resolve 1. Verify the resource ID is correct and properly formatted. -2. Check that the resource has not been deleted (for example, via the [Oz web app](https://oz.warp.dev) or CLI). +2. Check that the resource has not been deleted (for example, via the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> or CLI). 3. Confirm the resource belongs to your team or that you have access to it. --- diff --git a/src/content/docs/reference/api-and-sdk/troubleshooting/index.mdx b/src/content/docs/reference/api-and-sdk/troubleshooting/index.mdx index f183b8f89..097333f4f 100644 --- a/src/content/docs/reference/api-and-sdk/troubleshooting/index.mdx +++ b/src/content/docs/reference/api-and-sdk/troubleshooting/index.mdx @@ -1,11 +1,12 @@ --- title: API Troubleshooting description: >- - Troubleshooting resources for the Oz API and SDK, including a full reference + Troubleshooting resources for the {{API_SDK_NAME}}, including a full reference for all platform error codes. --- +import { VARS } from '@data/vars'; -When the Oz platform API 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. +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 diff --git a/src/content/docs/reference/cli/agent-profiles.mdx b/src/content/docs/reference/cli/agent-profiles.mdx index 91dc97870..179d02a75 100644 --- a/src/content/docs/reference/cli/agent-profiles.mdx +++ b/src/content/docs/reference/cli/agent-profiles.mdx @@ -1,13 +1,18 @@ --- title: Agent profiles description: >- - Use agent profiles with the Oz CLI to control what the agent can access, how + Use agent profiles with the {{WARP_AGENT_CLI}} to control what the agent can access, how it behaves, and where it can act. sidebar: label: "Agent Profiles" --- +import { VARS } from '@data/vars'; -Agent profiles control what the agent can do, how it behaves, and where it can act when running from the Oz 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. +:::caution +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). See the [Warp Agent CLI docs](/agents/cli/) for the replacement. +::: + +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. Agent profiles control three things: @@ -15,7 +20,7 @@ Agent profiles control three things: * **How the agent works** — model selection, autonomy level, and response style * **Where the agent can act** — directory allowlists and denylists -You can create and configure agent profiles in the Warp app. For detailed instructions, see [Agent Profiles & Permissions](/agent-platform/capabilities/agent-profiles-permissions/). +You can create and configure agent profiles in the Warp app. For detailed instructions, see [Agent Profiles & Permissions](/agents/capabilities/agent-profiles-permissions/). Agent profiles are automatically synced to each host where you have Warp installed, so you can use them remotely as well. diff --git a/src/content/docs/reference/cli/api-keys.mdx b/src/content/docs/reference/cli/api-keys.mdx index dd998e131..153007219 100644 --- a/src/content/docs/reference/cli/api-keys.mdx +++ b/src/content/docs/reference/cli/api-keys.mdx @@ -1,27 +1,32 @@ --- -title: API keys for the Oz CLI +title: "API keys for the {{WARP_AGENT_CLI}}" description: >- - Create and manage API keys for authenticating the Oz CLI and cloud agents. + Create and manage API keys for authenticating the {{WARP_AGENT_CLI}} and cloud agents. sidebar: label: "API keys" --- +import { VARS } from '@data/vars'; -API keys let the Oz CLI and cloud agents authenticate without human interaction. Use API keys for CI pipelines, headless servers, VMs, Codespaces, containers, and other automated environments. +:::caution +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). See the [Warp Agent CLI docs](/agents/cli/) for the replacement. +::: + +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. ## Personal vs. agent keys Every API key is either a **personal API key** or an **agent API key**. -* **Personal API keys** authenticate as you. Runs use your GitHub permissions, draw from your credit pool, and inherit your account's [skills](/agent-platform/capabilities/skills/). Use a personal key when the run should act on your behalf — for example, developer-triggered API automation, or the [Enterprise Analytics API](/enterprise/enterprise-features/analytics-api/), which only accepts personal keys. +* **Personal API keys** authenticate as you. Runs use your GitHub permissions, draw from your credit pool, and inherit your account's [skills](/agents/capabilities/skills/). Use a personal key when the run should act on your behalf — for example, developer-triggered API automation, or the [Enterprise Analytics API](/enterprise/enterprise-features/analytics-api/), which only accepts personal keys. * **Agent API keys** run as a [cloud agent](/platform/agents/) on your team. Use an agent key for scheduled jobs, integrations (Slack, Linear, GitHub Actions), SDK-triggered runs, and other automation that isn't tied to a specific user. Billing and GitHub permissions are scoped to the team rather than to you. ## Creating an API key -You can create an API key in either the [Oz web app](https://oz.warp.dev/settings) or the Warp app. Both surfaces produce keys that authenticate the CLI and SDK identically. +You can create an API key in either the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP}</a> or the Warp app. Both surfaces produce keys that authenticate the CLI and SDK identically. -### From the Oz web app (recommended) +### From the web app (recommended) -1. Open the [Oz web app settings page](https://oz.warp.dev/settings). +1. Open the <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP} settings page</a>. 2. In the API keys section, click **Generate new token**. 3. Choose the type: * **Personal** — Tied to your individual Warp account. @@ -33,7 +38,7 @@ You can create an API key in either the [Oz web app](https://oz.warp.dev/setting ### From the Warp app 1. In the Warp app, click your profile photo in the top-right corner, then click **Settings**. -2. In the sidebar, expand **Cloud platform** and click **Oz Cloud API Keys**. +2. In the sidebar, expand **Cloud platform** and click **API keys**. 3. In the API Keys section, click **+ Create API Key**. 4. Pick **Personal** for a personal key, or **Agent** / **Team** for an agent key tied to your team. (The toggle may still read **Team** in older versions of the desktop app.) 5. Name the key and choose an expiration (1 day, 30 days, 90 days, or never). @@ -59,7 +64,7 @@ The key type determines who the run is attributed to, which credit pool is bille * Run as a cloud agent on your team. * On Build, Max, and Business plans, bill the team owner: the owner's plan-included credits, then the owner's add-on credits. With auto-reload on, usage can trigger a reload on the owner's pool, subject to the team-wide monthly spend cap. On Enterprise plans, use the team-scoped credit pool. -* Use the **Oz by Warp** GitHub App when [team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization) is configured. Without team GitHub authorization, agent keys are still useful for tasks that don't need to write to GitHub, such as analysis, monitoring, or triage. +* Use the **Warp Factories** GitHub App when [team GitHub authorization](/platform/team-access-billing-and-identity/#team-github-authorization) is configured. Without team GitHub authorization, agent keys are still useful for tasks that don't need to write to GitHub, such as analysis, monitoring, or triage. For the full credit waterfall, see [Access, billing, and identity permissions](/platform/team-access-billing-and-identity/) and [add-on credits](/support-and-community/plans-and-billing/add-on-credits/). @@ -86,13 +91,13 @@ API keys start with the prefix `wk-`. If your key doesn't have this prefix, it m ## Managing API keys -The [Oz web app settings page](https://oz.warp.dev/settings) and the Warp app's **Settings** > **Cloud platform** > **Oz Cloud API Keys** both list your active keys. Both surfaces show: +The <a href={`${VARS.WEB_APP_URL}/settings`}>{VARS.WEB_APP} settings page</a> and the Warp app's **Settings** > **Cloud platform** > **API keys** both list your active keys. Both surfaces show: * **Name** — The name you assigned when creating the key. * **Scope** — Personal keys show your user; agent keys show the cloud agent the key runs as. * **Expires at** — The key's expiration date, or "Never" if it doesn't expire. -The Warp app also shows additional metadata that isn't surfaced in the Oz web app: +The Warp app also shows additional metadata that isn't surfaced in the {VARS.WEB_APP}: * **Key** — A masked suffix (`wk-**xxxx`) to help identify the key. * **Created** — When the key was created. @@ -100,13 +105,13 @@ The Warp app also shows additional metadata that isn't surfaced in the Oz web ap ### Deleting API keys -To delete an API key, find it in either the Oz web app or the Warp app's API Keys list and click the delete icon next to the key. +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/). ## Manage API keys from the CLI -In addition to the web and Warp app surfaces, you can manage API keys directly with the [Oz 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}](/reference/cli/). These commands are useful for scripting key rotation and for headless environments. ### List keys @@ -153,6 +158,6 @@ oz api-key expire "ci-pipeline" --force * **Use personal keys for runs that should act as you.** When code changes should be attributed to your GitHub account, a personal key is the right choice. Use agent keys for automation that isn't tied to a specific user. * **Use environment variables.** Avoid passing API keys directly in commands where they may be logged or visible in shell history. * **Set appropriate expiration.** Use shorter expiration times for development and testing; consider longer durations for stable production workflows. -* **Configure team GitHub authorization for agents that write to GitHub.** Personal keys authenticate as you with your GitHub permissions. Agent keys authenticate via the [Oz by Warp GitHub App](/platform/team-access-billing-and-identity/#team-github-authorization) when team GitHub authorization is configured in the Admin Panel. +* **Configure team GitHub authorization for agents that write to GitHub.** Personal keys authenticate as you with your GitHub permissions. Agent keys authenticate via the [Warp Factories GitHub App](/platform/team-access-billing-and-identity/#team-github-authorization) when team GitHub authorization is configured in the Admin Panel. * **Rotate keys periodically.** Create new keys and retire old ones on a regular schedule to limit exposure from compromised credentials. * **Store securely.** Use secret managers (like 1Password CLI, HashiCorp Vault, or cloud provider secret services) rather than plain text files. diff --git a/src/content/docs/reference/cli/artifacts.mdx b/src/content/docs/reference/cli/artifacts.mdx index d8380416a..752cea237 100644 --- a/src/content/docs/reference/cli/artifacts.mdx +++ b/src/content/docs/reference/cli/artifacts.mdx @@ -6,8 +6,13 @@ description: >- sidebar: label: "Artifacts" --- +import { VARS } from '@data/vars'; -Artifacts are files that an agent produces during a run and uploads to Oz — 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. +:::caution +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). See the [Warp Agent CLI docs](/agents/cli/) for the replacement. +::: + +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. ## When to use artifacts @@ -17,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 [Oz API](/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`](/reference/cli/), or in the response from the [{VARS.API_SDK_NAME}](/reference/api-and-sdk/). ## `oz artifact get` @@ -73,5 +78,5 @@ oz artifact download "$ARTIFACT_UID" --out ./latest-report.html ## Related -* [Oz API & SDK](/reference/api-and-sdk/) - retrieve artifacts programmatically over HTTP. +* [{VARS.API_SDK_NAME}](/reference/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/reference/cli/federate.mdx index b1ec3e007..f4059f598 100644 --- a/src/content/docs/reference/cli/federate.mdx +++ b/src/content/docs/reference/cli/federate.mdx @@ -6,10 +6,15 @@ description: >- sidebar: label: "Federated identity" --- +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). See the [Warp Agent CLI docs](/agents/cli/) for the replacement. +::: `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. -This command can only be called from inside a running agent session — typically as part of a [skill](/agent-platform/capabilities/skills/), a tool, or a script the agent executes while a run is in progress. +This command can only be called from inside a running agent session — typically as part of a [skill](/agents/capabilities/skills/), a tool, or a script the agent executes while a run is in progress. ## When to use federation @@ -35,7 +40,7 @@ oz federate issue-token \ ### Flags -* **`--run-id <RUN_ID>`** - The ID of the Oz run requesting the token. The token is bound to this run. +* **`--run-id <RUN_ID>`** - The ID of the {VARS.PLATFORM_RUN} requesting the token. The token is bound to this run. * **`--audience <AUDIENCE>`** - The `aud` claim for the issued token. Set this to the value your cloud provider's identity pool expects (for example, an AWS IAM Identity Center audience or a GCP workload identity pool URL). * **`--duration <DURATION>`** - Requested token lifetime. Accepts human-readable durations like `15m`, `1h`, or `2h30m`. Defaults to `1h`. * **`--subject-template <COMPONENT> ...`** - Controls how the OIDC token's `sub` claim is formatted. Pass one or more components, which are joined to form the subject. Defaults to `principal` (for example, `user:my-user-id`). @@ -78,7 +83,7 @@ oz federate issue-token \ ## Using tokens with cloud providers -Once you have a token, exchange it for cloud credentials using your provider's standard OIDC federation flow. The exchange happens between the cloud provider and your script — Oz only issues the OIDC token. +Once you have a token, exchange it for cloud credentials using your provider's standard OIDC federation flow. The exchange happens between the cloud provider and your script — the {VARS.WARP_AUTOMATION_PLATFORM} only issues the OIDC token. A typical AWS flow: diff --git a/src/content/docs/reference/cli/index.mdx b/src/content/docs/reference/cli/index.mdx index e6844f422..5fa741231 100644 --- a/src/content/docs/reference/cli/index.mdx +++ b/src/content/docs/reference/cli/index.mdx @@ -1,25 +1,26 @@ --- -title: Oz CLI reference +title: "{{WARP_AGENT_CLI}} reference" sidebar: - label: "Oz CLI" + label: "{{WARP_AGENT_CLI}}" description: >- - Use the Oz CLI to run, configure, and manage agents from the terminal. + Use the {{WARP_AGENT_CLI}} to run, configure, and manage agents from the terminal. --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import { VARS } from '@data/vars'; -The Oz 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. - -:::note -**`warp-cli` is deprecated and has been replaced by `oz`.** If you have `warp-cli` installed, it will auto-update to `oz`. All the same commands are available, just replace `warp-cli` with `oz` in your scripts and workflows. +:::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). See the [Warp Agent CLI docs](/agents/cli/) for the replacement. ::: -## What is the Oz CLI? +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. + +## What is the CLI? -The Oz CLI is the command-line tool that lets you run [Cloud Agents](/platform/) from anywhere, including terminals, scripts, automated systems, or services. +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**. -With the Oz CLI, you can: +With the {VARS.WARP_AGENT_CLI}, you can: * Run agents locally for development and debugging * Run agents on remote machines @@ -28,18 +29,18 @@ With the Oz CLI, you can: ## Installing the CLI -You can install the Oz CLI as part of the Warp desktop app, or as a standalone package. +You can install the {VARS.WARP_AGENT_CLI} as part of the Warp desktop app, or as a standalone package. ### Bundled with Warp -The Oz CLI is automatically distributed with the Warp desktop app and can be used right away in Warp. To make the CLI globally available, add it to your `PATH`. +The {VARS.WARP_AGENT_CLI} is automatically distributed with the Warp desktop app and can be used right away in Warp. To make the CLI globally available, add it to your `PATH`. <Tabs> <TabItem label="macOS"> - To add the Oz CLI to your `PATH`: + To add the {VARS.WARP_AGENT_CLI} to your `PATH`: 1. Open the [Command Palette](/terminal/command-palette/) (`Cmd+P`) - 2. In the search field, find and select the **Install Oz CLI Command** action. + 2. In the search field, find and select the **Install {VARS.WARP_AGENT_CLI} Command** action. :::note **Note:** Administrator permissions are required to install the CLI into `/usr/local/bin` . @@ -49,7 +50,7 @@ The Oz CLI is automatically distributed with the Warp desktop app and can be use In the Warp installer, select **Add Warp to PATH**. If you are installing for all users, this will put the CLI on the system path. Otherwise, the CLI is only added to the path for your account. </TabItem> <TabItem label="Linux"> - To run the Oz CLI on Linux, use the same command that you'd use to start Warp normally. If you installed Warp via a package manager, it should already be on the system `PATH`. + To run the {VARS.WARP_AGENT_CLI} on Linux, use the same command that you'd use to start Warp normally. If you installed Warp via a package manager, it should already be on the system `PATH`. </TabItem> </Tabs> @@ -113,7 +114,7 @@ Warp provides standalone packages for the CLI on macOS and Linux, without the Wa * aarch64: [`.deb`](https://app.warp.dev/download/cli?os=linux\&package=deb\&arch=aarch64), [`.rpm`](https://app.warp.dev/download/cli?os=linux\&package=rpm\&arch=aarch64), [pacman](https://app.warp.dev/download/cli?os=linux\&package=pacman\&arch=aarch64) </TabItem> <TabItem label="Windows"> - A standalone CLI package is not currently available on Windows. To use the Oz CLI on Windows, install the Warp app, which bundles the CLI. + A standalone CLI package is not currently available on Windows. To use the {VARS.WARP_AGENT_CLI} on Windows, install the Warp app, which bundles the CLI. You can install Warp using [WinGet](https://learn.microsoft.com/en-us/windows/package-manager/winget/): @@ -131,7 +132,7 @@ Regardless of your OS or installation method, the CLI command is `oz`. If you're ## Logging in -The Oz CLI supports two authentication methods, depending on where and how you're running agents. +The {VARS.WARP_AGENT_CLI} supports two authentication methods, depending on where and how you're running agents. * **Interactive login —** best for local machines where you have Warp installed and can authenticate through a browser. * **API keys** — best for automated or remote environments that need to authenticate without human interaction. @@ -201,7 +202,7 @@ $ oz agent run --prompt "analyze this codebase" ## Running agents -The Oz CLI offers two ways to run agents, depending on where you want the work to happen: +The {VARS.WARP_AGENT_CLI} offers two ways to run agents, depending on where you want the work to happen: **Use `oz agent run` when:** @@ -219,7 +220,7 @@ The Oz CLI offers two ways to run agents, depending on where you want the work t ### Running locally: \`oz agent run\` -To start an agent, use the `oz agent run` subcommand. You'll need to specify a prompt and, optionally, the [MCP servers](/agent-platform/capabilities/mcp/) and [agent profile](/agent-platform/capabilities/agent-profiles-permissions/) to use. +To start an agent, use the `oz agent run` subcommand. You'll need to specify a prompt and, optionally, the [MCP servers](/agents/capabilities/mcp/) and [agent profile](/agents/capabilities/agent-profiles-permissions/) to use. ```sh oz agent run --prompt "set up a new Rust crate named warp-cli" @@ -231,7 +232,7 @@ oz agent run --prompt "set up a new Rust crate named warp-cli" * `--name <NAME>` (`-n`) — label the run for grouping and traceability. * `--share` — share the session with teammates (see [Collaboration](/reference/cli/#collaboration)). * `--profile <ID>` — use a specific agent profile (see [Using Agent Profiles](/reference/cli/#using-agent-profiles)). -* `--model <MODEL_ID>` — override the default model (see [Model Choice](/agent-platform/inference/model-choice/)). +* `--model <MODEL_ID>` — override the default model (see [Model Choice](/agents/inference/model-choice/)). * `--skill <SPEC>` — use a skill as the base prompt (see [Using Skills](/reference/cli/#using-skills)). * `--mcp <SPEC>` — start one or more MCP servers before execution (UUID, JSON file path, or inline JSON). Can be repeated. * `--environment <ID>` (`-e`) — run in a specific cloud environment. @@ -263,13 +264,15 @@ oz agent run-cloud \ * `--no-environment` — run without an environment (not recommended). * `--open` — view the agent's session in Warp once it's available. * `--name <NAME>` (`-n`) — label the run for grouping and traceability (see [Naming runs](/reference/cli/#naming-runs) below). +* `--title <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). * `--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)). * `--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](/agent-platform/capabilities/computer-use/) for this run. +* `--computer-use` / `--no-computer-use` — enable or disable [Computer Use](/agents/capabilities/computer-use/) for this run. * `--harness <HARNESS>` — choose the execution harness for the run. Defaults to `oz` (Warp Agent). Set `claude` or `codex` to run [Claude Code or Codex as a cloud agent](/platform/harnesses/). * `--claude-auth-secret <NAME>` — name of the [Warp-managed secret](/platform/secrets/) that authenticates the Claude Code harness. Only valid with `--harness claude`. See [Third-party cloud agent authentication](/platform/harnesses/authentication/). * `--codex-auth-secret <NAME>` — name of the [Warp-managed secret](/platform/secrets/) that authenticates the Codex harness. Only valid with `--harness codex`. See [Third-party cloud agent authentication](/platform/harnesses/authentication/). @@ -301,12 +304,12 @@ The `--name` flag assigns a config name to the run. Use it to group related runs **How names work:** -* **Skill-based runs** — When you run an agent from a [skill](/agent-platform/capabilities/skills/), the name is automatically set to the skill name. You don't need to pass `--name` explicitly. +* **Skill-based runs** — When you run an agent from a [skill](/agents/capabilities/skills/), the name is automatically set to the skill name. You don't need to pass `--name` explicitly. * **Custom runs** — When you build your own automation (via the CLI, API, or SDK), set `--name` to a consistent value that describes the workflow's intent. **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 [Oz API](/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}](/reference/api-and-sdk/). **Examples:** @@ -324,6 +327,33 @@ oz agent run-cloud \ --prompt "review the latest PR" ``` +#### Titling runs + +The `--title` flag sets the title shown for the run and its conversation in Warp and the [{VARS.WEB_APP}](/platform/oz-web-app/). Use it when the auto-generated title isn't descriptive enough: + +```sh +oz agent run-cloud \ + --environment <ENVIRONMENT_ID> \ + --title "Upgrade Postgres driver to 5.2" \ + --prompt "Upgrade the Postgres driver and fix any resulting build errors" +``` + +`--title` and `--name` do different things: `--name` sets the run's config name, which groups related runs under a shared label, while `--title` labels this one run for humans reading it. + +#### Starting a run as an orchestration child + +The `--parent-run-id` flag attaches the new run to an existing run as an [orchestration](/platform/orchestration/multi-agent-runs/) child. The child inherits the parent's lineage and scope, and it appears alongside the parent's other children instead of as a standalone run: + +```sh +oz agent run-cloud \ + --environment <ENVIRONMENT_ID> \ + --parent-run-id <PARENT_RUN_ID> \ + --title "Backfill integration tests" \ + --prompt "Add integration tests for the new endpoints" +``` + +Pass the run ID of the run doing the spawning. Omit the flag for ordinary standalone runs. + **When cloud runs fail** * Verify your environment has the correct repository and context. @@ -362,13 +392,13 @@ See [MCP Servers](/reference/cli/mcp-servers/) for full details, including how t ## Using skills -[Skills](/agent-platform/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. +[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. ## Collaboration -In addition to text-based output, the CLI can share the agent's session for you to access on other devices or in a browser. To enable [Agent Session Sharing](/agent-platform/local-agents/session-sharing/), use the `--share` flag. +In addition to text-based output, the CLI can share the agent's session for you to access on other devices or in a browser. To enable [Agent Session Sharing](/agents/local-agents/session-sharing/), use the `--share` flag. By default, the session is only accessible to the user running the CLI, but you can also share with [Teams](/knowledge-and-collaboration/teams/) or other Warp users: @@ -392,11 +422,11 @@ The `--share` flag can be repeated, and uses the following syntax: ## Additional commands -The following commands are available for managing and inspecting Oz resources. +The following commands are available for managing and inspecting Warp resources. ### Managing named agents -[Named agents](/platform/agents/) are reusable agent configurations — a name, description, skills, secrets, base model, and default environment — that you can run with `oz agent run-cloud --agent <UID>` and scope API keys to. +[Named agents](/platform/agents/) are reusable agent configurations — a name, description, base prompt, skills, secrets, base model, and default environment — that you can run with `oz agent run-cloud --agent <UID>` and scope API keys to. List the named agents on your team, optionally sorting by name or creation time: @@ -417,6 +447,7 @@ Create a named agent. Only `--name` is required; attach skills and secrets by re oz agent create \ --name "release-notes" \ --description "Drafts release notes from merged PRs" \ + --prompt "Draft concise release notes grouped by feature area." \ --skill "myorg/repo:release-notes" \ --secret GITHUB_TOKEN \ --base-model <MODEL_ID> \ @@ -438,6 +469,7 @@ Common `oz agent update` flags: * `--name <NAME>` (`-n`) — rename the agent. * `--description <TEXT>` / `--remove-description` — set or clear the description. +* `--prompt <TEXT>` / `--remove-prompt` — set or clear the base prompt applied to the agent's runs. * `--add-secret <NAME>` / `--remove-secret <NAME>` / `--remove-all-secrets` — manage attached secrets. * `--add-skill <SKILL>` / `--remove-skill <SKILL>` / `--remove-all-skills` — manage attached skills. * `--base-model <MODEL_ID>` / `--remove-base-model` — set or clear the base model. diff --git a/src/content/docs/reference/cli/integration-setup.mdx b/src/content/docs/reference/cli/integration-setup.mdx index f63830750..19eaf7991 100644 --- a/src/content/docs/reference/cli/integration-setup.mdx +++ b/src/content/docs/reference/cli/integration-setup.mdx @@ -1,11 +1,16 @@ --- title: Integration setup description: >- - Learn how to set up environments and integrations so you can trigger Oz + Learn how to set up environments and integrations so you can trigger agents from external tools. sidebar: label: "Integration Setup" --- +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). See the [Warp Agent CLI docs](/agents/cli/) for the replacement. +::: 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: @@ -29,7 +34,7 @@ Warp integrations connect external tools, like Slack or Linear, to agents that r There are three main components to know: -* **Triggers** provide the context that tells Warp _what_ to run. A trigger could be a Slack message where you tag @Oz, or a Linear issue or comment. +* **Triggers** provide the context that tells Warp _what_ to run. A trigger could be a Slack message where you tag @warp, or a Linear issue or comment. * [**Integrations**](/platform/integrations/) are what connect the trigger surface (Slack, Linear) to Warp. An integration links the trigger to your [Warp team](/knowledge-and-collaboration/teams/) and handles posting results to the original tool, for example, replying in Slack. * **Environments** define how and where agents run your code. When an agent is triggered, Warp uses the environment to spin up a container, clone repositories, and execute the agent's workflow. @@ -50,7 +55,7 @@ Setting up an integration consists of three steps. 1. **Create an environment** for the agent to run your code. 2. **Authorize GitHub** so Warp can clone repositories, write code, debug issues, open pull requests, and more. -3. **Configure** the Oz app with an integration. +3. **Configure** the Warp app with an integration. :::tip If setup fails, use the returned error code to narrow the fix. Common errors include: @@ -89,7 +94,7 @@ You only need to create an environment once. It can be reused across Slack, Line ### Option 1: Guided environment setup (recommended) -The fastest way to get started is to use the guided environment setup. Use the `/create-environment` [slash command](/agent-platform/capabilities/slash-commands/) if you want Warp to analyze your repos and suggest an environment configuration. +The fastest way to get started is to use the guided environment setup. Use the `/create-environment` [slash command](/agents/capabilities/slash-commands/) if you want Warp to analyze your repos and suggest an environment configuration. You can run the command inside a Git repo directory with no argument, or with one or more repo paths or URLs. For example, from Warp: @@ -186,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 Oz by Warp GitHub App instead of an individual's personal token. +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. 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. @@ -203,7 +208,7 @@ For full setup instructions, see [Team GitHub authorization](/platform/team-acce Once you have set up at least one environment, you can create integrations that connect it to Slack or Linear. :::note -For easier setup, use the [Oz web app](https://oz.warp.dev) to configure integrations with a guided flow. +For easier setup, use the <a href={VARS.WEB_APP_URL}>{VARS.WEB_APP}</a> to configure integrations with a guided flow. ::: Alternatively, use the CLI where `<ENV_ID>` is your environment ID: @@ -221,9 +226,13 @@ If you omit `--environment`, the CLI will show a list of environments and prompt The CLI then: 1. Links the integration to your Warp team and environment. -2. Opens a browser flow to install the Oz app into your Slack workspace or Linear workspace. +2. Opens a browser flow to install the Warp app into your Slack workspace or Linear workspace. 3. Generates an **integration ID** you can later list or delete. +:::note +The [GitHub integration](/platform/integrations/github/), which starts agents from `@warp-agent` mentions on issues and pull requests, isn't created with `oz integration create`. It's set up by installing the Warp Factories GitHub App and enabling the GitHub organization in the Admin Panel. +::: + **Additional `integration create` flags:** * `--prompt` — custom instructions applied to all runs for this integration. @@ -298,6 +307,6 @@ You now have everything needed to trigger agents from your team's tools. From he **Additional reading** * [Cloud Agents Overview](/platform/) -* [Oz Platform](/platform/overview/) -* [Slack](/platform/integrations/slack/), [Linear](/platform/integrations/linear/), and [GitHub Actions](/platform/integrations/github-actions/) integrations +* [{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/) diff --git a/src/content/docs/reference/cli/mcp-servers.mdx b/src/content/docs/reference/cli/mcp-servers.mdx index e78ab3e21..4d1211e1d 100644 --- a/src/content/docs/reference/cli/mcp-servers.mdx +++ b/src/content/docs/reference/cli/mcp-servers.mdx @@ -6,8 +6,13 @@ description: >- sidebar: label: "MCP servers" --- +import { VARS } from '@data/vars'; -MCP servers connect agents to external systems like GitHub, Linear, or Sentry. To use a [Model Context Protocol (MCP)](/agent-platform/capabilities/mcp/) server from the CLI, use the `--mcp` flag with `oz agent run` or `oz agent run-cloud`. +:::caution +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). See the [Warp Agent CLI docs](/agents/cli/) for the replacement. +::: + +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`. For help choosing between local, cloud, and shared MCP workflows, see [Connect developer tools to agents with MCP workflows](/guides/external-tools/using-mcp-servers-with-warp/). For a conceptual overview of MCP with cloud agents — including configuration schema, full agent config examples, and limitations — see [MCP Servers](/platform/mcp/) in the Cloud Agents docs. @@ -15,9 +20,10 @@ For help choosing between local, cloud, and shared MCP workflows, see [Connect d ## Using the `--mcp` flag -The `--mcp` flag accepts three formats: +The `--mcp` flag accepts four formats: * **UUID** — reference a Warp-shared MCP server by its UUID (find UUIDs with `oz mcp list`) +* **Managed integration id** — reference a Warp-managed integration MCP server by its short id, such as `linear` (see [Passing Warp-managed integration servers by id](#passing-warp-managed-integration-servers-by-id)) * **Inline JSON** — pass a full MCP JSON configuration directly as a string * **File path** — path to a JSON file containing the MCP configuration @@ -53,6 +59,26 @@ $ oz mcp list $ oz agent run --mcp "1deb1b14-b6e5-4996-ae99-233b7555d2d0" --prompt "who last updated the README?" ``` +### Passing Warp-managed integration servers by id + +Some MCP servers are hosted by Warp and backed by an [integration](/platform/integrations/) your team has already connected, so they have no UUID of their own. Reference them by their short id instead: + +```sh +$ oz agent run --mcp linear --prompt "summarize the tickets assigned to me" +``` + +Warp recognizes these managed integration ids: + +* `linear` — the hosted [Linear](/platform/integrations/linear/) MCP server +* `slack` — the hosted [Slack](/platform/integrations/slack/) MCP server +* `jira` — the hosted [Jira](/platform/integrations/jira/) MCP server + +:::caution +`linear` and `slack` resolve only for runs executing inside a [Warp Factory](/factories/) with that integration connected; `jira` also resolves for a run triggered directly by a Jira event. Outside those cases — including a plain `oz agent run` like the example above — the server is silently skipped and the run continues without it. +::: + +The id is resolved when the run starts, using the integration connection that belongs to the run's team. If the id isn't one Warp recognizes, the server is also skipped. + ### Passing MCP servers as inline JSON or a file You can pass MCP configuration inline or via a file: @@ -102,7 +128,7 @@ $ oz agent run --mcp "904a8936-fa82-4571-b1d6-166c26197981" --prompt "use my MCP ``` :::note -For cloud agent workflows, use [Oz-managed secrets](/platform/secrets/) to store and inject credentials safely — secrets are stored in the cloud and referenced by name in your config. For local runs, a secrets manager CLI such as [`op`](https://developer.1password.com/docs/cli/get-started/), [`pass`](https://www.passwordstore.org/), or [`gcloud secrets versions access`](https://cloud.google.com/secret-manager/docs/create-secret-quickstart#secretmanager-quickstart-gcloud) can fetch secrets on remote hosts without exposing them in your shell history. +For cloud agent workflows, use [{VARS.WARP_AUTOMATION_PLATFORM}-managed secrets](/platform/secrets/) to store and inject credentials safely — secrets are stored in the cloud and referenced by name in your config. For local runs, a secrets manager CLI such as [`op`](https://developer.1password.com/docs/cli/get-started/), [`pass`](https://www.passwordstore.org/), or [`gcloud secrets versions access`](https://cloud.google.com/secret-manager/docs/create-secret-quickstart#secretmanager-quickstart-gcloud) can fetch secrets on remote hosts without exposing them in your shell history. ::: --- @@ -110,6 +136,6 @@ For cloud agent workflows, use [Oz-managed secrets](/platform/secrets/) to store ## Learn more * [MCP Servers (cloud agents)](/platform/mcp/) — configuration schema, full agent config file examples, and cloud agent limitations -* [Model Context Protocol (MCP)](/agent-platform/capabilities/mcp/) — configuring MCP servers in Warp for local agents +* [Model Context Protocol (MCP)](/agents/capabilities/mcp/) — configuring MCP servers in Warp for local agents * [Connect developer tools to agents with MCP workflows](/guides/external-tools/using-mcp-servers-with-warp/) — choose the setup path for local sessions, cloud runs, team sharing, and repeatable automation * [Secrets](/platform/secrets/) — store credentials in Warp so agents can access them at run time without exposing them in config files diff --git a/src/content/docs/reference/cli/quickstart.mdx b/src/content/docs/reference/cli/quickstart.mdx index 3950c22ae..3ca6ae54d 100644 --- a/src/content/docs/reference/cli/quickstart.mdx +++ b/src/content/docs/reference/cli/quickstart.mdx @@ -1,16 +1,21 @@ --- title: CLI quickstart description: >- - Set up and run your first cloud agent via the Oz CLI in less than 5 minutes. + Set up and run your first cloud agent via the {{WARP_AGENT_CLI}} in less than 5 minutes. sidebar: label: "Quickstart" --- import VideoEmbed from '@components/VideoEmbed.astro'; +import { VARS } from '@data/vars'; -This guide walks you through the essentials to get up and running with the Oz 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. +:::caution +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). See the [Warp Agent CLI docs](/agents/cli/) for the replacement. +::: + +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. -Watch this short demo of the Oz CLI workflow: -<VideoEmbed url="https://youtu.be/WpcChBNDCXQ" title="Oz CLI quickstart video" /> +Watch this short demo of the {VARS.WARP_AGENT_CLI} workflow: +<VideoEmbed url="https://youtu.be/WpcChBNDCXQ" title={`${VARS.WARP_AGENT_CLI} quickstart video`} /> ## 1. Install the CLI @@ -39,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 [Oz web app](https://oz.warp.dev/settings). 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](/reference/cli/api-keys/) for guidance on personal vs. [agent keys](/platform/agents/) and on security best practices. ::: ## 3. Run an agent @@ -68,7 +73,7 @@ If you haven't already created an environment, run `/create-environment` in Warp oz agent run-cloud --environment <ENV_ID> --prompt "Scan this repo for outdated dependencies" ``` -Replace `<ENV_ID>` with your environment ID, which you can find by running `oz environment list` on the Oz CLI. +Replace `<ENV_ID>` with your environment ID, which you can find by running `oz environment list` on the {VARS.WARP_AGENT_CLI}. ## 5. Add MCP context (optional) @@ -82,13 +87,13 @@ See [MCP Servers](/reference/cli/mcp-servers/) for all supported formats, includ ## Next steps -Once you've successfully set up and run your agent, explore other configurations and workflows with the Oz CLI: +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 Oz CLI using the [`oz help` command](/reference/cli/troubleshooting/#getting-help). +* Get up-to-date information about the {VARS.WARP_AGENT_CLI} using the [`oz help` command](/reference/cli/troubleshooting/#getting-help). * Run agents in CI with the [GitHub Actions quickstart](/platform/integrations/quickstart-github-actions/). -Continue reading the [Oz 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](/reference/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/reference/cli/skills.mdx index 92c603ac9..f718c98b6 100644 --- a/src/content/docs/reference/cli/skills.mdx +++ b/src/content/docs/reference/cli/skills.mdx @@ -1,13 +1,18 @@ --- -title: "Skills via the Oz CLI" +title: "Skills via the {{WARP_AGENT_CLI}}" sidebar: label: "Skills" description: >- - Use skills with the Oz CLI to run agents from reusable skill definitions + Use skills with the {{WARP_AGENT_CLI}} to run agents from reusable skill definitions stored in your repositories. --- +import { VARS } from '@data/vars'; -[Skills](/agent-platform/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. +:::caution +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). See the [Warp Agent CLI docs](/agents/cli/) for the replacement. +::: + +[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. ## Skill spec format @@ -59,4 +64,4 @@ For local agent runs, skills from your current repository are automatically disc oz agent run --skill "owner/repo:skill-name" --prompt "additional context" ``` -For more information about creating and managing skills, see [Skills](/agent-platform/capabilities/skills/). +For more information about creating and managing skills, see [Skills](/agents/capabilities/skills/). diff --git a/src/content/docs/reference/cli/troubleshooting.mdx b/src/content/docs/reference/cli/troubleshooting.mdx index 12f620b4f..86e72c1f6 100644 --- a/src/content/docs/reference/cli/troubleshooting.mdx +++ b/src/content/docs/reference/cli/troubleshooting.mdx @@ -1,11 +1,16 @@ --- title: CLI Troubleshooting description: >- - Solutions for common Oz CLI errors — including authentication issues, agent + Solutions for common {{WARP_AGENT_CLI}} errors — including authentication issues, agent failures, environments, GitHub access, and Docker image issues. --- +import { VARS } from '@data/vars'; -Solutions for common Oz 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. +:::caution +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). See the [Warp Agent CLI docs](/agents/cli/) for the replacement. +::: + +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. ## Getting help @@ -37,7 +42,7 @@ oz --version * 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/). **Agent or MCP errors**\ -Ensure your agent profile and [MCP servers](/agent-platform/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](/reference/cli/mcp-servers/) and [Agent profiles](/reference/cli/agent-profiles/) for details. --- diff --git a/src/content/docs/reference/cli/warp-drive.mdx b/src/content/docs/reference/cli/warp-drive.mdx index 8859e1c38..425e42565 100644 --- a/src/content/docs/reference/cli/warp-drive.mdx +++ b/src/content/docs/reference/cli/warp-drive.mdx @@ -6,8 +6,13 @@ description: >- sidebar: label: "Warp Drive Context" --- +import { VARS } from '@data/vars'; -Reference saved Warp Drive objects in Oz 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. +:::caution +The {VARS.WARP_AGENT_CLI} (the `oz` binary) is being deprecated in favor of the {VARS.WARP_CLI} (the `warp` binary). See the [Warp Agent CLI docs](/agents/cli/) for the replacement. +::: + +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. ## Reusing saved prompts @@ -31,10 +36,10 @@ $ oz agent run --saved-prompt sgNpbUgDkmp2IImUVDc8kR ## Referencing Warp Drive objects as context -Use `<workflow:id>`, `<notebook:id>`, or `<rule:id>` in prompts to attach [Warp Drive objects](/knowledge-and-collaboration/warp-drive/) and [rules](/agent-platform/capabilities/rules/) as context for the agent. +Use `<workflow:id>`, `<notebook:id>`, or `<rule:id>` in prompts to attach [Warp Drive objects](/knowledge-and-collaboration/warp-drive/) and [rules](/agents/capabilities/rules/) as context for the agent. :::note -**Tip:** Use the [@ context menu](/agent-platform/local-agents/agent-context/using-to-add-context/) in Warp to construct a prompt with the right references, then copy it into your CLI command. +**Tip:** Use the [@ context menu](/agents/local-agents/agent-context/using-to-add-context/) in Warp to construct a prompt with the right references, then copy it into your CLI command. ::: ```bash diff --git a/src/content/docs/reference/index.mdx b/src/content/docs/reference/index.mdx index 4acfd0f23..59996046e 100644 --- a/src/content/docs/reference/index.mdx +++ b/src/content/docs/reference/index.mdx @@ -1,16 +1,17 @@ --- title: Technical reference description: >- - Technical reference documentation for the Oz CLI, API, and SDK. + Technical reference documentation for the {{WARP_AGENT_CLI}}, API, and SDK. --- +import { VARS } from '@data/vars'; -Technical reference documentation for the Oz 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. +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 [Oz CLI](/reference/cli/) lets you run and configure agents from any environment — locally, in CI pipelines, or on remote machines. +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 Oz CLI without human interaction, ideal for CI pipelines, headless servers, and containers. +- [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. @@ -20,6 +21,6 @@ The [Oz CLI](/reference/cli/) lets you run and configure agents from any environ ## API & SDK -The [Oz API](/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. +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/community/open-source-licenses.mdx b/src/content/docs/support-and-community/community/open-source-licenses.mdx index a286e148b..f0a5c9b30 100644 --- a/src/content/docs/support-and-community/community/open-source-licenses.mdx +++ b/src/content/docs/support-and-community/community/open-source-licenses.mdx @@ -22,6 +22,7 @@ sidebar: | cmov 0.5.4 | Apache License 2.0 | | ctutils 0.4.2 | Apache License 2.0 | | embed_plist 1.2.2 | Apache License 2.0 | +| encode_unicode 1.0.0 | Apache License 2.0 | | encoding_rs 0.8.35 | Apache License 2.0 | | fragile 2.0.0 | Apache License 2.0 | | hound 3.5.1 | Apache License 2.0 | @@ -93,6 +94,8 @@ sidebar: | windows_x86_64_msvc 0.52.6 | Apache License 2.0 | | zopfli 0.8.3 | Apache License 2.0 | | crc-catalog 2.4.0 | Apache License 2.0 | +| macro_rules_attribute-proc_macro 0.2.2 | Apache License 2.0 | +| macro_rules_attribute 0.2.2 | Apache License 2.0 | | urlocator 0.1.4 | Apache License 2.0 | | tinyvec_macros 0.1.1 | Apache License 2.0 | | dagre_rust 0.0.5 | Apache License 2.0 | @@ -104,6 +107,7 @@ sidebar: | moxcms 0.7.11 | Apache License 2.0 | | pxfm 0.1.28 | Apache License 2.0 | | sketches-ddsketch 0.4.0 | Apache License 2.0 | +| candle-core 0.9.2 | Apache License 2.0 | | ciborium-io 0.2.2 | Apache License 2.0 | | ciborium-ll 0.2.2 | Apache License 2.0 | | codespan-reporting 0.13.1 | Apache License 2.0 | @@ -111,11 +115,15 @@ sidebar: | content_inspector 0.2.4 | Apache License 2.0 | | cpal 0.17.1 | Apache License 2.0 | | cvt 0.1.2 | Apache License 2.0 | +| esaxx-rs 0.1.10 | Apache License 2.0 | | graphql-ws-client 0.11.1 | Apache License 2.0 | | opentelemetry-proto 0.32.0 | Apache License 2.0 | | rustls-platform-verifier 0.6.2 | Apache License 2.0 | +| safetensors 0.7.0 | Apache License 2.0 | | spinning 0.1.0 | Apache License 2.0 | +| spm_precompiled 0.1.4 | Apache License 2.0 | | sys-locale 0.3.2 | Apache License 2.0 | +| tokenizers 0.21.4 | Apache License 2.0 | | unicode-linebreak 0.1.5 | Apache License 2.0 | | zune-core 0.5.1 | Apache License 2.0 | | zune-jpeg 0.5.12 | Apache License 2.0 | @@ -143,6 +151,10 @@ sidebar: | clap_lex 0.7.5 | Apache License 2.0 | | colorchoice 1.0.0 | Apache License 2.0 | | crc32fast 1.5.0 | Apache License 2.0 | +| derive_builder 0.20.1 | Apache License 2.0 | +| derive_builder_core 0.20.1 | Apache License 2.0 | +| derive_builder_macro 0.20.1 | Apache License 2.0 | +| enum-as-inner 0.6.1 | Apache License 2.0 | | env_logger 0.10.2 | Apache License 2.0 | | float-ord 0.3.2 | Apache License 2.0 | | foreign-types-macros 0.2.3 | Apache License 2.0 | @@ -170,7 +182,8 @@ sidebar: | toml_parser 1.1.0+spec-1.1.0 | Apache License 2.0 | | toml_write 0.1.2 | Apache License 2.0 | | toml_writer 1.1.0+spec-1.1.0 | Apache License 2.0 | -| diesel 2.3.9 | Apache License 2.0 | +| unicode_categories 0.1.1 | Apache License 2.0 | +| diesel 2.3.10 | Apache License 2.0 | | diesel_derives 2.3.5 | Apache License 2.0 | | diesel_migrations 2.3.1 | Apache License 2.0 | | diesel_table_macro_syntax 0.3.0 | Apache License 2.0 | @@ -251,6 +264,7 @@ sidebar: | async-task 4.7.1 | Apache License 2.0 | | atomic-waker 1.1.2 | Apache License 2.0 | | backtrace 0.3.76 | Apache License 2.0 | +| base64 0.13.1 | Apache License 2.0 | | base64 0.21.7 | Apache License 2.0 | | base64 0.22.1 | Apache License 2.0 | | bitflags-serde-legacy 0.1.1 | Apache License 2.0 | @@ -381,6 +395,7 @@ sidebar: | prost-types 0.14.3 | Apache License 2.0 | | prost 0.14.3 | Apache License 2.0 | | psl-types 2.0.11 | Apache License 2.0 | +| rayon-cond 0.4.0 | Apache License 2.0 | | rayon-core 1.12.1 | Apache License 2.0 | | rayon 1.10.0 | Apache License 2.0 | | regex-automata 0.4.9 | Apache License 2.0 | @@ -406,8 +421,8 @@ sidebar: | security-framework 3.5.1 | Apache License 2.0 | | send_wrapper 0.4.0 | Apache License 2.0 | | send_wrapper 0.6.0 | Apache License 2.0 | -| serde_with 2.3.3 | Apache License 2.0 | -| serde_with_macros 2.3.3 | Apache License 2.0 | +| serde_with 3.21.0 | Apache License 2.0 | +| serde_with_macros 3.21.0 | Apache License 2.0 | | serde_yaml 0.8.26 | Apache License 2.0 | | shellexpand 3.1.1 | Apache License 2.0 | | signal-hook-mio 0.2.5 | Apache License 2.0 | @@ -436,6 +451,7 @@ sidebar: | unicode-bidi-mirroring 0.4.0 | Apache License 2.0 | | unicode-bidi 0.3.15 | Apache License 2.0 | | unicode-ccc 0.4.0 | Apache License 2.0 | +| unicode-normalization-alignments 0.1.12 | Apache License 2.0 | | unicode-properties 0.1.3 | Apache License 2.0 | | unicode-segmentation 1.11.0 | Apache License 2.0 | | unicode-truncate 2.0.1 | Apache License 2.0 | @@ -463,8 +479,8 @@ sidebar: | xz2 0.1.7 | Apache License 2.0 | | ff 0.13.1 | Apache License 2.0 | | hashlink 0.10.0 | Apache License 2.0 | +| bit-set 0.10.0 | Apache License 2.0 | | bit-set 0.5.3 | Apache License 2.0 | -| bit-set 0.9.1 | Apache License 2.0 | | bit-vec 0.6.3 | Apache License 2.0 | | bit-vec 0.9.1 | Apache License 2.0 | | downcast-rs 1.2.0 | Apache License 2.0 | @@ -526,6 +542,7 @@ sidebar: | console_error_panic_hook 0.1.7 | Apache License 2.0 | | rand_core 0.6.4 | Apache License 2.0 | | rand_core 0.9.3 | Apache License 2.0 | +| rand_distr 0.5.1 | Apache License 2.0 | | getrandom 0.2.16 | Apache License 2.0 | | getrandom 0.3.4 | Apache License 2.0 | | rand_chacha 0.3.1 | Apache License 2.0 | @@ -600,10 +617,13 @@ sidebar: | bimap 0.6.3 | Apache License 2.0 | | bon-macros 3.7.1 | Apache License 2.0 | | bon 3.7.1 | Apache License 2.0 | +| candle-nn 0.9.2 | Apache License 2.0 | +| candle-onnx 0.9.2 | Apache License 2.0 | | cesu8 1.1.0 | Apache License 2.0 | | color-print-proc-macro 0.3.7 | Apache License 2.0 | | color-print 0.3.7 | Apache License 2.0 | | constant_time_eq 0.3.1 | Apache License 2.0 | +| dary_heap 0.3.7 | Apache License 2.0 | | dasp_sample 0.11.0 | Apache License 2.0 | | datasketches 0.2.0 | Apache License 2.0 | | directories 6.0.0 | Apache License 2.0 | @@ -630,8 +650,6 @@ sidebar: | gloo-utils 0.2.0 | Apache License 2.0 | | gloo-worker-macros 0.1.0 | Apache License 2.0 | | gloo-worker 0.5.0 | Apache License 2.0 | -| gpu-descriptor-types 0.2.0 | Apache License 2.0 | -| gpu-descriptor 0.3.2 | Apache License 2.0 | | half 2.6.0 | Apache License 2.0 | | hpke 0.13.0 | Apache License 2.0 | | htmlescape 0.3.1 | Apache License 2.0 | @@ -650,7 +668,10 @@ sidebar: | mach2 0.5.0 | Apache License 2.0 | | match_token 0.35.0 | Apache License 2.0 | | miniz_oxide 0.8.8 | Apache License 2.0 | -| naga 29.0.1 | Apache License 2.0 | +| monostate-impl 0.1.14 | Apache License 2.0 | +| monostate 0.1.14 | Apache License 2.0 | +| naga-types 30.0.0 | Apache License 2.0 | +| naga 30.0.0 | Apache License 2.0 | | ndk-context 0.1.1 | Apache License 2.0 | | ndk-sys 0.6.0+11769913 | Apache License 2.0 | | ndk 0.9.0 | Apache License 2.0 | @@ -712,6 +733,7 @@ sidebar: | saphyr-parser 0.0.6 | Apache License 2.0 | | self_cell 1.2.1 | Apache License 2.0 | | semver 1.0.20 | Apache License 2.0 | +| seq-macro 0.3.6 | Apache License 2.0 | | serde 1.0.228 | Apache License 2.0 | | serde_bytes 0.11.19 | Apache License 2.0 | | serde_core 1.0.228 | Apache License 2.0 | @@ -742,6 +764,7 @@ sidebar: | tink-mac 0.3.0 | Apache License 2.0 | | tink-prf 0.3.0 | Apache License 2.0 | | typed-path 0.10.0 | Apache License 2.0 | +| typed-path 0.12.2 | Apache License 2.0 | | typeid 1.0.3 | Apache License 2.0 | | typetag-impl 0.2.21 | Apache License 2.0 | | typetag 0.2.21 | Apache License 2.0 | @@ -753,15 +776,15 @@ sidebar: | wasip2 1.0.2+wasi-0.2.9 | Apache License 2.0 | | wasite 0.1.0 | Apache License 2.0 | | wasm-streams 0.5.0 | Apache License 2.0 | -| wgpu-core-deps-apple 29.0.0 | Apache License 2.0 | -| wgpu-core-deps-emscripten 29.0.0 | Apache License 2.0 | -| wgpu-core-deps-wasm 29.0.0 | Apache License 2.0 | -| wgpu-core-deps-windows-linux-android 29.0.0 | Apache License 2.0 | -| wgpu-core 29.0.1 | Apache License 2.0 | -| wgpu-hal 29.0.1 | Apache License 2.0 | -| wgpu-naga-bridge 29.0.1 | Apache License 2.0 | -| wgpu-types 29.0.1 | Apache License 2.0 | -| wgpu 29.0.1 | Apache License 2.0 | +| wgpu-core-deps-apple 30.0.0 | Apache License 2.0 | +| wgpu-core-deps-emscripten 30.0.0 | Apache License 2.0 | +| wgpu-core-deps-wasm 30.0.0 | Apache License 2.0 | +| wgpu-core-deps-windows-linux-android 30.0.0 | Apache License 2.0 | +| wgpu-core 30.0.0 | Apache License 2.0 | +| wgpu-hal 30.0.0 | Apache License 2.0 | +| wgpu-naga-bridge 30.0.0 | Apache License 2.0 | +| wgpu-types 30.0.0 | Apache License 2.0 | +| wgpu 30.0.0 | Apache License 2.0 | | whoami 1.5.2 | Apache License 2.0 | | wide 0.7.33 | Apache License 2.0 | | winapi-i686-pc-windows-gnu 0.4.0 | Apache License 2.0 | @@ -796,7 +819,6 @@ sidebar: | error-code 3.3.2 | Boost Software License 1.0 | | clipboard-win 5.4.1 | Boost Software License 1.0 | | notify 8.0.0 | Creative Commons Zero v1.0 Universal | -| hexf-parse 0.2.1 | Creative Commons Zero v1.0 Universal | | to_method 1.1.0 | Creative Commons Zero v1.0 Universal | | webpki-root-certs 1.0.1 | Community Data License Agreement Permissive 2.0 | | untrusted 0.9.0 | ISC License | @@ -847,7 +869,7 @@ sidebar: | redox_syscall 0.4.1 | MIT License | | redox_syscall 0.5.7 | MIT License | | version-compare 0.1.1 | MIT License | -| h2 0.4.12 | MIT License | +| h2 0.4.15 | MIT License | | bytes 1.11.1 | MIT License | | levenshtein_automata 0.2.1 | MIT License | | try-lock 0.2.4 | MIT License | @@ -946,6 +968,14 @@ sidebar: | compact_str 0.9.0 | MIT License | | fontconfig-parser 0.5.3 | MIT License | | castaway 0.2.4 | MIT License | +| gemm-c32 0.19.0 | MIT License | +| gemm-c64 0.19.0 | MIT License | +| gemm-common 0.19.0 | MIT License | +| gemm-f16 0.19.0 | MIT License | +| gemm-f32 0.19.0 | MIT License | +| gemm-f64 0.19.0 | MIT License | +| gemm 0.19.0 | MIT License | +| pulp 0.22.2 | MIT License | | sctk-adwaita 0.10.1 | MIT License | | get-size-derive 0.1.3 | MIT License | | get-size 0.1.4 | MIT License | @@ -953,11 +983,14 @@ sidebar: | outref 0.5.2 | MIT License | | attribute-derive-macro 0.6.1 | MIT License | | attribute-derive 0.6.1 | MIT License | +| dyn-stack 0.13.0 | MIT License | +| reborrow 0.5.5 | MIT License | | libredox 0.0.2 | MIT License | | libredox 0.1.3 | MIT License | | is-docker 0.2.0 | MIT License | | is-wsl 0.4.0 | MIT License | | byte-unit 5.2.0 | MIT License | +| float8 0.6.0 | MIT License | | codesnake 0.3.0 | MIT License | | sqlite-wasm-rs 0.4.8 | MIT License | | line-ending 1.5.1 | MIT License | @@ -1022,6 +1055,7 @@ sidebar: | jaq-std 3.0.0 | MIT License | | libm 0.2.15 | MIT License | | malloc_buf 0.0.6 | MIT License | +| number_prefix 0.4.0 | MIT License | | objc-foundation 0.1.1 | MIT License | | objc-sys 0.3.5 | MIT License | | objc2-app-kit 0.2.2 | MIT License | @@ -1033,6 +1067,7 @@ sidebar: | objc2 0.6.3 | MIT License | | objc_id 0.1.1 | MIT License | | ownedbytes 0.9.0 | MIT License | +| pulp-wasm-simd-flag 0.1.0 | MIT License | | quote-use-macros 0.7.2 | MIT License | | quote-use 0.7.2 | MIT License | | realfft 3.4.0 | MIT License | @@ -1053,6 +1088,7 @@ sidebar: | tokio 1.50.0 | MIT License | | simd-adler32 0.3.7 | MIT License | | getset 0.1.2 | MIT License | +| deltae 0.3.2 | MIT License | | imagesize 0.14.0 | MIT License | | serde-wasm-bindgen 0.6.5 | MIT License | | crossterm 0.29.0 | MIT License | @@ -1060,7 +1096,6 @@ sidebar: | line-span 0.1.5 | MIT License | | fluent-uri 0.1.4 | MIT License | | downcast 0.11.0 | MIT License | -| deltae 0.3.2 | MIT License | | endi 1.1.0 | MIT License | | is-terminal 0.4.17 | MIT License | | unsafe-libyaml 0.2.11 | MIT License | @@ -1074,6 +1109,7 @@ sidebar: | fancy-regex 0.11.0 | MIT License | | deflate64 0.1.10 | MIT License | | zip 2.4.2 | MIT License | +| zip 7.2.0 | MIT License | | freetype-sys 0.20.1 | MIT License | | phf 0.11.3 | MIT License | | phf_shared 0.11.3 | MIT License | @@ -1105,6 +1141,7 @@ sidebar: | nix 0.31.2 | MIT License | | strsim 0.10.0 | MIT License | | strsim 0.11.1 | MIT License | +| raw-cpuid 11.5.0 | MIT License | | sysinfo 0.37.0 | MIT License | | twox-hash 2.1.2 | MIT License | | combine 4.6.6 | MIT License | @@ -1128,6 +1165,9 @@ sidebar: | locale_config 0.3.0 | MIT License | | same-file 1.0.6 | MIT License | | winapi-util 0.1.11 | MIT License | +| console 0.15.11 | MIT License | +| indicatif 0.17.11 | MIT License | +| sysctl 0.6.0 | MIT License | | redox_users 0.4.3 | MIT License | | redox_users 0.5.2 | MIT License | | os_info 3.7.0 | MIT License | @@ -1184,7 +1224,9 @@ sidebar: | tinystr 0.7.6 | Unicode License v3 | | writeable 0.5.5 | Unicode License v3 | | yoke-derive 0.7.5 | Unicode License v3 | +| yoke-derive 0.8.1 | Unicode License v3 | | yoke 0.7.5 | Unicode License v3 | +| yoke 0.8.1 | Unicode License v3 | | zerofrom-derive 0.1.5 | Unicode License v3 | | zerofrom 0.1.5 | Unicode License v3 | | zerovec-derive 0.10.3 | Unicode License v3 | @@ -2488,6 +2530,7 @@ Apache License 2.0 - cmov 0.5.4 - ctutils 0.4.2 - embed_plist 1.2.2 + - encode_unicode 1.0.0 - encoding_rs 0.8.35 - fragile 2.0.0 - hound 3.5.1 @@ -3985,6 +4028,213 @@ Apache License 2.0 limitations under the License. +Apache License 2.0 + - macro_rules_attribute-proc_macro 0.2.2 + - macro_rules_attribute 0.2.2 +-------------------------------------------------------------------------------- + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2019 Daniel Henry-Mantilla <daniel.henry.mantilla@gmail.com> + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Apache License 2.0 - urlocator 0.1.4 -------------------------------------------------------------------------------- @@ -5638,6 +5888,7 @@ Apache License 2.0 Apache License 2.0 + - candle-core 0.9.2 - ciborium-io 0.2.2 - ciborium-ll 0.2.2 - codespan-reporting 0.13.1 @@ -5645,11 +5896,15 @@ Apache License 2.0 - content_inspector 0.2.4 - cpal 0.17.1 - cvt 0.1.2 + - esaxx-rs 0.1.10 - graphql-ws-client 0.11.1 - opentelemetry-proto 0.32.0 - rustls-platform-verifier 0.6.2 + - safetensors 0.7.0 - spinning 0.1.0 + - spm_precompiled 0.1.4 - sys-locale 0.3.2 + - tokenizers 0.21.4 - unicode-linebreak 0.1.5 - zune-core 0.5.1 - zune-jpeg 0.5.12 @@ -6907,6 +7162,10 @@ Apache License 2.0 - clap_lex 0.7.5 - colorchoice 1.0.0 - crc32fast 1.5.0 + - derive_builder 0.20.1 + - derive_builder_core 0.20.1 + - derive_builder_macro 0.20.1 + - enum-as-inner 0.6.1 - env_logger 0.10.2 - float-ord 0.3.2 - foreign-types-macros 0.2.3 @@ -6934,6 +7193,7 @@ Apache License 2.0 - toml_parser 1.1.0+spec-1.1.0 - toml_write 0.1.2 - toml_writer 1.1.0+spec-1.1.0 + - unicode_categories 0.1.1 -------------------------------------------------------------------------------- Apache License Version 2.0, January 2004 @@ -7140,7 +7400,7 @@ Apache License 2.0 Apache License 2.0 - - diesel 2.3.9 + - diesel 2.3.10 - diesel_derives 2.3.5 - diesel_migrations 2.3.1 - diesel_table_macro_syntax 0.3.0 @@ -12724,6 +12984,7 @@ Apache License 2.0 - async-task 4.7.1 - atomic-waker 1.1.2 - backtrace 0.3.76 + - base64 0.13.1 - base64 0.21.7 - base64 0.22.1 - bitflags-serde-legacy 0.1.1 @@ -12854,6 +13115,7 @@ Apache License 2.0 - prost-types 0.14.3 - prost 0.14.3 - psl-types 2.0.11 + - rayon-cond 0.4.0 - rayon-core 1.12.1 - rayon 1.10.0 - regex-automata 0.4.9 @@ -12879,8 +13141,8 @@ Apache License 2.0 - security-framework 3.5.1 - send_wrapper 0.4.0 - send_wrapper 0.6.0 - - serde_with 2.3.3 - - serde_with_macros 2.3.3 + - serde_with 3.21.0 + - serde_with_macros 3.21.0 - serde_yaml 0.8.26 - shellexpand 3.1.1 - signal-hook-mio 0.2.5 @@ -12909,6 +13171,7 @@ Apache License 2.0 - unicode-bidi-mirroring 0.4.0 - unicode-bidi 0.3.15 - unicode-ccc 0.4.0 + - unicode-normalization-alignments 0.1.12 - unicode-properties 0.1.3 - unicode-segmentation 1.11.0 - unicode-truncate 2.0.1 @@ -13551,8 +13814,8 @@ See the License for the specific language governing permissions and limitations under the License. Apache License 2.0 + - bit-set 0.10.0 - bit-set 0.5.3 - - bit-set 0.9.1 - bit-vec 0.6.3 - bit-vec 0.9.1 - downcast-rs 1.2.0 @@ -14639,6 +14902,7 @@ limitations under the License. Apache License 2.0 - rand_core 0.6.4 - rand_core 0.9.3 + - rand_distr 0.5.1 -------------------------------------------------------------------------------- Apache License Version 2.0, January 2004 @@ -17917,10 +18181,13 @@ Apache License 2.0 - bimap 0.6.3 - bon-macros 3.7.1 - bon 3.7.1 + - candle-nn 0.9.2 + - candle-onnx 0.9.2 - cesu8 1.1.0 - color-print-proc-macro 0.3.7 - color-print 0.3.7 - constant_time_eq 0.3.1 + - dary_heap 0.3.7 - dasp_sample 0.11.0 - datasketches 0.2.0 - directories 6.0.0 @@ -17947,8 +18214,6 @@ Apache License 2.0 - gloo-utils 0.2.0 - gloo-worker-macros 0.1.0 - gloo-worker 0.5.0 - - gpu-descriptor-types 0.2.0 - - gpu-descriptor 0.3.2 - half 2.6.0 - hpke 0.13.0 - htmlescape 0.3.1 @@ -17967,7 +18232,10 @@ Apache License 2.0 - mach2 0.5.0 - match_token 0.35.0 - miniz_oxide 0.8.8 - - naga 29.0.1 + - monostate-impl 0.1.14 + - monostate 0.1.14 + - naga-types 30.0.0 + - naga 30.0.0 - ndk-context 0.1.1 - ndk-sys 0.6.0+11769913 - ndk 0.9.0 @@ -18029,6 +18297,7 @@ Apache License 2.0 - saphyr-parser 0.0.6 - self_cell 1.2.1 - semver 1.0.20 + - seq-macro 0.3.6 - serde 1.0.228 - serde_bytes 0.11.19 - serde_core 1.0.228 @@ -18059,6 +18328,7 @@ Apache License 2.0 - tink-mac 0.3.0 - tink-prf 0.3.0 - typed-path 0.10.0 + - typed-path 0.12.2 - typeid 1.0.3 - typetag-impl 0.2.21 - typetag 0.2.21 @@ -18070,15 +18340,15 @@ Apache License 2.0 - wasip2 1.0.2+wasi-0.2.9 - wasite 0.1.0 - wasm-streams 0.5.0 - - wgpu-core-deps-apple 29.0.0 - - wgpu-core-deps-emscripten 29.0.0 - - wgpu-core-deps-wasm 29.0.0 - - wgpu-core-deps-windows-linux-android 29.0.0 - - wgpu-core 29.0.1 - - wgpu-hal 29.0.1 - - wgpu-naga-bridge 29.0.1 - - wgpu-types 29.0.1 - - wgpu 29.0.1 + - wgpu-core-deps-apple 30.0.0 + - wgpu-core-deps-emscripten 30.0.0 + - wgpu-core-deps-wasm 30.0.0 + - wgpu-core-deps-windows-linux-android 30.0.0 + - wgpu-core 30.0.0 + - wgpu-hal 30.0.0 + - wgpu-naga-bridge 30.0.0 + - wgpu-types 30.0.0 + - wgpu 30.0.0 - whoami 1.5.2 - wide 0.7.33 - winapi-i686-pc-windows-gnu 0.4.0 @@ -18853,7 +19123,6 @@ For these and/or other purposes and motivations, and without any expectation of d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. Creative Commons Zero v1.0 Universal - - hexf-parse 0.2.1 - to_method 1.1.0 -------------------------------------------------------------------------------- Creative Commons Legal Code @@ -19812,7 +20081,7 @@ SOFTWARE. MIT License - - h2 0.4.12 + - h2 0.4.15 -------------------------------------------------------------------------------- Copyright (c) 2017 h2 authors @@ -21596,6 +21865,39 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +MIT License + - gemm-c32 0.19.0 + - gemm-c64 0.19.0 + - gemm-common 0.19.0 + - gemm-f16 0.19.0 + - gemm-f32 0.19.0 + - gemm-f64 0.19.0 + - gemm 0.19.0 + - pulp 0.22.2 +-------------------------------------------------------------------------------- +MIT License + +Copyright (c) 2021 sarah + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + MIT License - sctk-adwaita 0.10.1 -------------------------------------------------------------------------------- @@ -21727,6 +22029,33 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +MIT License + - dyn-stack 0.13.0 + - reborrow 0.5.5 +-------------------------------------------------------------------------------- +MIT License + +Copyright (c) 2022 sarah + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + MIT License - libredox 0.0.2 - libredox 0.1.3 @@ -21807,6 +22136,31 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +MIT License + - float8 0.6.0 +-------------------------------------------------------------------------------- +MIT License + +Copyright (c) 2024 Eric Buehler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + MIT License - codesnake 0.3.0 -------------------------------------------------------------------------------- @@ -21971,6 +22325,7 @@ MIT License - jaq-std 3.0.0 - libm 0.2.15 - malloc_buf 0.0.6 + - number_prefix 0.4.0 - objc-foundation 0.1.1 - objc-sys 0.3.5 - objc2-app-kit 0.2.2 @@ -21982,6 +22337,7 @@ MIT License - objc2 0.6.3 - objc_id 0.1.1 - ownedbytes 0.9.0 + - pulp-wasm-simd-flag 0.1.0 - quote-use-macros 0.7.2 - quote-use 0.7.2 - realfft 3.4.0 @@ -22123,6 +22479,31 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +MIT License + - deltae 0.3.2 +-------------------------------------------------------------------------------- +MIT License + +Copyright 2019 Ryan O'Beirne + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + MIT License - imagesize 0.14.0 -------------------------------------------------------------------------------- @@ -22268,7 +22649,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI MIT License - - deltae 0.3.2 - endi 1.1.0 - is-terminal 0.4.17 - unsafe-libyaml 0.2.11 @@ -22410,6 +22790,7 @@ SOFTWARE. MIT License - zip 2.4.2 + - zip 7.2.0 -------------------------------------------------------------------------------- The MIT License (MIT) @@ -22646,6 +23027,31 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +MIT License + - raw-cpuid 11.5.0 +-------------------------------------------------------------------------------- +The MIT License (MIT) + +Copyright (c) 2015 Gerd Zellweger + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + MIT License - sysinfo 0.37.0 -------------------------------------------------------------------------------- @@ -23080,6 +23486,59 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +MIT License + - console 0.15.11 + - indicatif 0.17.11 +-------------------------------------------------------------------------------- +The MIT License (MIT) + +Copyright (c) 2017 Armin Ronacher <armin.ronacher@active-4.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + +MIT License + - sysctl 0.6.0 +-------------------------------------------------------------------------------- +The MIT License (MIT) + +Copyright (c) 2017 Johannes Lundberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + MIT License - redox_users 0.4.3 - redox_users 0.5.2 @@ -25514,7 +25973,9 @@ Unicode License v3 - tinystr 0.7.6 - writeable 0.5.5 - yoke-derive 0.7.5 + - yoke-derive 0.8.1 - yoke 0.7.5 + - yoke 0.8.1 - zerofrom-derive 0.1.5 - zerofrom 0.1.5 - zerovec-derive 0.10.3 diff --git a/src/content/docs/support-and-community/community/open-source-partnership.mdx b/src/content/docs/support-and-community/community/open-source-partnership.mdx index 8694c0a50..d704499e9 100644 --- a/src/content/docs/support-and-community/community/open-source-partnership.mdx +++ b/src/content/docs/support-and-community/community/open-source-partnership.mdx @@ -1,21 +1,22 @@ --- -title: Oz Open Source Partnership +title: "{{WARP_AUTOMATION_PLATFORM}} Open Source Partnership" description: >- Warp supports high-impact open source projects with free agent credits - through the Oz Open Source Partnership program. + through the {{WARP_AUTOMATION_PLATFORM}} Open Source Partnership program. --- +import { VARS } from '@data/vars'; -Warp is committed to supporting the open source community. Through the Oz Open Source Partnership program, we offer free agent usage credits to high-impact open source projects, helping maintainers and contributors accelerate their development workflows. +Warp is committed to supporting the open source community. Through the {VARS.WARP_AUTOMATION_PLATFORM} Open Source Partnership program, we offer free agent usage credits to high-impact open source projects, helping maintainers and contributors accelerate their development workflows. ## What you get -* **Free Oz credits** - Receive complimentary credits to run agents on your open source project +* **Free {VARS.WARP_AUTOMATION_PLATFORM} credits** - Receive complimentary credits to run agents on your open source project * **Agent access** - Use cloud agents to automate tasks like code review, bug triage, documentation, and more across your repositories * **Ongoing support** - Warp partners with accepted projects to ensure they get the most value from agents ## Who can apply -The Oz Open Source Partnership program is designed for actively maintained, high-impact open source projects. When reviewing applications, we consider factors like community size, project activity, and the potential impact of agents on your workflow. +The {VARS.WARP_AUTOMATION_PLATFORM} Open Source Partnership program is designed for actively maintained, high-impact open source projects. When reviewing applications, we consider factors like community size, project activity, and the potential impact of agents on your workflow. :::note Have questions about the program? Reach out to us at [support@warp.dev](mailto:support@warp.dev). @@ -26,5 +27,5 @@ Have questions about the program? Reach out to us at [support@warp.dev](mailto:s Tell us about your open source project by filling out the [application form](https://tally.so/r/LZWxqG). We'll review your submission and follow up with next steps. :::note -The Oz Open Source Partnership program provides free agent credits for open source projects. This is separate from Warp's open source client — the Warp client is published under AGPL v3 at [`warpdotdev/warp`](https://github.com/warpdotdev/warp); see [Contributing to Warp](/support-and-community/community/contributing/). For sponsorship opportunities for your project, reach out to [partnerships@warp.dev](mailto:partnerships@warp.dev). +The {VARS.WARP_AUTOMATION_PLATFORM} Open Source Partnership program provides free agent credits for open source projects. This is separate from Warp's open source client — the Warp client is published under AGPL v3 at [`warpdotdev/warp`](https://github.com/warpdotdev/warp); see [Contributing to Warp](/support-and-community/community/contributing/). For sponsorship opportunities for your project, reach out to [partnerships@warp.dev](mailto:partnerships@warp.dev). ::: diff --git a/src/content/docs/support-and-community/community/refer-a-friend.mdx b/src/content/docs/support-and-community/community/refer-a-friend.mdx index 2f1f463fc..ec662ccd3 100644 --- a/src/content/docs/support-and-community/community/refer-a-friend.mdx +++ b/src/content/docs/support-and-community/community/refer-a-friend.mdx @@ -53,7 +53,7 @@ Once you've hit the other referral tiers, we'll email you with details on how to ### International users -International users who choose physical rewards are responsible for paying any customs fees associated with shipping. Estimated costs are provided in the [approximate customs fees by region](/support-and-community/community/refer-a-friend/#approximate-customs-fees-by-region) section below. Please note that once the package leaves the United States, Warp no longer has visibility or control over the shipment process, including any customs-related issues or fees that may arise. +International users who choose physical rewards are responsible for paying any customs fees associated with shipping. Estimated costs are provided in the [approximate customs fees by region](/support-and-community/community/refer-a-friend/#approximate-customs-fees-by-region) section below. Note that once the package leaves the United States, Warp no longer has visibility or control over the shipment process, including any customs-related issues or fees that may arise. Alternatively, international users may opt to receive a digital gift card instead of a physical reward. @@ -106,7 +106,7 @@ All amounts are listed in USD. Fees are estimates and may vary regardless of pac #### **"I have referred people but have not received an email."** -Please allow a few hours for the referral system to process and send email updates. If you still haven’t received an email after a reasonable amount of time, contact us at [referrals@warp.dev](mailto:referrals@warp.dev) and we'll look into it. +Allow a few hours for the referral system to process and send email updates. If you still haven’t received an email after a reasonable amount of time, contact us at [referrals@warp.dev](mailto:referrals@warp.dev) and we'll look into it. #### **"I've claimed my physical reward but have issues receiving my package."** diff --git a/src/content/docs/support-and-community/index.mdx b/src/content/docs/support-and-community/index.mdx index c58f94b95..fff6f15a9 100644 --- a/src/content/docs/support-and-community/index.mdx +++ b/src/content/docs/support-and-community/index.mdx @@ -1,9 +1,21 @@ --- title: Support & Community description: >- - Connect with the developers and engineers building with Warp. Share what - you've built, shape what we build next, and get help when you're stuck. + Contact Warp support, join the community, and find help for bugs, billing, + and enterprise issues. --- +import { VARS } from '@data/vars'; + +## Contact support + +### Subscribers and Enterprise + +* **Technical issues or questions** - For bugs, credits, and other technical issues, email [support@warp.dev](mailto:support@warp.dev). +* **Billing issues or questions** - For refunds, cancellations, and other billing questions, email [billing@warp.dev](mailto:billing@warp.dev). +* **Enterprise** - Direct all feedback and issues to your designated Slack channel. + +For other ways to send feedback, gather logs, or file a bug report, see [Sending feedback and logs](/support-and-community/troubleshooting-and-support/sending-us-feedback/). + ## Find your space ### Join the community @@ -43,7 +55,7 @@ We host [live events](https://luma.com/warpdotdev) year-round — product demos, * [**Warp Preview**](/support-and-community/community/warp-preview-and-alpha-program/) — Try experimental features before anyone else. Your feedback directly shapes what ships. * [**Refer a Friend**](/support-and-community/community/refer-a-friend/) — Send Warp to a developer you think would love it. Earn themes, swag, and gift cards. -* [**Oz Open Source Partnership**](/support-and-community/community/open-source-partnership/) — Free agent credits for high-impact open source projects. +* [**{VARS.WARP_AUTOMATION_PLATFORM} Open Source Partnership**](/support-and-community/community/open-source-partnership/) — Free agent credits for high-impact open source projects. :::note **Ambassador program** @@ -51,9 +63,9 @@ We host [live events](https://luma.com/warpdotdev) year-round — product demos, We're building an Ambassador program for developers who want to lead and grow the Warp community. Join the [community Slack](https://go.warp.dev/join-preview) to hear when applications open. ::: -## Get help +## More help -* [Sending us feedback](/support-and-community/troubleshooting-and-support/sending-us-feedback/) +* [Sending feedback and logs](/support-and-community/troubleshooting-and-support/sending-us-feedback/) * [Known issues](/support-and-community/troubleshooting-and-support/known-issues/) * [Plans, pricing, and refunds](/support-and-community/plans-and-billing/plans-pricing-refunds/) * [Privacy](/support-and-community/privacy-and-security/privacy/) diff --git a/src/content/docs/support-and-community/plans-and-billing/add-on-credits.mdx b/src/content/docs/support-and-community/plans-and-billing/add-on-credits.mdx index 2845adbeb..1f4441f10 100644 --- a/src/content/docs/support-and-community/plans-and-billing/add-on-credits.mdx +++ b/src/content/docs/support-and-community/plans-and-billing/add-on-credits.mdx @@ -2,12 +2,12 @@ title: Add-on credits description: >- Purchase add-on credits to keep using premium AI models after reaching your - monthly credit limit. + monthly credit limit, or to top up on the Free plan without subscribing. --- -Add-on credits let you continue using premium AI models even after you've reached your monthly credit limit — at lower rates and with more control over spending. +Add-on credits let you continue using premium AI models even after you've reached your monthly credit limit — at lower rates and with more control over spending. You can also buy them on the Free plan without subscribing. -You can manage and purchase add-on credits directly in **Settings** > **Billing and usage**. +In the Warp app, you can manage and purchase add-on credits directly in **Settings** > **Billing and usage**. ![Add-on credits management surface under **Settings** > **Billing and usage**.](../../../../assets/support-and-community/reload-credits.png) @@ -17,10 +17,20 @@ Add-on credits extend your AI usage beyond the included monthly quota in your pl If you’ve enabled **auto-reload**, new credits will be added automatically and billed based on your selected configuration of monthly spending limit and selected purchase amount. -Add-on credits are available for Build, Max, Business, and Enterprise plans (with custom pricing for Enterprise). On self-serve plans (Build, Max, and Business), add-on credits are scoped to each individual user; Enterprise uses a team-pooled model. These credits **roll over across billing cycles** and remain valid for **12 months from the purchase date**. +Add-on credits are available on every self-serve plan — Free, Build, Max, and Business — plus Enterprise. The Free plan buys the same packs at a higher rate than paid plans; see [Warp pricing](https://www.warp.dev/pricing) for current rates. On self-serve plans, add-on credits are scoped to each individual user; Enterprise uses a team-pooled model. These credits **roll over across billing cycles** and remain valid for **12 months from the purchase date**. Add-on credits draw from the same pool as [platform credits](/support-and-community/plans-and-billing/platform-credits/) and compute credits, so a single balance covers all three credit types. +### Who can purchase add-on credits + +Any active member of a team can purchase add-on credits for their own usage. You don't need to be a team admin, and you don't need a paid subscription — Free plan users can buy packs and spend them on any model. Credits you buy are scoped to you, so they only draw down for your own usage. + +Team admins keep the team-level controls: + +* **Team-wide monthly spend cap** - Caps what the whole team can spend on add-on credits per calendar month, across all members. +* **Auto-reload** - While an admin has auto-reload on, individual members can't purchase add-on credits manually. +* **The team's payment method** - Every purchase charges the payment method saved for the team, and only admins can change or remove it. See [Which card is charged when a team member buys add-on credits?](/support-and-community/plans-and-billing/pricing-faqs/#which-card-is-charged-when-a-team-member-buys-add-on-credits). + ### Purchasing add-on credits You have two options for purchasing more credits: @@ -73,7 +83,7 @@ You can track your remaining credits and spending in the credits transparency fo #### Teams using add-on credits -On Build, Max, and Business self-serve plans, add-on credits are scoped to individual users. Each team member's add-on credits draw down only for their own usage. +On self-serve plans (Free, Build, Max, and Business), add-on credits are scoped to individual users. Each team member's add-on credits draw down only for their own usage. Team admins manage add-on credit settings for the team in **Settings** > **Billing and usage**: @@ -85,12 +95,12 @@ For how cloud agent runs that aren't initiated by a specific team member (schedu ### Plan changes and cancellations -Any purchased add-on credits remain in your account and can continue to be used for up to 12 months after purchase, as long as you have an active subscription. +Any purchased add-on credits remain in your account and can continue to be used for up to 12 months after purchase. -If you move to the Free plan, your remaining add-on credits aren't removed. They keep their original 12-month expiration from the purchase date, but you can't use them. When you re-subscribe, on the same team, you regain access to any unused, non-expired credits. You also can't buy additional add-on credits until you're subscribed again. +If you move to the Free plan, your remaining add-on credits aren't removed and they keep their original 12-month expiration from the purchase date. You can keep spending them on the Free plan and buy more, though new purchases use the Free plan rate until you re-subscribe. :::caution -Add-on credits are tied to your team. Leaving the team, being removed by an admin, or having the team deleted revokes your access to any credits tied to that team. Premium models require an active paid plan. +Add-on credits are tied to your team. Leaving the team, being removed by an admin, or having the team deleted revokes your access to any credits tied to that team. ::: #### When team membership changes @@ -102,5 +112,5 @@ Add-on credits are tied to the team they were purchased under. The flows below d * **An admin deletes the team** - Any remaining add-on credits must be used or removed before a team can be deleted. Contact [support@warp.dev](mailto:support@warp.dev) if you need help with this. :::note -All unused add-on credits remain valid for 12 months from purchase. Using them requires an active paid subscription on the same team. +All unused add-on credits remain valid for 12 months from purchase, and they stay tied to the team they were purchased under. ::: 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 9103b74c5..9234449d4 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 @@ -5,6 +5,7 @@ sidebar: description: >- Details on Warp credits and how they are calculated. --- +import { VARS } from '@data/vars'; ### What are Warp credits? @@ -21,7 +22,7 @@ All three buckets draw from the same Warp credit pool and [add-on credits](/supp Each interaction consumes **at least one credit**, though more complex interactions may use **multiple credits**. Because of factors such as codebase size, model choice, number of tool calls, and the nature of LLMs, credit usage is **non-deterministic** — two similar prompts can still use a different number of credits. :::note -For a general breakdown of what factors contribute to how many credits are consumed, please refer to: [How are Warp credits calculated?](/support-and-community/plans-and-billing/credits/#how-are-warp-credits-calculated) +For a general breakdown of what factors contribute to how many credits are consumed, see [How are Warp credits calculated?](/support-and-community/plans-and-billing/credits/#how-are-warp-credits-calculated) ::: Since there's no exact formula for predicting usage, we recommend building an intuitive understanding by experimenting with different prompts, models, and tracking how many credits they consume. @@ -43,13 +44,13 @@ You can view your total credit usage, along with other billing details, in **Set * **Seat-level allocation**: On team plans, credit limits apply per seat — each team member has their own allowance. Individual users (not on a team) also have their own credit allocation. * **Cloud agents and integrations**: Individual users can run cloud agents via the CLI and API, drawing from their Warp credits. Slack and Linear integrations require team membership. -* **Credit limits by plan**: The Free plan doesn't include bundled AI usage for the Warp Agent. To use the Warp Agent, [upgrade to a paid plan](https://www.warp.dev/pricing) or bring your own inference with [Bring Your Own API Key (BYOK)](/agent-platform/inference/bring-your-own-api-key/), a [custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/), or a [SuperGrok or X Premium subscription](/agent-platform/inference/grok-subscription/). On paid plans, once you reach your monthly credit limit you can continue using AI with usage-based billing via [add-on credits](/support-and-community/plans-and-billing/add-on-credits/). +* **Credit limits by plan**: The Free plan doesn't include bundled AI usage for the Warp Agent. To use the Warp Agent, [upgrade to a paid plan](https://www.warp.dev/pricing), buy [add-on credits](/support-and-community/plans-and-billing/add-on-credits/) without subscribing, or bring your own inference with [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/), a [custom inference endpoint](/agents/inference/custom-inference-endpoint/), or a [SuperGrok or X Premium subscription](/agents/inference/grok-subscription/). On paid plans, once you reach your monthly credit limit you can continue using AI with usage-based billing via [add-on credits](/support-and-community/plans-and-billing/add-on-credits/). #### **Other features that use credits** In addition to direct Agent conversations, the following features also consume credits: -* [Generate](/agent-platform/local-agents/overview/) helps you look up commands and suggestions as you type. As you refine your input, multiple credits may be used before you select a final suggestion. +* [Generate](/agents/local-agents/generate/) helps you look up commands and suggestions as you type. As you refine your input, multiple credits may be used before you select a final suggestion. * [AI Autofill in Workflows](/knowledge-and-collaboration/warp-drive/workflows/#ai-autofill) counts as a credit each time it is run. :::tip @@ -96,7 +97,7 @@ Some tasks are straightforward and may require only a single quick response, wit #### 4. Amount of context passed to the model -Prompts that include large amounts of context (such as [attached blocks](/agent-platform/local-agents/agent-context/blocks-as-context/), long user query messages, etc.) or file attachments like [images](/agent-platform/local-agents/agent-context/images-as-context/) may also increase the number of credits used due to increased token consumption. +Prompts that include large amounts of context (such as [attached blocks](/agents/local-agents/agent-context/blocks-as-context/), long user query messages, etc.) or file attachments like [images](/agents/local-agents/agent-context/images-as-context/) may also increase the number of credits used due to increased token consumption. :::note **Tip**: When sharing logs, code, or other large pieces of content, attach only the most relevant portions instead of full outputs. @@ -129,7 +130,7 @@ The following scenarios use compute credits: * **First-party integrations** - Running agents through Slack or Linear integrations * **Cloud agent runs** - Using `oz agent run-cloud` via the CLI -* **Oz API** - Running agents through Warp's Oz API +* **{VARS.API_SDK_NAME}** - Running agents through Warp's API * **Cloud Mode** - Running an agent from Cloud Mode in the Warp app #### Not eligible for compute credits @@ -146,7 +147,7 @@ Platform credits cover Warp's platform infrastructure — run lifecycle, schedul Platform credits are used in the following scenarios: * **Cloud agents on any plan** use platform credits for every cloud agent run, regardless of which agent runs the task or which inference source it uses. -* **Local agents on Business or Enterprise with customer-supplied inference** use platform credits when the local agent run uses [Bring Your Own API Key (BYOK)](/agent-platform/inference/bring-your-own-api-key/), a [custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/), or [BYOLLM](/enterprise/enterprise-features/bring-your-own-llm/). +* **Local agents on Business or Enterprise with customer-supplied inference** use platform credits when the local agent run uses [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/), a [custom inference endpoint](/agents/inference/custom-inference-endpoint/), or [BYOLLM](/enterprise/enterprise-features/bring-your-own-llm/). #### Not eligible for platform credits @@ -155,7 +156,7 @@ The following scenarios do **not** use platform credits: * **Local agents on Free, Build, or Max plans** don't use platform credits, regardless of inference source. * **Local agents on Business or Enterprise using Warp-managed inference** don't use platform credits because Warp is already paying for the model call through AI credits. * **Regular terminal usage** doesn't use platform credits. Shell commands and non-AI Warp features don't consume credits. -* **Third-party agent CLIs run directly** don't use platform credits when you run `claude`, `codex`, or another agent CLI outside of Oz. +* **Third-party agent CLIs run directly** don't use platform credits when you run `claude`, `codex`, or another agent CLI outside of Warp. For a full breakdown of how platform credits work, see [platform credits](/support-and-community/plans-and-billing/platform-credits/). diff --git a/src/content/docs/support-and-community/plans-and-billing/index.mdx b/src/content/docs/support-and-community/plans-and-billing/index.mdx index afe34e7a3..402319fe7 100644 --- a/src/content/docs/support-and-community/plans-and-billing/index.mdx +++ b/src/content/docs/support-and-community/plans-and-billing/index.mdx @@ -7,7 +7,7 @@ description: >- Warp offers flexible plans for individual developers, teams, and enterprises. Credits power all agent features and meter across three buckets: AI credits (the model call), compute credits (the sandbox an agent runs in), and platform credits (run lifecycle, integrations, dashboard, APIs, and observability). Top up your monthly allowance with add-on credit purchases or enable auto-reload. -Looking for **Bring Your Own API Key** or **custom inference endpoints**? They've moved to [Inference & providers](/agent-platform/inference/model-choice/) under Warp Agents. +Looking for **Bring Your Own API Key** or **custom inference endpoints**? They've moved to [Inference & providers](/agents/inference/model-choice/) under Warp Agents. * [**Plans, pricing, and refunds**](/support-and-community/plans-and-billing/plans-pricing-refunds/) - Compare plans, pricing tiers, and refund policies. * [**Credits**](/support-and-community/plans-and-billing/credits/) - How credits are used and calculated across AI features. diff --git a/src/content/docs/support-and-community/plans-and-billing/plans-pricing-refunds.mdx b/src/content/docs/support-and-community/plans-and-billing/plans-pricing-refunds.mdx index ab4233b16..91ccbae27 100644 --- a/src/content/docs/support-and-community/plans-and-billing/plans-pricing-refunds.mdx +++ b/src/content/docs/support-and-community/plans-and-billing/plans-pricing-refunds.mdx @@ -10,7 +10,7 @@ sidebar: Warp offers flexible, pay-as-you-go plans designed for individual developers, teams, and enterprises. -Paid plans include a monthly allowance of credits that power features such as code generation, debugging, and multi-agent workflows. The Free plan doesn't include bundled AI usage for the Warp Agent. To use the Warp Agent, [upgrade to a paid plan](https://www.warp.dev/pricing) or bring your own inference with [Bring Your Own API Key (BYOK)](/agent-platform/inference/bring-your-own-api-key/), a [custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/), or a [SuperGrok or X Premium subscription](/agent-platform/inference/grok-subscription/). +Paid plans include a monthly allowance of credits that power features such as code generation, debugging, and multi-agent workflows. The Free plan doesn't include bundled AI usage for the Warp Agent. To use the Warp Agent, [upgrade to a paid plan](https://www.warp.dev/pricing), buy [add-on credits](/support-and-community/plans-and-billing/add-on-credits/) without subscribing, or bring your own inference with [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/), a [custom inference endpoint](/agents/inference/custom-inference-endpoint/), or a [SuperGrok or X Premium subscription](/agents/inference/grok-subscription/). :::note See [Warp pricing](https://www.warp.dev/pricing) for the latest plans and what’s included in each offering. @@ -21,13 +21,13 @@ See [Warp pricing](https://www.warp.dev/pricing) for the latest plans and what * [Credits](/support-and-community/plans-and-billing/credits/) — learn how credits are used and calculated across AI features. * [Add-on credits](/support-and-community/plans-and-billing/add-on-credits/) — purchase additional credits or enable auto-reload at discounted rates. * [Platform credits](/support-and-community/plans-and-billing/platform-credits/) — learn how platform credits cover Warp's platform infrastructure for cloud agent runs and local runs with customer-supplied inference. -* [Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/) — connect your own model provider API keys for custom usage and billing. -* [Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/) — connect an OpenAI-compatible endpoint such as OpenRouter, LiteLLM, z.ai, or an internal gateway. +* [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) — connect your own model provider API keys for custom usage and billing. +* [Custom inference endpoint](/agents/inference/custom-inference-endpoint/) — connect an OpenAI-compatible endpoint such as OpenRouter, LiteLLM, z.ai, or an internal gateway. * [Pricing FAQs](/support-and-community/plans-and-billing/pricing-faqs/) — answers to common questions about plans, billing, and usage. Don’t have Warp yet? [Download Warp](https://www.warp.dev/download) and get started for free today. ### Warp’s refund policies -Please review the details of our refund policies below. To request a refund, email [**billing@warp.dev**](mailto:billing@warp.dev) with information about your situation — the more context you provide, the faster we can resolve your request. +Review the details of our refund policies below. To request a refund, email [**billing@warp.dev**](mailto:billing@warp.dev) with information about your situation — the more context you provide, the faster we can resolve your request. :::caution To request a refund or credit for a product defect, we require your [Conversation ID](/support-and-community/troubleshooting-and-support/sending-us-feedback/#gathering-ai-conversation-id) and [logs](/support-and-community/troubleshooting-and-support/sending-us-feedback/#gathering-warp-logs). You must have **Help improve Warp** enabled, so we can identify the issue before issuing any refund or credit. Learn how to enable it in [Crash reports and telemetry](/support-and-community/privacy-and-security/privacy/#how-to-disable-telemetry-and-crash-reporting). @@ -49,7 +49,8 @@ After 15 days, we will refund you for the remaining full months on your subscrip #### Add-on credits refund policy -* If you purchased [add-on credits](/support-and-community/plans-and-billing/add-on-credits/) by mistake, you can receive a refund **as long as none of the credits have been used**. Warp cannot refund add-on credits if there has been any usage. Add-on credits remain available for up to **12 months** from the date of purchase. If you move to the Free plan, your remaining add-on credits aren't removed and keep the same expiration. You just can't use them until you re-subscribe on the same team. +* If you purchased [add-on credits](/support-and-community/plans-and-billing/add-on-credits/) by mistake, you can receive a refund **as long as none of the credits have been used**. Warp cannot refund add-on credits if there has been any usage. Add-on credits remain available for up to **12 months** from the date of purchase, including if you move to the Free plan. +* Add-on credit purchases charge the payment method saved for your team, and any active team member can make one. If a purchase was billed to a card you didn't expect, see [Which card is charged when a team member buys add-on credits?](/support-and-community/plans-and-billing/pricing-faqs/#which-card-is-charged-when-a-team-member-buys-add-on-credits) before requesting a refund. :::caution Warp does not offer a formal guaranteed uptime Service Level Agreement (SLA). Live incidents can be monitored on our [**Status Page**](https://status.warp.dev/), and open issues are tracked on our [**GitHub Issues**](https://github.com/warpdotdev/Warp/issues). 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 51e22fed1..0708f7030 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 @@ -4,12 +4,13 @@ description: >- Platform credits cover Warp's platform layer on every cloud agent run and on local runs with customer-supplied inference. Learn when they apply. --- +import { VARS } from '@data/vars'; Platform credits cover Warp's platform infrastructure for coordinating, observing, and integrating agent runs. They apply to every cloud agent run, plus local agent runs on Business and Enterprise plans that use customer-supplied inference such as BYOK, a custom inference endpoint, or BYOLLM. Warp meters credits across three types of infrastructure: **inference** (the model call), **compute** (the sandbox an agent runs in), and **platform** (everything that runs around the agent — run lifecycle, integrations, dashboard, APIs, and observability). Each type maps to one credit bucket: [AI credits](/support-and-community/plans-and-billing/credits/), [compute credits](/support-and-community/plans-and-billing/credits/#compute-credits), and platform credits. Credit types and where an agent runs (local or cloud) are independent. -Customer-supplied inference covers [Bring Your Own API Key (BYOK)](/agent-platform/inference/bring-your-own-api-key/), [custom inference endpoints](/agent-platform/inference/custom-inference-endpoint/), [BYOLLM](/enterprise/enterprise-features/bring-your-own-llm/), and Enterprise [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/). +Customer-supplied inference covers [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/), [custom inference endpoints](/agents/inference/custom-inference-endpoint/), [BYOLLM](/enterprise/enterprise-features/bring-your-own-llm/), and Enterprise [team-managed API keys and endpoints](/enterprise/enterprise-features/team-managed-keys-and-endpoints/). :::caution BYOK and customer-supplied inference (custom inference endpoints, plus BYOLLM) are available to individual users and organizations with 10 or fewer employees on any plan. Organizations with more than 10 employees need a Warp Business or Enterprise plan to use BYOK or customer-supplied inference. See Warp's [Terms of Service](https://www.warp.dev/legal/terms-of-service) for details. @@ -19,8 +20,8 @@ BYOK and customer-supplied inference (custom inference endpoints, plus BYOLLM) a Each credit bucket covers a different layer of the infrastructure Warp provides. Credit types and where an agent runs (local or cloud) are independent — each agent run consumes from whichever credit types apply to it. -* **AI credits** cover inference: the LLM call itself. Consumed when Warp pays for the model call through Warp-managed providers. Used by agent conversations, [Generate](/agent-platform/local-agents/generate/), [AI Autofill](/knowledge-and-collaboration/warp-drive/workflows/#ai-autofill), and other AI features. See [credits](/support-and-community/plans-and-billing/credits/) for how AI credits are calculated. -* **Compute credits** cover compute: the sandbox an agent runs in. Consumed when an agent run uses Warp-hosted compute. In practice this is cloud agent runs (Slack and Linear integrations, `oz agent run-cloud`, the Oz API, and Cloud Mode in the Warp app); local agent runs use your own machine and don't consume compute credits. See [compute credits](/support-and-community/plans-and-billing/credits/#compute-credits). +* **AI credits** cover inference: the LLM call itself. Consumed when Warp pays for the model call through Warp-managed providers. Used by agent conversations, [Generate](/agents/local-agents/generate/), [AI Autofill](/knowledge-and-collaboration/warp-drive/workflows/#ai-autofill), and other AI features. See [credits](/support-and-community/plans-and-billing/credits/) for how AI credits are calculated. +* **Compute credits** cover compute: the sandbox an agent runs in. Consumed when an agent run uses Warp-hosted compute. In practice this is cloud agent runs (Slack and Linear integrations, `oz agent run-cloud`, the {VARS.API_SDK_NAME}, and Cloud Mode in the Warp app); local agent runs use your own machine and don't consume compute credits. See [compute credits](/support-and-community/plans-and-billing/credits/#compute-credits). * **Platform credits** cover Warp's platform layer: run lifecycle, integrations, dashboard, APIs, and observability. Apply to every cloud agent run, plus local agent runs on Business and Enterprise plans that use customer-supplied inference. The three buckets are independent and a single run can consume from more than one. A Warp-managed cloud agent run, for example, consumes AI credits for the model call, compute credits for the hosted compute, and platform credits for the platform infrastructure that runs the agent. @@ -37,15 +38,15 @@ Whether platform credits apply depends on where the agent runs and who's paying ### Uses platform credits -* **Cloud agents on any plan** use platform credits for every cloud agent run, regardless of which agent runs the task (Warp Agent, Claude Code, or Codex), inference source (Warp-managed, BYOK, or BYOLLM), or compute source (Warp-hosted or self-hosted workers). Warp's platform infrastructure coordinates every cloud agent run. -* **Local agents on Business or Enterprise with customer-supplied inference** use platform credits when the local agent run uses [BYOK](/agent-platform/inference/bring-your-own-api-key/), a [custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/), or BYOLLM. Warp isn't paying for the model call, but Warp's platform infrastructure is still running the local agent. BYOK and customer-supplied inference are subject to plan-size eligibility — see the callout above. +* **Cloud agents on any plan** use platform credits for every cloud agent run, regardless of which agent runs the task (Warp Agent, Claude Code, or Codex), inference source (Warp-managed, BYOK, or BYOLLM), or compute source (Warp-hosted or self-hosted workers). Warp's platform infrastructure coordinates every cloud agent run. [Warp Factories](/factories/) runs are cloud agent runs, so a factory's agents draw platform credits the same way. +* **Local agents on Business or Enterprise with customer-supplied inference** use platform credits when the local agent run uses [BYOK](/agents/inference/bring-your-own-api-key/), a [custom inference endpoint](/agents/inference/custom-inference-endpoint/), or BYOLLM. Warp isn't paying for the model call, but Warp's platform infrastructure is still running the local agent. BYOK and customer-supplied inference are subject to plan-size eligibility — see the callout above. ### Doesn't use platform credits * **Local agents on Free, Build, or Max plans** don't use platform credits, regardless of whether you use Warp-managed inference or BYOK. * **Local agents on Business or Enterprise using Warp-managed inference** don't use platform credits because Warp is already paying for the model call through AI credits. * **Regular terminal usage** doesn't use platform credits. Shell commands and non-AI Warp features don't consume credits. -* **Third-party agent CLIs run directly** don't use platform credits when you run `claude`, `codex`, or another agent CLI without going through Oz. +* **Third-party agent CLIs run directly** don't use platform credits when you run `claude`, `codex`, or another agent CLI without going through Warp. ## Where platform credits appear @@ -59,6 +60,6 @@ Platform credits appear in the same billing views as your other credit usage. * [Credits](/support-and-community/plans-and-billing/credits/) - How AI credits are measured and calculated. * [Add-on credits](/support-and-community/plans-and-billing/add-on-credits/) - Purchase additional credits or enable auto-reload. -* [Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/) - Connect your own model provider keys. -* [Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/) - Route Warp through any OpenAI-compatible endpoint. +* [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) - Connect your own model provider keys. +* [Custom inference endpoint](/agents/inference/custom-inference-endpoint/) - Route Warp through any OpenAI-compatible endpoint. * [Plans, pricing, and refunds](/support-and-community/plans-and-billing/plans-pricing-refunds/) - Compare plans and refund policies. 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 7fd66d867..adc2e4d8a 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 @@ -6,6 +6,7 @@ description: >- Frequently asked questions about upgrading, managing billing, refunds, and invoicing with Warp's paid plans. --- +import { VARS } from '@data/vars'; ### How can I upgrade and subscribe to a Warp plan? @@ -24,7 +25,7 @@ After entering your payment details, you’ll receive an invoice and confirmatio Warp's plans are designed for developers who rely on AI to code, debug, and move faster with their team. Pick the plan that matches the scale of your usage and the controls your team needs: -* **Build** — Usage-based plan for individuals or small teams with monthly credits, the ability to [Bring Your Own API Key (BYOK)](/agent-platform/inference/bring-your-own-api-key/) or point Warp at a [custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/), and access to [add-on credits](/support-and-community/plans-and-billing/add-on-credits/) with volume-based discounts. +* **Build** — Usage-based plan for individuals or small teams with monthly credits, the ability to [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/) or point Warp at a [custom inference endpoint](/agents/inference/custom-inference-endpoint/), and access to [add-on credits](/support-and-community/plans-and-billing/add-on-credits/) with volume-based discounts. * **Max** — Plan for individuals or small teams with heavier AI usage. Includes a larger monthly credit allowance than Build, plus a better effective rate for credits than buying add-on credits on Build. * **Business** — Multi-seat plan for teams. Includes everything in Build, plus admin-configurable data controls, SAML-based SSO, and centralized billing. Available up to the seat limit listed on [Warp pricing](https://www.warp.dev/pricing). * **Enterprise** — Custom plan for organizations that need higher seat counts, [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/) managed inference, granular admin controls, advanced security and compliance, and dedicated support. @@ -86,25 +87,34 @@ When you use the account to sign into Warp on different devices, for example Lin You can use your Warp account on multiple personal computers. Warp is designed to provide a consistent experience across devices. When you log in with the same account on different computers, your settings and preferences can be synced through the [Settings Sync](/terminal/more-features/settings-sync/) feature. +### How do I manage my billing? + +Open the billing portal to update your payment method, change billing details, view invoices, downgrade, cancel, or switch between monthly and annual billing. + +You can open **Manage billing** from the Warp app or the web: + +* **In the Warp app** - Go to **Settings** > **Billing and usage**, then click **Manage billing**. +* **On the web** - Open the [Warp Admin Panel](https://app.warp.dev/admin/) or the [Warp upgrade page](https://app.warp.dev/upgrade), click your profile in the top-right corner, then click **Manage billing**. You don't need the Warp app installed. + ### What happens when I downgrade during a billing cycle? Downgrades take effect immediately. Warp issues an account balance for the prorated difference based on the time remaining in your billing cycle, not on unused monthly AI credits. You can apply that balance toward future subscription payments or AI credit purchases. The account balance amount is visible in the billing portal invoice history. Any AI credits you've already used in the current cycle count against the lower plan's monthly limit. If your usage has already exceeded that limit, you won't receive more AI credits until your next billing cycle. -You can downgrade at any point throughout your subscription through the billing portal by going to **Settings** > **Billing and usage** > **Manage billing**. +You can downgrade at any point throughout your subscription through the billing portal. See [How do I manage my billing?](#how-do-i-manage-my-billing). -### What happens when I cancel during a billing cycle? +### How do I cancel my subscription? -You can cancel at any point throughout your subscription through the billing portal by going to **Settings** > **Billing and usage** > **Manage billing**. The subscription will be canceled at the **end of your billing cycle**, monthly or yearly. +You can cancel at any point throughout your subscription through the billing portal. See [How do I manage my billing?](#how-do-i-manage-my-billing). -**You can continue to use your Warp paid plan features until the cycle end date**. Any additional team members added to your team will be invoiced at the end of your billing cycle. +Cancelled subscriptions remain active until the **end of your billing cycle**, monthly or yearly. **You can continue to use your Warp paid plan features until the cycle end date**. New team members added before the cycle ends are still billed immediately on a prorated basis for the remaining time in the cycle. See [What counts as a team member and how does billing work for members?](#what-counts-as-a-team-member-and-how-does-billing-work-for-members). ### What happens if I upgrade from monthly to annual billing? When upgrading from a monthly to annual billing cycle the billing is prorated, meaning you only pay for the annual portion of the year you haven't paid for yet. You will be billed for the remaining part of the billing year with the discounted rate. -You can upgrade at any point throughout your subscription through the billing portal by going to **Settings** > **Billing and usage** > **Manage billing**. +You can upgrade at any point throughout your subscription on the [Warp upgrade page](https://app.warp.dev/upgrade). You can also open **Manage billing** from your profile menu on that page. See [How do I manage my billing?](#how-do-i-manage-my-billing). ### What happens to unused credits? @@ -112,11 +122,13 @@ Unused credits do not rollover to the next cycle and can't be transferred to oth ### What happens if my payment fails? -If a payment fails, you will receive an email from Stripe and your Warp Team Settings will show a past-due alert. Certain paid plan features and the ability to invite new members will be locked down while your Team is in a past-due state. Paying the most recent invoice through the billing portal by going to **Settings** > **Billing and usage** > **Manage billing** will fully re-enable your paid plan features. +If a payment fails, you will receive an email from Stripe and your Warp Team Settings will show a past-due alert. Certain paid plan features and the ability to invite new members will be locked down while your Team is in a past-due state. Paying all unpaid invoices through the billing portal will fully re-enable your paid plan features. See [How do I manage my billing?](#how-do-i-manage-my-billing). + +If there are multiple unpaid invoices and you need help resolving them, contact [billing@warp.dev](mailto:billing@warp.dev) for assistance. ### What counts as a credit? -Each time you submit a prompt in Warp, whether to generate code, suggest a command, or accomplish a task, you initiate an interaction with the Agent. Please see more details in our [credits](/support-and-community/plans-and-billing/credits/) page. +Each time you submit a prompt in Warp, whether to generate code, suggest a command, or accomplish a task, you initiate an interaction with the Agent. See more details on our [credits](/support-and-community/plans-and-billing/credits/) page. ### What counts as an AI token? @@ -163,15 +175,54 @@ Local agent runs on Free, Build, or Max — and local runs on Business or Enterp If you regularly run through your plan's monthly credit allowance, you have a few options: * **Upgrade to Max** — Designed for developers with heavier AI usage. Max includes a higher monthly credit allowance than Build, plus a better effective rate for credits than buying [add-on credits](/support-and-community/plans-and-billing/add-on-credits/) on Build. See [Warp pricing](https://www.warp.dev/pricing) for current allowances. -* **Purchase add-on credits** — Top up your account on demand. Larger denominations have a better effective rate. Add-on credits roll over month-to-month and remain valid for 12 months from purchase. If you move to the Free plan, your remaining add-on credits aren't removed. You just can't use them until you re-subscribe on the same team. See [add-on credits](/support-and-community/plans-and-billing/add-on-credits/) for current denominations. +* **Purchase add-on credits** — Top up your account on demand. Larger denominations have a better effective rate. Add-on credits roll over month-to-month and remain valid for 12 months from purchase, and they stay usable if you later move to the Free plan. See [add-on credits](/support-and-community/plans-and-billing/add-on-credits/) for current denominations. * **Enable auto-reload** — Pick a denomination and a monthly spend cap, and Warp will automatically purchase add-on credits when your balance drops below 100 credits, up to your cap. -* **Bring Your Own API Key (BYOK)** — Point Warp at your own OpenAI, Anthropic, or Google API key. Requests routed through BYOK don't consume Warp credits — you're billed directly by the model provider. See [Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/). On Business and Enterprise, platform credits may apply for local agent runs (billing starts July 1, 2026 on self-serve plans — see [When do platform credits start being charged on self-serve plans?](#when-do-platform-credits-start-being-charged-on-self-serve-plans)). -* **Use a custom inference endpoint** — Route requests through any OpenAI-compatible endpoint (OpenRouter, LiteLLM, z.ai, an internal gateway, etc.) without spending Warp credits. See [Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/). On Business and Enterprise, platform credits may apply for local agent runs (billing starts July 1, 2026 on self-serve plans — see [When do platform credits start being charged on self-serve plans?](#when-do-platform-credits-start-being-charged-on-self-serve-plans)). +* **Bring Your Own API Key (BYOK)** — Point Warp at your own OpenAI, Anthropic, or Google API key. Requests routed through BYOK don't consume Warp credits — you're billed directly by the model provider. See [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/). On Business and Enterprise, platform credits may apply for local agent runs (billing starts July 1, 2026 on self-serve plans — see [When do platform credits start being charged on self-serve plans?](#when-do-platform-credits-start-being-charged-on-self-serve-plans)). +* **Use a custom inference endpoint** — Route requests through any OpenAI-compatible endpoint (OpenRouter, LiteLLM, z.ai, an internal gateway, etc.) without spending Warp credits. See [Custom inference endpoint](/agents/inference/custom-inference-endpoint/). On Business and Enterprise, platform credits may apply for local agent runs (billing starts July 1, 2026 on self-serve plans — see [When do platform credits start being charged on self-serve plans?](#when-do-platform-credits-start-being-charged-on-self-serve-plans)). *BYOK and custom inference endpoint availability is subject to organization size — see [Can I bring my own API key?](#can-i-bring-my-own-api-key) for details.* For organization-scale needs (cloud-provider managed inference, granular admin controls, or higher seat counts), Enterprise plans include [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/). +### Can I buy credits on the Free plan without subscribing? + +Yes. Free plan users can buy the same [add-on credit](/support-and-community/plans-and-billing/add-on-credits/) packs as paid plans and spend them on any model, without a subscription. Free plan packs cost more per credit than the same packs on a paid plan — see [Warp pricing](https://www.warp.dev/pricing) for current rates. + +Buy from **Settings** > **Billing and usage** in the Warp app, or from the **Add-on credits** card on the [Warp upgrade page](https://app.warp.dev/upgrade). + +Credits you buy this way behave like any other add-on credits: they roll over, stay valid for 12 months from purchase, and remain usable if your team later moves between plans. + +### Who on my team can purchase add-on credits? + +Any active team member can purchase add-on credits for their own usage. Admin permissions aren't required, and the team doesn't need a paid subscription. Purchased credits are scoped to the buyer, so they only draw down for that person's usage. + +Two team-level settings still apply, and both are admin-only: + +* **Team-wide monthly spend cap** — Every purchase counts against one cap for the whole team per calendar month. Purchases that would exceed the cap are rejected. +* **Auto-reload** — While an admin has auto-reload on, individual members can't purchase add-on credits manually. + +Upgrading the team to a paid plan is still admin-only. A member who can't upgrade the team can still buy add-on credits for themselves. + +### Which card is charged when a team member buys add-on credits? + +Add-on credit purchases charge the payment method saved for the **team**, not a per-member card. That's whichever card the team already has on file — usually the one an admin entered when subscribing, or the one the first member entered when buying credits on a team that had no card yet. + +If the team has no saved payment method, the first purchase adds one and that card becomes the team's default. Later add-on credit purchases and auto-reload charge it. On a Free plan team, that means the first member to buy credits can end up supplying the card a teammate's later purchase is billed to. + +If you see an add-on credit charge you don't recognize: + +* Check **Settings** > **Billing and usage** in the Warp app for the team's add-on credit purchases this month. +* Ask a team admin to review the invoices in the billing portal, which lists each purchase and the member it was purchased for. See [How do I manage my billing?](#how-do-i-manage-my-billing). +* Email [billing@warp.dev](mailto:billing@warp.dev) if the charge still looks wrong. + +### How do I change or remove the card saved for my team? + +Team admins change or remove the saved card in the billing portal, reachable from **Settings** > **Billing and usage** in the Warp app or from the [Warp Admin Panel](https://app.warp.dev/admin/) on the web. See [How do I manage my billing?](#how-do-i-manage-my-billing) for both paths. + +Non-admin members can't open the billing portal. If you added a card to your team through a credit purchase and want it removed, ask a team admin to do it, or email [billing@warp.dev](mailto:billing@warp.dev). + +Admins who want to limit exposure without removing the card can lower the team-wide monthly spend cap under **Settings** > **Billing and usage**. Setting a lower cap bounds what the team can spend on add-on credits in a calendar month, no matter who makes the purchase. + ### How does auto-reload work for teams? Auto-reload prevents team members from getting blocked by credit exhaustion. It works the same way for individual and multi-seat paid plans, with one extra knob for teams. @@ -185,7 +236,7 @@ When auto-reload is **on**: Teams with a pre-May 21, 2026 grandfathered pooled add-on credit balance: that pooled balance drains first across the team before user-scoped add-on credits and is not counted toward any individual user's 100-credit auto-reload threshold. -When auto-reload is **off**, eligible team members can purchase add-on credits for themselves, as long as the team stays below the team-wide monthly spend cap. Users keep working as long as they have plan credits, previously purchased add-on credits, or have routed Warp at their own API key or [custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/). Once those run out, premium-model usage is blocked until credits are topped up or the next billing cycle begins. +When auto-reload is **off**, eligible team members can purchase add-on credits for themselves, as long as the team stays below the team-wide monthly spend cap. Users keep working as long as they have plan credits, previously purchased add-on credits, or have routed Warp at their own API key or [custom inference endpoint](/agents/inference/custom-inference-endpoint/). Once those run out, premium-model usage is blocked until credits are topped up or the next billing cycle begins. Auto-reload can be enabled, paused, or reconfigured at any time in **Settings** > **Billing and usage**. @@ -204,7 +255,7 @@ The waterfall on the owner's account 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 on the owner's 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 Oz 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](/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. :::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. @@ -212,12 +263,13 @@ Enterprise plans support team-scoped credit pools, so this traffic draws from th ### Does the Free plan include AI usage? -The Free plan doesn't include bundled AI usage for the Warp Agent. To use the Warp Agent, you have two options: +The Free plan doesn't include bundled AI usage for the Warp Agent. To use the Warp Agent, you have three options: * **Upgrade to a paid plan** — paid plans include a monthly allowance of Warp-provided AI usage with no extra setup. See [Warp pricing](https://www.warp.dev/pricing). -* **Bring your own inference** — connect your own API key with [Bring Your Own API Key (BYOK)](/agent-platform/inference/bring-your-own-api-key/), point Warp at a [custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/), or use a [SuperGrok or X Premium subscription](/agent-platform/inference/grok-subscription/). Requests routed through your own inference don't consume Warp credits. +* **Buy add-on credits** — purchase a credit pack without subscribing and spend it on any model. See [Can I buy credits on the Free plan without subscribing?](#can-i-buy-credits-on-the-free-plan-without-subscribing). +* **Bring your own inference** — connect your own API key with [Bring Your Own API Key (BYOK)](/agents/inference/bring-your-own-api-key/), point Warp at a [custom inference endpoint](/agents/inference/custom-inference-endpoint/), or use a [SuperGrok or X Premium subscription](/agents/inference/grok-subscription/). Requests routed through your own inference don't consume Warp credits. -Without a paid plan or your own inference, conversations on the Free plan can't run on Warp-provided models. This includes conversations started from prompt suggestions in the input. +Without a paid plan, purchased add-on credits, or your own inference, conversations on the Free plan can't run on Warp-provided models. This includes conversations started from prompt suggestions in the input. ### Can I use a Free plan if I'm a developer at a large company or organization? @@ -231,14 +283,14 @@ Warp doesn’t currently offer discounts for students or non-profits. We recomme For open source teams, two paths are available: -* The [Oz Open Source Partnership](/support-and-community/community/open-source-partnership/) program offers free agent credits to high-impact open source projects. +* The [{VARS.WARP_AUTOMATION_PLATFORM} Open Source Partnership](/support-and-community/community/open-source-partnership/) program offers free agent credits to high-impact open source projects. * Warp's client itself is open source under [AGPL v3](https://github.com/warpdotdev/warp/blob/master/LICENSE-AGPL), so you can build, run, and contribute to it directly. See [Contributing to Warp](/support-and-community/community/contributing/) for the flow. ### Where is Warp Drive data for my team stored? Warp Drive data is securely stored on Google Cloud Platform servers located in the United States. All data is encrypted in transit and at rest. -For more details, please [visit the Security Overview](https://www.warp.dev/legal/security) or contact [security@warp.dev](mailto:security@warp.dev). +For more details, [visit the Security Overview](https://www.warp.dev/legal/security) or contact [security@warp.dev](mailto:security@warp.dev). ### Does Warp have a SOC 2 Type 2 attestation? @@ -268,9 +320,9 @@ Regardless of plan, Warp never allows OpenAI, Anthropic, Google, or other model ### Can I bring my own API key? -Yes. On Free, Build, Max, Business, and Enterprise plans, you can configure your own OpenAI, Anthropic, or Google API key in **Settings** > **Agents** > **Oz** > **Manage models**. Requests routed through your own key don't consume Warp credits — you're billed directly by the model provider. +Yes. On Free, Build, Max, Business, and Enterprise plans, you can configure your own OpenAI, Anthropic, or Google API key in **Settings** > **Agents** > **Warp Agent** > **Manage models**. Requests routed through your own key don't consume Warp credits — you're billed directly by the model provider. -See [Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/) for setup steps, the list of supported providers and models, and the differences between BYOK, custom inference endpoints, and BYOLLM. +See [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) for setup steps, the list of supported providers and models, and the differences between BYOK, custom inference endpoints, and BYOLLM. 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. Companies or organizations with more than 10 employees need a Warp Business or Enterprise plan to use these features. @@ -280,7 +332,7 @@ On Business and Enterprise, local agent runs that use BYOK still consume platfor Yes. In addition to BYOK, Warp can route requests to any OpenAI-compatible inference endpoint — including OpenRouter, LiteLLM, z.ai, and internal gateways your team already runs. Custom inference endpoint requests also don't consume Warp credits. -Custom inference endpoints are available on Free, Build, Max, Business, and Enterprise. See [Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/) for configuration steps, billing behavior, and how custom inference endpoints differ from BYOK and from Enterprise's [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/) managed inference. +Custom inference endpoints are available on Free, Build, Max, Business, and Enterprise. See [Custom inference endpoint](/agents/inference/custom-inference-endpoint/) for configuration steps, billing behavior, and how custom inference endpoints differ from BYOK and from Enterprise's [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/) managed inference. 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. Companies or organizations with more than 10 employees need a Warp Business or Enterprise plan to use these features. @@ -288,7 +340,7 @@ On Business and Enterprise, local agent runs that use a custom inference endpoin ### Does Warp support other model routers or "Bring Your Own LLM"? -On the Enterprise plan, Warp's [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/) lets you route inference through major cloud-provider Model-as-a-Service offerings. BYOLLM currently supports AWS Bedrock, with Azure Foundry and Google Vertex coming soon. Warp still manages model support, routing, and orchestration, but inference runs in your cloud environment so you can maintain data locality, security controls, and existing cloud spend commitments. +On the Enterprise plan, Warp's [Bring Your Own LLM (BYOLLM)](/enterprise/enterprise-features/bring-your-own-llm/) lets you route inference through major cloud-provider Model-as-a-Service offerings. BYOLLM supports AWS Bedrock and [Gemini Enterprise (Vertex AI)](/enterprise/enterprise-features/byollm-gemini-enterprise/), with Azure Foundry coming soon. Warp still manages model support, routing, and orchestration, but inference runs in your cloud environment so you can maintain data locality, security controls, and existing cloud spend commitments. Custom or in-house model routers outside this list aren't supported by default today. If you have specific requirements, [contact our sales team](https://www.warp.dev/contact-sales). @@ -296,9 +348,9 @@ For lighter-weight routing through any OpenAI-compatible endpoint (OpenRouter, L ### What features are available during multi-harness orchestration beta? -Multi-harness orchestration is currently in beta and available to all users. You can use the [Warp Agent](/platform/harnesses/warp-agent/) alongside [Claude Code](/platform/harnesses/claude-code/) and [Codex](/platform/harnesses/codex/) in Oz cloud environments, and mix and match harnesses across workflows. +Multi-harness orchestration is currently in beta and available to all users. You can use the [Warp Agent](/platform/harnesses/warp-agent/) alongside [Claude Code](/platform/harnesses/claude-code/) and [Codex](/platform/harnesses/codex/) in {VARS.WARP_AUTOMATION_PLATFORM} cloud environments, and mix and match harnesses across workflows. -[Agent Memory](/agent-platform/agent-memory/) is currently in Research Preview. It lets preferences, project knowledge, and learnings from past sessions carry across harnesses and future agent runs. [Contact our sales team](https://www.warp.dev/contact-sales) to request access. +[Agent Memory](/agents/agent-memory/) is currently in Research Preview. It lets preferences, project knowledge, and learnings from past sessions carry across harnesses and future agent runs. [Contact our sales team](https://www.warp.dev/contact-sales) to request access. As these features move out of beta or Research Preview, availability, limits, and pricing may change. @@ -313,17 +365,11 @@ To checkout with Apple Pay, use the Safari browser on an Apple device.\ To checkout with Google Pay, use Chrome, make sure you're logged into your Google Wallet account in the browser, and that "Save and fill payment methods" is enabled in the browser settings. ::: -### How do I cancel my subscription? - -You can cancel at any point throughout your subscription through the billing portal by going to **Settings** > **Billing and usage** > **Manage billing**. - -Cancelled subscriptions will remain active until the end of the billing cycle. - ### How do I get a refund? For monthly subscriptions, we can issue a full refund if you cancel within 24 hours of being charged and no credits have been used. -For annual subscriptions, we can issue a full refund within 15 days if no credits have been used, or a prorated refund for remaining months after that. Please see [Warp's Refund Policy](/support-and-community/plans-and-billing/plans-pricing-refunds/#warps-refund-policies) for full details and exceptions. +For annual subscriptions, we can issue a full refund within 15 days if no credits have been used, or a prorated refund for remaining months after that. See [Warp's Refund Policy](/support-and-community/plans-and-billing/plans-pricing-refunds/#warps-refund-policies) for full details and exceptions. ### Why doesn't my promo code work or why was it disabled? @@ -389,13 +435,13 @@ Add-on credits are tied to the team that paid for them, so team-membership chang * **An admin removes you from a team**: You lose access to any add-on credits tied to that team. If you rejoin later, you regain access to any unused, non-expired credits. * **An admin deletes the team**: Any remaining add-on credits tied to the team are no longer usable by anyone. -Unused add-on credits remain valid for 12 months from purchase, as long as you have an active subscription. See [When team membership changes](/support-and-community/plans-and-billing/add-on-credits/#when-team-membership-changes) on the add-on credits page for full details. +Unused add-on credits remain valid for 12 months from purchase and stay tied to the team they were purchased under. See [When team membership changes](/support-and-community/plans-and-billing/add-on-credits/#when-team-membership-changes) on the add-on credits page for full details. #### Can I bring my own API key on the Free plan now? -Yes. As of May 21, 2026, **Bring Your Own API Key (BYOK)** is available on all plans, including Free. Previously, BYOK required a Build, Business, or Enterprise subscription. You can configure your OpenAI, Anthropic, or Google key under **Settings** > **Agents** > **Oz** > **Manage models**. +Yes. As of May 21, 2026, **Bring Your Own API Key (BYOK)** is available on all plans, including Free. Previously, BYOK required a Build, Business, or Enterprise subscription. You can configure your OpenAI, Anthropic, or Google key under **Settings** > **Agents** > **Warp Agent** > **Manage models**. -See [Bring Your Own API Key](/agent-platform/inference/bring-your-own-api-key/) for the full list of supported providers and setup steps. +See [Bring Your Own API Key](/agents/inference/bring-your-own-api-key/) for the full list of supported providers and setup steps. #### What is the new custom inference endpoint feature? @@ -405,9 +451,9 @@ Here's how custom inference endpoints differ from BYOK and BYOLLM: * **BYOK** sends requests directly to OpenAI, Anthropic, or Google using your own provider API key. * **Custom inference endpoint** sends requests to any OpenAI-compatible URL you control or that your team runs. -* **BYOLLM** is an Enterprise-only managed inference feature. Warp routes traffic through your cloud provider (AWS Bedrock today, with Azure Foundry and Google Vertex coming soon) and handles the routing, orchestration, governance, and observability. +* **BYOLLM** is an Enterprise-only managed inference feature. Warp routes traffic through your cloud provider (AWS Bedrock and Gemini Enterprise Agent Platform (Vertex AI) today, with Azure Foundry coming soon) and handles the routing, orchestration, governance, and observability. -For setup and details, see [Custom inference endpoint](/agent-platform/inference/custom-inference-endpoint/). +For setup and details, see [Custom inference endpoint](/agents/inference/custom-inference-endpoint/). #### When do platform credits start being charged on self-serve plans? @@ -429,4 +475,5 @@ A short checklist to triage the May 2026 changes for your team: * **Check your seat count.** Go to **Settings** > **Teams** to see whether your team is at or above your plan's new seat limit. If you are, see [What if my team is already above the new seat limit?](#what-if-my-team-is-already-above-the-new-seat-limit). * **Set your team's add-on credit spend cap.** Under **Settings** > **Billing and usage**, configure the monthly cap that applies to add-on credit purchases across your team. Team members can now buy their own add-on credits, but every purchase counts against this cap. * **Let your team know add-on credits are user-scoped now.** Each member can purchase add-on credits for their own usage without affecting anyone else's balance. +* **Confirm which card your team has on file.** Every add-on credit purchase charges the team's saved payment method, including purchases made by members who aren't admins. Review it in the billing portal. See [Which card is charged when a team member buys add-on credits?](#which-card-is-charged-when-a-team-member-buys-add-on-credits). * **Plan for platform credits on July 1, 2026.** If your team is on Business and uses BYOK or a custom inference endpoint locally, those local runs will start consuming platform credits when the preview period ends. See [When do platform credits start being charged on self-serve plans?](#when-do-platform-credits-start-being-charged-on-self-serve-plans). diff --git a/src/content/docs/support-and-community/privacy-and-security/network-log.mdx b/src/content/docs/support-and-community/privacy-and-security/network-log.mdx index d85880c46..2600286ea 100644 --- a/src/content/docs/support-and-community/privacy-and-security/network-log.mdx +++ b/src/content/docs/support-and-community/privacy-and-security/network-log.mdx @@ -26,4 +26,4 @@ Each log item is a timestamped Debug format string for either a request or respo ## Known issues with network log -At the moment, network traffic originating from crash reports and error messages is not captured in the network log. This is due to our use of the Sentry SDK, which encapsulates all network logic and doesn’t currently expose a hook for handling requests and responses directly. The team is actively investigating a solution to include such traffic in the log in a future release. You may also disable Crash Reporting entirely in Warp’s **Settings** > **Privacy** tab. +At the moment, network traffic originating from crash reports and error messages is not captured in the network log. This is due to our use of the Sentry SDK, which encapsulates all network logic and doesn’t currently expose a hook for handling requests and responses directly. The team is actively investigating a solution to include such traffic in the log in a future release. You can also disable Crash Reporting entirely in Warp’s **Settings** > **Privacy** tab. diff --git a/src/content/docs/support-and-community/privacy-and-security/privacy.mdx b/src/content/docs/support-and-community/privacy-and-security/privacy.mdx index f9fe72df5..18910b0d6 100644 --- a/src/content/docs/support-and-community/privacy-and-security/privacy.mdx +++ b/src/content/docs/support-and-community/privacy-and-security/privacy.mdx @@ -18,6 +18,7 @@ Our philosophy is complete transparency and control over any data leaving your m * Monitor telemetry in real-time with Warp's native [Network Log](/support-and-community/privacy-and-security/network-log/) * [Opt out](/support-and-community/privacy-and-security/privacy/#how-to-disable-telemetry-and-crash-reporting) of telemetry at any time * Read and audit Warp's client source code at [`warpdotdev/warp`](https://github.com/warpdotdev/warp), open source under [AGPL v3](https://github.com/warpdotdev/warp/blob/master/LICENSE-AGPL) +* See how long [shared session data is kept and who can access it](/agents/local-agents/session-sharing/#data-retention-and-access) ## What telemetry data does Warp collect and why? @@ -26,7 +27,7 @@ Warp collects high-level telemetry and usage data to discover product quality is If you haven't opted out of "Help improve Warp", we may collect: 1. High level product usage and analytics data to analyze feature uptake and usage patterns. See the full list of tracked events in the [exhaustive telemetry table](/support-and-community/privacy-and-security/privacy/#exhaustive-telemetry-table) below. These are all high level metrics and do not include any user generated content. -2. AI interactions and console inputs that power our [AI features](/agent-platform/local-agents/overview/). Warp unconditionally applies [Secret Redaction](/support-and-community/privacy-and-security/secret-redaction/) in all AI interactions to ensure that any sensitive data is _never_ collected or sent to third parties. +2. AI interactions and console inputs that power our [AI features](/agents/). Warp unconditionally applies [Secret Redaction](/support-and-community/privacy-and-security/secret-redaction/) in all AI interactions to ensure that any sensitive data is _never_ collected or sent to third parties. :::note Telemetry must be enabled to use AI features on the Free plan, while paid plans can opt out at any time and continue using Warp, including AI. @@ -66,7 +67,6 @@ Deletion jobs run every 24 hours, so if you deleted your account and want to sig If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow will require that you assign a team member as the new admin. ::: - ### Exhaustive telemetry table | Event Name | Description | @@ -85,632 +85,7 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `AI Suggested Rule Added` | Clicked the Add Suggested Rule button in the AI blocklist | | `AI Suggested Rule Content Changed` | Content changed by the user in the suggested rule dialog | | `AI Suggested Rule Edited` | Clicked the Edit Suggested Rule button in the AI blocklist | -| `AIAutonomy.AutoexecutedRequestedCommand` | Autoexecuted an Agent Mode requested command | -| `AIAutonomy.ChangedAgentModeAskUserQuestionPermission` | Changed Agent Mode permission for asking user questions | -| `AIAutonomy.ChangedAgentModeCodingPermissions` | Changed Agent Mode permissions for coding tasks | -| `AIAutonomy.ToggledAutoexecuteReadonlyCommandsSetting` | Toggled setting to autoexecute readonly Agent Mode requested commands | -| `Active Indexed Repos Changed` | Active indexed repositories changed, affecting codebase context. | -| `Add Added Subshell Command` | Added a command to be automatically Warpified via Warp's subshell wrapper | -| `Add Denylisted SSH Tmux Wrapper Host` | Added a SSH host to the denylist for prompting for Tmux Wrapper | -| `Add Denylisted Subshell Command` | Explicitly prevent a command from being Warpified via Warp's subshell wrapper | -| `Add Tab With Shell` | Added a tab with specific shell | -| `Added Workflow Alias` | Added an alias to a Warp Drive workflow | -| `Agent Management View Copied Session Link` | User copied a session link from the Agent Management View | -| `Agent Management View Opened Session` | User opened a session from the Agent Management View | -| `Agent Management View Toggled` | User toggled the Agent Management View open or closed | -| `Agent Mode Query Suggestion Accepted` | Prompt Suggestion accepted | -| `Agent Mode Query Suggestions Banner Shown` | Prompt Suggestions banner shown | -| `Agent Mode Setup Banner Accepted` | Agent Mode setup banner accepted | -| `Agent Mode Setup Banner Dismissed` | Agent Mode setup banner dismissed | -| `Agent Mode Setup Project Scoped Rules Action` | User clicked a button in the Agent Mode setup project scoped rules step | -| `Agent Mode.Setup Codebase Context Action` | User clicked a button in the Agent Mode setup codebase context step | -| `Agent Predict` | Completed an Agent Predict prediction | -| `Agent Toolbar Dismissed` | User dismissed the use-agent toolbar | -| `AgentManagement.AgentTypeSelectorOpened` | User opened the agent type selector from agent management | -| `AgentManagement.ArtifactClicked` | User clicked an artifact button | -| `AgentManagement.CloudRunCancelled` | User cancelled a cloud run | -| `AgentManagement.CloudRunOpened` | User opened a cloud run | -| `AgentManagement.ConversationForked` | User forked a conversation | -| `AgentManagement.ConversationLinkCopied` | User copied a conversation link | -| `AgentManagement.ConversationOpened` | User opened a conversation | -| `AgentManagement.DetailsPanelContinueLocally` | User clicked Continue locally in the details panel | -| `AgentManagement.DetailsViewed` | User clicked View details | -| `AgentManagement.DismissSetupGuide` | User dismissed the ambient agent setup guide | -| `AgentManagement.FilterChanged` | User changed a filter in the management view | -| `AgentManagement.OpenSetupGuide` | User opened the ambient agent setup guide | -| `AgentManagement.SessionLinkCopied` | User copied a session link | -| `AgentManagement.SetupGuideDocsLink` | User clicked a docs URL in the setup guide | -| `AgentManagement.SetupGuideStepCopy` | User copied a workflow step from the setup guide | -| `AgentManagement.SetupGuideStepRun` | User ran a workflow step from the setup guide | -| `AgentManagement.SlashCommandContinueLocally` | User invoked /continue-locally to fork a cloud conversation locally | -| `AgentManagement.SpawnNewCloudAgent` | User spawned a new cloud agent from agent management | -| `AgentManagement.SpawnNewLocalAgent` | User spawned a new local agent from agent management | -| `AgentManagement.TombstoneArtifactClicked` | User clicked an artifact in the tombstone view | -| `AgentManagement.TombstoneContinueInCloud` | User clicked Continue in the tombstone to start a cloud follow-up | -| `AgentManagement.TombstoneContinueLocally` | User clicked Continue locally in the tombstone | -| `AgentManagement.ViewToggled` | User toggled the agent management view open or closed | -| `AgentMode.AttachedContext` | Attached block as context to an Agent Mode query | -| `AgentMode.AttachedImages` | Attached images to an Agent Mode query | -| `AgentMode.ChangedInputType` | The input type was changed from shell -> AI or AI -> shell | -| `AgentMode.ClickedEntrypoint` | Clicked on an Agent Mode entrypoint | -| `AgentMode.Code.DiffHunksNavigated` | Agent Mode Code diff hunks navigated | -| `AgentMode.Code.DiffMatchFailed` | Failed to match code diff | -| `AgentMode.Code.FileExceededContextLimit` | File from AI exceeded context limit | -| `AgentMode.Code.FilesNavigated` | Agent Mode Code files navigated | -| `AgentMode.Code.InvalidFile` | File(s) in code diff could not be found | -| `AgentMode.Code.MalformedFinalLineProxy` | Suggested code diff likely required malformed trailing line correction (heuristic) | -| `AgentMode.Code.MissingLineNumbers` | Code diff was missing line numbers | -| `AgentMode.Code.SuggestedCodeEditedByUser` | Agent Mode Code suggestion edited by user | -| `AgentMode.Code.SuggestedEditAcceptAndContinueClicked` | User selected Accept and start conversation for a code diff suggestion in Agent Mode | -| `AgentMode.Code.SuggestedEditAcceptClicked` | User selected Accept for a code diff suggestion in Agent Mode | -| `AgentMode.Code.SuggestedEditReceived` | Agent Mode suggested a code edit | -| `AgentMode.Code.SuggestedEditResolved` | Agent Mode pending code edit suggestion resolved | -| `AgentMode.CreatedAIBlock` | Created an AI block in agent mode | -| `AgentMode.Error` | Received an error when getting Agent Mode response | -| `AgentMode.ExecutedWarpDrivePrompt` | Executed a saved prompt. | -| `AgentMode.ExitedShellProcess` | An agent-requested command caused the shell process to exit | -| `AgentMode.FileGlob.Failed` | The file glob tool failed to complete | -| `AgentMode.FileGlob.Succeeded` | The file glob tool completed successfully | -| `AgentMode.FullEmbedCodebaseContextSearch.Failed` | Failed to search full embed codebase context | -| `AgentMode.FullEmbedCodebaseContextSearch.Success` | Successfully searched full embed codebase context | -| `AgentMode.Grep.Failed` | The grep tool failed to complete | -| `AgentMode.Grep.Succeeded` | The grep tool completed successfully | -| `AgentMode.MerkleTreeSnapshot.Diff.Failed` | Failed to diff merkle tree snapshot | -| `AgentMode.MerkleTreeSnapshot.Diff.Success` | Successfully diffed merkle tree snapshot | -| `AgentMode.MerkleTreeSnapshot.Rebuild.Failed` | Failed to rebuild merkle tree from snapshot | -| `AgentMode.MerkleTreeSnapshot.Rebuild.Success` | Successfully rebuilt merkle tree from snapshot | -| `AgentMode.NaturalLanguageDetection.InputBufferSubmitted` | Input buffer submitted | -| `AgentMode.OpenedCitation` | Opened a citation that was surfaced in agent mode | -| `AgentMode.Orchestration.AgentProposedConfig` | An agent-authored orchestration config snapshot first became visible to the user on a plan card | -| `AgentMode.Orchestration.Entered` | Orchestration was activated in a conversation via /orchestrate or a run_agents confirmation card surfacing. Plan-card entries are tracked separately via AgentProposedConfig + PlanConfigApprovalToggled. | -| `AgentMode.Orchestration.PillBarInteraction` | User interacted with the orchestration pill bar (switch, pin, open in pane/tab, stop, kill, etc.) | -| `AgentMode.Orchestration.PlanConfigApprovalToggled` | User toggled the Use orchestration switch on a plan card | -| `AgentMode.Orchestration.RunAgentsCardDecision` | User accepted, accepted-without-orchestration, or rejected a run_agents confirmation card. Reports which config fields diverged from the original tool call and/or the active approved config. | -| `AgentMode.Orchestration.TeamAgentCommunicationFailed` | Failed to send an orchestration message or lifecycle event for a TeamAgent | -| `AgentMode.PotentialAutoDetectionFalsePositive` | Manually toggled input to shell mode after input was auto-detected as natural language. | -| `AgentMode.QueryAttemptAtLImit` | Tried to send an Agent Mode query but they already reached the query limit | -| `AgentMode.RequestRetrySucceeded` | Agent Mode request succeeded after retrying following an initial error | -| `AgentMode.SetupCreateEnvironmentAction` | User clicked a button in the Agent Mode setup create environment step | -| `AgentMode.SurfacedCitations` | Agent mode used and cited external sources that were used in its response | -| `AgentMode.SyncCodebaseContext.BuildTree.Failed` | Failed to build merkle tree for codebase context | -| `AgentMode.SyncCodebaseContext.BuildTree.Success` | Successfully built merkle tree for codebase context | -| `AgentMode.SyncCodebaseContext.Failed` | Failed to sync codebase context | -| `AgentMode.SyncCodebaseContext.Success` | Successfully synced codebase context | -| `AgentMode.ToggleAutoDetectionSetting` | Toggled the setting that enables or disables natural language auto-detection in the input. | -| `AgentNotification.Shown` | An agent notification was shown to the user (toast or mailbox) | -| `AgentTip Clicked` | User clicked a link or action in an Agent Tip | -| `AgentTip Shown` | Selected an Agent Tip to show in the Agent Mode status bar | -| `AgentView.Entered` | User entered the Agent View | -| `AgentView.Exited` | User exited the Agent View | -| `AgentView.InlineConversationMenuItemSelected` | User selected an item from the inline conversation menu | -| `AgentView.InlineConversationMenuOpened` | User opened the inline conversation menu in Agent View | -| `AgentView.ShortcutsViewToggled` | User toggled the shortcuts view in Agent View | -| `AgenticOnboarding.BlockSelected` | Selected an agentic onboarding block to execute | -| `AmbientAgent.CloudMode.Entered` | User entered cloud agent view | -| `AmbientAgent.CloudMode.EnvironmentSelector.Opened` | User opened the environment selector menu | -| `AmbientAgent.CloudMode.EnvironmentSelector.Selected` | User selected an environment from the selector | -| `AmbientAgent.CloudMode.EnvironmentSettings.GitHubAuth` | User started GitHub authentication from the environment form | -| `AmbientAgent.CloudMode.EnvironmentSettings.LaunchedAgent` | User launched an environment setup agent from the environment form | -| `AmbientAgent.ConcurrencyModal.Dismissed` | User dismissed the cloud agent capacity modal | -| `AmbientAgent.ConcurrencyModal.Opened` | User opened the cloud agent capacity modal | -| `AmbientAgent.ConcurrencyModal.UpgradeClicked` | User clicked the upgrade button in the cloud agent capacity modal | -| `AmbientAgent.DispatchFailed` | Ambient agent failed to dispatch or encountered an error | -| `AmbientAgent.EnvironmentSettings.CreatedEnvironment` | User created a new environment | -| `AmbientAgent.EnvironmentSettings.DeletedEnvironment` | User deleted an environment | -| `AmbientAgent.EnvironmentSettings.Image.Suggested` | Docker image was suggested for an environment | -| `AmbientAgent.EnvironmentSettings.Image.SuggestionFailed` | Docker image suggestion failed | -| `AmbientAgent.EnvironmentSettings.Opened` | User opened the environment management pane | -| `AmbientAgent.EnvironmentSettings.UpdatedEnvironment` | User updated an existing environment | -| `AmbientAgent.Handoff.Initiated` | User initiated a local-to-cloud handoff | -| `AmbientAgents.ThirdPartyHarness.RuntimeError.Detected` | Runtime output scanner detected a known failure substring in a third-party harness block. | -| `Anonymous User Attempted Login-Gated Feature` | Anonymous user attempted to access a login-gated feature | -| `Anonymous User Expiration Lockout` | An anonymous user opened Warp after their conversion deadline and was locked out | -| `Anonymous User Hit Cloud Object Limit` | Anonymous user attempted to create a cloud object past their personal object limit | -| `Anonymous User Initiated Signup` | An anonymous user initiated the sign up flow | -| `Anonymous User Linked from Browser` | Received an auth payload from anonymous user after linking in browser | -| `App Download Source` | Whether the Warp was installed from the home page or through homebrew | -| `App Startup` | App is launched | -| `Attached Workflow Alias Environment Variables` | Added or removed environment variables for a Warp Drive workflow alias | -| `Attempting to Relaunch for Update` | Attempted to relaunch the app after installing an update | -| `Auth Common Question Clicked in App` | Clicked on "Common Question" when logging in | -| `Auth: Open Privacy Settings Overlay` | Privacy settings are open during sign-in | -| `Auth: Toggle Common Questions` | Toggled FAQ Page when logging in | -| `Autosuggestion Inserted` | Accepted autosuggestion | -| `Background Block Started` | Warp created a background-output Block (whenever a processes has been backgrounded and yields some output) | -| `BaselineCommand Latency` | Command execution time | -| `Block Creation` | Created Block | -| `Block Filter Toolbelt Button Clicked` | Clicked the block filter icon in the top-right of a block | -| `Block Selection` | Selected Block | -| `Bootstrap Slow Contents` | Contents of the bootstrap block if bootstrapping is slow | -| `Bootstrapping Slow` | Slow bootstrap on session startup | -| `Bootstrapping Succeeded` | Successful bootstrap for session | -| `CLI Subagent Action Executed` | User approved a blocked action from the CLI subagent | -| `CLI Subagent Action Rejected` | User rejected a blocked action from the CLI subagent | -| `CLI Subagent Control State Changed` | Control state changed in CLI subagent (agent in control, agent blocked, user in control, or agent tagged in) | -| `CLI Subagent Input Dismissed` | User dismissed the input in the CLI subagent | -| `CLI Subagent Responses Toggled` | User toggled the visibility of agent responses in CLI subagent | -| `CLI.Execute.Agent.Create` | Created an agent from the Warp CLI | -| `CLI.Execute.Agent.Delete` | Deleted an agent from the Warp CLI | -| `CLI.Execute.Agent.Get` | Got agent details from the Warp CLI | -| `CLI.Execute.Agent.List` | Listed agents from the Warp CLI | -| `CLI.Execute.Agent.Profile.List` | Listed agent profiles from the Warp CLI | -| `CLI.Execute.Agent.Run` | Ran an agent from the Warp CLI | -| `CLI.Execute.Agent.RunAmbient` | Ran an ambient agent from the Warp CLI | -| `CLI.Execute.Agent.Skills` | Listed agent skills from the Warp CLI | -| `CLI.Execute.Agent.Update` | Updated an agent from the Warp CLI | -| `CLI.Execute.ApiKey.Create` | Created an API key from the Warp CLI | -| `CLI.Execute.ApiKey.Expire` | Expired an API key from the Warp CLI | -| `CLI.Execute.ApiKey.List` | Listed API keys from the Warp CLI | -| `CLI.Execute.Artifact.Download` | Downloaded an artifact from the Warp CLI | -| `CLI.Execute.Artifact.Get` | Got artifact metadata from the Warp CLI | -| `CLI.Execute.Artifact.Upload` | Uploaded an artifact from the Warp CLI | -| `CLI.Execute.Conversation.Get` | Got conversation by ID from the Warp CLI | -| `CLI.Execute.Environment.Create` | Created a cloud environment from the Warp CLI | -| `CLI.Execute.Environment.Delete` | Deleted a cloud environment from the Warp CLI | -| `CLI.Execute.Environment.Get` | Got cloud environment details from the Warp CLI | -| `CLI.Execute.Environment.Image.List` | Listed available base images from the Warp CLI | -| `CLI.Execute.Environment.List` | Listed cloud environments from the Warp CLI | -| `CLI.Execute.Environment.Update` | Updated a cloud environment from the Warp CLI | -| `CLI.Execute.Federate.IssueGcpToken` | Issued a GCP federated identity token from the Warp CLI | -| `CLI.Execute.Federate.IssueToken` | Issued a federated identity token from the Warp CLI | -| `CLI.Execute.HarnessSupport.FinishTask` | Reported task completion via harness-support from the Warp CLI | -| `CLI.Execute.HarnessSupport.NotifyUser` | Sent a user notification via harness-support from the Warp CLI | -| `CLI.Execute.HarnessSupport.Ping` | Pinged harness-support from the Warp CLI | -| `CLI.Execute.HarnessSupport.ReportArtifact` | Reported an artifact via harness-support from the Warp CLI | -| `CLI.Execute.HarnessSupport.ReportShutdown` | Reported agent shutdown via harness-support from the Warp CLI | -| `CLI.Execute.Integration.Create` | Created an integration from the Warp CLI | -| `CLI.Execute.Integration.List` | Listed integrations from the Warp CLI | -| `CLI.Execute.Integration.Update` | Updated an integration from the Warp CLI | -| `CLI.Execute.Login` | Logged in via the Warp CLI | -| `CLI.Execute.Logout` | Logged out via the Warp CLI | -| `CLI.Execute.MCP.List` | Listed MCP servers from the Warp CLI | -| `CLI.Execute.Model.List` | Listed models from the Warp CLI | -| `CLI.Execute.Provider.List` | Listed providers from the Warp CLI | -| `CLI.Execute.Provider.Setup` | Set up a provider via the Warp CLI | -| `CLI.Execute.Run.Conversation.Get` | Got run conversation from the Warp CLI | -| `CLI.Execute.Run.Message.List` | Listed run messages from the Warp CLI | -| `CLI.Execute.Run.Message.MarkDelivered` | Marked a run message as delivered from the Warp CLI | -| `CLI.Execute.Run.Message.Read` | Read a run message from the Warp CLI | -| `CLI.Execute.Run.Message.Send` | Sent a run message from the Warp CLI | -| `CLI.Execute.Run.Message.Watch` | Watched run messages from the Warp CLI | -| `CLI.Execute.Schedule.Create` | Created a scheduled agent from the Warp CLI | -| `CLI.Execute.Schedule.Delete` | Deleted a scheduled agent from the Warp CLI | -| `CLI.Execute.Schedule.Get` | Got scheduled agent configuration from the Warp CLI | -| `CLI.Execute.Schedule.List` | Listed scheduled agents from the Warp CLI | -| `CLI.Execute.Schedule.Pause` | Paused a scheduled agent from the Warp CLI | -| `CLI.Execute.Schedule.Unpause` | Unpaused a scheduled agent from the Warp CLI | -| `CLI.Execute.Schedule.Update` | Updated a scheduled agent from the Warp CLI | -| `CLI.Execute.Secret.Create` | Created a secret from the Warp CLI | -| `CLI.Execute.Secret.Delete` | Deleted a secret from the Warp CLI | -| `CLI.Execute.Secret.List` | Listed secrets from the Warp CLI | -| `CLI.Execute.Secret.Update` | Updated a secret from the Warp CLI | -| `CLI.Execute.Task.Get` | Got status of task from the Warp CLI | -| `CLI.Execute.Task.List` | Listed tasks from the Warp CLI | -| `CLI.Execute.Whoami` | Printed current user info from the Warp CLI | -| `CLIAgentFooter.ImageAttached` | User attached an image from the CLI agent footer | -| `CLIAgentFooter.SettingToggled` | User toggled the CLI agent footer setting | -| `CLIAgentFooter.Shown` | CLI agent footer was shown to the user | -| `CLIAgentFooter.VoiceInputUsed` | User used voice input from the CLI agent footer | -| `CLIAgentPlugin.ChipClicked` | User clicked the plugin install or update chip | -| `CLIAgentPlugin.ChipDismissed` | User dismissed the plugin install or update chip | -| `CLIAgentPlugin.Detected` | A CLI agent plugin was detected via a SessionStart event | -| `CLIAgentPlugin.OperationFailed` | Auto plugin install or update failed | -| `CLIAgentPlugin.OperationSucceeded` | Auto plugin install or update completed successfully | -| `CLIAgentRichInput.Closed` | CLI agent Rich Input was closed | -| `CLIAgentRichInput.Opened` | User opened CLI agent Rich Input | -| `CLIAgentRichInput.Submitted` | User submitted a prompt via CLI agent Rich Input | -| `Changed invite view option` | Toggled between link and invite for invite | -| `Clicked Continue Conversation Button` | User clicked the Continue Conversation button in a block footer | -| `Clicked Reset to Defaults Button in Settings Import` | Reset the imported settings in the settings import onboarding block | -| `Clone Repo Prompt Submitted` | User submitted a repository URL from the clone repo view | -| `Code Pane Opened` | Opened the code editor pane from various sources | -| `CodePanels.FileOpened` | Opened a file from code review, project explorer, or global search | -| `CodeReview.AddToContext` | Content added to AI context from code review | -| `CodeReview.BaseChanged` | Diff base changed in code review | -| `CodeReview.CommentAdded` | Inline code review comment added | -| `CodeReview.CommentDeleted` | Inline code review comment deleted | -| `CodeReview.CommentEdited` | Inline code review comment edited | -| `CodeReview.CommentEditorOpened` | Inline code review comment editor opened | -| `CodeReview.CommentListExpanded` | Inline code review comment list expanded | -| `CodeReview.CommentListItemClicked` | Inline code review comment list item clicked | -| `CodeReview.CommentRelocationFailed` | Inline code review comment relocation fell back to approximate line | -| `CodeReview.CommentResolved` | Inline code review comment resolved | -| `CodeReview.CommentsAttached` | Newly-imported comments relocated against editor lines | -| `CodeReview.CommentsReceived` | Agent insert_code_review_comments tool call received and processed | -| `CodeReview.DiffLoadCompleted` | Diff content loaded successfully | -| `CodeReview.FileSaved` | File saved in code review pane | -| `CodeReview.FindBarModeChanged` | Search mode changed in code review find bar | -| `CodeReview.FindBarToggled` | Code review find bar opened or closed | -| `CodeReview.FindNavigated` | Navigated to next or previous match in code review find bar | -| `CodeReview.GitButtonTriggered` | User clicked a git operation button in the code review header | -| `CodeReview.GitDialogCompleted` | Git operation dialog reached a terminal state (succeeded, failed, or cancelled) | -| `CodeReview.LoadDiffFailed` | Failure when loading diff content | -| `CodeReview.LoadMetadataFailed` | Failure when calculating diff metadata | -| `CodeReview.PaneOpened` | Code review pane opened | -| `CodeReview.PaneStateChanged` | Code review pane minimized or maximized | -| `CodeReview.RevertHunkClicked` | Revert hunk button clicked | -| `CodeReview.ReviewSubmitted` | Inline code review submitted to agent | -| `CodeView.SelectionAddedAsContext` | Added selected code as context from the code editor | -| `CodexModal.Opened` | User opened the Codex modal | -| `CodexModal.UseCodexClicked` | User clicked 'Use Codex' in the Codex modal | -| `Command Correction Event` | Accepted command correction | -| `Command File Run` | Opened a .cmd or unix executable file and ran it directly in Warp | -| `Command Palette Search Accepted` | Accepted a command palette search result | -| `Command Palette Search Exited` | Exited command palette search without accepting a result | -| `Command Search Async Query Completed` | Finished searching for a command in the background | -| `Command Search Exited` | Exited command search (universal search panel to search) without accepting a result | -| `Command Search Filter Changed` | Changed command search filter | -| `Command Search Opened` | Opened command search (universal search panel to search) | -| `Command Search Result Accepted` | Accepted command search result | -| `Complete Welcome Tip` | Completed all welcome tips items | -| `Completed Settings Import` | Imported a terminal's settings via the settings import onboarding block | -| `ComputerUse.Approved` | A RequestComputerUse action was approved (manually or auto-executed) | -| `ComputerUse.Cancelled` | A RequestComputerUse action was cancelled/rejected | -| `Confirm Suggestion` | Accepted tab completion suggestion | -| `Context Menu Copy` | Clicked "Copy" in context menu | -| `Context Menu Copy Prompt` | Clicked "Copy Prompt" in context menu | -| `Context Menu Copy Selected Text` | Clicked "Copy selected text" in context menu | -| `Context Menu Insert Selected Text into Input` | Clicked "insert into input" in context menu | -| `Context Menu Toggle Git Prompt Dirty Indicator` | Toggled indicator of dirty git prompt | -| `Context Menu: Find Within Blocks` | Clicked "find within blocks" in context menu | -| `Context Menu: Initiate Block Sharing` | Opened "Share" modal via context menu | -| `Context Menu: Reinput Commands` | Clicked "reinput commands" in context menu | -| `ConversationList.ItemDeleted` | Deleted a conversation from the conversation list | -| `ConversationList.ItemOpened` | Opened a conversation from the conversation list | -| `ConversationList.LinkCopied` | Copied a conversation link from the conversation list | -| `ConversationList.Opened` | Opened the conversation list view in the left panel | -| `Copied Shared Session Link` | Copied a shared session link | -| `Copy Block Sharing Link` | Clicked "Share block..." in context menu | -| `Copy Invite Link` | Clicked "Copy Link" on Referral Modal | -| `Copy Obfuscated Secret` | Copied a secret's obfuscated contents to clipboard | -| `Copy Object To Clipboard` | Copied an object to the user's keyboard | -| `Create Custom Theme` | Created a custom theme using the built-in theme creator | -| `Create Project Prompt Submitted` | User submitted a prompt from the create project view | -| `Create Project Prompt Submitted Content` | User submitted custom prompt content from the create project view | -| `Custom Secret Regex Added` | Custom Secret Regex Added | -| `Database Read Error` | Database read error when trying to get app state for session restoration | -| `Database Startup Error` | Failed to initialize sqlite upon startup | -| `Database Write Error` | Database write error when trying to write app state for session restoration | -| `Decline Subshell Bootstrap` | Developer declined the Warp banner to Warpify the current session | -| `Delete Custom Theme` | Deleted a custom theme using the built-in theme creator | -| `Deleted Notebook` | Deleted notebook from Warp Drive team | -| `Deleted Workflow` | Deleted workflow from Warp Drive team | -| `Disable Input Sync Inputs` | Disabled / turn off the Input Synchronization (across editors) | -| `Dismiss Alias Expansion Banner` | Dismissed the banner to enable automatic alias expansion within the Input Editor | -| `Dismiss Welcome Tips` | Dismissed Welcome tips | -| `Don't Show Sharer Grant Modal Again` | When you check don't show again on the confirmation modal for granting a role | -| `Drag and Drop Tab` | Tab dragged and dropped | -| `Drag and Drop Tab Group` | Tab group dragged and dropped | -| `Duplicate Object` | Cloned a Warp Drive object | -| `Edited Input Before Precmd` | Input edited before precmd hook completes | -| `Edited Workflow Alias Argument` | Edited an argument in a Warp Drive workflow alias | -| `Enable Alias Expansion From Banner` | Enabled automatic alias expansion within the Input Editor from the banner | -| `Executed Conversation Rewind` | User executed a rewind to a previous conversation state | -| `Expanded Code Suggestion` | Expanded the passive code diff suggestion | -| `Export Object` | Exported a Warp Drive object | -| `Features Page Action` | Changed settings in Features Page | -| `File Tree Toggled` | Opened the file tree/project explorer | -| `FileTree.AttachedAsContext` | Attached a file or directory as context from the file tree | -| `FileTree.ItemCreated` | Created a new file from the file tree | -| `Find Option Toggled` | Changed settings in Find Toggle | -| `Focused Config in Settings Import` | Selected a terminal in the settings import onboarding block | -| `FreeTierLimitHitInterstitial.Closed` | User closed the free tier limit hit interstitial | -| `FreeTierLimitHitInterstitial.Displayed` | The free tier limit hit interstitial was displayed | -| `FreeTierLimitHitInterstitial.UpgradeButtonClicked` | User clicked the 'Upgrade' button in the free tier limit hit interstitial | -| `Generate Block Sharing Link` | Generated Block sharing link | -| `Generate Metadata For Workflow Error` | Failed to generate metadata for a workflow using Warp AI | -| `Generate Metadata For Workflow Success` | Successfully generated metadata for a workflow using Warp AI | -| `Get Started Skip to Terminal` | User clicked skip to terminal from get started view | -| `Global Search Opened` | Opened the global search view | -| `Global Search Query Started` | Started a global search (warp_ripgrep) search | -| `ITerm Profile has Multiple Hotkeys` | Attempted to import an iTerm profile that contained multiple hotkey window bindings | -| `Identified Antivirus Software` | Identified running antivirus software on the user's machine | -| `Image Received` | Received an image through an image protocol over the pty | -| `InitialWorkingDirectoryConfigurationChanged` | Replaced the default working directory with a different path | -| `Initiate Reauth` | Started the flow to re-authenticate the client | -| `Input Mode Changed` | Changed the Input Editor Mode (Pinned to Bottom, Pinned to Top, Classic / Waterfall Mode) | -| `Input.AtMenuInteracted` | Interacted with the @ menu | -| `Input.ContextChipInteracted` | Interacted with a context chip | -| `Input.InputUXModeChanged` | Changed the input UX mode | -| `Input.VoiceInputUsed` | Used voice input | -| `InputBoxAICommandSearch` | Opened AI Command Search via the Input Editor's context menu (right clicking the buffer) | -| `InputBoxAskWarpAI` | Clicked "Ask Warp AI" from the Input Editor's context menu | -| `InputBoxCommandSearch` | Opened Command Search via the Input Editor's context menu (right clicking the buffer) | -| `InputBoxCutSelectedText` | Copied selected text from Input Editor | -| `InputBoxPaste` | Pasted text into the Input Editor's via its context menu (right clicking the buffer) | -| `InputBoxSelectAll` | Selected all the text in the Input Editor via its context menu (right clicking the buffer) | -| `Invited Teammates` | Sent emails to invite teammates to join Warp Drive team | -| `Invoked Environment Variables` | Invoked an environment variables object | -| `Isolation.DetectedIsolationPlatform` | Detected that Warp is running in an isolated sandbox | -| `Joined Shared Session` | When you join another instance of Warp using shared sessions | -| `Jumped to Bookmark Block` | Jumped to bookmarked Block | -| `Jumped to Bottom of Block Button Clicked` | Used the button to jump to the bottom of a Block | -| `Jumped to Previous Command` | Jumped to a previous command | -| `Jumped to Shared Session Participant` | Clicked on a shared session participant avatar to jump to their location in the session | -| `Keybinding Changed` | Edited a custom keybinding | -| `Keybinding Removed` | Removed / cleared a keybinding | -| `Keybinding Reset to Default` | Reset a custom keybinding to its default | -| `Knowledge Pane Opened` | Knowledge Pane Opened | -| `Linear.IssueLinkOpened` | User opened a warp://linear deeplink to work on an issue | -| `Log In Button Clicked in App` | Clicked on "Log in" button | -| `Log Out` | Logged out of the Warp client | -| `Log Out Modal Cancel Pressed` | Escaped the log out flow by canceling the log out modal | -| `Log Out Modal Shown` | When the log out modal is displayed | -| `Logged in to native app` | Login is successful | -| `Logged-out App Startup` | Started Warp in the logged-out / signed-out state | -| `Login Later Button Clicked` | Clicked "Login later" button | -| `Login Later Confirmation Button Clicked` | Clicked "Yes, skip login" confirmation button | -| `Lsp.ControlAction` | User performed an LSP control action from the footer menu | -| `Lsp.FindReferencesShown` | Find references card displayed via LSP | -| `Lsp.GotoDefinition` | User triggered goto definition via LSP | -| `Lsp.HoverShown` | Hover tooltip displayed with LSP content or diagnostics | -| `Lsp.ServerEnabled` | User enabled an LSP server for a workspace | -| `Lsp.ServerEnablementSkipped` | User skipped LSP enablement during /init | -| `Lsp.ServerFailed` | LSP server failed to start | -| `Lsp.ServerInstallCompleted` | An LSP server installation finished | -| `Lsp.ServerRemoved` | User removed an LSP server | -| `Lsp.ServerStarted` | LSP server successfully started and is available | -| `MCP Server Added` | MCP Server Added | -| `MCP Server Collection Pane Opened` | MCP Server Collection Pane Opened | -| `MCP Server Spawned` | MCP Server Spawned | -| `MCP Template Created` | MCP Template Created | -| `MCP Template Installed` | MCP Template Installed | -| `MCP Template Shared` | MCP Template Shared | -| `MCP Tool Call Accepted` | MCP Tool Call Accepted | -| `Move Active Tab` | Move active tab left or right | -| `Move Tab` | Move tab left or right | -| `Needs Reauth` | User needs to re-authenticate | -| `New Session From Directory` | Dragged a file, folder, etc. into Warp to start a session | -| `Notebook Action` | Took an action on a notebook: edit, delete, modified font size, etc. | -| `Notebook Edited` | Edited a notebook | -| `Notebook Opened` | Opened a notebook | -| `Notification Clicked` | Clicked desktop notification sent from Warp | -| `Notification Failed to Send` | Failed to send desktop notification | -| `Notification Permissions Requested` | Requested permission for desktop notification permissions | -| `Notification Request Permissions Outcome` | Recorded outcome of attempting to request desktop notification permissions | -| `Notification Sent` | Sent desktop notification | -| `Notifications Discovery Banner Action` | Showed banner introducing the notifications feature | -| `Notifications Error Banner Action` | Showed error banner for notifications feature | -| `Object Link Copied` | The web link to an object has been copied. | -| `Open Context Menu` | Opened context menu (such as right clicking, clicking on ellipses in the top right of a Block, etc.) | -| `Open Launch Config` | Opened launch config for a session | -| `Open Launch Config File` | Opened the launch config YAML file from modal once saved successfully | -| `Open Palette` | Opened the palette | -| `Open Quake Mode Window` | Toggled quake mode window when previously hidden or closed | -| `Open Repo Folder Submitted` | User selected a folder to open as a repo from the "Open repository" button | -| `Open Save Config Modal` | Opened save launch configuration modal | -| `Open Slash Menu` | Opened the slash commands menu | -| `Open Suggestions Menu` | Opened a suggestion menus, such as with up arrow or tab | -| `Open Team from URI` | Showed settings view of their newly joined team within the app | -| `Open Theme Chooser` | Opened theme chooser (list of different themes and visualizations of those themes) | -| `Open Theme Creator Modal` | Opened theme creator modal (modal to create a new theme) | -| `Open Welcome Tips` | Opened welcome tips in app | -| `Open Workflows Search` | Opened workflows search in command search pane | -| `OpenAndWarpifyDockerSubshell` | Warpifying a docker subshell from using the docker extension | -| `OpenInputBoxContextMenu` | Opened the Input Editor's context menu | -| `Opened Changelog Link` | Opened the changelog link within the App | -| `Opened Link` | Opened a highlighted link within input or output | -| `Opened Rewind Confirmation Dialog` | User opened the rewind confirmation dialog | -| `Opened Save As Workflow Modal` | Opened the modal to create a new workflow using a Block's context--command, etc. | -| `Opened Sharing Dialog` | Opened the sharing settings dialog for a session or Warp Drive object | -| `Opened Warp AI` | Activated Warp AI | -| `Opened alt screen find bar` | Opened the Find bar in the Alt Screen | -| `Page Up/Down In Editor Pressed` | Pressed `PAGE-UP` or `PAGE-DOWN` within the Input Editor | -| `Pane Drag Ended` | Ended dragging a pane via the pane header | -| `Pane Drag Inititiated` | Initiated dragging a pane via the header | -| `Parameterized Workflow With Environment Variables` | Selected from environment variables dropdown to parameterize workflow | -| `Parsed Config in Settings Import` | Parsed a terminal's settings as part of settings import | -| `Preview Pane Promoted` | Promoted a preview code tab to a normal tab | -| `Prompt Edited` | Edited the prompt using the built-in prompt editor | -| `Prompt Editor Opened` | Opened the prompt editor | -| `Pty Spawned` | Tracks the manner by which we create a new shell process (new codepath vs. old codepath). Used to ensure nothing breaks as we change parts of our infrastructure. | -| `QueuedPrompt.Deleted` | User deleted a queued prompt row | -| `QueuedPrompt.Edited` | User committed a non-empty edit to a queued prompt row | -| `QueuedPrompt.PanelCollapseToggled` | User toggled the queued prompts panel collapse state | -| `QueuedPrompt.Reordered` | User reordered a queued prompt row via drag-and-drop | -| `Quit Modal Cancel Pressed` | `Cancel` button on the alert modal was pressed | -| `Quit Modal Disabled` | The quit modal dialog has been disabled and will not popup when a user closes Warp while a session is running | -| `Quit Modal Shown` | Showed an alert modal to warn the user about closing the app/window with a running process | -| `Received Subshell RC File DCS` | Spawned a subshell to be automatically Warpified | -| `Recent Menu Item Selected` | User selected an item from the recents list on the new tab zero state | -| `RemoteCodebaseIndex.AutoIndexRequested` | Remote codebase auto-indexing requested one or more repositories | -| `RemoteCodebaseIndex.StatusChanged` | The remote codebase index status changed | -| `RemoteServer.BinaryCheck` | Remote server binary check completed (found, not found, or error) | -| `RemoteServer.ClientRequestError` | A client request to the remote server failed | -| `RemoteServer.DaemonStartup` | Remote server daemon startup completed and socket bound | -| `RemoteServer.Disconnection` | An established remote server connection was dropped | -| `RemoteServer.HostUnsupported` | Preinstall check classified the remote host as unsupported, falling back to the legacy SSH flow | -| `RemoteServer.Initialization` | Remote server connection and initialization completed (success or failure) | -| `RemoteServer.Installation` | Remote server binary installation completed (success or failure) | -| `RemoteServer.MessageDecodingError` | A server message could not be decoded (no parseable request_id) | -| `RemoteServer.ReconnectExhausted` | All reconnection attempts were exhausted after a spontaneous disconnect | -| `RemoteServer.Reconnection` | A reconnection attempt succeeded after a spontaneous disconnect | -| `RemoteServer.SetupDuration` | End-to-end duration of the remote server setup flow | -| `Remove Added Subshell Command` | Removed a command from the list of commands to automatically Warpify via Warp's subshell wrapper | -| `Remove Denylisted SSH Tmux Wrapper Host` | Removed an SSH host from the denylist from prompting for Tmux Wrapper | -| `Remove Denylisted Subshell Command` | Removed a command from the list of commands to IGNORE when trying to Warpify via Warp's subshell wrapper | -| `Removed Workflow Alias` | Removed an alias from a Warp Drive workflow | -| `Removed user from team` | Remove user from Warp Drive team | -| `RepoMetadata.BuildTree.Failed` | Failed to build file tree for repo metadata | -| `Resource Center Keybindings Page Opened` | Opened the keybinding page within the resource center | -| `Resource Center Opened` | Opened Resource Center pane | -| `Resource Center Tips Completed` | Completed resource center tips | -| `Resource Center Tips Skipped` | Skipped welcome tips for new users | -| `SSH Bootstrap Attempt` | Attempted bootstrapping for an SSH session | -| `SSH ControlMaster Error` | Encountered a ControlMaster error during an SSH session | -| `SSH Install Tmux Block Accepted` | User accepted an ssh install tmux block | -| `SSH Install Tmux Block Dismissed` | User dismissed an ssh install tmux block | -| `SSH Install Tmux Block Displayed` | Displayed an ssh install tmux block | -| `SSH Interactive Session Detected` | An interactive SSH session was detected | -| `SSH Remote Server Choice Do Not Ask Again Toggled` | Toggled the 'Don't ask me this again' checkbox on the SSH remote-server choice block | -| `SSH Tmux Warpification Error Block` | Ssh tmux warpification errored out | -| `SSH Tmux Warpification Succeeded` | Ssh tmux warpification succeeded | -| `SSH Tmux Warpify Block Accepted` | User accepted an ssh tmux warpify block | -| `SSH Tmux Warpify Block Dismissed` | User dismissed an ssh tmux warpify block | -| `Save Launch Config` | Saved current launch configuration of windows, tabs, and panes | -| `Select App Icon` | Selected app icon | -| `Select Command Palette Option` | Selected option from command palette (i.e. CMD-P) | -| `Select Cursor Type` | Selected cursor type | -| `Select Navigation Palette Item` | Selected session from the Session Navigation Palette (search across panes, tabs, and windows) | -| `Select Theme` | Selected theme | -| `Sent email invites` | Sent email invites for Warp Drive team | -| `Session Abandoned Before Bootstrap` | Abandoned session before the bootstrapping completes | -| `Set Line Height` | Set line height through Settings -> Appearance | -| `Set New Windows at Custom Size` | Set new windows at custom size through Settings -> Appearance | -| `Set SSH Extension Install Mode` | Changed the SSH extension install mode (always ask / always allow / always skip) | -| `Set Window Blur Radius` | Changed the blur radius from the `Settings -> Appearance` dialog | -| `Set Window Opacity` | Changed the opacity (window transparency) from the `Settings -> Appearance` dialog | -| `Settings Import Initiated` | Started the import settings flow for new users | -| `Settings.Environments.PageOpened` | User opened the Environments settings page | -| `Shared Object Limit Hit Banner View Plans Button Clicked` | Clicked the 'View Plans' button on the persistent drive banner | -| `Sharer Cancelled Grant Role` | When you cancel granting a role to a shared session participant | -| `Shell Terminated Prematurely` | The shell process terminated prematurely | -| `Show Alias Expansion Banner` | Displayed the banner asking whether Warp should automatically expand aliases within the Input Editor | -| `Show Subshell Banner` | Displayed the banner asking whether Warp should Warpify the current session via Warp's subshell wrapper | -| `Show Warpify SSH Banner` | Displayed the banner asking whether Warp should Warpify the current SSH session via Warp's SSH Wrapper | -| `ShowNotificationsDiscoveryBanner` | Showed notifications discovery banner in the block list | -| `ShowNotificationsErrorBanner` | Showed error banner for notifications feature | -| `Showed File in File Explorer` | Opened a file in Finder by using "Show in Finder" | -| `Sign Up Button Clicked in App` | Clicked "Sign Up" button | -| `Skill.Opened` | A skill was opened from an 'open skill' button or /edit-skill command | -| `Skill.Read` | A skill was read via the ReadSkill tool call | -| `Skip Onboarding Survey` | Skipped onboarding survey as a whole | -| `Slash Command Accepted` | User accepted a slash command | -| `Split Pane` | Split tab into multiple panes | -| `Static Prompt Suggestion Accepted` | Static Prompt Suggestion accepted | -| `Static Prompt Suggestions Banner Shown` | Static Prompt Suggestions banner shown | -| `Suggested Code Diff Banner Shown` | Suggested Code Diff banner shown | -| `Suggested Code Diff Failed` | Suggested Code Diff Failed | -| `Suggested Prompt Accepted` | Suggested prompt accepted | -| `Suggested Prompt Cancelled` | Suggested prompt cancelled | -| `Suggested Prompt Shown` | Suggested prompt shown | -| `Tab Creation` | Created a tab | -| `Tab Operations` | Took operation on a tab: change color, close tab, close adjacent tabs, etc. | -| `Tab Renamed` | Changed tab title | -| `Tab Single Result Autocompletion` | Accepted tab completion and inserted into Input Editor | -| `TabConfigs.ExistingConfigOpened` | User opened an existing saved tab config | -| `TabConfigs.GuidedModalOpened` | User opened the guided Create a tab config modal | -| `TabConfigs.GuidedModalSubmitted` | User submitted the guided Create a tab config modal | -| `TabConfigs.MenuCreateNewTabConfigClicked` | User clicked the New tab config entry from the tab configs menu | -| `TabConfigs.NewWorktreeConfigOpened` | User opened a new worktree config from the submenu or new worktree modal | -| `Team Created` | Created a Warp Drive team | -| `Team Joined` | Joined a Warp Drive team | -| `Team Left` | Left a Warp Drive team | -| `Team Link Copied` | Copied a Warp Drive team link | -| `Thin Strokes Setting Changed` | Changed thin strokes setting in settings -> Appearance | -| `Tier Limit Hit` | User hit the tier limit for a feature | -| `Toggle Active AI Enablement` | Toggled active AI enablement. | -| `Toggle Agent Mode Codebase Context` | Toggled on/off the enablement of codebase context usage for Agent Mode. | -| `Toggle Agent Mode Query Suggestions Setting` | Toggled on/off the prompt suggestions setting | -| `Toggle Approvals Modal` | Opened or closed teams modal | -| `Toggle Block Filter Case Sensitivity` | Toggled on/off case sensitivity within the block filter editor | -| `Toggle Block Filter Invert` | Toggled on/off invert within the block filter editor | -| `Toggle Block Filter Query` | Toggled on/off a block filter query | -| `Toggle Block Filter Regex` | Toggled on/off regex within the block filter editor | -| `Toggle Code Suggestions Setting` | Toggled on/off the code suggestions setting | -| `Toggle Codebase Context Autoindexing` | Toggled on/off the enablement of autoindexing for codebase context. | -| `Toggle Dim Inactive Panes` | Whether the dim inactive panes feature has been toggled | -| `Toggle Focus Pane On Hover` | Toggled on/off focus pane on hover feature, which causes panes to automatically focus when hovering over them | -| `Toggle Git Operations Autogen Setting` | Toggled on/off the git operations autogen setting | -| `Toggle Global AI Enablement` | Toggled global AI enablement. | -| `Toggle Intelligent Autosuggestions Setting` | Toggled on/off the intelligent autosuggestions setting | -| `Toggle Jump to Bottom of Block Button` | Enabled or disabled the Jump to Bottom of Block Button | -| `Toggle Ligature Rendering` | Toggled ligature rendering | -| `Toggle New Windows at Custom Size` | Whether the new windows at custom size feature has been toggled | -| `Toggle Obfuscate Secret` | Revealed or hid a secret | -| `Toggle Preserve Active Tab Color` | Enabled or disabled preserving the active tab color | -| `Toggle Restore Session` | Toggled session restoration ("Restore windows, tabs, panes, on startup") | -| `Toggle SSH Tmux Wrapper` | Changed the setting for SSH sessions to prompt for Tmux Wrapper | -| `Toggle SSH Warpification` | Changed the setting for SSH sessions to be warified | -| `Toggle Same Line Prompt` | Toggled on/off same line prompt | -| `Toggle Secret Redaction` | Toggled on/off the setting for Secret Redaction - attempts to redact secrets and sensitive information | -| `Toggle Settings Sync` | Toggle Settings Sync | -| `Toggle SharedBlock Title Generation` | Toggled on/off the shared block title generation setting | -| `Toggle Show Agent Tips` | Toggled the Show Agent Tips setting in AI settings | -| `Toggle Show Block Dividers` | Enabled or disabled the Show Block Dividers Button | -| `Toggle Sticky Command Header in Active Pane` | Expanded or collapsed the sticky command header in the active pane | -| `Toggle Sync Inputs Across All Panes in All Tabs` | Enable the synchronization of the Input Editor's buffer to all the panes in all the tabs | -| `Toggle Sync Inputs Across All Panes in Current Tab` | Enable the synchronization of the Input Editor's buffer to all the panes in the current tab | -| `Toggle Tab Indicators` | Enabled or disabled the tab indicators (failed command, etc.) | -| `Toggle Voice Input Setting` | Toggled on/off the voice input setting | -| `Toggle Warp AI` | Toggled Warp AI--an AI assistant to help you debug errors, look up forgotten commands and more | -| `Toggled Bookmark Block` | Bookmarked or unbookmarked Block | -| `Toggled Tab Bar Visibility` | Toggled when to display the tab bar | -| `Tried to Execute Before Precmd` | Attempted to execute command before precmd, a shell stage that has metadata on a command such as ssh, prompt info, etc. | -| `Trigger Subshell Bootstrap` | Attempted to Warpify the current session via Warp's subshell wrapper | -| `Triggered Command XRay` | Triggered Command X-Ray (hovering over a command for explanation) | -| `Unable to Update To New Version` | Update available but not authorized to install | -| `Undo Close` | Re-opened a closed tab or window (undo closing a tab or window) | -| `Unhandled Editor Modifier Key` | Used modifier keybinding keystroke which is not currently supported | -| `Unsupported Shell` | Booted Warp with a shell that isn't supported | -| `Update Block Filter Query` | When a new filter is applied to a block | -| `Update Block Filter Query With Context Lines` | When the number of context lines for a block filter query is updated | -| `Update Tab Close Button Position` | Updated the tab close button position | -| `Updated Alt Screen Padding Mode` | Updated the custom padding setting for the alt-screen | -| `Updated Sorting Choice` | Modified the sorting scheme for Warp Drive objects | -| `UseAgentToolbar.SettingToggled` | User toggled the Use Agent footer setting | -| `Used Warp AI Prepared Prompt` | Used one of the Warp-provided prompts, like "Show examples" | -| `User Initiated Closing Something` | Attempted to either quit the app or close a window | -| `User Initiated Log Out` | Confirms a user has explicitly logged out of the application | -| `User Menu Upgrade Clicked` | Clicked the 'Upgrade' menu item in the user menu | -| `VerticalTabs.DiffStatsChipClicked` | User clicked a diff stats chip in the vertical tabs panel or detail sidecar | -| `VerticalTabs.DisplayOptionChanged` | User updated a display option in the vertical tabs settings popup | -| `VerticalTabs.PrChipClicked` | User clicked a GitHub PR chip in the vertical tabs panel or detail sidecar | -| `Vim Keybindings Banner Dismissed` | Dismissed the banner to enable Vim keybindings in the Input Editor | -| `Vim Keybindings Banner Displayed` | Displayed the banner asking whether Warp should enable Vim keybindings in the Input Editor | -| `Vim Keybindings Enabled from Banner` | Enabled Vim keybindings in the Input Editor from the banner | -| `Warp AI Action` | Executed a Warp AI action: Restart, Copy, Insert into terminal | -| `Warp AI Character Limit Exceeded` | Attempted to ask a question longer than 1k chars to Warp AI | -| `Warp AI Request Issued` | Issued a question to Warp AI | -| `Warp Drive Opened` | Opened Warp Drive panel | -| `Warp Drive Sharing onboarding block shown` | Showed onboarding block for Warp Drive sharing | -| `Warp Drive object opened on desktop` | Warp Drive object on the web was opened on the desktop | -| `Warpify Footer Accepted Warpify` | User clicked Warpify in the warpify footer | -| `Warpify Footer Shown` | Displayed the warpify footer for a detected subshell or SSH session | -| `Web session opened on desktop` | Shared session viewed on the web was opened on the desktop | -| `Workflow Executed` | Executed workflow | -| `Workflow Selected` | Selected workflow and populated into the Input Editor | -| `Zero State Prompt Suggestion Used` | Used a zero state prompt suggestion | -| `experiments.client.enroll_client` | Client assigned to A/B test | -| `onboarding_agent_slide_upgrade_clicked` | User clicked the Upgrade button on the Customize your agent slide | -| `onboarding_callout_completed` | User completed the callout flow | -| `onboarding_callout_displayed` | A callout was displayed to the user | -| `onboarding_callout_next` | User clicked next on a callout | -| `onboarding_folder_selected` | User selected a folder | -| `onboarding_folder_selection_started` | User started folder selection | -| `onboarding_free_user_no_ai_upgrade_clicked` | User clicked the upgrade button on the free-user no-AI experiment slide | -| `onboarding_get_started_clicked` | User clicked the Get Started button | -| `onboarding_setting_changed` | User changed a setting during onboarding | -| `onboarding_slide_navigated_back` | User navigated to the previous slide | -| `onboarding_slide_navigated_next` | User navigated to the next slide | -| `onboarding_slide_viewed` | User viewed a slide in the onboarding flow | -| `onboarding_slides_completed` | User completed the onboarding slides | -| `onboarding_started` | User started the onboarding flow | -| `onboarding_welcome_login_clicked` | User clicked the Log in link on the welcome/intro slide | -| `perf_metrics.memory_usage_high` | Total application memory usage exceeded a significant threshold | -| `perf_metrics.resource_usage` | Periodic report on application resource usage statistics | -| `revenue.AutoReloadModalClosed` | User closed the auto-reload modal (either dismissed or enabled auto-reload) | -| `revenue.AutoReloadToggledFromBillingSettings` | User toggled auto-reload in Billing & Usage settings | -| `revenue.OutOfCreditsBannerClosed` | User closed the 'Out of credits' banner (dismissed or purchased credits) | - -### Exhaustive Telemetry Table - -| Event Name | Description | -|---|---| -| `AI Command Search opened` | Opened the modal for AI Command Search, where you can use natural language to search for commands | -| `AI Execution Profile Created` | A new AI execution profile was created | -| `AI Execution Profile Deleted` | An AI execution profile was deleted | -| `AI Execution Profile: Added To Allowlist` | An item was added to an AI execution profile allowlist | -| `AI Execution Profile: Added To Denylist` | An item was added to an AI execution profile denylist | -| `AI Execution Profile: Context Window Selected` | Selected a context window limit for an execution profile's base model | -| `AI Execution Profile: Model Selected` | An AI model was selected for an AI execution profile | -| `AI Execution Profile: Removed From Allowlist` | An item was removed from an AI execution profile allowlist | -| `AI Execution Profile: Removed From Denylist` | An item was removed from an AI execution profile denylist | -| `AI Execution Profile: Setting Updated` | An AI execution profile setting was updated | -| `AI Input Not Sent` | The AI input was not sent | -| `AI Suggested Rule Added` | Clicked the Add Suggested Rule button in the AI blocklist | -| `AI Suggested Rule Content Changed` | Content changed by the user in the suggested rule dialog | -| `AI Suggested Rule Edited` | Clicked the Edit Suggested Rule button in the AI blocklist | +| `AI.ProviderCredential.Changed` | A user added or removed a model-provider credential | | `AIAutonomy.AutoexecutedRequestedCommand` | Autoexecuted an Agent Mode requested command | | `AIAutonomy.ChangedAgentModeAskUserQuestionPermission` | Changed Agent Mode permission for asking user questions | | `AIAutonomy.ChangedAgentModeCodingPermissions` | Changed Agent Mode permissions for coding tasks | @@ -789,9 +164,9 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `AgentMode.Orchestration.PillBarInteraction` | User interacted with the orchestration pill bar (switch, pin, open in pane/tab, stop, kill, etc.) | | `AgentMode.Orchestration.PlanConfigApprovalToggled` | User toggled the Use orchestration switch on a plan card | | `AgentMode.Orchestration.RunAgentsCardDecision` | User accepted, accepted-without-orchestration, or rejected a run_agents confirmation card. Reports which config fields diverged from the original tool call and/or the active approved config. | +| `AgentMode.Orchestration.RunAgentsCompleted` | A run_agents request completed with actual launched and failed child counts | | `AgentMode.Orchestration.TeamAgentCommunicationFailed` | Failed to send an orchestration message or lifecycle event for a TeamAgent | | `AgentMode.PotentialAutoDetectionFalsePositive` | Manually toggled input to shell mode after input was auto-detected as natural language. | -| `AgentMode.QueryAttemptAtLImit` | Tried to send an Agent Mode query but they already reached the query limit | | `AgentMode.RequestRetrySucceeded` | Agent Mode request succeeded after retrying following an initial error | | `AgentMode.SetupCreateEnvironmentAction` | User clicked a button in the Agent Mode setup create environment step | | `AgentMode.SurfacedCitations` | Agent mode used and cited external sources that were used in its response | @@ -841,9 +216,7 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `Auth Common Question Clicked in App` | Clicked on "Common Question" when logging in | | `Auth: Open Privacy Settings Overlay` | Privacy settings are open during sign-in | | `Auth: Toggle Common Questions` | Toggled FAQ Page when logging in | -| `Autosuggestion Inserted` | Accepted autosuggestion | | `Background Block Started` | Warp created a background-output Block (whenever a processes has been backgrounded and yields some output) | -| `BaselineCommand Latency` | Command execution time | | `Block Creation` | Created Block | | `Block Filter Toolbelt Button Clicked` | Clicked the block filter icon in the top-right of a block | | `Block Selection` | Selected Block | @@ -908,6 +281,10 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `CLI.Execute.Run.Message.Read` | Read a run message from the Warp CLI | | `CLI.Execute.Run.Message.Send` | Sent a run message from the Warp CLI | | `CLI.Execute.Run.Message.Watch` | Watched run messages from the Warp CLI | +| `CLI.Execute.Runner.Create` | Created a runner from the Warp CLI | +| `CLI.Execute.Runner.Delete` | Deleted a runner from the Warp CLI | +| `CLI.Execute.Runner.List` | Listed runners from the Warp CLI | +| `CLI.Execute.Runner.Update` | Updated a runner from the Warp CLI | | `CLI.Execute.Schedule.Create` | Created a scheduled agent from the Warp CLI | | `CLI.Execute.Schedule.Delete` | Deleted a scheduled agent from the Warp CLI | | `CLI.Execute.Schedule.Get` | Got scheduled agent configuration from the Warp CLI | @@ -968,12 +345,10 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `CodeView.SelectionAddedAsContext` | Added selected code as context from the code editor | | `CodexModal.Opened` | User opened the Codex modal | | `CodexModal.UseCodexClicked` | User clicked 'Use Codex' in the Codex modal | -| `Command Correction Event` | Accepted command correction | | `Command File Run` | Opened a .cmd or unix executable file and ran it directly in Warp | | `Command Palette Search Accepted` | Accepted a command palette search result | | `Command Palette Search Exited` | Exited command palette search without accepting a result | | `Command Search Exited` | Exited command search (universal search panel to search) without accepting a result | -| `Command Search Filter Changed` | Changed command search filter | | `Command Search Opened` | Opened command search (universal search panel to search) | | `Command Search Result Accepted` | Accepted command search result | | `Complete Welcome Tip` | Completed all welcome tips items | @@ -983,7 +358,6 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `Confirm Suggestion` | Accepted tab completion suggestion | | `Context Menu Copy` | Clicked "Copy" in context menu | | `Context Menu Copy Prompt` | Clicked "Copy Prompt" in context menu | -| `Context Menu Copy Selected Text` | Clicked "Copy selected text" in context menu | | `Context Menu Insert Selected Text into Input` | Clicked "insert into input" in context menu | | `Context Menu Toggle Git Prompt Dirty Indicator` | Toggled indicator of dirty git prompt | | `Context Menu: Find Within Blocks` | Clicked "find within blocks" in context menu | @@ -1016,7 +390,6 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `Drag and Drop Tab` | Tab dragged and dropped | | `Drag and Drop Tab Group` | Tab group dragged and dropped | | `Duplicate Object` | Cloned a Warp Drive object | -| `Edited Input Before Precmd` | Input edited before precmd hook completes | | `Edited Workflow Alias Argument` | Edited an argument in a Warp Drive workflow alias | | `Enable Alias Expansion From Banner` | Enabled automatic alias expansion within the Input Editor from the banner | | `Executed Conversation Rewind` | User executed a rewind to a previous conversation state | @@ -1044,7 +417,6 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `Initiate Reauth` | Started the flow to re-authenticate the client | | `Input Mode Changed` | Changed the Input Editor Mode (Pinned to Bottom, Pinned to Top, Classic / Waterfall Mode) | | `Input.AtMenuInteracted` | Interacted with the @ menu | -| `Input.ContextChipInteracted` | Interacted with a context chip | | `Input.InputUXModeChanged` | Changed the input UX mode | | `Input.VoiceInputUsed` | Used voice input | | `InputBoxAICommandSearch` | Opened AI Command Search via the Input Editor's context menu (right clicking the buffer) | @@ -1107,7 +479,6 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `Notifications Discovery Banner Action` | Showed banner introducing the notifications feature | | `Notifications Error Banner Action` | Showed error banner for notifications feature | | `Object Link Copied` | The web link to an object has been copied. | -| `Open Context Menu` | Opened context menu (such as right clicking, clicking on ellipses in the top right of a Block, etc.) | | `Open Launch Config` | Opened launch config for a session | | `Open Launch Config File` | Opened the launch config YAML file from modal once saved successfully | | `Open Palette` | Opened the palette | @@ -1115,7 +486,6 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `Open Repo Folder Submitted` | User selected a folder to open as a repo from the "Open repository" button | | `Open Save Config Modal` | Opened save launch configuration modal | | `Open Slash Menu` | Opened the slash commands menu | -| `Open Suggestions Menu` | Opened a suggestion menus, such as with up arrow or tab | | `Open Team from URI` | Showed settings view of their newly joined team within the app | | `Open Theme Chooser` | Opened theme chooser (list of different themes and visualizations of those themes) | | `Open Theme Creator Modal` | Opened theme creator modal (modal to create a new theme) | @@ -1124,7 +494,6 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `OpenAndWarpifyDockerSubshell` | Warpifying a docker subshell from using the docker extension | | `OpenInputBoxContextMenu` | Opened the Input Editor's context menu | | `Opened Changelog Link` | Opened the changelog link within the App | -| `Opened Link` | Opened a highlighted link within input or output | | `Opened Rewind Confirmation Dialog` | User opened the rewind confirmation dialog | | `Opened Save As Workflow Modal` | Opened the modal to create a new workflow using a Block's context--command, etc. | | `Opened Sharing Dialog` | Opened the sharing settings dialog for a session or Warp Drive object | @@ -1134,8 +503,10 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `Pane Drag Ended` | Ended dragging a pane via the pane header | | `Pane Drag Inititiated` | Initiated dragging a pane via the header | | `Parameterized Workflow With Environment Variables` | Selected from environment variables dropdown to parameterize workflow | -| `Parsed Config in Settings Import` | Parsed a terminal's settings as part of settings import | | `Preview Pane Promoted` | Promoted a preview code tab to a normal tab | +| `PricingPromotion.Clicked` | A pricing promotion was clicked | +| `PricingPromotion.Dismissed` | A pricing promotion was dismissed | +| `PricingPromotion.Shown` | A pricing promotion was shown | | `Prompt Edited` | Edited the prompt using the built-in prompt editor | | `Prompt Editor Opened` | Opened the prompt editor | | `Pty Spawned` | Tracks the manner by which we create a new shell process (new codepath vs. old codepath). Used to ensure nothing breaks as we change parts of our infrastructure. | @@ -1149,6 +520,8 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `Quit Modal Shown` | Showed an alert modal to warn the user about closing the app/window with a running process | | `Received Subshell RC File DCS` | Spawned a subshell to be automatically Warpified | | `Recent Menu Item Selected` | User selected an item from the recents list on the new tab zero state | +| `Recording.Started` | A computer-use video recording was started | +| `Recording.Stopped` | A computer-use video recording was stopped and finalized | | `RemoteCodebaseIndex.AutoIndexRequested` | Remote codebase auto-indexing requested one or more repositories | | `RemoteCodebaseIndex.StatusChanged` | The remote codebase index status changed | | `RemoteServer.BinaryCheck` | Remote server binary check completed (found, not found, or error) | @@ -1267,7 +640,6 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `Trigger Subshell Bootstrap` | Attempted to Warpify the current session via Warp's subshell wrapper | | `Unable to Update To New Version` | Update available but not authorized to install | | `Undo Close` | Re-opened a closed tab or window (undo closing a tab or window) | -| `Unhandled Editor Modifier Key` | Used modifier keybinding keystroke which is not currently supported | | `Unsupported Shell` | Booted Warp with a shell that isn't supported | | `Update Block Filter Query` | When a new filter is applied to a block | | `Update Block Filter Query With Context Lines` | When the number of context lines for a block filter query is updated | @@ -1298,10 +670,13 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `Workflow Selected` | Selected workflow and populated into the Input Editor | | `Zero State Prompt Suggestion Used` | Used a zero state prompt suggestion | | `experiments.client.enroll_client` | Client assigned to A/B test | +| `onboarding_action` | User performed an action in the account-first onboarding flow | | `onboarding_agent_slide_upgrade_clicked` | User clicked the Upgrade button on the Customize your agent slide | +| `onboarding_auth_completed` | User completed account-first browser authentication | | `onboarding_callout_completed` | User completed the callout flow | | `onboarding_callout_displayed` | A callout was displayed to the user | | `onboarding_callout_next` | User clicked next on a callout | +| `onboarding_completed` | User completed account-first onboarding | | `onboarding_folder_selected` | User selected a folder | | `onboarding_folder_selection_started` | User started folder selection | | `onboarding_get_started_clicked` | User clicked the Get Started button | @@ -1314,6 +689,8 @@ If you're a [Team](/knowledge-and-collaboration/teams/) admin, the deletion flow | `onboarding_slide_viewed` | User viewed a slide in the onboarding flow | | `onboarding_slides_completed` | User completed the onboarding slides | | `onboarding_started` | User started the onboarding flow | +| `onboarding_upgrade_completed` | User completed an upgrade from account-first onboarding | +| `onboarding_upgrade_started` | User started an upgrade from account-first onboarding | | `onboarding_welcome_login_clicked` | User clicked the Log in link on the welcome/intro slide | | `perf_metrics.memory_usage_high` | Total application memory usage exceeded a significant threshold | | `perf_metrics.resource_usage` | Periodic report on application resource usage statistics | diff --git a/src/content/docs/support-and-community/privacy-and-security/secret-redaction.mdx b/src/content/docs/support-and-community/privacy-and-security/secret-redaction.mdx index 3e59d785b..224dcc53d 100644 --- a/src/content/docs/support-and-community/privacy-and-security/secret-redaction.mdx +++ b/src/content/docs/support-and-community/privacy-and-security/secret-redaction.mdx @@ -21,7 +21,7 @@ By default, identified secrets will be displayed with a strikethrough visual tre If instead you'd prefer to visually hide the secrets as well, i.e. `echo ********`, the setting to obfuscate secrets with asterisks can be found in **Settings** > **Privacy** > **Secret redaction** > **Hide secrets in blocklist**. -Clicking on a secret will display a tooltip that lets you reveal the secret or copy the secret's contents. When trying to copy terminal output containing secrets, it will be copied as asterisks (e.g. `echo password` becomes `echo ********`) unless revealed or copied from the tooltip. Secret redaction is not applied in [Session Sharing](/knowledge-and-collaboration/session-sharing/). +Clicking on a secret will display a tooltip that lets you reveal the secret or copy the secret's contents. When trying to copy terminal output containing secrets, it will be copied as asterisks (e.g. `echo password` becomes `echo ********`) unless revealed or copied from the tooltip. Secret redaction is not applied in [Session Sharing](/agents/local-agents/session-sharing/#secrets-in-shared-sessions) — treat a shared session like sharing your screen. ## Case sensitivity diff --git a/src/content/docs/support-and-community/troubleshooting-and-support/known-issues.mdx b/src/content/docs/support-and-community/troubleshooting-and-support/known-issues.mdx index 02a563c8e..375a11efb 100644 --- a/src/content/docs/support-and-community/troubleshooting-and-support/known-issues.mdx +++ b/src/content/docs/support-and-community/troubleshooting-and-support/known-issues.mdx @@ -10,20 +10,20 @@ import DemoVideo from '@components/DemoVideo.astro'; import { Tabs, TabItem } from '@astrojs/starlight/components'; :::note -To see a complete list of Warp issues and feature requests, please visit our [GitHub issues page](https://github.com/warpdotdev/Warp/issues?q=is%3Aissue+is%3Aopen+sort%3Acreated-desc). +To see a complete list of Warp issues and feature requests, visit our [GitHub issues page](https://github.com/warpdotdev/Warp/issues?q=is%3Aissue+is%3Aopen+sort%3Acreated-desc). -Please note that there are tools that are incompatible with Warp, as listed [below](/support-and-community/troubleshooting-and-support/known-issues/#list-of-incompatible-tools). You can find debugging information in this [section](/support-and-community/troubleshooting-and-support/known-issues/#debugging). +Note that some tools are incompatible with Warp, as listed [below](/support-and-community/troubleshooting-and-support/known-issues/#list-of-incompatible-tools). You can find debugging information in this [section](/support-and-community/troubleshooting-and-support/known-issues/#debugging). ::: ## General ### SSH -To enable Blocks over SSH, Warp uses an SSH Wrapper function; navigate to **Settings** > **Features** if you need to disable it. Please see [Troubleshooting Legacy SSH](/terminal/warpify/ssh-legacy/#troubleshooting-ssh) for more info on workarounds to SSH issues, or see the [new SSH Page](/terminal/warpify/ssh/) for more on the upcoming features. +To enable Blocks over SSH, Warp uses an SSH Wrapper function; navigate to **Settings** > **Features** if you need to disable it. See [Troubleshooting Legacy SSH](/terminal/warpify/ssh-legacy/#troubleshooting-ssh) for more info on workarounds to SSH issues, or see the [new SSH Page](/terminal/warpify/ssh/) for more on the upcoming features. ### Online features don't work -There is a known issue that can occur that causes online features to break ([Agent](/agent-platform/local-agents/overview/), [Generate](/agent-platform/local-agents/generate/), [Block Sharing](/terminal/blocks/block-sharing/), [Refer a Friend](/support-and-community/community/refer-a-friend/) ). This is due to the login token going stale, typically due to a password change, and can be resolved by the following steps: +There is a known issue that can occur that causes online features to break ([Agent](/agents/), [Generate](/agents/local-agents/generate/), [Block Sharing](/terminal/blocks/block-sharing/), [Refer a Friend](/support-and-community/community/refer-a-friend/) ). This is due to the login token going stale, typically due to a password change, and can be resolved by the following steps: <Tabs> <TabItem label="macOS"> @@ -62,7 +62,7 @@ Nov 2021: We have added character support for Chinese, Korean, and Japanese, but ### Abnormal rendering of Chinese characters -If you notice issues with the terminal rendering Chinese characters (i.e. [#3366](https://github.com/warpdotdev/Warp/issues/3366)). Please try adding the following lines to your rc file. +If you notice issues with the terminal rendering Chinese characters (i.e. [#3366](https://github.com/warpdotdev/Warp/issues/3366)), try adding the following lines to your rc file. ``` export LC_ALL=zh_CN.UTF-8 @@ -71,7 +71,7 @@ export LANG=zh_CN.UTF-8 ### Warp fails to render a window -This can likely occur due to some corruption in the local sqlite db. You may see a similar error your [logs](/support-and-community/#gathering-warp-logs): +This can likely occur due to some corruption in the local sqlite db. You may see a similar error your [logs](/support-and-community/troubleshooting-and-support/sending-us-feedback/#gathering-warp-logs): ``` [WARN] SQLite error 283 (A WAL mode database file was recovered): recovered 383 frames from WAL file /home/xxxxx/.local/state/warp-terminal/warp.sqlite-wal @@ -101,13 +101,13 @@ There is an issue in fish shell version 3.6 and below that causes the `read` bui ### Warp shell loads slowly due to EDR -If you comment out the rc files (i.e. `~/.zshrc`, `~/.bashrc`, `~/.config/fish/config.fish`), and still notice a slowdown on loading the shell, it is likely due to an Endpoint Detection and Response or EDR (i.e. Sentinel One, CrowdStrike, Carbon Black) causing the issue. Please restart your system and see if the issue persists. If so, please [Send us Feedback](/support-and-community/) and provide details of your EDR, OS, shell, etc. +If you comment out the rc files (i.e. `~/.zshrc`, `~/.bashrc`, `~/.config/fish/config.fish`), and still notice a slowdown on loading the shell, it is likely due to an Endpoint Detection and Response or EDR (i.e. Sentinel One, CrowdStrike, Carbon Black) causing the issue. Restart your system and see if the issue persists. If so, [Send us Feedback](/support-and-community/) and provide details of your EDR, OS, shell, etc. ### Configuring and debugging your RC files -To support Blocks ([custom hooks](https://www.warp.dev/blog/how-warp-works#implementing-blocks)), a native Input Editor experience, AI blocks, etc. we have built custom support for a subset of shell functionality (decouple functionality from the shell and move to the terminal). This leads to Warp being incompatible with various tools and plugins. Please see the [list of incompatible](/support-and-community/troubleshooting-and-support/known-issues/#list-of-incompatible-tools) tools to find the tools that are known not to work with Warp. +To support Blocks ([custom hooks](https://www.warp.dev/blog/how-warp-works#implementing-blocks)), a native Input Editor experience, AI blocks, etc. we have built custom support for a subset of shell functionality (decouple functionality from the shell and move to the terminal). This leads to Warp being incompatible with various tools and plugins. See the [list of incompatible](/support-and-community/troubleshooting-and-support/known-issues/#list-of-incompatible-tools) tools to find the tools that are known not to work with Warp. -Unlike typical terminals which are essentially continuous character grids, each section of Warp is its own (separate) UI element. Please see our [Prompt](/terminal/appearance/prompt/) page for more information on custom prompts. +Unlike typical terminals which are essentially continuous character grids, each section of Warp is its own (separate) UI element. See our [Prompt](/terminal/appearance/prompt/) page for more information on custom prompts. #### Debugging @@ -176,8 +176,8 @@ If Warp is not working with your dotfile configuration, you can run your shell i The following non-exhaustive list of plugins, prompts, or tools can cause potential issues in Warp: -* oh-my-fish, oh-my-bash, or other unsupported shell prompts. See our [Custom Prompt Compatibility Table](/terminal/appearance/prompt/#custom-prompt-compatibility-table). -* [iterm shell integration](https://iterm2.com/documentation-shell-integration.html) +* oh-my-fish, oh-my-bash, or other unsupported shell prompts. See our [Custom Prompt Compatibility Table](/terminal/appearance/prompt/#shell-prompt-compatibility-table). +* [iTerm2 shell integration](https://iterm2.com/documentation-shell-integration.html) * `test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh" || true` * [Termium](https://codeium.com/blog/termium-codeium-in-terminal-launch) * `eval "$(termium shell-hook show pre)"` @@ -233,7 +233,7 @@ The following non-exhaustive list of plugins, prompts, or tools can cause potent Warp may have an error opening after auto-update on macOS Ventura. This issue has been resolved for current and future releases of Warp. To avoid the issue, [update Warp](/support-and-community/troubleshooting-and-support/updating-warp/) _before_ you upgrade to macOS Ventura.\ \ - If you experience an error opening Warp, please try the following: + If you experience an error opening Warp, try the following: * Go to the macOS Applications folder, right-click on Warp, choose Open, then the '"Warp" is damaged' dialog will have the option to click the Open button. @@ -252,13 +252,13 @@ The following non-exhaustive list of plugins, prompts, or tools can cause potent <TabItem label="Windows"> **Unsupported in Warp on Windows** - The following features are not supported in Warp on Windows. Please track the relevant GitHub issues linked below for any changes: + The following features are not supported in Warp on Windows. Track the relevant GitHub issues linked below for any changes: * [cmd.exe](https://github.com/warpdotdev/Warp/issues/5882) or [fish](https://github.com/warpdotdev/Warp/issues/6060) shells **Warp won't run on Windows** - We're tracking some issues on Windows where [Warp crashes on startup](https://github.com/warpdotdev/Warp/issues/5840) or doesn't render, with some possible workarounds below. If none of the workarounds help, please open a [new GitHub issue](https://github.com/warpdotdev/warp/issues/new/choose) and include [logs](/support-and-community/#gathering-warp-logs), installation (Baremetal or VM, x86\_64 or ARM64), and the issue you had. + We're tracking some issues on Windows where [Warp crashes on startup](https://github.com/warpdotdev/Warp/issues/5840) or doesn't render, with some possible workarounds below. If none of the workarounds help, please open a [new GitHub issue](https://github.com/warpdotdev/warp/issues/new/choose) and include [logs](/support-and-community/troubleshooting-and-support/sending-us-feedback/#gathering-warp-logs), installation (Baremetal or VM, x86\_64 or ARM64), and the issue you had. * Graphics * You can select the graphics backend used to render new Warp windows in the Settings menu, under **Features** > **System** > **Preferred graphics backend**. @@ -266,7 +266,7 @@ The following non-exhaustive list of plugins, prompts, or tools can cause potent **Crash on opening a Launch configuration or doesn't become transparent on Windows** - When a user has an Nvidia 572.xx or AMD 23.10.x drivers or above, Warp may [crash when trying to open a Launch Configuration](https://github.com/warpdotdev/Warp/issues/5875), or [Warp fails to become transparent](https://github.com/warpdotdev/Warp/issues/5903) (opacity setting doesn't work). These are known limitations of the graphics drivers. We're investigating the issues and will update the GitHub issues above. You can workaround this by forcing the graphics backend to Vulkan or OpenGL by running the following from another terminal and setting your GPU driver Vulkan/OpenGL render method setting to "Prefer Native", or using the [DX12 backend](/support-and-community/troubleshooting-and-support/known-issues/#warp-wont-run-or-render-on-windows): + When a user has an Nvidia 572.xx or AMD 23.10.x drivers or above, Warp may [crash when trying to open a Launch Configuration](https://github.com/warpdotdev/Warp/issues/5875), or [Warp fails to become transparent](https://github.com/warpdotdev/Warp/issues/5903) (opacity setting doesn't work). These are known limitations of the graphics drivers. We're investigating the issues and will update the GitHub issues above. You can workaround this by forcing the graphics backend to Vulkan or OpenGL by running the following from another terminal and setting your GPU driver Vulkan/OpenGL render method setting to "Prefer Native", or using the [DX12 backend](/support-and-community/troubleshooting-and-support/known-issues/#operating-systems): ```powershell # Run if Warp on Windows is installed for a single user @@ -279,7 +279,7 @@ The following non-exhaustive list of plugins, prompts, or tools can cause potent <TabItem label="Linux"> **Warp won't run on Linux** - We're tracking some issues on Linux where a [Warp window doesn't show/render](https://github.com/warpdotdev/Warp/issues/4215) and won't run in [Virtual Machines](https://github.com/warpdotdev/Warp/issues/4476), over [remote desktops](https://github.com/warpdotdev/Warp/issues/4435), or on [WSL](https://github.com/warpdotdev/Warp/issues/4240). Some possible workarounds are below. If none of the workarounds help, please open a [new GitHub issue](https://github.com/warpdotdev/warp/issues/new/choose) and include [logs](/support-and-community/#gathering-warp-logs) with your Linux distro, installation (WSL, Baremetal or VM, x86\_64 or ARM64), and the issue you had. + We're tracking some issues on Linux where a [Warp window doesn't show/render](https://github.com/warpdotdev/Warp/issues/4215) and won't run in [Virtual Machines](https://github.com/warpdotdev/Warp/issues/4476), over [remote desktops](https://github.com/warpdotdev/Warp/issues/4435), or on [WSL](https://github.com/warpdotdev/Warp/issues/4240). Some possible workarounds are below. If none of the workarounds help, please open a [new GitHub issue](https://github.com/warpdotdev/warp/issues/new/choose) and include [logs](/support-and-community/troubleshooting-and-support/sending-us-feedback/#gathering-warp-logs) with your Linux distro, installation (WSL, Baremetal or VM, x86\_64 or ARM64), and the issue you had. :::note * Many package install examples are for Ubuntu using `apt`, your distro may use different commands (`dnf`, `pacman`, `zypper`) or package names. @@ -322,6 +322,6 @@ The following non-exhaustive list of plugins, prompts, or tools can cause potent sudo apt update && sudo apt install warp-terminal ``` -See the instructions for other Linux distros on our [quickstart guide](/getting-started/quickstart/installation-and-setup/#linux). +See the instructions for other Linux distros on our [quickstart guide](/getting-started/quickstart/installation-and-setup/#install-warp). </TabItem> </Tabs> diff --git a/src/content/docs/support-and-community/troubleshooting-and-support/sending-us-feedback.mdx b/src/content/docs/support-and-community/troubleshooting-and-support/sending-us-feedback.mdx index 6d83a604f..98508abe2 100644 --- a/src/content/docs/support-and-community/troubleshooting-and-support/sending-us-feedback.mdx +++ b/src/content/docs/support-and-community/troubleshooting-and-support/sending-us-feedback.mdx @@ -7,6 +7,7 @@ sidebar: label: "Sending Feedback & Logs" --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import { VARS } from '@data/vars'; ## Sending Warp feedback @@ -24,7 +25,7 @@ import { Tabs, TabItem } from '@astrojs/starlight/components'; ## Using `/feedback` in Warp -The `/feedback` [slash command](/agent-platform/capabilities/slash-commands/) is the fastest way to report a Warp bug, flag a regression, or file a feature request from inside the terminal. It opens the feedback form without starting an Agent conversation or consuming credits. +The `/feedback` [slash command](/agents/capabilities/slash-commands/) is the fastest way to report a Warp bug, flag a regression, or file a feature request from inside the terminal. It opens the feedback form without starting an Agent conversation or consuming credits. ### What to include @@ -36,7 +37,7 @@ Whether you use the `/feedback` slash command or file an issue manually, a good * **What version of Warp are you on?** `/feedback` fills this in automatically; for manual reports, copy it from **Settings** > **Account**. * **Logs, screenshots, or conversation IDs.** See [Gathering Warp logs](#gathering-warp-logs), [Collecting crash reports on macOS](#collecting-crash-reports-on-macos), or [Gathering AI conversation ID](#gathering-ai-conversation-id) below. -See the [Slash Commands reference](/agent-platform/capabilities/slash-commands/) for the full list of commands available in Warp. +See the [Slash Commands reference](/agents/capabilities/slash-commands/) for the full list of commands available in Warp. ## Gathering Warp logs @@ -67,7 +68,7 @@ Warp's logs and crash reports _**do not**_ contain any console input or output. ``` :::caution - If your issue is graphical (e.g. no display of windows) or a crash, please run Warp with the following command to capture more log information: + If your issue is graphical (e.g. no display of windows) or a crash, run Warp with the following command to capture more log information: ```bash # Run if Warp on macOS is installed @@ -98,7 +99,7 @@ Warp's logs and crash reports _**do not**_ contain any console input or output. ``` :::caution - If your issue is graphical (e.g. no display of windows) or a crash, please run Warp with the following command to capture more log information: + If your issue is graphical (e.g. no display of windows) or a crash, run Warp with the following command to capture more log information: ```powershell # Run if Warp on Windows is installed for a single user @@ -135,7 +136,7 @@ Warp's logs and crash reports _**do not**_ contain any console input or output. ``` :::caution - If your issue is graphical (e.g. no display of windows) or a crash, please run Warp with the following command to capture more log information: + If your issue is graphical (e.g. no display of windows) or a crash, run Warp with the following command to capture more log information: ```bash # Run if Warp on Linux is installed @@ -260,4 +261,14 @@ To gather the conversation ID, `RIGHT-CLICK` on the AI conversation block in que Whenever there is an error in the Agent Conversation, there will also be an option to directly copy the conversation ID for the bug report. +### Using `/copy-debugging-id` + +The [`/copy-debugging-id`](/agents/capabilities/slash-commands/) slash command copies the same information without leaving the input. It works in both the Warp app and the [{VARS.WARP_CLI}](/agents/cli/), and it applies to the conversation you're currently in: + +1. Run `/copy-debugging-id` in the conversation you want to report. +2. Warp confirms with a "Debugging information copied to clipboard" message. +3. Paste the copied text into your bug report. + +The copied text is a small JSON payload with the conversation ID, plus the request ID when the command is run on a specific agent response — for example, `{"conversation_id":"abc123"}`. If the conversation hasn't reached Warp's servers yet, the command reports that no debugging ID is available; send a prompt first, then run it again. + ![Agent Mode error message with Send Feedback button and debug information containing request and conversation IDs](../../../../assets/support-and-community/send-feedback-debugging-information.png) diff --git a/src/content/docs/support-and-community/troubleshooting-and-support/troubleshooting-login-issues.mdx b/src/content/docs/support-and-community/troubleshooting-and-support/troubleshooting-login-issues.mdx index 20bda0756..5c6d3af96 100644 --- a/src/content/docs/support-and-community/troubleshooting-and-support/troubleshooting-login-issues.mdx +++ b/src/content/docs/support-and-community/troubleshooting-and-support/troubleshooting-login-issues.mdx @@ -62,7 +62,7 @@ When directly launching Warp from Okta or other SSO providers', you may see an e ### I logged in with another method before and now can't use SSO -In cases where you logged in with another method, please do the following to fix SSO login: +In cases where you logged in with another method, do the following to fix SSO login: 1. Go to the [Warp login page](https://app.warp.dev/login) 2. Login with the original method that you used to create your Warp account (email, Google, GitHub). @@ -73,28 +73,28 @@ In cases where you logged in with another method, please do the following to fix If you received the message "This account has been flagged as fraudulent.", this means that you have failed one or more checks in our fraud detection system, and you will be unable to authenticate to Warp or leverage AI features. -Please note that creating multiple accounts or using throwaway emails is against our [Terms of Service](https://www.warp.dev/legal/terms-of-service) and increases the chance of triggering this system significantly. +Note that creating multiple accounts or using throwaway emails is against our [Terms of Service](https://www.warp.dev/legal/terms-of-service) and increases the chance of triggering this system significantly. ### False positives -At times, ad-blockers or systems like Pi-hole may falsely trigger this system. You may be able to remediate this error by temporarily disabling these and attempting login again. +At times, ad-blockers or systems like Pi-hole may falsely trigger this system. To remediate this error, try temporarily disabling them and attempting login again. ### Requesting an appeal -If you are still unable to authenticate, you may email [appeals@warp.dev](mailto:appeals@warp.dev) to request an appeal. Please include the email of the account you are experiencing the issue on so a member of our support team can investigate. This may take 5-10 days. +If you are still unable to authenticate, you can email [appeals@warp.dev](mailto:appeals@warp.dev) to request an appeal. Include the email of the account you are experiencing the issue on so a member of our support team can investigate. This may take 5-10 days. If you have an active subscription and continue to have login issues, see [how to get help with login issues](/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/#get-help-with-login-issues). ## How to get an auth token to login -If the browser does not open from Warp directly when you click "Sign up" or "Sign in". Please go to the [Signup](https://app.warp.dev/signup) page to create an account or [Login](https://app.warp.dev/login) page if you already have one, then copy the auth token from the "here" link on the logged\_in page and paste it into Warp. +If the browser does not open from Warp directly when you click "Sign up" or "Sign in", go to the [Signup](https://app.warp.dev/signup) page to create an account or the [Login](https://app.warp.dev/login) page if you already have one, then copy the auth token from the "here" link on the logged\_in page and paste it into Warp. -If nothing happens when you click "Take me to Warp" on the logged-in page. If this happens to you, copy the "here" link on the web logged-in page (https://app.warp.dev/logged\_in) to copy the authentication token, then paste it into the app as shown below. +If nothing happens when you click "Take me to Warp" on the logged-in page, copy the "here" link on the web logged-in page (https://app.warp.dev/logged\_in) to copy the authentication token, then paste it into the app as shown below. :::caution On Linux and Windows, the default copy-and-paste [Keyboard shortcuts](/getting-started/keyboard-shortcuts/) are `Ctrl+Shift+C` and `Ctrl+Shift+V` respectively.\ \ -On Linux and WSL you should install and set your default `$BROWSER` to `brave-browser` to workaround any copy-paste issues. Please see the workaround guide below. +On Linux and WSL you should install and set your default `$BROWSER` to `brave-browser` to workaround any copy-paste issues. See the workaround guide below. ::: <DemoVideo src="/assets/support-and-community/auth-token-demo.mp4" label="Authentication Token Linux" /> diff --git a/src/content/docs/support-and-community/troubleshooting-and-support/updating-warp.mdx b/src/content/docs/support-and-community/troubleshooting-and-support/updating-warp.mdx index 868d76d8a..b4a0e230c 100644 --- a/src/content/docs/support-and-community/troubleshooting-and-support/updating-warp.mdx +++ b/src/content/docs/support-and-community/troubleshooting-and-support/updating-warp.mdx @@ -28,7 +28,7 @@ There are 2 main causes of this: 2. You are a non-Admin user. This can happen if you use a computer with multiple profiles. If you have admin access on the computer, opening the app with the admin user should fix the auto-update issues. :::note -(Oct 2022): There is a known issue with [auto-update on macOS Ventura](/support-and-community/troubleshooting-and-support/known-issues/#auto-update-on-macos-ventura). +(Oct 2022): There is a known issue with [auto-update on macOS Ventura](/support-and-community/troubleshooting-and-support/known-issues/#operating-systems). ::: ## Linux: Refreshing the package signing key diff --git a/src/content/docs/support-and-community/troubleshooting-and-support/using-warp-offline.mdx b/src/content/docs/support-and-community/troubleshooting-and-support/using-warp-offline.mdx index b4672966f..80b1ee464 100644 --- a/src/content/docs/support-and-community/troubleshooting-and-support/using-warp-offline.mdx +++ b/src/content/docs/support-and-community/troubleshooting-and-support/using-warp-offline.mdx @@ -17,15 +17,15 @@ Warp is "Offline" when you aren't connected to the internet, or if you're blocki Warp’s cloud-based features which require an internet connection will not work in offline mode. Those features include: * [Warp Drive](/knowledge-and-collaboration/warp-drive/#using-warp-drive-offline) (Some files may be read-only in offline mode) -* [Agent](/agent-platform/local-agents/overview/) - * [Agent Mode](/agent-platform/local-agents/interacting-with-agents/) - * [Generate](/agent-platform/local-agents/overview/) - * [AI Autofill](/knowledge-and-collaboration/warp-drive/workflows/#warp-ai-autofill) +* [Agent](/agents/) + * [Agent Mode](/agents/local-agents/interacting-with-agents/) + * [Generate](/agents/local-agents/generate/) + * [AI Autofill](/knowledge-and-collaboration/warp-drive/workflows/#ai-autofill) * [Prompts](/knowledge-and-collaboration/warp-drive/prompts/) - * [Active AI Recommendations](/agent-platform/local-agents/active-ai/) - * [Voice](/agent-platform/local-agents/interacting-with-agents/voice/) - * [Rules](/agent-platform/capabilities/rules/) - * [Model Context Protocol](/agent-platform/capabilities/mcp/) + * [Active AI Recommendations](/agents/local-agents/active-ai/) + * [Voice](/agents/local-agents/interacting-with-agents/voice/) + * [Rules](/agents/capabilities/rules/) + * [Model Context Protocol](/agents/capabilities/mcp/) * [Teams](/knowledge-and-collaboration/teams/) * [Session Sharing](/knowledge-and-collaboration/session-sharing/) * [Block Sharing](/terminal/blocks/block-sharing/) diff --git a/src/content/docs/terminal/appearance/prompt.mdx b/src/content/docs/terminal/appearance/prompt.mdx index d790297ac..abb39396d 100644 --- a/src/content/docs/terminal/appearance/prompt.mdx +++ b/src/content/docs/terminal/appearance/prompt.mdx @@ -143,7 +143,7 @@ echo '[line_break]\ndisabled = false' >> ~/.config/starship.toml ## Known incompatibilities -If you're having issues with prompts, please see below or our [Known Issues](/support-and-community/troubleshooting-and-support/known-issues/#configuring-and-debugging-your-rc-files) for more troubleshooting steps. +If you're having issues with prompts, see below or our [Known Issues](/support-and-community/troubleshooting-and-support/known-issues/#configuring-and-debugging-your-rc-files) for more troubleshooting steps. ### Starship @@ -197,7 +197,7 @@ Warp still doesn't fully support some p10k features like transient prompt and vi <VideoEmbed url="https://www.youtube.com/watch?t=18s&v=dIV9Cso4Mi8" title="Installing Powerlevel10k" /> :::caution -Please note the Installing Powerlevel10k video mentions enabling a custom prompt in **Settings** > **Features** > **Honor users custom prompt (PS1)**, but it's now in **Settings** > **Appearance** > **Input** > **Classic** > **Current prompt** > **Shell Prompt (PS1)**. +The Installing Powerlevel10k video mentions enabling a custom prompt in **Settings** > **Features** > **Honor users custom prompt (PS1)**, but it's now in **Settings** > **Appearance** > **Input** > **Classic** > **Current prompt** > **Shell Prompt (PS1)**. ::: ### Spaceship @@ -224,7 +224,7 @@ fi #### iTerm2 -The iTerm2 shell integration breaks Warp and your custom prompt will not be able to be visible with this on. If you're coming from iTerm2 please check your dotfiles for it. We advise disabling the integration for Warp like so: +The iTerm2 shell integration breaks Warp and your custom prompt will not be able to be visible with this on. If you're coming from iTerm2, check your dotfiles for it. We advise disabling the integration for Warp like so: ``` if [[ $TERM_PROGRAM != "WarpTerminal" ]]; then diff --git a/src/content/docs/terminal/blocks/block-sharing.mdx b/src/content/docs/terminal/blocks/block-sharing.mdx index ee3a3fa6d..843a2daef 100644 --- a/src/content/docs/terminal/blocks/block-sharing.mdx +++ b/src/content/docs/terminal/blocks/block-sharing.mdx @@ -45,7 +45,7 @@ Share your blocks with a permalink or HTML embed. You can get started with share </Tabs> :::note -If you experience any issues with block sharing, please see our known issues for [troubleshooting steps](/support-and-community/troubleshooting-and-support/known-issues/#online-features-dont-work). +If you experience any issues with block sharing, see our known issues for [troubleshooting steps](/support-and-community/troubleshooting-and-support/known-issues/#online-features-dont-work). ::: <DemoVideo src="/assets/terminal/block-sharing-embed.mp4" label="Block Sharing & Embed Demo" /> diff --git a/src/content/docs/terminal/comparisons/index.mdx b/src/content/docs/terminal/comparisons/index.mdx index 16f221008..e665ba579 100644 --- a/src/content/docs/terminal/comparisons/index.mdx +++ b/src/content/docs/terminal/comparisons/index.mdx @@ -4,13 +4,14 @@ description: >- Compare Warp's performance and terminal feature support against other popular terminal emulators like iTerm2, Alacritty, and WezTerm. --- +import { VARS } from '@data/vars'; Warp is a modern terminal built in Rust with GPU rendering, agent support, and a code-editor-style input. Use this section to see how Warp stacks up against other popular terminals on raw performance and feature coverage. ## How Warp differs * **Open source under AGPL v3** — Warp's client lives at [`warpdotdev/warp`](https://github.com/warpdotdev/warp). You can read the code, build from source, and contribute. See [Contributing to Warp](/support-and-community/community/contributing/) for the flow. -* **Built-in agents** — Warp ships with Warp Agent (powered by Oz) and supports third-party CLI agents like Claude Code, Codex, and Gemini CLI from the same terminal. +* **Built-in agents** — Warp ships with the Warp Agent (powered by the {VARS.WARP_AUTOMATION_PLATFORM}) and supports third-party CLI agents like Claude Code, Codex, and Gemini CLI from the same terminal. * **Modern editing** — Cursor placement, multi-line input, block-based output, and integrated code review work like a text editor instead of a traditional terminal emulator. * **Cross-platform Rust core** — Warp ships on macOS, Linux, and Windows from a single Rust + GPU-rendered codebase. diff --git a/src/content/docs/terminal/comparisons/performance.mdx b/src/content/docs/terminal/comparisons/performance.mdx index fc926fb0c..a78a0a623 100644 --- a/src/content/docs/terminal/comparisons/performance.mdx +++ b/src/content/docs/terminal/comparisons/performance.mdx @@ -24,7 +24,7 @@ We chose to benchmark Warp against 4 other terminal emulator applications, based ### About benchmarks -We link the source code of each benchmark used, so you can easily reproduce the tests with other terminal apps. Please, note that those benchmarks are not exhaustive. Comparing terminal emulators with each other is not an easy task - right now we're checking how each of the apps behaves when dealing with lots of input and/or output. +We link the source code of each benchmark used, so you can easily reproduce the tests with other terminal apps. Note that these benchmarks are not exhaustive. Comparing terminal emulators with each other is not an easy task - right now we're checking how each of the apps behaves when dealing with lots of input and/or output. Ideally, the benchmarks would also cover the latency (time between pressing a key and the character showing on the screen, but also a delay between the user's input and communication with the shell). We may include tests that account for that in the future. diff --git a/src/content/docs/terminal/editor/alias-expansion.mdx b/src/content/docs/terminal/editor/alias-expansion.mdx index 5fcd6f565..320fed2fd 100644 --- a/src/content/docs/terminal/editor/alias-expansion.mdx +++ b/src/content/docs/terminal/editor/alias-expansion.mdx @@ -37,7 +37,7 @@ Aliases will not be expanded when the command in the expanded form is the same a Alias expansion is disabled by default. There are two ways to toggle this on and off: * From Settings: Navigate to **Settings** > **Features** > **Terminal Input** and toggle “Expand aliases as you type”. -* From the [Command Palette](/terminal/command-palette/#windows): Search for the “Enable/disable alias expansion” option and hit `ENTER`. +* From the [Command Palette](/terminal/command-palette/#how-to-access-it): Search for the “Enable/disable alias expansion” option and hit `ENTER`. ## How it works diff --git a/src/content/docs/terminal/editor/vim.mdx b/src/content/docs/terminal/editor/vim.mdx index 66d7541a9..e4e69155c 100644 --- a/src/content/docs/terminal/editor/vim.mdx +++ b/src/content/docs/terminal/editor/vim.mdx @@ -28,7 +28,7 @@ As in `bash` and `zsh`'s vi mode implementations, the editor starts in insert mo At the moment, Warp only supports default Vim keybindings. -One exception is the keyboard shortcut for exiting insert mode, which can be rebound under **Settings** > **Keyboard shortcuts** > **Exit Vim Insert Mode**, or through the [Command Palette](/terminal/command-palette/) search for "Exit Vim Insert Mode". +One exception is the keyboard shortcut for exiting insert mode, which can be rebound under **Settings** > **Keyboard shortcuts** > **Exit Vim insert mode**, or through the [Command Palette](/terminal/command-palette/) search for "Exit Vim insert mode". ## Supported keybindings @@ -147,4 +147,4 @@ See [Vim docs: registers](https://vimdoc.sourceforge.net/htmldoc/change.html#reg ## Feedback -The best way to report bugs and request features is through Warp's [GitHub Issues](https://github.com/warpdotdev/Warp/issues) page. Please note that the issue or request is for Vim keybindings. +The best way to report bugs and request features is through Warp's [GitHub Issues](https://github.com/warpdotdev/Warp/issues) page. Note that the issue or request is for Vim keybindings. diff --git a/src/content/docs/terminal/entry/command-search.mdx b/src/content/docs/terminal/entry/command-search.mdx index a7b066c83..dbf2d81a1 100644 --- a/src/content/docs/terminal/entry/command-search.mdx +++ b/src/content/docs/terminal/entry/command-search.mdx @@ -8,7 +8,7 @@ sidebar: --- import VideoEmbed from '@components/VideoEmbed.astro'; -The Command Search panel provides unified search across all your terminal inputs, saved commands, and [Terminal and Agent modes](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/) conversation history. Use it to quickly find and reuse commands, workflows, or past agent interactions. +The Command Search panel provides unified search across all your terminal inputs, saved commands, and [Terminal and Agent modes](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/) conversation history. Use it to quickly find and reuse commands, workflows, or past agent interactions. ![Command Search Panel](../../../../assets/terminal/command-search-panel.png) @@ -26,7 +26,7 @@ Tailor your Command Search experience by toggling off "Show Global Workflows" in You can filter your search results by prepending your search term with any of the following: -<table><thead><tr><th width="215.78436279296875">Filter</th><th>Shortcuts</th></tr></thead><tbody><tr><td>Command History</td><td><code>history:</code>, <code>h:</code>, or <code>H-TAB</code></td></tr><tr><td>Prompts</td><td><code>prompts:</code>, <code>p:</code>, or <code>P-TAB</code></td></tr><tr><td><a href="/agent-platform/local-agents/interacting-with-agents/">Agent Mode</a> History</td><td><code>ai_history:</code>, <code>a:</code>, or <code>A-TAB</code></td></tr></tbody></table> +<table><thead><tr><th width="215.78436279296875">Filter</th><th>Shortcuts</th></tr></thead><tbody><tr><td>Command History</td><td><code>history:</code>, <code>h:</code>, or <code>H-TAB</code></td></tr><tr><td>Prompts</td><td><code>prompts:</code>, <code>p:</code>, or <code>P-TAB</code></td></tr><tr><td><a href="/agents/local-agents/interacting-with-agents/">Agent Mode</a> History</td><td><code>ai_history:</code>, <code>a:</code>, or <code>A-TAB</code></td></tr></tbody></table> :::note When a filter is activated, it will be bolded and italicized in the search panel. diff --git a/src/content/docs/terminal/input/classic-input.mdx b/src/content/docs/terminal/input/classic-input.mdx index 5da4f8005..2e01dccd4 100644 --- a/src/content/docs/terminal/input/classic-input.mdx +++ b/src/content/docs/terminal/input/classic-input.mdx @@ -6,12 +6,13 @@ description: >- box. --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import { VARS } from '@data/vars'; Classic Input corresponds to the **Shell (PS1)** option under **Settings** > **Appearance** > **Input**. It provides a traditional terminal experience with support for shell customizations like PS1 prompts, oh-my-zsh themes, same-line prompts, and more. -Warp's default input uses [Terminal and Agent modes](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/), which provide a clean terminal by default and a dedicated conversation view for agent interactions. Classic Input is an alternative for users who prefer a more traditional terminal. +Warp's default input uses [Terminal and Agent modes](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/), which provide a clean terminal by default and a dedicated conversation view for agent interactions. Classic Input is an alternative for users who prefer a more traditional terminal. -[Agent Mode](/agent-platform/local-agents/interacting-with-agents/) works in Classic Input with some minor differences from the default input. +[Agent Mode](/agents/local-agents/interacting-with-agents/) works in Classic Input with some minor differences from the default input. ## Features @@ -94,7 +95,7 @@ Warp input occasionally shows hints within the input editor in a light grey text ## How to run commands in Agent Mode -Once you have typed your question or task in the input, press `Enter` to execute your AI query. Agent Mode will send your request to Oz and begin streaming output in the form of an AI block. +Once you have typed your question or task in the input, press `Enter` to execute your AI query. Agent Mode will send your request to the {VARS.WARP_AUTOMATION_PLATFORM} and begin streaming output in the form of an AI block. Unlike a chat panel, Agent Mode can complete tasks for you by running commands directly in your session. @@ -112,12 +113,12 @@ If the suggested command fails and you want to resolve the error, you can start If Agent Mode doesn't have enough context to assist with a task, it will ask permission to run a command and read the output of that command. -You must explicitly agree and press `Enter` to run the requested command. When you hit enter, both the command input and the output will be sent to Oz. +You must explicitly agree and press `Enter` to run the requested command. When you hit enter, both the command input and the output will be sent to the {VARS.WARP_AUTOMATION_PLATFORM}. If you do not wish to send the command or its output to AI, you can click Cancel or press `Ctrl+C` to exit Agent Mode and return to the traditional command line. <figure> -![Oz asks permission to run a command and read the output.](../../../../assets/terminal/warp-ai-permissions.png) +![The agent asks permission to run a command and read the output.](../../../../assets/terminal/warp-ai-permissions.png) <figcaption>Agent command approval prompt.</figcaption> </figure> @@ -128,6 +129,6 @@ Once a requested command is executed, you can click to expand the output and vie <figcaption>Viewing command details.</figcaption> </figure> -If a requested command fails, Oz detects it. Agent Mode is self-correcting. It will request another command until it completes the task for you. +If a requested command fails, the {VARS.WARP_AUTOMATION_PLATFORM} detects it. Agent Mode is self-correcting. It will request another command until it completes the task for you. -Warp lets you choose from a curated list of LLMs for use in Agent Mode. By default, Warp uses **Auto (Responsive)**, which routes to the highest-quality, fastest available model. You can switch to other supported models — see [Model choice](/agent-platform/inference/model-choice/) for the full list. +Warp lets you choose from a curated list of LLMs for use in Agent Mode. By default, Warp uses **Auto (Responsive)**, which routes to the highest-quality, fastest available model. You can switch to other supported models — see [Model choice](/agents/inference/model-choice/) for the full list. diff --git a/src/content/docs/terminal/input/universal-input.mdx b/src/content/docs/terminal/input/universal-input.mdx index b49c3ddf9..573c19965 100644 --- a/src/content/docs/terminal/input/universal-input.mdx +++ b/src/content/docs/terminal/input/universal-input.mdx @@ -10,7 +10,7 @@ import { Tabs, TabItem } from '@astrojs/starlight/components'; import VideoEmbed from '@components/VideoEmbed.astro'; :::caution -**This is legacy documentation.** Universal Input has been replaced by [Terminal and Agent modes](/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/), which provides a cleaner terminal experience with a dedicated conversation view for agent interactions. +**This is legacy documentation.** Universal Input has been replaced by [Terminal and Agent modes](/agents/local-agents/interacting-with-agents/terminal-and-agent-modes/), which provides a cleaner terminal experience with a dedicated conversation view for agent interactions. ::: The **Universal Input** was the main input interface for using Warp. @@ -26,12 +26,12 @@ The **Universal Input** was the main input interface for using Warp. The Universal Input brings together all of Warp's input features into one streamlined editor: -* **Natural language auto-detection**: Warp can automatically detect when you're writing in plain English, as opposed to a shell command, and switch you into [Agent Mode](/agent-platform/local-agents/interacting-with-agents/#what-is-agent-mode). +* **Natural language auto-detection**: Warp can automatically detect when you're writing in plain English, as opposed to a shell command, and switch you into [Agent Mode](/agents/local-agents/interacting-with-agents/#conversations-with-warps-agent). * **Contextual chips**: See your current directory, previous conversations, Git status, node version, and more, all inline with your input. -* [**Modern text editing**](/terminal/editor/): Enjoy IDE-like editing features such as [completions](/terminal/command-completions/), [syntax highlighting](/terminal/editor/syntax-error-highlighting/), mouse support, [rectangular selection](/terminal/more-features/text-selection/), and [Next Command](/agent-platform/local-agents/active-ai/) predictions. -* **Input toolbelt**: Quickly access [@-context](/agent-platform/local-agents/agent-context/using-to-add-context/), [Slash Commands](/agent-platform/capabilities/slash-commands/), [voice input](/agent-platform/local-agents/interacting-with-agents/voice/), [image attachments](/agent-platform/local-agents/agent-context/images-as-context/) as context, and other AI features. +* [**Modern text editing**](/terminal/editor/): Enjoy IDE-like editing features such as [completions](/terminal/command-completions/), [syntax highlighting](/terminal/editor/syntax-error-highlighting/), mouse support, [rectangular selection](/terminal/more-features/text-selection/), and [Next Command](/agents/local-agents/active-ai/) predictions. +* **Input toolbelt**: Quickly access [@-context](/agents/local-agents/agent-context/using-to-add-context/), [Slash Commands](/agents/capabilities/slash-commands/), [voice input](/agents/local-agents/interacting-with-agents/voice/), [image attachments](/agents/local-agents/agent-context/images-as-context/) as context, and other AI features. -If you prefer a more traditional terminal input experience, you can switch to [Classic Input](/terminal/input/classic-input/) in **Settings** > **Appearance** > **Input**. Classic input also supports oh-my-posh, PS1 customizations, and [same line prompt.](/terminal/appearance/prompt/#same-line-prompt) +If you prefer a more traditional terminal input experience, you can switch to [Classic Input](/terminal/input/classic-input/) in **Settings** > **Appearance** > **Input**. Classic input also supports oh-my-posh and [shell prompt (PS1) customizations](/terminal/appearance/prompt/#shell-prompt-ps1). ## Input modes @@ -90,7 +90,7 @@ The model Warp uses to detect natural language automatically is completely local By default, auto-detection is enabled. This means Warp decides whether to treat your input as a command or an Agent prompt. -* **To turn off auto-detection**: go to **Settings** > **Agents** > **Oz** > **Input** > **Natural Language Detection** +* **To turn off auto-detection**: go to **Settings** > **Agents** > **Warp Agent** > **Input** > **Natural Language Detection** * When disabled: You’ll explicitly be in either Terminal or Agent Mode. Use the following keyboard shortcuts to switch between modes: * `CMD+I` (macOS) * `CTRL+I` (Windows/Linux) @@ -107,7 +107,7 @@ By default, auto-detection is enabled. This means Warp decides whether to treat ### Entering Agent Mode -[Agent Mode](/agent-platform/local-agents/interacting-with-agents/) is how you interact directly with Warp's AI to ask questions, run tasks, and collaborate in natural language. There are multiple ways to enter Agent Mode depending on where you are in your workflow: +[Agent Mode](/agents/local-agents/interacting-with-agents/) is how you interact directly with Warp's AI to ask questions, run tasks, and collaborate in natural language. There are multiple ways to enter Agent Mode depending on where you are in your workflow: <Tabs> <TabItem label="macOS"> @@ -195,11 +195,11 @@ Warp can automatically detect when you’re writing in plain English and switch #### Fixing false detections -If certain shell commands are mistakenly detected as natural language, you can add them to the denylist: **Settings** > **Agents** > **Oz** > **Input** > **Natural language denylist** +If certain shell commands are mistakenly detected as natural language, you can add them to the denylist: **Settings** > **Agents** > **Warp Agent** > **Input** > **Natural language denylist** #### Turning off auto-detection -To disable natural language detection entirely, go to: **Settings** > **Agents** > **Oz** > **Input Auto-detection** +To disable natural language detection entirely, go to: **Settings** > **Agents** > **Warp Agent** > **Input Auto-detection** When auto-detection is turned off, you’ll need to explicitly switch between Terminal Mode and Agent Mode using `CMD + I` (macOS) or `CTRL + I` (Windows/Linux). @@ -225,16 +225,16 @@ The Universal Input includes **contextual chips** that provide inline informatio #### Conversation Management chip -The conversation management chip shows your recent [Agent conversations](/agent-platform/local-agents/interacting-with-agents/), allowing you to reference or reopen them directly. +The conversation management chip shows your recent [Agent conversations](/agents/local-agents/interacting-with-agents/), allowing you to reference or reopen them directly. -These chips appear in both Agent Mode and Terminal Mode, so you can continue a previous conversation without starting from scratch. For more details, see [Agent Conversations](/agent-platform/local-agents/interacting-with-agents/). +These chips appear in both Agent Mode and Terminal Mode, so you can continue a previous conversation without starting from scratch. For more details, see [Agent Conversations](/agents/local-agents/interacting-with-agents/). <figure> ![The Conversation Management chip displays recent Agent conversations and lets you continue or reopen them directly from the input.](../../../../assets/terminal/conversation-management-chip-universal-input.png) <figcaption>The Conversation Management chip.</figcaption> </figure> -These chips appear in both Agent Mode and Terminal Mode, helping you continue a previous conversation without starting from scratch. For more details, refer to [Agent Conversations](/agent-platform/local-agents/interacting-with-agents/). +These chips appear in both Agent Mode and Terminal Mode, helping you continue a previous conversation without starting from scratch. For more details, refer to [Agent Conversations](/agents/local-agents/interacting-with-agents/). #### Active directory chip @@ -258,7 +258,7 @@ The chip updates automatically as files are added, removed, or changed, giving y #### File attachments chips -The file attachments chip lets you attach images and other files directly to a prompt. You can upload up to five [images at a time (as Agent Context)](/agent-platform/local-agents/agent-context/images-as-context/) using the upload button in the toolbelt or by dragging and dropping files into the input. This makes it possible to add screenshots, diagrams, PDFs, or other references directly to your query, giving the Agent richer context. +The file attachments chip lets you attach images and other files directly to a prompt. You can upload up to five [images at a time (as Agent Context)](/agents/local-agents/agent-context/images-as-context/) using the upload button in the toolbelt or by dragging and dropping files into the input. This makes it possible to add screenshots, diagrams, PDFs, or other references directly to your query, giving the Agent richer context. <figure> ![The File Attachments chip allows you to add images or files as context for your queries.](../../../../assets/terminal/images-as-context-chip.png) @@ -291,7 +291,7 @@ The **Input Toolbelt** provides quick-access controls alongside the Universal In #### @ - Context -The [@ context chip](/agent-platform/local-agents/agent-context/using-to-add-context/) is available when you are working in a Git repository. Outside of a Git repo, it appears dimmed. +The [@ context chip](/agents/local-agents/agent-context/using-to-add-context/) is available when you are working in a Git repository. Outside of a Git repo, it appears dimmed. This feature allows you to attach specific files, folders, code symbols, Warp Drive objects, or blocks from other sessions as context for a prompt. Typing **@** inside the input also opens a context menu where you can search for and select files or directories to include. @@ -299,17 +299,17 @@ Attaching context with @ works in both Agent Mode (when interacting with Agents) **Slash Commands** -[Slash Commands](/agent-platform/capabilities/slash-commands/) are available in Agent Mode and Auto-detection Modes. They allow you to quickly run built-in actions or saved prompts without leaving the input field. Typing / displays a menu of available commands, which can be customized or extended. +[Slash Commands](/agents/capabilities/slash-commands/) are available in Agent Mode and Auto-detection Modes. They allow you to quickly run built-in actions or saved prompts without leaving the input field. Typing / displays a menu of available commands, which can be customized or extended. **Voice Input** -[Voice Input](/agent-platform/local-agents/interacting-with-agents/voice/) automatically places you in Agent Mode. Speaking directly into Warp lets you phrase tasks, commands, or queries in natural language, and Warp will interpret them as if you had typed them. This feature is especially useful when you want hands-free interaction or when dictating longer tasks. +[Voice Input](/agents/local-agents/interacting-with-agents/voice/) automatically places you in Agent Mode. Speaking directly into Warp lets you phrase tasks, commands, or queries in natural language, and Warp will interpret them as if you had typed them. This feature is especially useful when you want hands-free interaction or when dictating longer tasks. **Image Attachments** -You can [attach images as context](/agent-platform/local-agents/agent-context/images-as-context/) directly to a prompt, which will automatically place you in Agent Mode. This is useful when you want the Agent to reference visual materials such as screenshots, diagrams, or other assets. +You can [attach images as context](/agents/local-agents/agent-context/images-as-context/) directly to a prompt, which will automatically place you in Agent Mode. This is useful when you want the Agent to reference visual materials such as screenshots, diagrams, or other assets. -You can add images using the image upload button in the toolbelt (located at the bottom left or right, depending on your input layout). For additional methods of attaching images, see [Images as Context](/agent-platform/local-agents/agent-context/images-as-context/). +You can add images using the image upload button in the toolbelt (located at the bottom left or right, depending on your input layout). For additional methods of attaching images, see [Images as Context](/agents/local-agents/agent-context/images-as-context/). **Fast Forward** @@ -317,7 +317,7 @@ Fast Forward gives the Agent full autonomy for the remainder of a task or conver #### Profile Picker -The Profile Picker allows you to select from different [Agent Profiles](/agent-platform/capabilities/agent-profiles-permissions/), each with its own configuration of autonomy, tools, and default model. If you have only one profile, the picker will not appear in the UI. +The Profile Picker allows you to select from different [Agent Profiles](/agents/capabilities/agent-profiles-permissions/), each with its own configuration of autonomy, tools, and default model. If you have only one profile, the picker will not appear in the UI. From the Profile Picker, you can view all available profiles, switch between them, and quickly see the default model attached to each one. Profiles make it possible to tailor Agent behavior for different types of tasks or projects. @@ -325,4 +325,4 @@ From the Profile Picker, you can view all available profiles, switch between the The Model Picker is tied to your current Agent Profile. Each profile has a default model, but you can override it at any time using the picker. Warp curates a selection of top large language models (LLMs) for you to choose from, balancing speed, quality, and reasoning ability depending on your needs. -For a full list of supported models and guidance on when to use them, see [Model Choice](/agent-platform/inference/model-choice/). +For a full list of supported models and guidance on when to use them, see [Model Choice](/agents/inference/model-choice/). diff --git a/src/content/docs/terminal/more-features/accessibility.mdx b/src/content/docs/terminal/more-features/accessibility.mdx index 6521ee864..668ba4b8c 100644 --- a/src/content/docs/terminal/more-features/accessibility.mdx +++ b/src/content/docs/terminal/more-features/accessibility.mdx @@ -9,7 +9,7 @@ description: >- Currently, these instructions are for macOS only. Warp doesn't support screen readers on Linux or Windows. We're tracking screen reader support in [GitHub issue #3847](https://github.com/warpdotdev/Warp/issues/3847). ::: -We recognize the need to improve the experience for those visually impaired, as - to our best knowledge - other terminal emulator apps didn't do a good job in this area. This doc summarizes what we've done so far, how Warp works with VoiceOver, and outlines the main changes from the typical workflow. For the features documentation and its keyboard shortcuts, please go to the feature-specific page in the documentation. +We recognize the need to improve the experience for those visually impaired, as - to our best knowledge - other terminal emulator apps didn't do a good job in this area. This doc summarizes what we've done so far, how Warp works with VoiceOver, and outlines the main changes from the typical workflow. For the features documentation and its keyboard shortcuts, go to the feature-specific page in the documentation. **Keep in mind that this is a work-in-progress and the current state is not a final state of accessibility in Warp**. @@ -21,13 +21,13 @@ The best way to start working with Warp & VoiceOver is to install it using Homeb This will ensure that you can receive all future updates automatically, without the need to go through a macOS standard drag-and-drop installation process. -From there, Warp should seamlessly work with VoiceOver and start announcing what's happening on the screen and what actions you can take. This may be a major difference from other apps - as Warp announces stuff on its own, letting you know what's going on. There's currently no way to navigate between different UI elements using VO key combinations. +From there, Warp should seamlessly work with VoiceOver and start announcing what's happening on the screen and what actions you can take. This may be a major difference from other apps: Warp makes these announcements on its own, letting you know what's going on. There's currently no way to navigate between different UI elements using VO key combinations. Once installed, it will ask you to log in. Warp also sends telemetry that we use to improve the overall user experience. You can find out more about that in the [privacy section](/support-and-community/privacy-and-security/privacy/). The login flow will require you to navigate between the app and your browser. The last step before you can start enjoying our new terminal app is filling up the onboarding survey. -The main terminal window is not that different from other terminals - there's a place to type commands (Command Input) and a list of the previously executed commands and their outputs. Warp groups those together - each command and output create a Block. You can navigate blocks with your keyboard to easily check what was the command, learn whether it was successful or not, and what was the output, as well as more easily copy the command, output, or both for further processing. +The main terminal window is not that different from other terminals - there's a place to type commands (Command Input) and a list of the previously executed commands and their outputs. Warp groups those together - each command and output create a Block. You can navigate blocks with your keyboard to check the command, learn whether it succeeded, and read the output, as well as copy the command, output, or both for further processing. A main entry point for discovering new features and actions is our Command Palette, which you can access by pressing `Cmd+P`. @@ -39,7 +39,7 @@ Instead, whenever you perform an action and/or something happens in the backgrou ### A11y specific actions -Some a11y-specific settings are available through the Command Palette. For example, you can adjust the verbosity level of messages. Simply enter the [Command Palette](/terminal/command-palette/) and type "a11y" to discover related options and their keybindings. +Some a11y-specific settings are available through the Command Palette. For example, you can adjust the verbosity level of messages. Open the [Command Palette](/terminal/command-palette/) and type "a11y" to discover related options and their keybindings. ### Voice input @@ -49,7 +49,7 @@ Warp supports voice input as an alternative way to interact with your terminal. * Ask questions about command usage * Perform complex multi-step operations -Voice input can be enabled in **Settings** > **Agents** > **Warp Agent** > **Voice**. For detailed information about voice features and setup, see our [Voice documentation](/agent-platform/local-agents/interacting-with-agents/voice/). +Voice input can be enabled in **Settings** > **Agents** > **Warp Agent** > **Voice**. For detailed information about voice features and setup, see our [Voice documentation](/agents/local-agents/interacting-with-agents/voice/). ## Future work diff --git a/src/content/docs/terminal/more-features/files-and-links.mdx b/src/content/docs/terminal/more-features/files-and-links.mdx index 793f24bde..b00713345 100644 --- a/src/content/docs/terminal/more-features/files-and-links.mdx +++ b/src/content/docs/terminal/more-features/files-and-links.mdx @@ -71,6 +71,21 @@ Non-exhaustive list of editors, please submit new ones on our GitHub, see [Sendi <DemoVideo src="/assets/terminal/files-links-demo.mp4" label="Files & Links Demo" /> +### OSC 8 hyperlinks + +Warp recognizes the OSC 8 escape sequence, so command-line tools can print a short label that links to a longer URL instead of printing the raw URL. When a program emits an OSC 8 hyperlink, Warp renders only the visible text and makes it clickable, the same way it treats auto-detected URLs: + +* Hold `⌘` (macOS) or `Ctrl` (Windows/Linux) and click the linked text to open it. +* Copying the block copies the visible text, not the escape sequence or the underlying URL. + +Any URL scheme works, including `file://` URLs without a hostname. To try it, print a hyperlink from your shell: + +```bash +printf '\033]8;;https://docs.warp.dev\033\\Warp docs\033]8;;\033\\\n' +``` + +The output shows `Warp docs` as a clickable link. Plain-text URL detection still works, so tools that print full URLs behave as before. + ## Scripts Warp can open `.command` and Unix Executable files from Finder directly. diff --git a/src/content/docs/terminal/more-features/full-screen-apps.mdx b/src/content/docs/terminal/more-features/full-screen-apps.mdx index bda484e09..75d7881b3 100644 --- a/src/content/docs/terminal/more-features/full-screen-apps.mdx +++ b/src/content/docs/terminal/more-features/full-screen-apps.mdx @@ -24,7 +24,8 @@ If you want a mouse event to go to Warp instead (for example, for text selection * From **Settings** > **Features** > **Terminal** > **Enable Mouse Reporting** * Scroll Reporting can be enabled after toggling **Enable Mouse Reporting** -* From the [Command Palette](/terminal/command-palette/), search for "Toggle Mouse Reporting" +* From the [Command Palette](/terminal/command-palette/), search for "Mouse Reporting" + * The entry is labeled "Enable Mouse Reporting" or "Disable Mouse Reporting" depending on the current setting * From the macOS Menu, **View** > **Toggle Mouse Reporting** ### How it works diff --git a/src/content/docs/terminal/more-features/notifications.mdx b/src/content/docs/terminal/more-features/notifications.mdx index a92a6c666..1c6704777 100644 --- a/src/content/docs/terminal/more-features/notifications.mdx +++ b/src/content/docs/terminal/more-features/notifications.mdx @@ -14,7 +14,7 @@ import VideoEmbed from '@components/VideoEmbed.astro'; Notifications can be sent when a command completes after a configurable number of seconds or when a running command needs you to enter a password to proceed. For either of these triggers, Warp will only send you a desktop notification if you are using a different app at the time the trigger is fired. :::note -For notifications from coding agents (Warp's built-in Agent and third-party CLI agents like Claude Code and OpenCode), see [Agent Notifications](/agent-platform/capabilities/agent-notifications/). +For notifications from coding agents (Warp's built-in Agent and third-party CLI agents like Claude Code and OpenCode), see [Agent Notifications](/agents/capabilities/agent-notifications/). ::: ## Custom notification hooks (OSC 9 / OSC 777) @@ -61,7 +61,7 @@ On macOS, you will want to **Allow** or **Accept** the request so that Warp can * Make sure the **Do Not Disturb** mode is turned off in > **System Settings** > **Notifications** > **Notifications & Focus** > **Focus**. * Go to > **System Settings** > **Notifications & Focus** > **Notifications** and select Warp in the list. Make sure either banner style or alert style notifications are selected, then quit and restart Warp. * To get the macOS notification prompt to show again for Warp, run `defaults delete dev.warp.Warp-Stable Notifications`, then restart Warp and toggle on the **Settings** > **Features** > **Receive desktop notifications from Warp**. - * Once all of the above is done, please restart macOS to apply the changes and that should help with restoring notifications in Warp. + * Once all of the above is done, restart macOS to apply the changes, which should restore notifications in Warp. </TabItem> <TabItem label="Windows"> Warp requires two distinct notification settings to work. Windows system settings found in **Settings** > **System** > **Notifications** > **Warp** and Warp app settings found in **Settings** > **Features** > **Session** must both be enabled for Notifications to show. diff --git a/src/content/docs/terminal/sessions/launch-configurations.mdx b/src/content/docs/terminal/sessions/launch-configurations.mdx index e678f2699..73483a260 100644 --- a/src/content/docs/terminal/sessions/launch-configurations.mdx +++ b/src/content/docs/terminal/sessions/launch-configurations.mdx @@ -27,7 +27,7 @@ You can create Launch Configurations in the app or by adding a YAML file. ### With a YAML File * Launch Configurations files are generated when you create them with the UI and can also be created or modified manually. -* Please see the below for [Launch Configuration YAML file locations, format, and examples](/terminal/sessions/launch-configurations/#launch-configuration-yaml-format). +* See [Launch Configuration YAML file locations, format, and examples](/terminal/sessions/launch-configurations/#launch-configuration-yaml-format). ## Using a Launch Configuration diff --git a/src/content/docs/terminal/settings/all-settings.mdx b/src/content/docs/terminal/settings/all-settings.mdx index 1a1cdc436..b2c825e70 100644 --- a/src/content/docs/terminal/settings/all-settings.mdx +++ b/src/content/docs/terminal/settings/all-settings.mdx @@ -191,8 +191,10 @@ Settings that control terminal behavior, input, and event handling. * `show_terminal_input_message_bar` — Whether the terminal input message bar is shown. Type: boolean. Default: `true`. * `enable_slash_commands_in_terminal` — Whether slash commands are available in the terminal input. Type: boolean. Default: `true`. * `at_context_menu_in_terminal_mode` — Whether the @ context menu is available in terminal mode. Type: boolean. Default: `true`. +* `enable_ai_command_search_hash_trigger` — Whether typing `#` at the start of terminal input opens [Command Search](/terminal/entry/command-search/). When disabled, Command Search is still reachable through its keyboard shortcut. Type: boolean. Default: `true`. * `outline_codebase_symbols_for_at_context_menu` — Whether codebase symbols appear in the @ context menu. Type: boolean. Default: `true`. * `middle_click_paste_enabled` — Whether middle-click pastes from the clipboard. Type: boolean. Default: `true`. +* `right_click_behavior` — What a bare right-click does in the terminal. Type: string. Default: `"context_menu"`. Options: `"context_menu"` (open the context menu), `"paste"` (paste from the clipboard; `Shift`+right-click opens the context menu instead). * `extra_meta_keys` — Controls which additional keys are treated as meta keys. Type: object. Default: `{ left_alt = false, right_alt = false }`. #### Autosuggestions @@ -262,7 +264,7 @@ Settings for Warp's agents, including model behavior, permissions, knowledge, MC * `cloud_conversation_storage_enabled` — Whether conversations are stored in the cloud. Type: boolean. Default: `true`. * `usage_display_mode` — Which unit the terminal agent's usage entry displays. Applies only to the terminal agent's settings file; click the usage entry to flip between units. Type: string. Default: `"credits"`. Options: `"credits"` (the same number the desktop app's usage footer shows), `"cost"` (provider dollar cost). -* `execution_profiles` — The collection of [agent profiles](/agent-platform/capabilities/agent-profiles-permissions/) and their permissions, shared by Agent Mode and the terminal agent. This is a structured object that Warp manages when you create and edit profiles in **Settings** > **Agents** > **Profiles**; edit it through the UI rather than by hand. Type: object. Default: `{}` (Warp's built-in profiles). +* `execution_profiles` — The collection of [agent profiles](/agents/capabilities/agent-profiles-permissions/) and their permissions, shared by Agent Mode and the terminal agent. This is a structured object that Warp manages when you create and edit profiles in **Settings** > **Agents** > **Profiles**; edit it through the UI rather than by hand. Type: object. Default: `{}` (Warp's built-in profiles). ### Knowledge @@ -330,9 +332,10 @@ Settings for Warp's agents, including model behavior, permissions, knowledge, MC * `cloud_agent_computer_use_enabled` — Whether computer use is enabled for cloud agent conversations. Type: boolean. Default: `false`. * `agent_attribution_enabled` — Whether the Warp Agent adds an attribution co-author line to commit messages and pull requests it creates. Type: boolean. Default: `true`. * `auto_handoff_on_sleep_enabled` — Whether Warp automatically hands off local agent conversations to the cloud when your computer is about to sleep (macOS). See [local-to-cloud handoff](/platform/handoff/local-to-cloud/). Type: boolean. Default: `false`. -* `default_prompt_submission_mode` — Default behavior when submitting a new prompt while the agent is still responding. See [Prompt Queueing](/agent-platform/local-agents/interacting-with-agents/prompt-queueing/). Type: string. Default: `"interrupt"`. Options: `"interrupt"`, `"queue"`. -* `long_running_command_submission_mode` — What happens when you submit a prompt while the agent is running an agent-requested long-running command. Only applies when `default_prompt_submission_mode` is `"interrupt"`. See [Prompt Queueing](/agent-platform/local-agents/interacting-with-agents/prompt-queueing/). Type: string. Default: `"queue_until_command_completes"`. Options: `"send_immediately"`, `"queue_until_command_completes"`. +* `default_prompt_submission_mode` — Default behavior when submitting a new prompt while the agent is still responding. See [Prompt Queueing](/agents/local-agents/interacting-with-agents/prompt-queueing/). Type: string. Default: `"interrupt"`. Options: `"interrupt"`, `"queue"`. +* `long_running_command_submission_mode` — What happens when you submit a prompt while the agent is running an agent-requested long-running command. Only applies when `default_prompt_submission_mode` is `"interrupt"`. See [Prompt Queueing](/agents/local-agents/interacting-with-agents/prompt-queueing/). Type: string. Default: `"queue_until_command_completes"`. Options: `"send_immediately"`, `"queue_until_command_completes"`. * `orchestration_message_display_mode` — How child-agent message bodies are displayed during [multi-agent runs](/platform/orchestration/multi-agent-runs/). Type: string. Default: `"always_collapse"`. Options: `"show_and_collapse"`, `"always_show"`, `"always_collapse"`. +* `auto_approve_bypasses_command_denylist` — Whether auto-approve and fast forward run commands that match your [command denylist](/agents/capabilities/agent-profiles-permissions/#command-denylist) without asking for confirmation. Denylist rules enforced by your organization through the [Admin Panel](/enterprise/team-management/admin-panel/) are never bypassed. Type: boolean. Default: `true`. * `should_force_disable_cloud_handoff` — Whether to force-disable [local-to-cloud handoff](/platform/handoff/local-to-cloud/). Type: boolean. Default: `false`. * `should_force_disable_ampersand_handoff` — Whether to force-disable the `&` prefix that composes a prompt for cloud handoff. Type: boolean. Default: `false`. diff --git a/src/content/docs/terminal/warpify/ssh.mdx b/src/content/docs/terminal/warpify/ssh.mdx index ae674c883..845908052 100644 --- a/src/content/docs/terminal/warpify/ssh.mdx +++ b/src/content/docs/terminal/warpify/ssh.mdx @@ -30,10 +30,10 @@ Once the SSH extension is installed on a remote host, the following features wor * **File tree (Project Explorer)** - The left panel reflects the remote project's structure and updates as you `cd` between directories or change files. See [File Tree](/code/code-editor/file-tree/). * **Code editor on remote files** - Open remote files in Warp's [code editor](/code/code-editor/) from the file tree or the Command Palette, edit them, and save back to the remote host. Warp keeps the buffer in sync with the remote file and surfaces a conflict resolution prompt if the file changes on disk while you have unsaved edits. * **Code review and git operations** - The [code review panel](/code/code-review/) works on remote repositories, including reviewing diffs, discarding files, committing, pushing, and creating PRs. AI-generated commit messages and PR descriptions are produced on the remote host, so large diffs never leave the machine. -* **Codebase indexing** - Warp indexes the remote repository so Agents can semantically search the remote codebase, just like [Codebase Context](/agent-platform/capabilities/codebase-context/) locally. +* **Codebase indexing** - Warp indexes the remote repository so Agents can semantically search the remote codebase, just like [Codebase Context](/agents/capabilities/codebase-context/) locally. * **File search** - Search for remote files by name from the [Command Palette](/terminal/command-palette/). * **Project rules and skills** - Agents discover and use the remote project's rules (`WARP.md`) and skills, the same as in a local repo. -* **Native file reads and code diffs** - The Agent reads files and applies edits through Warp's built-in diff tool. Code changes show up as inline diffs you can review and approve, instead of being applied via `sed` or other shell commands. See [Code diffs](/agent-platform/local-agents/code-diffs/). +* **Native file reads and code diffs** - The Agent reads files and applies edits through Warp's built-in diff tool. Code changes show up as inline diffs you can review and approve, instead of being applied via `sed` or other shell commands. See [Code diffs](/agents/local-agents/code-diffs/). * **Reliable completions and autosuggestions** - Generators run in parallel over a single multiplexed connection instead of opening a new SSH session per command, so completions stop hitting the remote host's `MaxSessions` ceiling and stop occasionally injecting errors into your blocks. * **All core terminal features** - The input editor, blocks, command history, autosuggestions, and history search behave the same as in a local session. @@ -110,7 +110,7 @@ Warp supports macOS and most flavors of Linux as remote hosts. Supported shells ### What if Warp fails to detect my SSH session? -If you're in a remote SSH session and Warp didn't detect it, you can manually Warpify by opening the [Command Palette](/terminal/command-palette/) and searching for "Warpify SSH Session". +If you're in a remote SSH session and Warp didn't detect it, first check that **Settings** > **Warpify** > **Warpify SSH Sessions** is enabled. If it's already on, Warp likely skipped detection for that particular command. See [What triggers SSH session detection for Warpification?](#what-triggers-ssh-session-detection-for-warpification) for the cases Warp doesn't detect. ### What triggers SSH session detection for Warpification? @@ -118,4 +118,4 @@ With SSH session detection enabled, Warp watches for `ssh` commands whose argume Once Warp is confident you've successfully authenticated (by detecting `Last login:` or something resembling a basic prompt), it prompts you to Warpify the active SSH session. -If SSH session detection doesn't pick up your session, you can still [Warpify manually](#what-if-warp-fails-to-detect-my-ssh-session). +If SSH session detection doesn't pick up your session, see [What if Warp fails to detect my SSH session?](#what-if-warp-fails-to-detect-my-ssh-session). diff --git a/src/content/docs/terminal/windows/configurable-toolbar.mdx b/src/content/docs/terminal/windows/configurable-toolbar.mdx index 8ce9e7141..f7a00c55c 100644 --- a/src/content/docs/terminal/windows/configurable-toolbar.mdx +++ b/src/content/docs/terminal/windows/configurable-toolbar.mdx @@ -28,7 +28,7 @@ The following header buttons can be rearranged or hidden: * **Tools panel** - Toggles the panel that contains the project explorer, global search, [Warp Drive](/knowledge-and-collaboration/warp-drive/), and conversation history. * **Agent management** - Toggles the agent management view for [cloud agents](/platform/managing-cloud-agents/). * **Code review** - Toggles the [Code Review](/code/code-review/) panel. -* **Notifications mailbox** - Toggles the [agent notifications](/agent-platform/capabilities/agent-notifications/) mailbox. +* **Notifications mailbox** - Toggles the [agent notifications](/agents/capabilities/agent-notifications/) mailbox. The search bar and profile avatar are fixed and can't be repositioned. @@ -70,6 +70,6 @@ When multiple panels are open on the same side, they render in the order their b * [Vertical tabs](/terminal/windows/vertical-tabs/) - The sidebar toggled by the tabs panel button. * [Code Review panel](/code/code-review/) - The panel toggled by the code review button. -* [Agent notifications](/agent-platform/capabilities/agent-notifications/) - The mailbox toggled by the notifications button. +* [Agent notifications](/agents/capabilities/agent-notifications/) - The mailbox toggled by the notifications button. * [Managing cloud agents](/platform/managing-cloud-agents/) - The view toggled by the agent management button. * [Warp Drive](/knowledge-and-collaboration/warp-drive/) - One of the views available in the tools panel. diff --git a/src/content/docs/terminal/windows/tab-configs.mdx b/src/content/docs/terminal/windows/tab-configs.mdx index 297110694..88a974de7 100644 --- a/src/content/docs/terminal/windows/tab-configs.mdx +++ b/src/content/docs/terminal/windows/tab-configs.mdx @@ -254,5 +254,5 @@ You can also create a worktree-based Tab Config directly from the `+` menu by cl * [Tabs](/terminal/windows/tabs/) — tab management, keyboard shortcuts, and behavior settings * [Themes](/terminal/appearance/themes/) — customize the colors used by tab color settings * [Working Directory](/terminal/more-features/working-directory/) — how Warp resolves working directories -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) — use the `"agent"` pane type to open tabs in Agent Mode +* [Third-party CLI agents](/agents/cli-agents/overview/) — use the `"agent"` pane type to open tabs in Agent Mode * [Warp URI Scheme](/terminal/more-features/uri-scheme/) — open Tab Configs via `warp://tab_config/<name>` deeplinks diff --git a/src/content/docs/terminal/windows/tabs.mdx b/src/content/docs/terminal/windows/tabs.mdx index 5492be683..be8468376 100644 --- a/src/content/docs/terminal/windows/tabs.mdx +++ b/src/content/docs/terminal/windows/tabs.mdx @@ -24,7 +24,7 @@ New Tabs will default to the active Tabs’ current [Working Directory](/termina * Activate the first through eighth Tabs with `CMD-1` thru `CMD-8`. * Switch to the last Tab with `CMD-9`. * Double-click a Tab to rename it. - * Right-clicking on a Tab reveals more options you can explore within the [Command Palette](/terminal/command-palette/) or [Keyboard Shortcuts](/getting-started/keyboard-shortcuts/#fundamentals). + * Right-clicking on a Tab reveals more options you can explore within the [Command Palette](/terminal/command-palette/) or [Keyboard Shortcuts](/getting-started/keyboard-shortcuts/#all-available-shortcuts). </TabItem> <TabItem label="Windows"> * Right-click on the new Tab button `+` to make a new tab, restore closed tab, or run a saved [Launch Configuration](/terminal/sessions/launch-configurations/). @@ -36,7 +36,7 @@ New Tabs will default to the active Tabs’ current [Working Directory](/termina * Activate the first through eighth Tabs with `CTRL-1` thru `CTRL-8`. * Switch to the last Tab with `CTRL-9`. * Double-click a Tab to rename it. - * Right-clicking on a Tab reveals more options you can explore within the [Command Palette](/terminal/command-palette/) or [Keyboard Shortcuts](/getting-started/keyboard-shortcuts/#fundamentals). + * Right-clicking on a Tab reveals more options you can explore within the [Command Palette](/terminal/command-palette/) or [Keyboard Shortcuts](/getting-started/keyboard-shortcuts/#all-available-shortcuts). </TabItem> <TabItem label="Linux"> * Right-click on the new Tab button `+` to make a new tab, restore closed tab, or run a saved [Launch Configuration](/terminal/sessions/launch-configurations/). @@ -48,7 +48,7 @@ New Tabs will default to the active Tabs’ current [Working Directory](/termina * Activate the first through eighth Tabs with `CTRL-1` thru `CTRL-8`. * Switch to the last Tab with `CTRL-9`. * Double-click a Tab to rename it. - * Right-clicking on a Tab reveals more options you can explore within the [Command Palette](/terminal/command-palette/) or [Keyboard Shortcuts](/getting-started/keyboard-shortcuts/#fundamentals). + * Right-clicking on a Tab reveals more options you can explore within the [Command Palette](/terminal/command-palette/) or [Keyboard Shortcuts](/getting-started/keyboard-shortcuts/#all-available-shortcuts). </TabItem> </Tabs> @@ -82,7 +82,7 @@ Tab Restoration enables you to reopen recently closed tabs for up to 60 seconds. ### Tabs behavior -Please see our [Appearance > Tabs Behavior](/terminal/appearance/tabs-behavior/) docs for more Tab related settings. +See our [Appearance > Tabs Behavior](/terminal/appearance/tabs-behavior/) docs for more tab-related settings. ### How Tabs work diff --git a/src/content/docs/terminal/windows/vertical-tabs.mdx b/src/content/docs/terminal/windows/vertical-tabs.mdx index 6e29816c9..a62c3cd81 100644 --- a/src/content/docs/terminal/windows/vertical-tabs.mdx +++ b/src/content/docs/terminal/windows/vertical-tabs.mdx @@ -20,7 +20,7 @@ Vertical tabs are especially useful when running multiple coding agents side by ### Rich metadata and status * **Pane metadata** - See working directory, Git branch, agent conversation status, diff stats, and PR badges at a glance for every pane. -* **Agent status badges** - Pane icons display a colored badge overlay showing agent state (in progress, done, errored, cancelled, or blocked). [Third-party CLI agents](/agent-platform/cli-agents/overview/) like Claude Code, Codex, and Gemini CLI display their brand icon and color alongside badges. +* **Agent status badges** - Pane icons display a colored badge overlay showing agent state (in progress, done, errored, cancelled, or blocked). [Third-party CLI agents](/agents/cli-agents/overview/) like Claude Code, Codex, and Gemini CLI display their brand icon and color alongside badges. * **Notification indicators** - An accent-colored dot appears on pane rows with unread agent activity, so you can spot sessions that need attention without switching tabs. ### Display modes and customization @@ -182,4 +182,4 @@ All existing tab keyboard shortcuts continue to work with vertical tabs. The sid * [Tab Configs](/terminal/windows/tab-configs/) - Define reusable tab setups in TOML files * [Git Worktrees](/code/git-worktrees/) - Worktree support that surfaces in vertical tab metadata * [Tabs behavior](/terminal/appearance/tabs-behavior/) - Tab bar visibility, indicators, and close button settings -* [Third-party CLI agents](/agent-platform/cli-agents/overview/) - Use Claude Code, Codex, Gemini CLI, and other third-party agents with Warp's utility bar, including brand icons and status badges in the vertical tabs panel +* [Third-party CLI agents](/agents/cli-agents/overview/) - Use Claude Code, Codex, Gemini CLI, and other third-party agents with Warp's utility bar, including brand icons and status badges in the vertical tabs panel diff --git a/src/data/vars.ts b/src/data/vars.ts index a9447ff45..eea706942 100644 --- a/src/data/vars.ts +++ b/src/data/vars.ts @@ -7,13 +7,60 @@ // Use the future/conceptual name as the key; the value holds the current string. export const VARS = { - // Platform — keys named for upcoming Warp branding; values are current Oz names - WARP_AUTOMATION_PLATFORM: "Oz", // value → "Warp Automation Platform" at rename - WARP_AGENT_CLI: "Oz CLI", // value → "Warp Agent CLI" at rename - WEB_APP: "Oz web app", // future name TBD - WEB_APP_URL: "https://oz.warp.dev", // value → "https://app.warp.dev" at rename - DASHBOARD: "Oz dashboard", // future name TBD - PLATFORM_RUN: "Oz run", // future name TBD + // Platform — renamed 8/18. The remaining Oz-valued keys below are the + // deliberate 9/15 holdouts: the `oz` binary and the Oz v1 webapp keep their + // names until that date, so they are NOT stale, they are pending. + // + // IMPORTANT: "Automation Platform" is a common-noun phrase, not a proper + // noun like "Oz" was. Referential uses need a definite article in the prose + // ("with the {VARS.WARP_AUTOMATION_PLATFORM}", "The {VARS.…} provides"); + // 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 9/15, then "Warp Agent CLI" + WEB_APP: "Oz web app", // legacy Oz v1 webapp (oz.warp.dev) — holds until 9/15 + WEB_APP_URL: "https://oz.warp.dev", // holds until 9/15, then "https://app.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 + // product, a "factory" is an instance, and a bare capitalized "Factory" is + // never a proper noun (AGENTS.md -> Warp Factories terminology). + // + // "Runs page" was the other candidate and reads better in isolation, but it + // names a single page in the web app. This surface is defined as unified + // across the Warp app and web, and its Warp-app half is the Agent Management + // Panel, not a Runs page. The descriptive term keeps that meaning. + // + // Lowercase common noun, so capitalize only at the start of a sentence or + // bullet -- which the variable cannot do, so avoid putting it there. + DASHBOARD: "cloud agent dashboard", + // Renamed per HYC (8/17): the platform-level default is the plain + // descriptive phrase, not a branded one. Factory-specific pages should write + // "factory run" directly rather than reaching for this variable. + // + // 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 9/15, then "Warp API & SDK" + + // 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. + // Not rename-sensitive: this is a new reference, not a flip of existing + // Oz-branded text, so it isn't in style_lint.py's RENAME_SENSITIVE_VAR_STRINGS. + 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: at the + // next launch (approximately 2026-08-18) 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_CLI: "Warp Agent CLI", // Feature names (stable — keys and values expected to remain unchanged) AGENT_MODE: "Agent Mode", diff --git a/src/pages/api.astro b/src/pages/api.astro index 67f42c689..79c45a4d9 100644 --- a/src/pages/api.astro +++ b/src/pages/api.astro @@ -13,6 +13,7 @@ import fs from 'node:fs'; import { parse } from 'yaml'; import WarpTopbar from '../components/WarpTopbar.astro'; +import DocsFeedbackLinks from '../components/DocsFeedbackLinks.astro'; const yamlContent = fs.readFileSync('developers/agent-api-openapi.yaml', 'utf-8'); const specObject = parse(yamlContent); const specJson = JSON.stringify(specObject); @@ -198,7 +199,7 @@ const specBaseUrl = (specObject.servers as Array<{ url?: string }> | undefined)? <WarpTopbar crumb="API Reference" /> <!-- llms.txt directive: machine-readable signal for agents and AI tools. --> <span class="api-visually-hidden" aria-hidden="true">For the complete documentation in markdown, see <a href="/llms.txt" tabindex="-1">llms.txt</a>.</span> - <h1 class="api-visually-hidden">Warp & Oz HTTP API reference</h1> + <h1 class="api-visually-hidden">Warp Automation Platform HTTP API reference</h1> <!-- Server-rendered API index for crawlers and agents that don't execute JS. Scalar (below) provides the interactive experience for browser users. @@ -391,5 +392,64 @@ const specBaseUrl = (specObject.servers as Array<{ url?: string }> | undefined)? })(); </script> <script is:inline src="https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.57.1" crossorigin="anonymous"></script> + <div class="api-feedback-links"> + <DocsFeedbackLinks + editUrl="https://github.com/warpdotdev/docs/edit/main/developers/agent-api-openapi.yaml" + pageUrl="https://docs.warp.dev/api/" + /> + </div> + <style is:inline> + /* `.warp-topbar*` rules ship with `<WarpTopbar />` itself; only the + /api-specific feedback CTA styling lives here. + + Anchored to the bottom-RIGHT so the CTA sits where users naturally + look for inline page actions (matches the removed PushFeedback + widget's placement). Scalar's Shell client picker / dark-mode + toggle live inside the operations column rather than fixed to the + viewport, so the two don't actually collide at this z-index. + + `.docs-feedback-links` comes from `<DocsFeedbackLinks />`; its own + scoped styles use Starlight's `--sl-*` tokens, which aren't defined + on this standalone Scalar page, so we override color/size here with + a higher-specificity descendant selector and Scalar's `--scalar-*` + tokens instead. */ + .api-feedback-links { + position: fixed; + bottom: 1.25rem; + right: 1.25rem; + max-width: min(20rem, calc(100vw - 2.5rem)); + padding: 0.5625rem 0.875rem; + border-radius: 0.625rem; + background: var(--scalar-background-2); + border: 1px solid var(--scalar-border-color); + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18), 0 1px 2px rgba(0, 0, 0, 0.12); + z-index: 1000; + } + .light-mode .api-feedback-links { + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04); + } + .api-feedback-links .docs-feedback-links { + color: var(--scalar-color-2); + font-size: 0.8125rem; + font-family: var(--scalar-font, 'Inter', sans-serif); + line-height: 1.4; + } + .api-feedback-links .docs-feedback-links a { + color: var(--scalar-color-accent); + } + .api-feedback-links .docs-feedback-links a:hover { + color: var(--scalar-color-1); + } + @media (max-width: 640px) { + .api-feedback-links { + bottom: 1rem; + right: 1rem; + padding: 0.5rem 0.75rem; + } + .api-feedback-links .docs-feedback-links { + font-size: 0.75rem; + } + } + </style> </body> </html> diff --git a/src/pages/api/support-handoff.ts b/src/pages/api/support-handoff.ts new file mode 100644 index 000000000..89ecba92a --- /dev/null +++ b/src/pages/api/support-handoff.ts @@ -0,0 +1,231 @@ +import type { APIRoute } from 'astro'; +import { SUPPORT_HANDOFF_ENDPOINT_URL, SUPPORT_HANDOFF_SHARED_SECRET } from 'astro:env/server'; + +export const prerender = false; + +type HandoffPayload = { + user_email?: unknown; + question?: unknown; + page_url?: unknown; + conversation_transcript?: unknown; + kapa_project_id?: unknown; + kapa_thread_id?: unknown; + kapa_conversation_url?: unknown; + captcha_token?: unknown; + captcha_header?: unknown; +}; + +const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; +const KAPA_ID_PATTERN = /^[a-zA-Z0-9_-]{1,128}$/; +const MAX_QUESTION_LENGTH = 4_000; +const MAX_TRANSCRIPT_LENGTH = 50_000; +const MAX_PAGE_URL_LENGTH = 2_048; +const MAX_CAPTCHA_TOKEN_LENGTH = 4_096; +const ALLOWED_PAGE_URL_HOSTS = new Set(['docs.warp.dev', 'localhost']); +const DOCS_PREVIEW_HOSTNAME_PATTERN = /^docs-[a-z0-9]+(?:-[a-z0-9]+)*-warpdotdev\.vercel\.app$/; +const ALLOWED_CAPTCHA_HEADERS = new Set(['X-RECAPTCHA-ENTERPRISE-TOKEN', 'X-HCAPTCHA-TOKEN']); +const RATE_LIMIT_WINDOW_MS = 10 * 60 * 1000; +const RATE_LIMIT_MAX_REQUESTS = 5; +const rateLimitStore = new Map<string, { count: number; resetAt: number }>(); + +function asTrimmedString(value: unknown) { + return typeof value === 'string' ? value.trim() : ''; +} + +function jsonError(message: string, status = 400) { + return new Response(JSON.stringify({ message }), { + status, + headers: { 'content-type': 'application/json' }, + }); +} + +function buildKapaConversationUrl(kapaProjectId: string, kapaThreadId: string) { + return `https://app.kapa.ai/${kapaProjectId}/conversations/${kapaThreadId}`; +} + +function isAllowedPageUrl(url: string) { + if (url.length > MAX_PAGE_URL_LENGTH) return false; + try { + const parsed = new URL(url); + if (!['http:', 'https:'].includes(parsed.protocol)) return false; + return isAllowedHostname(parsed.hostname); + } catch { + return false; + } +} + +function isAllowedHostname(hostname: string) { + const lowercasedHostname = hostname.toLowerCase(); + if (ALLOWED_PAGE_URL_HOSTS.has(lowercasedHostname)) return true; + return DOCS_PREVIEW_HOSTNAME_PATTERN.test(lowercasedHostname); +} + +function isAllowedRequestOrigin(request: Request) { + const originHeader = request.headers.get('origin'); + if (!originHeader) return false; + try { + const parsedOrigin = new URL(originHeader); + if (!['http:', 'https:'].includes(parsedOrigin.protocol)) return false; + return isAllowedHostname(parsedOrigin.hostname); + } catch { + return false; + } +} + +function getClientIp(request: Request) { + // Vercel overwrites `x-forwarded-for` and strips external values to prevent + // spoofing: https://vercel.com/docs/headers/request-headers#x-forwarded-for + const forwardedFor = request.headers.get('x-forwarded-for'); + if (forwardedFor) { + const firstIp = forwardedFor.split(',')[0]?.trim(); + if (firstIp) return firstIp; + } + const connectingIp = request.headers.get('cf-connecting-ip')?.trim(); + if (connectingIp) return connectingIp; + const realIp = request.headers.get('x-real-ip')?.trim(); + if (realIp) return realIp; + return 'unknown'; +} + +function isRateLimited(clientIp: string) { + const now = Date.now(); + const existing = rateLimitStore.get(clientIp); + if (!existing || existing.resetAt <= now) { + rateLimitStore.set(clientIp, { count: 1, resetAt: now + RATE_LIMIT_WINDOW_MS }); + return false; + } + existing.count += 1; + if (existing.count > RATE_LIMIT_MAX_REQUESTS) { + return true; + } + rateLimitStore.set(clientIp, existing); + return false; +} + +export const POST: APIRoute = async ({ request }) => { + const supportHandoffEndpointUrl = SUPPORT_HANDOFF_ENDPOINT_URL?.trim() || ''; + const supportHandoffSharedSecret = SUPPORT_HANDOFF_SHARED_SECRET?.trim() || ''; + if (!supportHandoffEndpointUrl || !supportHandoffSharedSecret) { + return jsonError('Support handoff is not configured.', 503); + } + if (!isAllowedRequestOrigin(request)) { + return jsonError('Request origin is not allowed.', 403); + } + const clientIp = getClientIp(request); + if (isRateLimited(clientIp)) { + return jsonError('Too many support handoff attempts. Please try again later.', 429); + } + + let payload: HandoffPayload; + try { + payload = (await request.json()) as HandoffPayload; + } catch { + return jsonError('Invalid JSON payload.'); + } + + const userEmail = asTrimmedString(payload.user_email).toLowerCase(); + if (!EMAIL_PATTERN.test(userEmail)) { + return jsonError('Please enter a valid email address.'); + } + + const question = asTrimmedString(payload.question); + const pageUrl = asTrimmedString(payload.page_url); + const conversationTranscript = asTrimmedString(payload.conversation_transcript); + const kapaProjectId = asTrimmedString(payload.kapa_project_id); + const kapaThreadId = asTrimmedString(payload.kapa_thread_id); + const suppliedKapaConversationUrl = asTrimmedString(payload.kapa_conversation_url); + const captchaToken = asTrimmedString(payload.captcha_token); + const captchaHeader = asTrimmedString(payload.captcha_header); + + if (!question) return jsonError('A question is required.'); + if (question.length > MAX_QUESTION_LENGTH) return jsonError('Question is too long.'); + if (!pageUrl) return jsonError('The current page URL is required.'); + if (!isAllowedPageUrl(pageUrl)) return jsonError('Page URL is invalid or not allowed.'); + if (!conversationTranscript) return jsonError('Conversation transcript is required.'); + if (conversationTranscript.length > MAX_TRANSCRIPT_LENGTH) { + return jsonError('Conversation transcript is too long.'); + } + if (!kapaThreadId) return jsonError('Kapa thread ID is required.'); + if (!KAPA_ID_PATTERN.test(kapaThreadId)) return jsonError('Kapa thread ID is invalid.'); + if (!captchaToken) return jsonError('Captcha verification is required.'); + if (captchaToken.length > MAX_CAPTCHA_TOKEN_LENGTH) return jsonError('Captcha token is invalid.'); + if (!ALLOWED_CAPTCHA_HEADERS.has(captchaHeader)) return jsonError('Captcha token header is invalid.'); + if (kapaProjectId && !KAPA_ID_PATTERN.test(kapaProjectId)) { + return jsonError('Kapa project ID is invalid.'); + } + const derivedKapaConversationUrl = + kapaProjectId && kapaThreadId + ? buildKapaConversationUrl(kapaProjectId, kapaThreadId) + : ''; + if (kapaProjectId) { + if ( + suppliedKapaConversationUrl && + suppliedKapaConversationUrl !== derivedKapaConversationUrl + ) { + return jsonError('Kapa conversation URL does not match project/thread values.'); + } + } else if (suppliedKapaConversationUrl) { + return jsonError('Kapa project ID is required when a Kapa conversation URL is supplied.'); + } + + const forwardPayload = { + user_email: userEmail, + question, + page_url: pageUrl, + conversation_transcript: conversationTranscript, + kapa_project_id: kapaProjectId || null, + kapa_thread_id: kapaThreadId, + kapa_conversation_url: derivedKapaConversationUrl || null, + source: 'docs-kapa-custom-chat', + }; + + // DevX `gcp_front_docs_handoff` validates the shared secret the same way + // Front webhooks do: as a `?secret=` query param (see + // helper_flask.validate_front_webhook_secret). Bearer alone is ignored. + const upstreamUrl = new URL(supportHandoffEndpointUrl); + upstreamUrl.searchParams.set('secret', supportHandoffSharedSecret); + + const forwardHeaders: HeadersInit = { + 'content-type': 'application/json', + [captchaHeader]: captchaToken, + }; + + let upstreamResponse: Response; + try { + upstreamResponse = await fetch(upstreamUrl.toString(), { + method: 'POST', + headers: forwardHeaders, + body: JSON.stringify(forwardPayload), + }); + } catch { + return jsonError('Failed to reach support handoff service.', 502); + } + + let upstreamData: unknown = null; + try { + upstreamData = await upstreamResponse.json(); + } catch { + upstreamData = null; + } + + if (!upstreamResponse.ok) { + const upstreamMessage = + upstreamData && + typeof upstreamData === 'object' && + 'message' in upstreamData && + typeof upstreamData.message === 'string' + ? upstreamData.message + : 'Support handoff failed.'; + return jsonError(upstreamMessage, upstreamResponse.status); + } + + return new Response( + JSON.stringify({ + message: 'Message sent to Warp Support.', + }), + { + status: 200, + headers: { 'content-type': 'application/json' }, + } + ); +}; diff --git a/src/plugins/vars-transform.ts b/src/plugins/vars-transform.ts index 19401b023..b2114c87f 100644 --- a/src/plugins/vars-transform.ts +++ b/src/plugins/vars-transform.ts @@ -1,6 +1,27 @@ import type { Plugin } from 'vite'; import { VARS } from '../data/vars.js'; +/** + * Replaces every `{{TOKEN}}` placeholder in `text` with its value from + * `src/data/vars.ts`. Throws when a `{{...}}`-shaped token remains + * unresolved afterward, naming the offending token(s) and `context` + * (typically a file path) so a typo'd key fails the build loudly instead + * of shipping literally. + */ +export function substituteVars(text: string, context: string): string { + let result = text; + for (const [key, value] of Object.entries(VARS)) { + result = result.replaceAll(`{{${key}}}`, value as string); + } + + const unresolved = result.match(/\{\{[A-Z_]+\}\}/g); + if (unresolved) { + throw new Error(`Unresolved variable token(s) in ${context}: ${unresolved.join(', ')}`); + } + + return result; +} + /** * Vite transform plugin that replaces `{{TOKEN}}` placeholders in .mdx * frontmatter with values from src/data/vars.ts before any parser sees @@ -16,6 +37,15 @@ import { VARS } from '../data/vars.js'; * import { VARS } from '@data/vars'; * ...{VARS.WARP_AGENT_CLI}... * + * NOTE: Starlight's `docs` collection loads frontmatter through Astro's + * content-layer `glob()` loader, which parses each file directly and never + * passes it through this Vite `transform` hook. That means this plugin + * alone does NOT substitute `{{TOKEN}}` in `docs` collection frontmatter + * (title/description/sidebar.label) — see the schema-level transform in + * `src/content.config.ts`, which is what actually resolves those fields. + * This plugin still covers any other `.mdx` frontmatter Vite transforms + * directly (outside the content-layer loader). + * * If any `{{...}}` tokens remain unresolved in the frontmatter after * substitution, the build fails with the file path and token name. */ @@ -32,22 +62,10 @@ export function varsTransformPlugin(): Plugin { const match = code.match(frontmatterRegex); if (!match) return null; // No frontmatter — nothing to substitute. - let frontmatter = match[1]; - const body = match[2]; - - for (const [key, value] of Object.entries(VARS)) { - frontmatter = frontmatter.replaceAll(`{{${key}}}`, value as string); - } - - // Fail the build if any {{TOKEN}} patterns remain unresolved in frontmatter. - const unresolved = frontmatter.match(/\{\{[A-Z_]+\}\}/g); - if (unresolved) { - throw new Error( - `[warp-vars-transform] Unresolved variable token(s) in frontmatter of ${id}: ${unresolved.join(', ')}` - ); - } + const frontmatter = substituteVars(match[1], `frontmatter of ${id}`); + const body = match[2]; - return frontmatter + body; + return frontmatter + body; }, }; } diff --git a/src/sidebar.ts b/src/sidebar.ts index 565d4e161..d029c5fbe 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -1,4 +1,5 @@ import type { StarlightSidebarTopicsUserConfig } from 'starlight-sidebar-topics'; +import { VARS } from './data/vars'; /** * Top-level sidebar topics, one per "tab" the docs site exposes. @@ -25,7 +26,12 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { label: 'Getting started', items: [ - { label: 'Getting started with Warp and Oz', link: '/' }, + // 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: '/' }, { slug: 'quickstart', label: 'Warp quickstart' }, 'getting-started/quickstart/installation-and-setup', 'getting-started/quickstart/coding-in-warp', @@ -236,234 +242,421 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ }, { label: 'Agents', - link: '/agent-platform/', + link: '/agents/', icon: 'puzzle', items: [ { - label: 'Getting started', + label: 'Agents', items: [ - { slug: 'agent-platform', label: 'Agents overview' }, - 'agent-platform/getting-started/agents-in-warp', - 'agent-platform/getting-started/faqs', + { slug: 'agents', label: 'Overview' }, + 'agents/getting-started/faqs', ], }, { label: 'Warp Agents', items: [ - { slug: 'agent-platform/local-agents/overview', label: 'Warp Agents overview' }, { label: 'Capabilities', collapsed: true, items: [ - { slug: 'agent-platform/capabilities', label: 'Overview' }, - { slug: 'agent-platform/capabilities/slash-commands', label: 'Slash commands' }, - 'agent-platform/capabilities/skills', - 'agent-platform/capabilities/planning', - { slug: 'agent-platform/capabilities/task-lists', label: 'Task lists' }, - 'agent-platform/capabilities/rules', - { slug: 'agent-platform/capabilities/agent-notifications', label: 'Agent notifications' }, - { slug: 'agent-platform/capabilities/full-terminal-use', label: 'Full terminal use' }, - { slug: 'agent-platform/capabilities/computer-use', label: 'Computer use' }, - { slug: 'agent-platform/capabilities/computer-use-testing-and-recordings', label: 'Testing and recordings' }, - 'agent-platform/capabilities/codebase-context', - { slug: 'agent-platform/capabilities/agent-profiles-permissions', label: 'Profiles & permissions' }, - { slug: 'agent-platform/capabilities/web-search', label: 'Web search' }, - { slug: 'agent-platform/local-agents/session-sharing', label: 'Session sharing' }, - 'agent-platform/local-agents/cloud-conversations', + { slug: 'agents/capabilities', label: 'Overview' }, + { slug: 'agents/capabilities/slash-commands', label: 'Slash commands' }, + 'agents/capabilities/skills', + 'agents/capabilities/planning', + { slug: 'agents/capabilities/task-lists', label: 'Task lists' }, + 'agents/capabilities/rules', + { slug: 'agents/capabilities/agent-notifications', label: 'Agent notifications' }, + { slug: 'agents/capabilities/full-terminal-use', label: 'Full terminal use' }, + { + label: 'Computer Use', + collapsed: true, + items: [ + { slug: 'agents/capabilities/computer-use', label: 'Overview' }, + { slug: 'agents/capabilities/computer-use/browser-use', label: 'Browser use' }, + { slug: 'agents/capabilities/computer-use/testing-and-recordings', label: 'Testing and recordings' }, + { slug: 'agents/capabilities/computer-use/artifacts-in-prs', label: 'Screenshots and videos in PRs' }, + ], + }, + 'agents/capabilities/codebase-context', + { slug: 'agents/capabilities/agent-profiles-permissions', label: 'Profiles & permissions' }, + { slug: 'agents/capabilities/web-search', label: 'Web search' }, + { slug: 'agents/local-agents/session-sharing', label: 'Session sharing' }, + 'agents/local-agents/cloud-conversations', ], }, { label: 'Interacting with agents', collapsed: true, items: [ - { slug: 'agent-platform/local-agents/interacting-with-agents', label: 'Overview' }, - 'agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes', - { slug: 'agent-platform/local-agents/interacting-with-agents/prompt-queueing', label: 'Prompt queueing' }, - { slug: 'agent-platform/local-agents/interacting-with-agents/agent-questions', label: 'Agent questions' }, - { slug: 'agent-platform/local-agents/interacting-with-agents/conversation-forking', label: 'Conversation forking' }, - { slug: 'agent-platform/local-agents/code-diffs', label: 'Code diffs' }, - 'agent-platform/local-agents/interacting-with-agents/voice', + { 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/conversation-forking', label: 'Conversation forking' }, + { slug: 'agents/local-agents/code-diffs', label: 'Code diffs' }, + 'agents/local-agents/interacting-with-agents/voice', ], }, { label: 'Agent context', collapsed: true, items: [ - { slug: 'agent-platform/local-agents/agent-context', label: 'Overview' }, - { slug: 'agent-platform/local-agents/agent-context/blocks-as-context', label: 'Blocks as context' }, - { slug: 'agent-platform/local-agents/agent-context/images-as-context', label: 'Images as context' }, - { slug: 'agent-platform/local-agents/agent-context/urls-as-context', label: 'URLs as context' }, - { slug: 'agent-platform/local-agents/agent-context/selection-as-context', label: 'Selection as context' }, - { slug: 'agent-platform/local-agents/agent-context/using-to-add-context', label: 'Using @ to add context' }, - 'agent-platform/capabilities/mcp', + { slug: 'agents/local-agents/agent-context', label: 'Overview' }, + { slug: 'agents/local-agents/agent-context/blocks-as-context', label: 'Blocks as context' }, + { slug: 'agents/local-agents/agent-context/images-as-context', label: 'Images as context' }, + { slug: 'agents/local-agents/agent-context/urls-as-context', label: 'URLs as context' }, + { slug: 'agents/local-agents/agent-context/selection-as-context', label: 'Selection as context' }, + { slug: 'agents/local-agents/agent-context/using-to-add-context', label: 'Using @ to add context' }, + 'agents/capabilities/mcp', ], }, { label: 'Inference & providers', collapsed: true, items: [ - { slug: 'agent-platform/inference/model-choice', label: 'Model choice' }, - { slug: 'agent-platform/inference/custom-routers', label: 'Custom routers' }, - 'agent-platform/inference/bring-your-own-api-key', - { slug: 'agent-platform/inference/custom-inference-endpoint', label: 'Custom inference endpoint' }, - { slug: 'agent-platform/inference/grok-subscription', label: 'SuperGrok subscription' }, + { slug: 'agents/inference/model-choice', label: 'Model choice' }, + { slug: 'agents/inference/custom-routers', label: 'Custom routers' }, + '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: 'agent-platform/local-agents/interactive-code-review', label: 'Interactive code review' }, - { slug: 'agent-platform/local-agents/active-ai', label: 'Active AI recommendations' }, - 'agent-platform/local-agents/generate', + { slug: 'agents/local-agents/interactive-code-review', label: 'Interactive code review' }, + { slug: 'agents/local-agents/active-ai', label: 'Active AI recommendations' }, + 'agents/local-agents/generate', + ], + }, + { + label: 'Warp Agent CLI', + items: [ + { slug: 'agents/cli', label: 'Overview' }, + { slug: 'agents/cli/quickstart', label: 'Quickstart' }, + { + label: 'Using the agent', + collapsed: true, + items: [ + { slug: 'agents/cli/agent-conversations', label: 'Agent conversations' }, + { slug: 'agents/cli/input-and-shell-commands', label: 'Input & shell commands' }, + { slug: 'agents/cli/permissions-and-profiles', label: 'Permissions & profiles' }, + { slug: 'agents/cli/cloud-and-orchestration', label: 'Cloud & orchestration' }, + ], + }, + { + label: 'Context & customization', + collapsed: true, + items: [ + { slug: 'agents/cli/configuration', label: 'Configuration' }, + { slug: 'agents/cli/models-and-usage', label: 'Models & usage' }, + ], + }, + { slug: 'agents/cli/reference', label: 'CLI reference' }, ], }, { label: 'Third-Party CLI Agents', items: [ - { slug: 'agent-platform/cli-agents/overview', label: 'Overview' }, - 'agent-platform/cli-agents/claude-code', - 'agent-platform/cli-agents/codex', - 'agent-platform/cli-agents/opencode', - 'agent-platform/cli-agents/rich-input', - 'agent-platform/cli-agents/remote-control', + { slug: 'agents/cli-agents/overview', label: 'Overview' }, + 'agents/cli-agents/claude-code', + 'agents/cli-agents/codex', + 'agents/cli-agents/opencode', + 'agents/cli-agents/rich-input', + 'agents/cli-agents/remote-control', ], }, { label: 'Memory (Research Preview)', items: [ - { slug: 'agent-platform/agent-memory', label: 'Agent Memory' }, + { slug: 'agents/agent-memory', label: 'Agent Memory' }, ], }, ], }, { - label: 'Oz', - link: '/platform/', - icon: 'cloud-download', + // Warp Factories documentation for Early Access. + // Starlight has no built-in factory glyph, so use its settings icon. + id: 'factories', + label: 'Factories', + link: '/factories/', + icon: 'setting', + badge: { text: 'Early Access', variant: 'note' }, + // Group labels are noun phrases naming a subject area, not imperative + // verbs. Every other tab does this -- 'Agent configuration', + // 'Triggers & integrations', 'Plans and billing', 'Team management' -- + // so 'Configure / Connect / Operate' read as a different product's + // sidebar. Two of these deliberately mirror the Automation Platform tab + // next door, since the underlying concepts are the same. items: [ - { slug: 'platform', label: 'Cloud agents overview' }, { + // 'Getting started', not 'Get started': matches the Terminal, + // Enterprise, and Guides tabs. label: 'Getting started', items: [ - { slug: 'platform/quickstart', label: 'Quickstart' }, - { slug: 'platform/overview', label: 'Oz platform' }, + { 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: 'Triggers', + // Parallel to 'Agent configuration' in the Automation Platform tab. + // Scoped to the factory itself: who runs the work, how it is defined, + // and where it runs. + label: 'Factory configuration', items: [ - { slug: 'platform/triggers', label: 'Overview' }, - { slug: 'platform/triggers/scheduled-agents-quickstart', label: 'Quickstart' }, - { slug: 'platform/triggers/scheduled-agents', label: 'Scheduled agents' }, + { slug: 'factories/factory-agents', label: 'Factory agents' }, + { slug: 'factories/factory-as-code', label: 'Definitions as code' }, + { slug: 'factories/infrastructure-and-security', label: 'Infrastructure & security' }, ], }, { + // 'Integrations' per HYC (8/17), replacing 'Work intake'. + // + // The per-service pages are listed directly rather than in a nested + // Integrations subgroup, which would have rendered as + // Integrations > Integrations > Slack. Flattening also drops the tab + // to two levels, matching every other group in it. + // + // '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. label: 'Integrations', items: [ - { slug: 'platform/integrations', label: 'Overview' }, - { slug: 'platform/integrations/quickstart', label: 'Quickstart' }, - 'platform/integrations/slack', - 'platform/integrations/linear', - 'platform/integrations/jira', + { slug: 'factories/connect-your-factory', label: 'Connect your factory' }, + { slug: 'factories/integrations/slack', label: 'Slack' }, + { slug: 'factories/integrations/github', label: 'GitHub' }, + { slug: 'factories/integrations/gitlab', label: 'GitLab' }, + { slug: 'factories/integrations/linear', label: 'Linear' }, + { slug: 'factories/integrations/jira', label: 'Jira' }, + // Kept with the integrations rather than moved to Factory + // configuration. Filters act on "events from your connected tools", + // and the page's core reference is a per-source table that links out + // to the Slack, GitHub, and Linear pages directly above. It reads as + // the last step of wiring up a source, not as something you define + // about the factory itself. "It is configuration" does not separate + // it from the integration pages, which are equally configuration. + { slug: 'factories/automation-filters', label: 'Automation filters' }, + { slug: 'factories/factory-mcp', label: 'Factory MCP' }, + ], + }, + { + // 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. + label: 'Management & observability', + items: [ + { slug: 'factories/factory-dashboard', label: 'Factory dashboard' }, + { slug: 'factories/measure-and-improve', label: 'Measure and improve' }, + ], + }, + // Troubleshooting sits outside the groups, last in 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' }, + ], + }, + { + // Relabeled from 'Oz' to 'Automation Platform' for the 8/18 launch (HYC's + // IA doc; naming confirmed -- see .agents/references/terminology.md). + // Reorganized from 10 subsections into HYC's 6-group IA; all page slugs + // unchanged. + id: 'platform', + label: 'Automation Platform', + // The tab lands on the platform overview rather than /platform/, which + // serves the cloud agents overview. The two pages are not + // interchangeable: 16 legacy redirects point at each, and they are + // aligned with the content that lives there now (/agent-platform/ + // warp-platform -> overview; /agent-platform/ambient-agents -> + // /platform/). Swapping the bodies would invert both sets, plus 17 + // internal links and an #execution-hosts anchor. Precedent for a + // non-root tab target: the Changelog tab links to /changelog/2026/. + link: '/platform/overview/', + icon: 'cloud-download', + items: [ + { slug: 'platform/overview', label: 'Overview' }, + { + label: 'Cloud Agents', + items: [ + { slug: 'platform', label: 'Overview' }, + { slug: 'platform/quickstart', label: 'Quickstart' }, + { + // Runtime (which agent executes the run) is kept separate from + // configuration (how any run is set up) -- HYC review, 8/14. + // 'Harness' is product terminology, not docs jargon: it is the + // Agent harness dropdown in the Warp app, the Harness field in the + // web app, --harness on the CLI, and the harness field in the API. + label: 'Harnesses', + collapsed: true, + items: [ + { slug: 'platform/harnesses', label: 'Overview' }, + { slug: 'platform/harnesses/warp-agent', label: 'Warp Agent (Default)' }, + { slug: 'platform/harnesses/claude-code', label: 'Claude Code' }, + { slug: 'platform/harnesses/codex', label: 'Codex' }, + { slug: 'platform/harnesses/authentication', label: 'Authentication' }, + ], + }, { - label: 'GitHub Actions', + // Every page here is cross-harness, verified 8/14: platform/agents has + // zero harness-specific content; skills-as-agents documents + // .claude/skills/ and .codex/skills/; secrets uses OPENAI_API_KEY as its + // example and both third-party harness pages link to it; mcp states no + // harness constraint. Do not add Warp-Agent-specific pages to this group. + label: 'Agent configuration', collapsed: true, items: [ - { slug: 'platform/integrations/github-actions', label: 'Overview' }, - { slug: 'platform/integrations/quickstart-github-actions', label: 'Quickstart' }, + { slug: 'platform/agents', label: 'Cloud agent accounts' }, + { slug: 'platform/skills-as-agents', label: 'Skills as agents' }, + { slug: 'platform/mcp', label: 'MCP servers' }, + 'platform/secrets', ], }, - 'platform/integrations/azure-devops', - 'platform/integrations/bitbucket', - 'platform/integrations/gitlab', - { slug: 'platform/integrations/cloud-providers', label: 'AWS, GCP, and other cloud providers' }, + { + // Surfaces for watching, steering, and managing runs. Named to match + // the 'Management and observability' section of the platform overview + // -- 'Operations' read as a job function rather than a set of pages. + label: 'Management & observability', + collapsed: true, + items: [ + // Labeled to match the page title, 'Cloud agent session sharing'. + { slug: 'platform/viewing-cloud-agent-runs', label: 'Session sharing' }, + { slug: 'platform/managing-cloud-agents', label: 'Managing cloud agents' }, + // Tokenized, not renamed: WEB_APP holds its "Oz web app" value + // until 9/15, so this renders identically today. Tokenizing now + // means the 9/15 flip reaches the sidebar, which the Vite + // transform does not process. + { slug: 'platform/oz-web-app', label: VARS.WEB_APP }, + ], + }, + { + label: 'Handoff', + collapsed: true, + items: [ + { slug: 'platform/handoff', label: 'Overview' }, + { slug: 'platform/handoff/local-to-cloud', label: 'Local to cloud' }, + { slug: 'platform/handoff/cloud-to-cloud', label: 'Cloud to cloud' }, + { slug: 'platform/handoff/snapshots', label: 'Snapshots' }, + ], + }, + { slug: 'platform/team-access-billing-and-identity', label: 'Access, billing, and identity' }, + { slug: 'platform/faqs', label: 'Cloud agent FAQs' }, ], }, { - label: 'Managing agents', + label: 'Environments', items: [ 'platform/environments', { slug: 'platform/runners', label: 'Runners' }, - { slug: 'platform/managing-cloud-agents', label: 'Managing cloud agents' }, - { slug: 'platform/agents', label: 'Agents' }, - { slug: 'platform/viewing-cloud-agent-runs', label: 'Viewing cloud agent runs' }, - { slug: 'platform/oz-web-app', label: 'Oz web app' }, - ], - }, - { - label: 'Orchestration', - items: [ - { slug: 'platform/orchestration', label: 'Multi-agent orchestration' }, - { slug: 'platform/orchestration/multi-agent-runs', label: 'Running orchestrated agents' }, - { slug: 'platform/software-factory', label: 'Software factory' }, ], }, { - label: 'Handoff', + // One group, not two, and not nested either way. platform/triggers + // lists integrations as one of six trigger types, so nesting + // Triggers under Integrations inverts the concept, and splitting + // them into siblings implies they are peers. A label naming both + // sidesteps the question. + // + // platform/triggers is the group overview: it already introduces + // both concepts and lists integrations among the trigger types. + // platform/integrations keeps a separate overview inside the + // Integrations subgroup rather than being merged into it -- it + // carries 20 inbound links and 19 legacy redirects, against 4 and 0 + // for platform/triggers, so it is the more established URL of the + // two and not a deletion candidate. + label: 'Triggers & integrations', items: [ - { slug: 'platform/handoff', label: 'Overview' }, - { slug: 'platform/handoff/local-to-cloud', label: 'Local to cloud' }, - { slug: 'platform/handoff/cloud-to-cloud', label: 'Cloud to cloud' }, - { slug: 'platform/handoff/snapshots', label: 'Snapshots' }, - ], - }, - { - label: 'Harnesses', - items: [ - { slug: 'platform/harnesses', label: 'Overview' }, - { slug: 'platform/harnesses/warp-agent', label: 'Warp Agent' }, - { slug: 'platform/harnesses/claude-code', label: 'Claude Code' }, - { slug: 'platform/harnesses/codex', label: 'Codex' }, - { slug: 'platform/harnesses/authentication', label: 'Authentication' }, + { slug: 'platform/triggers', label: 'Overview' }, + { + // Overview-then-Quickstart, matching the GitHub Actions subgroup. + label: 'Scheduled agents', + collapsed: true, + items: [ + { slug: 'platform/triggers/scheduled-agents', label: 'Overview' }, + { slug: 'platform/triggers/scheduled-agents-quickstart', label: 'Quickstart' }, + ], + }, + { + label: 'Integrations', + collapsed: true, + items: [ + { slug: 'platform/integrations', label: 'Overview' }, + { slug: 'platform/integrations/quickstart', label: 'Quickstart' }, + 'platform/integrations/slack', + 'platform/integrations/linear', + 'platform/integrations/jira', + 'platform/integrations/github', + { + label: 'GitHub Actions', + collapsed: true, + items: [ + { slug: 'platform/integrations/github-actions', label: 'Overview' }, + { slug: 'platform/integrations/quickstart-github-actions', label: 'Quickstart' }, + ], + }, + 'platform/integrations/azure-devops', + 'platform/integrations/bitbucket', + 'platform/integrations/gitlab', + { slug: 'platform/integrations/cloud-providers', label: 'AWS, GCP, and other cloud providers' }, + ], + }, ], }, { - label: 'Extending agents', + label: 'Orchestration', items: [ - { slug: 'platform/skills-as-agents', label: 'Skills as agents' }, - { slug: 'platform/mcp', label: 'MCP servers' }, - 'platform/secrets', + { slug: 'platform/orchestration', label: 'Multi-agent orchestration' }, + { 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/deployment-patterns', label: 'Deployment patterns' }, { slug: 'platform/warp-hosting', label: 'Warp-hosted agents' }, - { - label: 'Self-hosting', - collapsed: true, - items: [ - { slug: 'platform/self-hosting', label: 'Overview' }, - { slug: 'platform/self-hosting/quickstart', label: '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: 'Access & support', - items: [ - { slug: 'platform/team-access-billing-and-identity', label: 'Access, billing, and identity' }, - { slug: 'platform/faqs', label: 'Cloud agent FAQs' }, + // 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: 'Reference', + label: 'API & Reference', link: '/reference/', icon: 'open-book', items: [ - { slug: 'reference', label: 'Technical reference' }, + { + // 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: 'Oz CLI' }, + { 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' }, @@ -479,9 +672,10 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { label: 'API & SDK', items: [ - { slug: 'reference/api-and-sdk', label: 'Oz API & SDK' }, + { slug: 'reference/api-and-sdk', label: VARS.API_SDK_NAME }, { slug: 'reference/api-and-sdk/quickstart', label: 'Quickstart' }, - { label: 'API Reference', link: '/api' }, + // 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', @@ -519,18 +713,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ }, ], }, - { - // Link-only topic: navigates straight to the standalone Scalar API - // reference at `/api`. Uses the plugin's `sidebarTopicLinkSchema` - // shape (no `items`) since `/api` isn't a Starlight route and - // doesn't have a per-topic sidebar tree. The `seti:json` icon is a - // graceful fallback for the mobile drawer; the desktop - // `WarpTopicNav` overrides this with a custom `</>` inline SVG via - // its `CUSTOM_TOPIC_ICONS` map. - label: 'API', - link: '/api', - icon: 'seti:json', - }, { label: 'Changelog', link: '/changelog/2026/', @@ -546,20 +728,19 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ ], }, { - label: 'Support & Community', + // Shortened from 'Support & Community' so the horizontal tab bar wraps to + // a second line less readily (HYC review, 8/14). The Community group + // moved to the bottom of this tab in the same pass: the tab is entered + // for help far more often than for community links, so troubleshooting, + // billing, and privacy now come first. + label: 'Support', link: '/support-and-community/', icon: 'comment', items: [ - { slug: 'support-and-community', label: 'Support and Community' }, - { - label: 'Community', - items: [ - 'support-and-community/community/contributing', - 'support-and-community/community/warp-preview-and-alpha-program', - { slug: 'support-and-community/community/refer-a-friend', label: 'Refer a Friend & Earn Rewards' }, - 'support-and-community/community/open-source-partnership', - ], - }, + // 'Overview', not the page's own 'Support & Community' title: the tab + // is now 'Support', and a bare first item labeled 'Overview' matches + // the Automation Platform, API & Reference, and Enterprise tabs. + { slug: 'support-and-community', label: 'Overview' }, { label: 'Troubleshooting and support', items: [ @@ -591,6 +772,15 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'support-and-community/community/open-source-licenses', label: 'Open Source Licenses' }, ], }, + { + label: 'Community', + items: [ + 'support-and-community/community/contributing', + 'support-and-community/community/warp-preview-and-alpha-program', + { slug: 'support-and-community/community/refer-a-friend', label: 'Refer a Friend & Earn Rewards' }, + 'support-and-community/community/open-source-partnership', + ], + }, ], }, { @@ -627,8 +817,10 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { label: 'Enterprise features', items: [ - { slug: 'enterprise/enterprise-features/architecture-and-deployment', label: 'Architecture and deployment' }, + { slug: 'enterprise/enterprise-features/architecture-and-deployment', label: 'Architecture and deployment' }, { slug: 'enterprise/enterprise-features/bring-your-own-llm', label: 'Bring your own LLM' }, + { slug: 'enterprise/enterprise-features/byollm-aws-bedrock', label: 'BYOLLM: AWS Bedrock' }, + { slug: 'enterprise/enterprise-features/byollm-gemini-enterprise', label: 'BYOLLM: Gemini Enterprise' }, { slug: 'enterprise/enterprise-features/team-managed-keys-and-endpoints', label: 'Team-managed LLM keys and endpoints' }, { slug: 'enterprise/enterprise-features/analytics-api', label: 'Analytics API' }, ], @@ -652,7 +844,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'guides', label: 'Guides' }, { label: 'Getting started', - collapsed: true, items: [ 'guides/getting-started/welcome-to-warp', { slug: 'guides/getting-started/10-coding-features-you-should-know', label: '10 coding features you should know' }, @@ -663,7 +854,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ }, { label: 'Agent workflows', - collapsed: true, items: [ { slug: 'guides/agent-workflows/how-to-review-ai-generated-code', label: 'Review AI-generated code' }, { slug: 'guides/agent-workflows/how-to-attach-agent-session-context-to-github-prs', label: 'Attach agent context to PRs' }, @@ -681,7 +871,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ }, { label: 'Build a software factory', - collapsed: true, items: [ { slug: 'guides/agent-workflows/build-a-triage-agent', label: 'Build a triage agent' }, { slug: 'guides/agent-workflows/write-product-and-tech-specs-with-agents', label: 'Write specs with agents' }, @@ -692,7 +881,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ }, { label: 'Configuration', - collapsed: true, items: [ { slug: 'guides/configuration/how-to-create-project-rules-for-an-existing-project-astro-typescript-tailwind', label: 'Create project Rules' }, { slug: 'guides/configuration/how-to-set-coding-best-practices', label: 'Set coding best practices with Rules' }, @@ -709,7 +897,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ }, { label: 'External tools & integrations', - collapsed: true, items: [ { slug: 'guides/external-tools/how-to-set-up-claude-code', label: 'Set up Claude Code' }, { slug: 'guides/external-tools/how-to-set-up-codex-cli', label: 'Set up Codex CLI' }, @@ -729,7 +916,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ }, { label: 'Build an app in Warp', - collapsed: true, items: [ { slug: 'guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-railway', label: 'Build a real-time chat app' }, { slug: 'guides/build-an-app-in-warp/building-a-chrome-extension-d3js-javascript-html-css', label: 'Build a Chrome extension' }, @@ -738,7 +924,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ }, { label: 'DevOps & infrastructure', - collapsed: true, items: [ { slug: 'guides/devops/how-to-analyze-cloud-run-logs-gcloud', label: 'Analyze Cloud Run logs (gcloud)' }, { slug: 'guides/devops/how-to-create-a-production-ready-docker-setup', label: 'Create a production-ready Docker setup' }, @@ -751,7 +936,6 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ }, { label: 'Frontend & UI', - collapsed: true, items: [ { slug: 'guides/frontend/how-to-replace-a-ui-element-in-warp-rust-codebase', label: 'Replace a UI element in Warp (Rust codebase)' }, { slug: 'guides/frontend/how-to-actually-code-ui-that-matches-your-mockup-react-tailwind', label: 'Code UI that matches your mockup (React + Tailwind)' }, diff --git a/src/styles/custom.css b/src/styles/custom.css index 8afdcb559..6b98b5af9 100644 --- a/src/styles/custom.css +++ b/src/styles/custom.css @@ -222,6 +222,24 @@ body { padding-inline-start: 0; } +/* Topic badge in the mobile drawer topic list (e.g. Factories "Early + Access") — replace Starlight's monospace bordered `.sl-badge` default + with the same compact brand pill used by the top-nav topic badge (see + WarpTopicNav.astro): Inter, small, accent tint, fully rounded. */ +.starlight-sidebar-topics .sl-badge { + border: 0; + border-radius: 9999px; + padding: 0.125rem 0.5rem; + background: var(--sl-color-accent-low); + color: var(--sl-color-text-accent); + font-family: var(--sl-font); + font-size: var(--sl-text-2xs); + font-weight: 600; + line-height: 1.3; + letter-spacing: 0.015em; + vertical-align: 0.125em; +} + /* Shrink the right "On this page" TOC panel */ :root { --sl-toc-width: 16rem; @@ -315,6 +333,146 @@ body { margin-left: auto; margin-right: auto; } +/* Article images are enhanced by ArticleImageLightbox.astro with keyboard + dialog controls while this class adds a layout-neutral zoom affordance. + The script scopes enhancement to main docs content and honors + `data-no-lightbox` on the image or any ancestor. */ +.sl-markdown-content img[data-docs-image-lightbox-image] { + cursor: zoom-in; + transition: box-shadow 0.15s ease; +} + +@media (hover: hover) { + .sl-markdown-content img[data-docs-image-lightbox-image]:hover { + box-shadow: 0 0 0 2px var(--sl-color-accent-high); + } +} +.sl-markdown-content img[data-warp-image-lightbox-trigger]:focus-visible, +.sl-markdown-content a[data-warp-image-lightbox-trigger]:focus-visible img { + outline: 2px solid var(--sl-color-accent-high); + outline-offset: 3px; +} + +html.docs-image-lightbox-open, +body.docs-image-lightbox-open { + overflow: hidden; +} + +.docs-image-lightbox { + position: fixed; + inset: 0; + z-index: 100; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: 100%; + max-width: none; + height: 100%; + max-height: none; + margin: 0; + padding: 1.5rem; + border: 0; + background: rgb(0 0 0 / 0.76); + backdrop-filter: blur(8px); + overflow: hidden; +} + +.docs-image-lightbox[hidden] { + display: none; +} +.docs-image-lightbox::backdrop { + background: transparent; +} + +.docs-image-lightbox__content { + position: relative; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: min(100%, 90rem); + height: 100%; + min-width: 0; + min-height: 0; + padding: 3.25rem 0 0; +} + +.docs-image-lightbox__image { + display: block; + max-width: 100%; + max-height: 100%; + width: auto; + height: auto; + border: 1px solid rgb(255 255 255 / 0.22); + border-radius: var(--sl-radius-md); + background: var(--sl-color-black); + object-fit: contain; + box-shadow: 0 1rem 2.5rem rgb(0 0 0 / 0.45); +} + +.docs-image-lightbox__close { + position: absolute; + top: 0; + right: 0; + z-index: 1; + display: inline-flex; + align-items: center; + justify-content: center; + width: 2.75rem; + height: 2.75rem; + padding: 0; + border: 1px solid rgb(255 255 255 / 0.25); + border-radius: var(--sl-radius-sm); + background: rgb(0 0 0 / 0.45); + color: var(--sl-color-white); + cursor: pointer; +} + +.docs-image-lightbox__close:hover { + border-color: rgb(255 255 255 / 0.5); + background: rgb(0 0 0 / 0.7); +} + +.docs-image-lightbox__close:focus-visible { + outline: 2px solid var(--sl-color-accent-high); + outline-offset: 2px; +} + +.docs-image-lightbox__close svg { + width: 1.25rem; + height: 1.25rem; +} + +.docs-image-lightbox__fallback { + max-width: min(100%, 24rem); + padding: 0.75rem 1rem; + border: 1px dashed var(--sl-color-gray-4); + border-radius: var(--sl-radius-md); + background: color-mix(in srgb, var(--sl-color-black), var(--sl-color-gray-6) 30%); + color: var(--sl-color-gray-3); +} + +:root[data-theme='light'] .docs-image-lightbox { + background: rgb(241 245 249 / 0.8); +} + +:root[data-theme='light'] .docs-image-lightbox__image { + border-color: rgb(15 23 42 / 0.2); + background: var(--sl-color-black); + box-shadow: 0 1rem 2.5rem rgb(15 23 42 / 0.24); +} + +:root[data-theme='light'] .docs-image-lightbox__close { + border-color: rgb(15 23 42 / 0.2); + background: rgb(255 255 255 / 0.8); + color: var(--sl-color-white); +} + +:root[data-theme='light'] .docs-image-lightbox__close:hover { + border-color: rgb(15 23 42 / 0.4); + background: var(--sl-color-black); +} .sl-markdown-content figcaption { margin-top: 0.5rem; @@ -377,6 +535,72 @@ body { margin-top: 0.5rem; } +/* -------------------------------------------------------------------------- + Mermaid diagrams + -------------------------------------------------------------------------- */ +.sl-markdown-content pre.mermaid { + max-width: 100%; + border: 1px solid var(--sl-color-hairline-light); + border-radius: var(--sl-radius-md); + overflow-x: auto; +} + +.sl-markdown-content pre.mermaid svg { + max-width: 100%; +} + +.svg-toolbelt-controls { + flex-direction: row !important; + gap: 0.125rem !important; + padding: 0.25rem !important; + background: var(--sl-color-bg-nav) !important; + border: 1px solid var(--sl-color-hairline-light) !important; + border-radius: var(--sl-radius-md) !important; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2) !important; +} + +:root[data-theme='light'] .svg-toolbelt-controls { + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08) !important; +} + +.svg-toolbelt-controls .svg-toolbelt-btn, +.svg-toolbelt-controls button { + border: none !important; + background: transparent !important; + color: var(--sl-color-gray-3) !important; + border-radius: var(--sl-radius-sm) !important; + box-shadow: none !important; + transform: none !important; +} + +.svg-toolbelt-controls .svg-toolbelt-btn:hover, +.svg-toolbelt-controls button:hover, +.svg-toolbelt-controls .svg-toolbelt-btn:active, +.svg-toolbelt-controls button:active { + background: var(--sl-color-gray-6) !important; + color: var(--sl-color-white) !important; + box-shadow: none !important; + transform: none !important; +} + +.svg-toolbelt-controls .svg-toolbelt-btn:focus, +.svg-toolbelt-controls button:focus { + outline: 2px solid var(--sl-color-accent) !important; + outline-offset: 2px !important; + border-color: transparent !important; +} + +.svg-toolbelt-zoom-indicator { + background: var(--sl-color-bg-nav) !important; + border: 1px solid var(--sl-color-hairline-light) !important; + color: var(--sl-color-gray-2) !important; + font-family: var(--sl-font) !important; +} + +.svg-toolbelt-container:fullscreen { + background: var(--sl-color-bg) !important; +} + /* -------------------------------------------------------------------------- Guides: Card-based discovery page diff --git a/src/styles/warp-components.css b/src/styles/warp-components.css index 0e15a39ce..2169c61c0 100644 --- a/src/styles/warp-components.css +++ b/src/styles/warp-components.css @@ -179,6 +179,18 @@ pre.astro-code, .sl-markdown-content pre { overflow-x: auto; + overflow-y: hidden; + white-space: pre; +} + +.expressive-code pre code, +.sl-kapa-codeblock pre code { + display: block; + min-width: max-content; +} + +.expressive-code pre { + scrollbar-width: thin; } /* Code block copy button — frosted glass effect (Scalar pattern) */ @@ -1561,3 +1573,27 @@ site-search #starlight__search .pagefind-ui__result-nested .pagefind-ui__result- :root[data-theme='light'] .warp-search-keyboard-hints__kbd { background: rgba(0, 0, 0, 0.06); } + +/* -------------------------------------------------------------------------- + 20. Terminal status glyphs — inline color for CLI transcript indicators + -------------------------------------------------------------------------- + The Warp Agent CLI paints status glyphs with the active terminal theme's + ANSI colors — yellow while something is in progress, green once it + succeeds. Tinting the same glyph inline lets a docs bullet read the way + the transcript actually looks on screen. + + Applied to `<code>` so the glyph keeps the inline-code chip that plain + Markdown backticks produce; only the foreground changes. Starlight's + mode-aware `-high` hue tokens are used instead of fixed hex values, so + the glyphs stay legible when the page flips between dark and light mode. + + Color is decorative here: every glyph is paired with a text label, so + meaning never depends on color alone. */ + +.sl-markdown-content code.glyph-attention { + color: var(--sl-color-orange-high); +} + +.sl-markdown-content code.glyph-success { + color: var(--sl-color-green-high); +} diff --git a/vercel.json b/vercel.json index 04a401f17..33467c0d9 100644 --- a/vercel.json +++ b/vercel.json @@ -29,39 +29,21 @@ }, { "key": "Content-Security-Policy", - "value": "default-src 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://www.google.com https://www.gstatic.com https://cdn.jsdelivr.net https://cdn.rudderlabs.com https://polyfill-fastly.io; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: https:; frame-src https://www.youtube-nocookie.com https://www.loom.com https://drive.google.com https://www.google.com; connect-src 'self' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://*.kapa.ai https://www.google.com https://app.warp.dev https://api.rudderstack.com; frame-ancestors 'none'" + "value": "default-src 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://www.google.com https://www.gstatic.com https://cdn.jsdelivr.net https://cdn.rudderlabs.com https://polyfill-fastly.io https://widget.kapa.ai https://hcaptcha.com https://*.hcaptcha.com https://js.hcaptcha.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: https:; frame-src https://www.youtube-nocookie.com https://www.loom.com https://drive.google.com https://www.google.com https://hcaptcha.com https://*.hcaptcha.com; connect-src 'self' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://*.kapa.ai https://kapa-widget-proxy-la7dkmplpq-uc.a.run.app https://www.google.com https://app.warp.dev https://api.rudderstack.com https://cdn.rudderlabs.com https://hcaptcha.com https://*.hcaptcha.com; frame-ancestors 'none'" } ] }, { - "source": "/api", + "source": "/api/:path*", "headers": [ { "key": "Content-Security-Policy", - "value": "default-src 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://www.google.com https://www.gstatic.com https://cdn.jsdelivr.net https://cdn.rudderlabs.com https://polyfill-fastly.io; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: https:; frame-src https://www.youtube-nocookie.com https://www.loom.com https://drive.google.com https://www.google.com; connect-src 'self' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://*.kapa.ai https://www.google.com https://app.warp.dev https://api.rudderstack.com; frame-ancestors 'none'" + "value": "default-src 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://www.google.com https://www.gstatic.com https://cdn.jsdelivr.net https://cdn.rudderlabs.com https://polyfill-fastly.io https://widget.kapa.ai https://hcaptcha.com https://*.hcaptcha.com https://js.hcaptcha.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: https:; frame-src https://www.youtube-nocookie.com https://www.loom.com https://drive.google.com https://www.google.com https://hcaptcha.com https://*.hcaptcha.com; connect-src 'self' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://*.kapa.ai https://kapa-widget-proxy-la7dkmplpq-uc.a.run.app https://www.google.com https://app.warp.dev https://api.rudderstack.com https://cdn.rudderlabs.com https://hcaptcha.com https://*.hcaptcha.com; frame-ancestors 'none'" } ] }, { - "source": "/api/(.*)", - "headers": [ - { - "key": "Content-Security-Policy", - "value": "default-src 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://www.google.com https://www.gstatic.com https://cdn.jsdelivr.net https://cdn.rudderlabs.com https://polyfill-fastly.io; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: https:; frame-src https://www.youtube-nocookie.com https://www.loom.com https://drive.google.com https://www.google.com; connect-src 'self' https://va.vercel-scripts.com https://vitals.vercel-insights.com https://*.kapa.ai https://www.google.com https://app.warp.dev https://api.rudderstack.com; frame-ancestors 'none'" - } - ] - }, - { - "source": "/_astro/(.*)", - "headers": [ - { - "key": "Cache-Control", - "value": "public, max-age=31536000, immutable" - } - ] - }, - { - "source": "/assets/(.*)", + "source": "/:directory(_astro|assets)/:path(.*)", "headers": [ { "key": "Cache-Control", @@ -95,6 +77,271 @@ } ], "redirects": [ + { + "source": "/platform/software-factory(/?)", + "destination": "/factories/", + "statusCode": 308 + }, + { + "source": "/cli/", + "destination": "/agents/cli/", + "statusCode": 308 + }, + { + "source": "/cli/:path(.*)", + "destination": "/agents/cli/:path", + "statusCode": 308 + }, + { + "source": "/agent-platform/", + "destination": "/agents/", + "statusCode": 308 + }, + { + "source": "/agent-platform/agent-memory/", + "destination": "/agents/agent-memory/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/", + "destination": "/agents/capabilities/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/agent-notifications/", + "destination": "/agents/capabilities/agent-notifications/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/agent-profiles-permissions/", + "destination": "/agents/capabilities/agent-profiles-permissions/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/codebase-context/", + "destination": "/agents/capabilities/codebase-context/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/computer-use(/?)", + "destination": "/agents/capabilities/computer-use/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/computer-use/artifacts-in-prs/", + "destination": "/agents/capabilities/computer-use/artifacts-in-prs/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/computer-use/browser-use/", + "destination": "/agents/capabilities/computer-use/browser-use/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/computer-use/testing-and-recordings/", + "destination": "/agents/capabilities/computer-use/testing-and-recordings/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/full-terminal-use/", + "destination": "/agents/capabilities/full-terminal-use/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/mcp/", + "destination": "/agents/capabilities/mcp/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/planning/", + "destination": "/agents/capabilities/planning/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/rules/", + "destination": "/agents/capabilities/rules/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/skills/", + "destination": "/agents/capabilities/skills/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/slash-commands/", + "destination": "/agents/capabilities/slash-commands/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/task-lists/", + "destination": "/agents/capabilities/task-lists/", + "statusCode": 308 + }, + { + "source": "/agent-platform/capabilities/web-search/", + "destination": "/agents/capabilities/web-search/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cli-agents/claude-code/", + "destination": "/agents/cli-agents/claude-code/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cli-agents/codex/", + "destination": "/agents/cli-agents/codex/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cli-agents/opencode/", + "destination": "/agents/cli-agents/opencode/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cli-agents/overview/", + "destination": "/agents/cli-agents/overview/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cli-agents/remote-control/", + "destination": "/agents/cli-agents/remote-control/", + "statusCode": 308 + }, + { + "source": "/agent-platform/cli-agents/rich-input/", + "destination": "/agents/cli-agents/rich-input/", + "statusCode": 308 + }, + { + "source": "/agent-platform/getting-started/agents-in-warp/", + "destination": "/agents/getting-started/agents-in-warp/", + "statusCode": 308 + }, + { + "source": "/agent-platform/getting-started/faqs/", + "destination": "/agents/getting-started/faqs/", + "statusCode": 308 + }, + { + "source": "/agent-platform/inference/bring-your-own-api-key/", + "destination": "/agents/inference/bring-your-own-api-key/", + "statusCode": 308 + }, + { + "source": "/agent-platform/inference/custom-inference-endpoint/", + "destination": "/agents/inference/custom-inference-endpoint/", + "statusCode": 308 + }, + { + "source": "/agent-platform/inference/custom-routers/", + "destination": "/agents/inference/custom-routers/", + "statusCode": 308 + }, + { + "source": "/agent-platform/inference/grok-subscription/", + "destination": "/agents/inference/grok-subscription/", + "statusCode": 308 + }, + { + "source": "/agent-platform/inference/model-choice/", + "destination": "/agents/inference/model-choice/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/active-ai/", + "destination": "/agents/local-agents/active-ai/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/agent-context/", + "destination": "/agents/local-agents/agent-context/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/agent-context/blocks-as-context/", + "destination": "/agents/local-agents/agent-context/blocks-as-context/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/agent-context/images-as-context/", + "destination": "/agents/local-agents/agent-context/images-as-context/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/agent-context/selection-as-context/", + "destination": "/agents/local-agents/agent-context/selection-as-context/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/agent-context/urls-as-context/", + "destination": "/agents/local-agents/agent-context/urls-as-context/", + "statusCode": 308 + }, + { + "source": "/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/local-agents/cloud-conversations/", + "destination": "/agents/local-agents/cloud-conversations/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/code-diffs/", + "destination": "/agents/local-agents/code-diffs/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/generate/", + "destination": "/agents/local-agents/generate/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/interacting-with-agents/", + "destination": "/agents/local-agents/interacting-with-agents/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/interacting-with-agents/agent-questions/", + "destination": "/agents/local-agents/interacting-with-agents/agent-questions/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", + "destination": "/agents/local-agents/interacting-with-agents/conversation-forking/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/interacting-with-agents/prompt-queueing/", + "destination": "/agents/local-agents/interacting-with-agents/prompt-queueing/", + "statusCode": 308 + }, + { + "source": "/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/voice/", + "destination": "/agents/local-agents/interacting-with-agents/voice/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/interactive-code-review/", + "destination": "/agents/local-agents/interactive-code-review/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/overview/", + "destination": "/agents/local-agents/overview/", + "statusCode": 308 + }, + { + "source": "/agent-platform/local-agents/session-sharing/", + "destination": "/agents/local-agents/session-sharing/", + "statusCode": 308 + }, { "source": "/terminal", "destination": "/terminal/input/classic-input/", @@ -131,182 +378,182 @@ "statusCode": 308 }, { - "source": "/advanced/command-line-flags", + "source": "/advanced/command-line-flags(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts", + "source": "/agent-platform/agent-concepts(/?)", "destination": "/agent-platform/capabilities/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/agent-profiles-permissions", + "source": "/agent-platform/agent-concepts/agent-profiles-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/codebase-context", + "source": "/agent-platform/agent-concepts/codebase-context(/?)", "destination": "/agent-platform/capabilities/codebase-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/full-terminal-use", + "source": "/agent-platform/agent-concepts/full-terminal-use(/?)", "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/mcp", + "source": "/agent-platform/agent-concepts/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/model-choice", + "source": "/agent-platform/agent-concepts/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/planning", + "source": "/agent-platform/agent-concepts/planning(/?)", "destination": "/agent-platform/capabilities/planning/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/rules", + "source": "/agent-platform/agent-concepts/rules(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/skills", + "source": "/agent-platform/agent-concepts/skills(/?)", "destination": "/agent-platform/capabilities/skills/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/slash-commands", + "source": "/agent-platform/agent-concepts/slash-commands(/?)", "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/task-lists", + "source": "/agent-platform/agent-concepts/task-lists(/?)", "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/web-search", + "source": "/agent-platform/agent-concepts/web-search(/?)", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent-mode(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/active-ai", + "source": "/agent-platform/agent-mode/active-ai(/?)", "destination": "/agent-platform/local-agents/active-ai/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context", + "source": "/agent-platform/agent-mode/agent-context(/?)", "destination": "/agent-platform/local-agents/agent-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/blocks-as-context", + "source": "/agent-platform/agent-mode/agent-context/blocks-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/images-as-context", + "source": "/agent-platform/agent-mode/agent-context/images-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/selection-as-context", + "source": "/agent-platform/agent-mode/agent-context/selection-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/urls-as-context", + "source": "/agent-platform/agent-mode/agent-context/urls-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/using-to-add-context", + "source": "/agent-platform/agent-mode/agent-context/using-to-add-context(/?)", "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agents-overview", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent-mode/agents-overview(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/ambient-agents-session-sharing", + "source": "/agent-platform/agent-mode/ambient-agents-session-sharing(/?)", "destination": "/platform/viewing-cloud-agent-runs/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/code-diffs-in-agent-conversations", + "source": "/agent-platform/agent-mode/code-diffs-in-agent-conversations(/?)", "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/full-terminal-use", + "source": "/agent-platform/agent-mode/full-terminal-use(/?)", "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/generate", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent-mode/generate(/?)", + "destination": "/agents/local-agents/generate/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interacting-with-agents", + "source": "/agent-platform/agent-mode/interacting-with-agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interacting-with-agents/agent-modality-beta", + "source": "/agent-platform/agent-mode/interacting-with-agents/agent-modality-beta(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interacting-with-agents/conversation-forking", + "source": "/agent-platform/agent-mode/interacting-with-agents/conversation-forking(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interacting-with-agents/voice", + "source": "/agent-platform/agent-mode/interacting-with-agents/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/interactive-code-review", + "source": "/agent-platform/agent-mode/interactive-code-review(/?)", "destination": "/agent-platform/local-agents/interactive-code-review/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/model-choice", + "source": "/agent-platform/agent-mode/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/task-lists", + "source": "/agent-platform/agent-mode/task-lists(/?)", "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/third-party-cli-agents", + "source": "/agent-platform/agent-mode/third-party-cli-agents(/?)", "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/web-search", + "source": "/agent-platform/agent-mode/web-search(/?)", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/active-ai", + "source": "/agent-platform/agent-platform/active-ai(/?)", "destination": "/agent-platform/local-agents/active-ai/", "statusCode": 308 }, @@ -321,37 +568,37 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agent-modality-beta", + "source": "/agent-platform/agent-platform/agent-modality-beta(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agent/agents-overview", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent-platform/agent/agents-overview(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agent/using-agents/agent-profiles-permissions", + "source": "/agent-platform/agent-platform/agent/using-agents/agent-profiles-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agents-md", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent-platform/agents-md(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/agents-overview", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent-platform/agents-overview(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/ai", + "source": "/agent-platform/agent-platform/ai(/?)", "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/ai-faqs", + "source": "/agent-platform/agent-platform/ai-faqs(/?)", "destination": "/agent-platform/getting-started/faqs/", "statusCode": 308 }, @@ -361,47 +608,47 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/ai-model-choice", + "source": "/agent-platform/agent-platform/ai-model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/ambient-agents/ambient-agents-overview", + "source": "/agent-platform/agent-platform/ambient-agents/ambient-agents-overview(/?)", "destination": "/platform/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/autonomy", + "source": "/agent-platform/agent-platform/autonomy(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/autonomy/agent-permissions", + "source": "/agent-platform/agent-platform/autonomy/agent-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/autonomy/run-to-completion", + "source": "/agent-platform/agent-platform/autonomy/run-to-completion(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/cloud-agents/cloud-agents-platform", + "source": "/agent-platform/agent-platform/cloud-agents/cloud-agents-platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/cloud-agents/warp-platform", + "source": "/agent-platform/agent-platform/cloud-agents/warp-platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/conversation-forking", + "source": "/agent-platform/agent-platform/conversation-forking(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/full-terminal-use", + "source": "/agent-platform/agent-platform/full-terminal-use(/?)", "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, @@ -411,32 +658,32 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/generate", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent-platform/generate(/?)", + "destination": "/agents/local-agents/generate/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/integrations/github-actions/readme", + "source": "/agent-platform/agent-platform/integrations/github-actions/readme(/?)", "destination": "/platform/integrations/github-actions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/integrations/integrations-overview", + "source": "/agent-platform/agent-platform/integrations/integrations-overview(/?)", "destination": "/platform/integrations/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/model-choice", + "source": "/agent-platform/agent-platform/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/slash-commands", + "source": "/agent-platform/agent-platform/slash-commands(/?)", "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents", + "source": "/agent-platform/agent-platform/using-agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, @@ -451,7 +698,7 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context", + "source": "/agent-platform/agent-platform/using-agents/agent-context(/?)", "destination": "/agent-platform/local-agents/agent-context/", "statusCode": 308 }, @@ -461,7 +708,7 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/blocks-as-context", + "source": "/agent-platform/agent-platform/using-agents/agent-context/blocks-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, @@ -471,42 +718,42 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/images-as-context", + "source": "/agent-platform/agent-platform/using-agents/agent-context/images-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/selection-as-context", + "source": "/agent-platform/agent-platform/using-agents/agent-context/selection-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/urls-as-context", + "source": "/agent-platform/agent-platform/using-agents/agent-context/urls-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-context/using-to-add-context", + "source": "/agent-platform/agent-platform/using-agents/agent-context/using-to-add-context(/?)", "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-conversations", + "source": "/agent-platform/agent-platform/using-agents/agent-conversations(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-conversations/conversation-forking", + "source": "/agent-platform/agent-platform/using-agents/agent-conversations/conversation-forking(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-permissions", + "source": "/agent-platform/agent-platform/using-agents/agent-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-profiles-permissions", + "source": "/agent-platform/agent-platform/using-agents/agent-profiles-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, @@ -521,12 +768,12 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/agent-tasklists", + "source": "/agent-platform/agent-platform/using-agents/agent-tasklists(/?)", "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/managing-agents", + "source": "/agent-platform/agent-platform/using-agents/managing-agents(/?)", "destination": "/platform/managing-cloud-agents/", "statusCode": 308 }, @@ -536,7 +783,7 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/model-choice", + "source": "/agent-platform/agent-platform/using-agents/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, @@ -556,567 +803,567 @@ "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/planning", + "source": "/agent-platform/agent-platform/using-agents/planning(/?)", "destination": "/agent-platform/capabilities/planning/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/third-party-cli-agents", + "source": "/agent-platform/agent-platform/using-agents/third-party-cli-agents(/?)", "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/using-agents/web-search", + "source": "/agent-platform/agent-platform/using-agents/web-search(/?)", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/voice", + "source": "/agent-platform/agent-platform/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-platform/warp-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent-platform/warp-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/active-ai", + "source": "/agent-platform/agents/active-ai(/?)", "destination": "/agent-platform/local-agents/active-ai/", "statusCode": 308 }, { - "source": "/agent-platform/agents/agent-modality-beta", + "source": "/agent-platform/agents/agent-modality-beta(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/agents/agents-md", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agents/agents-md(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/agents-overview", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agents/agents-overview(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai", + "source": "/agent-platform/agents/ai(/?)", "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai-commander", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agents/ai-commander(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai-commands", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agents/ai-commands(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai-faqs", + "source": "/agent-platform/agents/ai-faqs(/?)", "destination": "/agent-platform/getting-started/faqs/", "statusCode": 308 }, { - "source": "/agent-platform/agents/ai-getting-started", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agents/ai-getting-started(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/autonomy", + "source": "/agent-platform/agents/autonomy(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agents/autonomy/agent-permissions", + "source": "/agent-platform/agents/autonomy/agent-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agents/autonomy/run-to-completion", + "source": "/agent-platform/agents/autonomy/run-to-completion(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agents/full-terminal-use", + "source": "/agent-platform/agents/full-terminal-use(/?)", "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, { - "source": "/agent-platform/agents/generate", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agents/generate(/?)", + "destination": "/agents/local-agents/generate/", "statusCode": 308 }, { - "source": "/agent-platform/agents/model-choice", + "source": "/agent-platform/agents/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agents/slash-commands", + "source": "/agent-platform/agents/slash-commands(/?)", "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents", + "source": "/agent-platform/agents/using-agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-context", + "source": "/agent-platform/agents/using-agents/agent-context(/?)", "destination": "/agent-platform/local-agents/agent-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-context/blocks-as-context", + "source": "/agent-platform/agents/using-agents/agent-context/blocks-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-context/images-as-context", + "source": "/agent-platform/agents/using-agents/agent-context/images-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-context/selection-as-context", + "source": "/agent-platform/agents/using-agents/agent-context/selection-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-context/urls-as-context", + "source": "/agent-platform/agents/using-agents/agent-context/urls-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-context/using-to-add-context", + "source": "/agent-platform/agents/using-agents/agent-context/using-to-add-context(/?)", "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-conversations", + "source": "/agent-platform/agents/using-agents/agent-conversations(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-conversations/conversation-forking", + "source": "/agent-platform/agents/using-agents/agent-conversations/conversation-forking(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-profiles-permissions", + "source": "/agent-platform/agents/using-agents/agent-profiles-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/agent-tasklists", + "source": "/agent-platform/agents/using-agents/agent-tasklists(/?)", "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/managing-agents", + "source": "/agent-platform/agents/using-agents/managing-agents(/?)", "destination": "/platform/managing-cloud-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/model-choice", + "source": "/agent-platform/agents/using-agents/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/planning", + "source": "/agent-platform/agents/using-agents/planning(/?)", "destination": "/agent-platform/capabilities/planning/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/profiles", + "source": "/agent-platform/agents/using-agents/profiles(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/third-party-cli-agents", + "source": "/agent-platform/agents/using-agents/third-party-cli-agents(/?)", "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agents/using-agents/web-search", + "source": "/agent-platform/agents/using-agents/web-search(/?)", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/agents/voice", + "source": "/agent-platform/agents/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/agents/warp-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agents/warp-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agents/warp-ai/agent-mode", + "source": "/agent-platform/agents/warp-ai/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/ai", + "source": "/agent-platform/ai(/?)", "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agent-platform/ai-features/ai-commands", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/ai-features/ai-commands(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/ai-features/model-choice", + "source": "/agent-platform/ai-features/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/ai/warp-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/ai/warp-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/ambient-agents", + "source": "/agent-platform/ambient-agents(/?)", "destination": "/platform/", "statusCode": 308 }, { - "source": "/agent-platform/ambient-agents/agent-secrets", + "source": "/agent-platform/ambient-agents/agent-secrets(/?)", "destination": "/platform/secrets/", "statusCode": 308 }, { - "source": "/agent-platform/ambient-agents/ambient-agents-overview", + "source": "/agent-platform/ambient-agents/ambient-agents-overview(/?)", "destination": "/platform/", "statusCode": 308 }, { - "source": "/agent-platform/ambient-agents/managing-ambient-agents", + "source": "/agent-platform/ambient-agents/managing-ambient-agents(/?)", "destination": "/platform/managing-cloud-agents/", "statusCode": 308 }, { - "source": "/agent-platform/ambient-agents/managing-ambient-agents/scheduled-agents", + "source": "/agent-platform/ambient-agents/managing-ambient-agents/scheduled-agents(/?)", "destination": "/platform/triggers/scheduled-agents/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/agent-session-sharing", + "source": "/agent-platform/cloud-agents/agent-session-sharing(/?)", "destination": "/agent-platform/local-agents/session-sharing/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/cloud-agent-secrets", + "source": "/agent-platform/cloud-agents/cloud-agent-secrets(/?)", "destination": "/platform/secrets/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/cloud-agents-faqs", + "source": "/agent-platform/cloud-agents/cloud-agents-faqs(/?)", "destination": "/platform/faqs/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/cloud-agents-overview", + "source": "/agent-platform/cloud-agents/cloud-agents-overview(/?)", "destination": "/platform/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/cloud-agents-platform", + "source": "/agent-platform/cloud-agents/cloud-agents-platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/cloud-agents-session-sharing", + "source": "/agent-platform/cloud-agents/cloud-agents-session-sharing(/?)", "destination": "/platform/viewing-cloud-agent-runs/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/managed-worker-reference", + "source": "/agent-platform/cloud-agents/managed-worker-reference(/?)", "destination": "/platform/self-hosting/reference/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/managed-worker-reference/direct-backend", + "source": "/agent-platform/cloud-agents/managed-worker-reference/direct-backend(/?)", "destination": "/platform/self-hosting/managed-direct/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/managed-worker-reference/docker-connectivity", + "source": "/agent-platform/cloud-agents/managed-worker-reference/docker-connectivity(/?)", "destination": "/platform/self-hosting/managed-docker/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/managed-worker-reference/helm-chart", + "source": "/agent-platform/cloud-agents/managed-worker-reference/helm-chart(/?)", "destination": "/platform/self-hosting/managed-kubernetes/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/managed-worker-reference/kubernetes-backend", + "source": "/agent-platform/cloud-agents/managed-worker-reference/kubernetes-backend(/?)", "destination": "/platform/self-hosting/managed-kubernetes/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/managed-worker-reference/private-docker-registries", + "source": "/agent-platform/cloud-agents/managed-worker-reference/private-docker-registries(/?)", "destination": "/platform/self-hosting/managed-docker/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/warp-platform", + "source": "/agent-platform/cloud-agents/warp-platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/code/code-review/interactive-code-review", + "source": "/agent-platform/code/code-review/interactive-code-review(/?)", "destination": "/agent-platform/local-agents/interactive-code-review/", "statusCode": 308 }, { - "source": "/agent-platform/code/codebase-context", + "source": "/agent-platform/code/codebase-context(/?)", "destination": "/agent-platform/capabilities/codebase-context/", "statusCode": 308 }, { - "source": "/agent-platform/code/reviewing-code", + "source": "/agent-platform/code/reviewing-code(/?)", "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, { - "source": "/agent-platform/features/agent-mode", + "source": "/agent-platform/features/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/agent-mode/agents-md", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/agent-mode/agents-md(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/agents", + "source": "/agent-platform/features/agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai", + "source": "/agent-platform/features/ai(/?)", "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-agents", + "source": "/agent-platform/features/ai-agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-agents", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai-and-agents(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-agents/agents", + "source": "/agent-platform/features/ai-and-agents/agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-ask-warp", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai-and-ask-warp(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-ask-warp-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai-and-ask-warp-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-session-history/warp-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai-and-session-history/warp-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-stack-overflow/agent-mode", + "source": "/agent-platform/features/ai-and-stack-overflow/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-and-warpdrive/warp-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai-and-warpdrive/warp-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-command", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai-command(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-command-search", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai-command-search(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-command-search/limits", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai-command-search/limits(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-command-search/model-choice", + "source": "/agent-platform/features/ai-command-search/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-command-suggestions", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai-command-suggestions(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-command/model-choice", + "source": "/agent-platform/features/ai-command/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-commands", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai-commands(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-features", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai-features(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai-features/ai-chat", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai-features/ai-chat(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/agent", + "source": "/agent-platform/features/ai/agent(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/agent-mode", + "source": "/agent-platform/features/ai/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/agents", + "source": "/agent-platform/features/ai/agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/ai-models-and-providers", + "source": "/agent-platform/features/ai/ai-models-and-providers(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/ai-setup", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai/ai-setup(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/assistant", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai/assistant(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/commands", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai/commands(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/commands-and-agents", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai/commands-and-agents(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/commands/agent-mode", + "source": "/agent-platform/features/ai/commands/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/commands/agents", + "source": "/agent-platform/features/ai/commands/agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/commands/ai-agent", + "source": "/agent-platform/features/ai/commands/ai-agent(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/commands/ai-commands-overview", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai/commands/ai-commands-overview(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/get-started-with-warp-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai/get-started-with-warp-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/model-choice", + "source": "/agent-platform/features/ai/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/using-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai/using-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/ai/using-warp-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/ai/using-warp-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/generate", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/generate(/?)", + "destination": "/agents/local-agents/generate/", "statusCode": 308 }, { - "source": "/agent-platform/features/integrations/mcp", + "source": "/agent-platform/features/integrations/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/features/knowledge", + "source": "/agent-platform/features/knowledge(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/features/model-choice", + "source": "/agent-platform/features/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/features/terminal-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/terminal-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/terminal-ai/ai-models", + "source": "/agent-platform/features/terminal-ai/ai-models(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/features/voice", + "source": "/agent-platform/features/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/warp-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/active-ai", + "source": "/agent-platform/features/warp-ai/active-ai(/?)", "destination": "/agent-platform/local-agents/active-ai/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/agent-mode", + "source": "/agent-platform/features/warp-ai/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, @@ -1126,427 +1373,427 @@ "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/agent-modea", + "source": "/agent-platform/features/warp-ai/agent-modea(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/ai-command-search", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/warp-ai/ai-command-search(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/ai-command-suggestions", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/warp-ai/ai-command-suggestions(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/generate", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/features/warp-ai/generate(/?)", + "destination": "/agents/local-agents/generate/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/knowledge", + "source": "/agent-platform/features/warp-ai/knowledge(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/mcp", + "source": "/agent-platform/features/warp-ai/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/rules", + "source": "/agent-platform/features/warp-ai/rules(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/features/warp-ai/voice", + "source": "/agent-platform/features/warp-ai/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/getting-started/quickstart-guide/agents-in-warp", - "destination": "/agent-platform/getting-started/agents-in-warp/", + "source": "/agent-platform/getting-started/quickstart-guide/agents-in-warp(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/integrations", + "source": "/agent-platform/integrations(/?)", "destination": "/platform/integrations/", "statusCode": 308 }, { - "source": "/agent-platform/integrations-overview", + "source": "/agent-platform/integrations-overview(/?)", "destination": "/platform/integrations/", "statusCode": 308 }, { - "source": "/agent-platform/integrations/github-actions", + "source": "/agent-platform/integrations/github-actions(/?)", "destination": "/platform/integrations/github-actions/", "statusCode": 308 }, { - "source": "/agent-platform/integrations/github-actions/demo-issue-triage-bot", + "source": "/agent-platform/integrations/github-actions/demo-issue-triage-bot(/?)", "destination": "/platform/integrations/quickstart-github-actions/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/integrations/demo-issue-triage-bot", + "source": "/agent-platform/cloud-agents/integrations/demo-issue-triage-bot(/?)", "destination": "/platform/integrations/quickstart-github-actions/", "statusCode": 308 }, { - "source": "/agent-platform/integrations/integrations-overview", + "source": "/agent-platform/integrations/integrations-overview(/?)", "destination": "/platform/integrations/", "statusCode": 308 }, { - "source": "/agent-platform/integrations/integrations-overview/team-access-billing-and-identity-permissions", + "source": "/agent-platform/integrations/integrations-overview/team-access-billing-and-identity-permissions(/?)", "destination": "/platform/team-access-billing-and-identity/", "statusCode": 308 }, { - "source": "/agent-platform/integrations/linear", + "source": "/agent-platform/integrations/linear(/?)", "destination": "/platform/integrations/linear/", "statusCode": 308 }, { - "source": "/agent-platform/integrations/slack", + "source": "/agent-platform/integrations/slack(/?)", "destination": "/platform/integrations/slack/", "statusCode": 308 }, { - "source": "/agent-platform/knowledge-and-collaboration/mcp", + "source": "/agent-platform/knowledge-and-collaboration/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/knowledge-and-collaboration/rules", + "source": "/agent-platform/knowledge-and-collaboration/rules(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/knowledge-and-collaboration/session-sharing/agent-session-sharing", + "source": "/agent-platform/knowledge-and-collaboration/session-sharing/agent-session-sharing(/?)", "destination": "/agent-platform/local-agents/session-sharing/", "statusCode": 308 }, { - "source": "/agent-platform/knowledge-and-collaboration/session-sharing/ambient-agents-session-sharing", + "source": "/agent-platform/knowledge-and-collaboration/session-sharing/ambient-agents-session-sharing(/?)", "destination": "/platform/viewing-cloud-agent-runs/", "statusCode": 308 }, { - "source": "/agent-platform/knowledge-and-collaboration/warp-drive/model-context-protocol-mcp", + "source": "/agent-platform/knowledge-and-collaboration/warp-drive/model-context-protocol-mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/local-agents(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/agent-notifications", + "source": "/agent-platform/local-agents/agent-notifications(/?)", "destination": "/agent-platform/capabilities/agent-notifications/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/agents-overview", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/local-agents/agents-overview(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/ambient-agents-session-sharing", + "source": "/agent-platform/local-agents/ambient-agents-session-sharing(/?)", "destination": "/platform/viewing-cloud-agent-runs/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/code-diffs-in-agent-conversations", + "source": "/agent-platform/local-agents/code-diffs-in-agent-conversations(/?)", "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, { "source": "/agent-platform/local-agents/generate", - "destination": "/agent-platform/local-agents/overview/", + "destination": "/agents/local-agents/generate/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality", + "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality-beta", + "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality-beta(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/local-agents/third-party-cli-agents", + "source": "/agent-platform/local-agents/third-party-cli-agents(/?)", "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/platform", + "source": "/agent-platform/platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/platform/deployment-patterns", + "source": "/agent-platform/platform/deployment-patterns(/?)", "destination": "/platform/deployment-patterns/", "statusCode": 308 }, { - "source": "/agent-platform/platform/environments", + "source": "/agent-platform/platform/environments(/?)", "destination": "/platform/environments/", "statusCode": 308 }, { - "source": "/agent-platform/platform/integrations/integrations-overview", + "source": "/agent-platform/platform/integrations/integrations-overview(/?)", "destination": "/platform/integrations/", "statusCode": 308 }, { - "source": "/agent-platform/platform/team-access-billing-and-identity-permissions", + "source": "/agent-platform/platform/team-access-billing-and-identity-permissions(/?)", "destination": "/platform/team-access-billing-and-identity/", "statusCode": 308 }, { - "source": "/agent-platform/platform/warp-platform", + "source": "/agent-platform/platform/warp-platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/settings/ai-agents", + "source": "/agent-platform/settings/ai-agents(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/terminal-ai/getting-started", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/terminal-ai/getting-started(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/terminal/ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/terminal/ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/terminal/ai/agent-mode", + "source": "/agent-platform/terminal/ai/agent-mode(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/terminal/warp-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/terminal/warp-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/third-party-agents/claude-code", + "source": "/agent-platform/third-party-agents/claude-code(/?)", "destination": "/agent-platform/cli-agents/claude-code/", "statusCode": 308 }, { - "source": "/agent-platform/third-party-agents/codex", + "source": "/agent-platform/third-party-agents/codex(/?)", "destination": "/agent-platform/cli-agents/codex/", "statusCode": 308 }, { - "source": "/agent-platform/third-party-agents/opencode", + "source": "/agent-platform/third-party-agents/opencode(/?)", "destination": "/agent-platform/cli-agents/opencode/", "statusCode": 308 }, { - "source": "/agent-platform/third-party-agents/overview", + "source": "/agent-platform/third-party-agents/overview(/?)", "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/third-party-agents/remote-control", + "source": "/agent-platform/third-party-agents/remote-control(/?)", "destination": "/agent-platform/cli-agents/remote-control/", "statusCode": 308 }, { - "source": "/agent-platform/third-party-agents/rich-input", + "source": "/agent-platform/third-party-agents/rich-input(/?)", "destination": "/agent-platform/cli-agents/rich-input/", "statusCode": 308 }, { - "source": "/agent-platform/using-agents/managing-agents", + "source": "/agent-platform/using-agents/managing-agents(/?)", "destination": "/platform/managing-cloud-agents/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/active-ai", + "source": "/agent-platform/warp-agents/active-ai(/?)", "destination": "/agent-platform/local-agents/active-ai/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context/blocks-as-context", + "source": "/agent-platform/warp-agents/agent-context/blocks-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context/images-as-context", + "source": "/agent-platform/warp-agents/agent-context/images-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context/selection-as-context", + "source": "/agent-platform/warp-agents/agent-context/selection-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context/urls-as-context", + "source": "/agent-platform/warp-agents/agent-context/urls-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context/using-to-add-context", + "source": "/agent-platform/warp-agents/agent-context/using-to-add-context(/?)", "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-notifications", + "source": "/agent-platform/warp-agents/agent-notifications(/?)", "destination": "/agent-platform/capabilities/agent-notifications/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-profiles-permissions", + "source": "/agent-platform/warp-agents/agent-profiles-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview", + "source": "/agent-platform/warp-agents/capabilities-overview(/?)", "destination": "/agent-platform/capabilities/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/cloud-conversations", + "source": "/agent-platform/warp-agents/cloud-conversations(/?)", "destination": "/agent-platform/local-agents/cloud-conversations/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/code-diffs", + "source": "/agent-platform/warp-agents/code-diffs(/?)", "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/codebase-context", + "source": "/agent-platform/warp-agents/codebase-context(/?)", "destination": "/agent-platform/capabilities/codebase-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/computer-use", + "source": "/agent-platform/warp-agents/computer-use(/?)", "destination": "/agent-platform/capabilities/computer-use/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/full-terminal-use", + "source": "/agent-platform/warp-agents/full-terminal-use(/?)", "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/interacting-with-agents/conversation-forking", + "source": "/agent-platform/warp-agents/interacting-with-agents/conversation-forking(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/interacting-with-agents/terminal-and-agent-modes", + "source": "/agent-platform/warp-agents/interacting-with-agents/terminal-and-agent-modes(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/interacting-with-agents/voice", + "source": "/agent-platform/warp-agents/interacting-with-agents/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/interactive-code-review", + "source": "/agent-platform/warp-agents/interactive-code-review(/?)", "destination": "/agent-platform/local-agents/interactive-code-review/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/mcp", + "source": "/agent-platform/warp-agents/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/model-choice", + "source": "/agent-platform/warp-agents/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/planning", + "source": "/agent-platform/warp-agents/planning(/?)", "destination": "/agent-platform/capabilities/planning/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/rules", + "source": "/agent-platform/warp-agents/rules(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/session-sharing", + "source": "/agent-platform/warp-agents/session-sharing(/?)", "destination": "/agent-platform/local-agents/session-sharing/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/skills", + "source": "/agent-platform/warp-agents/skills(/?)", "destination": "/agent-platform/capabilities/skills/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/slash-commands", + "source": "/agent-platform/warp-agents/slash-commands(/?)", "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/task-lists", + "source": "/agent-platform/warp-agents/task-lists(/?)", "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/web-search", + "source": "/agent-platform/warp-agents/web-search(/?)", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/warp-ai", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/warp-ai(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/warp-ai/assistant", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/warp-ai/assistant(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/warp-ai/get-started", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/warp-ai/get-started(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/warp-platform", + "source": "/agent-platform/warp-platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/appearance/app-icons", + "source": "/appearance/app-icons(/?)", "destination": "/terminal/appearance/app-icons/", "statusCode": 308 }, { - "source": "/appearance/blocks-behavior", + "source": "/appearance/blocks-behavior(/?)", "destination": "/terminal/appearance/blocks-behavior/", "statusCode": 308 }, { - "source": "/appearance/compact-mode", + "source": "/appearance/compact-mode(/?)", "destination": "/terminal/appearance/blocks-behavior/", "statusCode": 308 }, { - "source": "/appearance/custom-themes", + "source": "/appearance/custom-themes(/?)", "destination": "/terminal/appearance/custom-themes/", "statusCode": 308 }, @@ -1556,17 +1803,17 @@ "statusCode": 308 }, { - "source": "/appearance/input-position", + "source": "/appearance/input-position(/?)", "destination": "/terminal/appearance/input-position/", "statusCode": 308 }, { - "source": "/appearance/pane-dimming", + "source": "/appearance/pane-dimming(/?)", "destination": "/terminal/appearance/pane-dimming/", "statusCode": 308 }, { - "source": "/appearance/prompt", + "source": "/appearance/prompt(/?)", "destination": "/terminal/appearance/prompt/", "statusCode": 308 }, @@ -1576,92 +1823,92 @@ "statusCode": 308 }, { - "source": "/appearance/size-opacity-blurring", + "source": "/appearance/size-opacity-blurring(/?)", "destination": "/terminal/appearance/size-opacity-blurring/", "statusCode": 308 }, { - "source": "/appearance/tab-indicators", + "source": "/appearance/tab-indicators(/?)", "destination": "/terminal/appearance/tabs-behavior/", "statusCode": 308 }, { - "source": "/appearance/tabs-behavior", + "source": "/appearance/tabs-behavior(/?)", "destination": "/terminal/appearance/tabs-behavior/", "statusCode": 308 }, { - "source": "/appearance/text-fonts-cursor", + "source": "/appearance/text-fonts-cursor(/?)", "destination": "/terminal/appearance/text-fonts-cursor/", "statusCode": 308 }, { - "source": "/appearance/themes", + "source": "/appearance/themes(/?)", "destination": "/terminal/appearance/themes/", "statusCode": 308 }, { - "source": "/appearance/transparency-and-blurring", + "source": "/appearance/transparency-and-blurring(/?)", "destination": "/terminal/appearance/size-opacity-blurring/", "statusCode": 308 }, { - "source": "/changelog/changelog/rss", + "source": "/changelog/changelog/rss(/?)", "destination": "/changelog/rss.xml", "statusCode": 308 }, { - "source": "/changelog/getting-started/changelog", + "source": "/changelog/getting-started/changelog(/?)", "destination": "/changelog/", "statusCode": 308 }, { - "source": "/changelog/help/changelog", + "source": "/changelog/help/changelog(/?)", "destination": "/changelog/", "statusCode": 308 }, { - "source": "/changelog/release-notes", + "source": "/changelog/release-notes(/?)", "destination": "/changelog/", "statusCode": 308 }, { - "source": "/changelog/rss", + "source": "/changelog/rss(/?)", "destination": "/changelog/rss.xml", "statusCode": 308 }, { - "source": "/changelog/url/docs.warp.dev/getting-started/changelog", + "source": "/changelog/url/docs.warp.dev/getting-started/changelog(/?)", "destination": "/changelog/", "statusCode": 308 }, { - "source": "/changelog/warp/getting-started/changelog", + "source": "/changelog/warp/getting-started/changelog(/?)", "destination": "/changelog/", "statusCode": 308 }, { - "source": "/code-editor", + "source": "/code-editor(/?)", "destination": "/code/code-editor/", "statusCode": 308 }, { - "source": "/code/code-overview", + "source": "/code/code-overview(/?)", "destination": "/code/overview/", "statusCode": 308 }, { - "source": "/code/code-review/interactive-code-review", + "source": "/code/code-review/interactive-code-review(/?)", "destination": "/code/code-review/", "statusCode": 308 }, { - "source": "/code/reviewing-code", + "source": "/code/reviewing-code(/?)", "destination": "/code/code-review/", "statusCode": 308 }, { - "source": "/configuration", + "source": "/configuration(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, @@ -1676,122 +1923,122 @@ "statusCode": 308 }, { - "source": "/features", + "source": "/features(/?)", "destination": "/", "statusCode": 308 }, { - "source": "/features/accessibility", + "source": "/features/accessibility(/?)", "destination": "/terminal/more-features/accessibility/", "statusCode": 308 }, { - "source": "/features/advanced/settings", + "source": "/features/advanced/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/features/appearance", + "source": "/features/appearance(/?)", "destination": "/terminal/appearance/", "statusCode": 308 }, { - "source": "/features/appearance/compact-mode", + "source": "/features/appearance/compact-mode(/?)", "destination": "/terminal/appearance/blocks-behavior/", "statusCode": 308 }, { - "source": "/features/appearance/custom-themes", + "source": "/features/appearance/custom-themes(/?)", "destination": "/terminal/appearance/custom-themes/", "statusCode": 308 }, { - "source": "/features/appearance/prompt", + "source": "/features/appearance/prompt(/?)", "destination": "/terminal/appearance/prompt/", "statusCode": 308 }, { - "source": "/features/appearance/themes", + "source": "/features/appearance/themes(/?)", "destination": "/terminal/appearance/themes/", "statusCode": 308 }, { - "source": "/features/blocks", + "source": "/features/blocks(/?)", "destination": "/terminal/blocks/", "statusCode": 308 }, { - "source": "/features/blocks/background-blocks", + "source": "/features/blocks/background-blocks(/?)", "destination": "/terminal/blocks/background-blocks/", "statusCode": 308 }, { - "source": "/features/blocks/block-actions", + "source": "/features/blocks/block-actions(/?)", "destination": "/terminal/blocks/block-actions/", "statusCode": 308 }, { - "source": "/features/blocks/block-basics", + "source": "/features/blocks/block-basics(/?)", "destination": "/terminal/blocks/block-basics/", "statusCode": 308 }, { - "source": "/features/blocks/block-filtering", + "source": "/features/blocks/block-filtering(/?)", "destination": "/terminal/blocks/block-filtering/", "statusCode": 308 }, { - "source": "/features/blocks/block-sharing", + "source": "/features/blocks/block-sharing(/?)", "destination": "/terminal/blocks/block-sharing/", "statusCode": 308 }, { - "source": "/features/blocks/sticky-command-header", + "source": "/features/blocks/sticky-command-header(/?)", "destination": "/terminal/blocks/sticky-command-header/", "statusCode": 308 }, { - "source": "/features/command-completions", + "source": "/features/command-completions(/?)", "destination": "/terminal/command-completions/", "statusCode": 308 }, { - "source": "/features/command-completions/autosuggestions", + "source": "/features/command-completions/autosuggestions(/?)", "destination": "/terminal/command-completions/autosuggestions/", "statusCode": 308 }, { - "source": "/features/command-completions/completions", + "source": "/features/command-completions/completions(/?)", "destination": "/terminal/command-completions/completions/", "statusCode": 308 }, { - "source": "/features/command-history", + "source": "/features/command-history(/?)", "destination": "/terminal/entry/command-history/", "statusCode": 308 }, { - "source": "/features/command-inspector", + "source": "/features/command-inspector(/?)", "destination": "/terminal/editor/command-inspector/", "statusCode": 308 }, { - "source": "/features/command-palette", + "source": "/features/command-palette(/?)", "destination": "/terminal/command-palette/", "statusCode": 308 }, { - "source": "/features/command-search", + "source": "/features/command-search(/?)", "destination": "/terminal/entry/command-search/", "statusCode": 308 }, { - "source": "/features/compact-mode", + "source": "/features/compact-mode(/?)", "destination": "/terminal/appearance/blocks-behavior/", "statusCode": 308 }, { - "source": "/features/completions", + "source": "/features/completions(/?)", "destination": "/terminal/command-completions/completions/", "statusCode": 308 }, @@ -1806,162 +2053,162 @@ "statusCode": 308 }, { - "source": "/features/customize/custom-keyboard-shortcuts", + "source": "/features/customize/custom-keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/features/editor", + "source": "/features/editor(/?)", "destination": "/terminal/editor/", "statusCode": 308 }, { - "source": "/features/editor/alias-expansion", + "source": "/features/editor/alias-expansion(/?)", "destination": "/terminal/editor/alias-expansion/", "statusCode": 308 }, { - "source": "/features/editor/command-corrections", + "source": "/features/editor/command-corrections(/?)", "destination": "/terminal/entry/command-corrections/", "statusCode": 308 }, { - "source": "/features/editor/command-inspector", + "source": "/features/editor/command-inspector(/?)", "destination": "/terminal/editor/command-inspector/", "statusCode": 308 }, { - "source": "/features/editor/syntax-error-highlighting", + "source": "/features/editor/syntax-error-highlighting(/?)", "destination": "/terminal/editor/syntax-error-highlighting/", "statusCode": 308 }, { - "source": "/features/editor/vim", + "source": "/features/editor/vim(/?)", "destination": "/terminal/editor/vim/", "statusCode": 308 }, { - "source": "/features/entry", + "source": "/features/entry(/?)", "destination": "/terminal/entry/", "statusCode": 308 }, { - "source": "/features/entry/command-corrections", + "source": "/features/entry/command-corrections(/?)", "destination": "/terminal/entry/command-corrections/", "statusCode": 308 }, { - "source": "/features/entry/command-history", + "source": "/features/entry/command-history(/?)", "destination": "/terminal/entry/command-history/", "statusCode": 308 }, { - "source": "/features/entry/command-search", + "source": "/features/entry/command-search(/?)", "destination": "/terminal/entry/command-search/", "statusCode": 308 }, { - "source": "/features/entry/synchronized-inputs", + "source": "/features/entry/synchronized-inputs(/?)", "destination": "/terminal/entry/synchronized-inputs/", "statusCode": 308 }, { - "source": "/features/entry/workflows", + "source": "/features/entry/workflows(/?)", "destination": "/terminal/entry/yaml-workflows/", "statusCode": 308 }, { - "source": "/features/entry/yaml-workflows", + "source": "/features/entry/yaml-workflows(/?)", "destination": "/terminal/entry/yaml-workflows/", "statusCode": 308 }, { - "source": "/features/files-and-links", + "source": "/features/files-and-links(/?)", "destination": "/terminal/more-features/files-and-links/", "statusCode": 308 }, { - "source": "/features/find", + "source": "/features/find(/?)", "destination": "/terminal/blocks/find/", "statusCode": 308 }, { - "source": "/features/full-screen-apps", + "source": "/features/full-screen-apps(/?)", "destination": "/terminal/more-features/full-screen-apps/", "statusCode": 308 }, { - "source": "/features/global-hotkey", + "source": "/features/global-hotkey(/?)", "destination": "/terminal/windows/global-hotkey/", "statusCode": 308 }, { - "source": "/features/hotkey-window", + "source": "/features/hotkey-window(/?)", "destination": "/terminal/windows/global-hotkey/", "statusCode": 308 }, { - "source": "/features/integrations", + "source": "/features/integrations(/?)", "destination": "/terminal/integrations-and-plugins/", "statusCode": 308 }, { - "source": "/features/integrations-and-plugins", + "source": "/features/integrations-and-plugins(/?)", "destination": "/terminal/integrations-and-plugins/", "statusCode": 308 }, { - "source": "/features/integrations/urls-and-deep-links", + "source": "/features/integrations/urls-and-deep-links(/?)", "destination": "/terminal/more-features/uri-scheme/", "statusCode": 308 }, { - "source": "/features/keybindings", + "source": "/features/keybindings(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/features/keyboard-input", + "source": "/features/keyboard-input(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/features/keyboard-shortcuts", + "source": "/features/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/features/knowledge", + "source": "/features/knowledge(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/features/launch-configurations", + "source": "/features/launch-configurations(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/features/linux", + "source": "/features/linux(/?)", "destination": "/terminal/more-features/linux/", "statusCode": 308 }, { - "source": "/features/markdown-viewer", + "source": "/features/markdown-viewer(/?)", "destination": "/terminal/more-features/markdown-viewer/", "statusCode": 308 }, { - "source": "/features/notifications", + "source": "/features/notifications(/?)", "destination": "/terminal/more-features/notifications/", "statusCode": 308 }, { - "source": "/features/overview", + "source": "/features/overview(/?)", "destination": "/", "statusCode": 308 }, { - "source": "/features/prompt", + "source": "/features/prompt(/?)", "destination": "/terminal/appearance/prompt/", "statusCode": 308 }, @@ -1986,227 +2233,227 @@ "statusCode": 308 }, { - "source": "/features/quit-warning", + "source": "/features/quit-warning(/?)", "destination": "/terminal/more-features/quit-warning/", "statusCode": 308 }, { - "source": "/features/session-management-and-restoration", + "source": "/features/session-management-and-restoration(/?)", "destination": "/terminal/sessions/", "statusCode": 308 }, { - "source": "/features/session-management/launch-configurations", + "source": "/features/session-management/launch-configurations(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/features/session-management/session-navigation", + "source": "/features/session-management/session-navigation(/?)", "destination": "/terminal/sessions/session-navigation/", "statusCode": 308 }, { - "source": "/features/session-management/session-restoration", + "source": "/features/session-management/session-restoration(/?)", "destination": "/terminal/sessions/session-restoration/", "statusCode": 308 }, { - "source": "/features/session-sharing", + "source": "/features/session-sharing(/?)", "destination": "/knowledge-and-collaboration/session-sharing/", "statusCode": 308 }, { - "source": "/features/sessions", + "source": "/features/sessions(/?)", "destination": "/terminal/sessions/", "statusCode": 308 }, { - "source": "/features/sessions/README", + "source": "/features/sessions/README(/?)", "destination": "/terminal/sessions/", "statusCode": 308 }, { - "source": "/features/sessions/launch-configurations", + "source": "/features/sessions/launch-configurations(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/features/sessions/quit-warning-modal", + "source": "/features/sessions/quit-warning-modal(/?)", "destination": "/terminal/more-features/quit-warning/", "statusCode": 308 }, { - "source": "/features/sessions/session-navigation", + "source": "/features/sessions/session-navigation(/?)", "destination": "/terminal/sessions/session-navigation/", "statusCode": 308 }, { - "source": "/features/sessions/session-restoration", + "source": "/features/sessions/session-restoration(/?)", "destination": "/terminal/sessions/session-restoration/", "statusCode": 308 }, { - "source": "/features/sessions/sharing-sessions", + "source": "/features/sessions/sharing-sessions(/?)", "destination": "/knowledge-and-collaboration/session-sharing/", "statusCode": 308 }, { - "source": "/features/settings", + "source": "/features/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/features/settings-sync", + "source": "/features/settings-sync(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/features/settings/configuration-files", + "source": "/features/settings/configuration-files(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/features/smart-select", + "source": "/features/smart-select(/?)", "destination": "/terminal/more-features/text-selection/", "statusCode": 308 }, { - "source": "/features/split-panes", + "source": "/features/split-panes(/?)", "destination": "/terminal/windows/split-panes/", "statusCode": 308 }, { - "source": "/features/ssh", + "source": "/features/ssh(/?)", "destination": "/terminal/warpify/ssh-legacy/", "statusCode": 308 }, { - "source": "/features/subshells", + "source": "/features/subshells(/?)", "destination": "/terminal/warpify/subshells/", "statusCode": 308 }, { - "source": "/features/system-settings", + "source": "/features/system-settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/features/tabs", + "source": "/features/tabs(/?)", "destination": "/terminal/windows/tabs/", "statusCode": 308 }, { - "source": "/features/teams", + "source": "/features/teams(/?)", "destination": "/knowledge-and-collaboration/teams/", "statusCode": 308 }, { - "source": "/features/terminal-features", + "source": "/features/terminal-features(/?)", "destination": "/terminal/blocks/", "statusCode": 308 }, { - "source": "/features/the-input-editor", + "source": "/features/the-input-editor(/?)", "destination": "/terminal/editor/", "statusCode": 308 }, { - "source": "/features/themes", + "source": "/features/themes(/?)", "destination": "/terminal/appearance/themes/", "statusCode": 308 }, { - "source": "/features/themes/custom-themes", + "source": "/features/themes/custom-themes(/?)", "destination": "/terminal/appearance/custom-themes/", "statusCode": 308 }, { - "source": "/features/uri-scheme", + "source": "/features/uri-scheme(/?)", "destination": "/terminal/more-features/uri-scheme/", "statusCode": 308 }, { - "source": "/features/warp-ai/code", + "source": "/features/warp-ai/code(/?)", "destination": "/code/overview/", "statusCode": 308 }, { - "source": "/features/warp-ai/knowledge", + "source": "/features/warp-ai/knowledge(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/features/warp-ai/mcp", + "source": "/features/warp-ai/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/features/warp-ai/rules", + "source": "/features/warp-ai/rules(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/features/warp-drive", + "source": "/features/warp-drive(/?)", "destination": "/knowledge-and-collaboration/warp-drive/", "statusCode": 308 }, { - "source": "/features/warp-drive/environment-variables", + "source": "/features/warp-drive/environment-variables(/?)", "destination": "/knowledge-and-collaboration/warp-drive/environment-variables/", "statusCode": 308 }, { - "source": "/features/warp-drive/notebooks", + "source": "/features/warp-drive/notebooks(/?)", "destination": "/knowledge-and-collaboration/warp-drive/notebooks/", "statusCode": 308 }, { - "source": "/features/warp-drive/prompts", + "source": "/features/warp-drive/prompts(/?)", "destination": "/knowledge-and-collaboration/warp-drive/prompts/", "statusCode": 308 }, { - "source": "/features/warp-drive/warp-drive-on-the-web", + "source": "/features/warp-drive/warp-drive-on-the-web(/?)", "destination": "/knowledge-and-collaboration/warp-drive/web/", "statusCode": 308 }, { - "source": "/features/warp-drive/warp-drive-on-the-web-beta", + "source": "/features/warp-drive/warp-drive-on-the-web-beta(/?)", "destination": "/knowledge-and-collaboration/warp-drive/web/", "statusCode": 308 }, { - "source": "/features/warp-drive/workflows", + "source": "/features/warp-drive/workflows(/?)", "destination": "/knowledge-and-collaboration/warp-drive/workflows/", "statusCode": 308 }, { - "source": "/features/warpify", + "source": "/features/warpify(/?)", "destination": "/terminal/warpify/", "statusCode": 308 }, { - "source": "/features/warpify/ssh", + "source": "/features/warpify/ssh(/?)", "destination": "/terminal/warpify/ssh/", "statusCode": 308 }, { - "source": "/features/warpify/ssh-legacy", + "source": "/features/warpify/ssh-legacy(/?)", "destination": "/terminal/warpify/ssh-legacy/", "statusCode": 308 }, { - "source": "/features/warpify/subshells", + "source": "/features/warpify/subshells(/?)", "destination": "/terminal/warpify/subshells/", "statusCode": 308 }, { - "source": "/features/windows", + "source": "/features/windows(/?)", "destination": "/terminal/windows/", "statusCode": 308 }, { - "source": "/features/windows/global-hotkey", + "source": "/features/windows/global-hotkey(/?)", "destination": "/terminal/windows/global-hotkey/", "statusCode": 308 }, @@ -2216,37 +2463,37 @@ "statusCode": 308 }, { - "source": "/features/windows/split-panes", + "source": "/features/windows/split-panes(/?)", "destination": "/terminal/windows/split-panes/", "statusCode": 308 }, { - "source": "/features/windows/tabs", + "source": "/features/windows/tabs(/?)", "destination": "/terminal/windows/tabs/", "statusCode": 308 }, { - "source": "/features/windows/~", + "source": "/features/windows/~(/?)", "destination": "/terminal/windows/", "statusCode": 308 }, { - "source": "/features/workflows", + "source": "/features/workflows(/?)", "destination": "/terminal/entry/yaml-workflows/", "statusCode": 308 }, { - "source": "/features/workflows/block-metrics/shortcuts", + "source": "/features/workflows/block-metrics/shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/features/working-directory", + "source": "/features/working-directory(/?)", "destination": "/terminal/more-features/working-directory/", "statusCode": 308 }, { - "source": "/features/workspaces", + "source": "/features/workspaces(/?)", "destination": "/terminal/sessions/", "statusCode": 308 }, @@ -2256,37 +2503,37 @@ "statusCode": 308 }, { - "source": "/getting-started/account-and-login", + "source": "/getting-started/account-and-login(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/coding-in-warp", + "source": "/getting-started/coding-in-warp(/?)", "destination": "/getting-started/quickstart/coding-in-warp/", "statusCode": 308 }, { - "source": "/getting-started/customizing-warp", + "source": "/getting-started/customizing-warp(/?)", "destination": "/getting-started/quickstart/customizing-warp/", "statusCode": 308 }, { - "source": "/getting-started/customizing-warp/settings", + "source": "/getting-started/customizing-warp/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/getting-started/download-and-install", + "source": "/getting-started/download-and-install(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/downloading-warp", + "source": "/getting-started/downloading-warp(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/getting-started-with-warp", + "source": "/getting-started/getting-started-with-warp(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, @@ -2311,132 +2558,132 @@ "statusCode": 308 }, { - "source": "/getting-started/getting-started-with-warp-on-linux", + "source": "/getting-started/getting-started-with-warp-on-linux(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/guides/shortcuts", + "source": "/getting-started/guides/shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/getting-started/how-to-use-warp", + "source": "/getting-started/how-to-use-warp(/?)", "destination": "/", "statusCode": 308 }, { - "source": "/getting-started/installation", + "source": "/getting-started/installation(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/installation-and-setup", + "source": "/getting-started/installation-and-setup(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/installation/linux", + "source": "/getting-started/installation/linux(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/installing-warp", + "source": "/getting-started/installing-warp(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/installing-warp-on-linux", + "source": "/getting-started/installing-warp-on-linux(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/launch-configurations", + "source": "/getting-started/launch-configurations(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/getting-started/launching-warp", + "source": "/getting-started/launching-warp(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/linux", + "source": "/getting-started/linux(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/linux-installation", + "source": "/getting-started/linux-installation(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/mac-permissions", + "source": "/getting-started/mac-permissions(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/quickstart-guide", + "source": "/getting-started/quickstart-guide(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/quickstart-guide/README", + "source": "/getting-started/quickstart-guide/README(/?)", "destination": "/quickstart/", "statusCode": 308 }, { - "source": "/getting-started/quickstart-guide/agents-in-warp", - "destination": "/agent-platform/getting-started/agents-in-warp/", + "source": "/getting-started/quickstart-guide/agents-in-warp(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/getting-started/quickstart-guide/coding-in-warp", + "source": "/getting-started/quickstart-guide/coding-in-warp(/?)", "destination": "/getting-started/quickstart/coding-in-warp/", "statusCode": 308 }, { - "source": "/getting-started/quickstart-guide/customizing-warp", + "source": "/getting-started/quickstart-guide/customizing-warp(/?)", "destination": "/getting-started/quickstart/customizing-warp/", "statusCode": 308 }, { - "source": "/getting-started/quickstart-guide/installation-and-setup", + "source": "/getting-started/quickstart-guide/installation-and-setup(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/settings", + "source": "/getting-started/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/getting-started/syncing-your-terminal", + "source": "/getting-started/syncing-your-terminal(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/getting-started/terminal", + "source": "/getting-started/terminal(/?)", "destination": "/terminal/blocks/", "statusCode": 308 }, { - "source": "/getting-started/using-warp-with-shells", + "source": "/getting-started/using-warp-with-shells(/?)", "destination": "/getting-started/supported-shells/", "statusCode": 308 }, { - "source": "/getting-started/what-is-warp", + "source": "/getting-started/what-is-warp(/?)", "destination": "/", "statusCode": 308 }, { - "source": "/guide/ssh-guide", + "source": "/guide/ssh-guide(/?)", "destination": "/terminal/warpify/ssh/", "statusCode": 308 }, { - "source": "/guides/ssh-quickstart", + "source": "/guides/ssh-quickstart(/?)", "destination": "/terminal/warpify/ssh/", "statusCode": 308 }, @@ -2446,162 +2693,162 @@ "statusCode": 308 }, { - "source": "/how-does-warp-compare/performance", + "source": "/how-does-warp-compare/performance(/?)", "destination": "/terminal/comparisons/performance/", "statusCode": 308 }, { - "source": "/how-does-warp-compare/terminal-features", + "source": "/how-does-warp-compare/terminal-features(/?)", "destination": "/terminal/comparisons/terminal-features/", "statusCode": 308 }, { - "source": "/installation", + "source": "/installation(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/installation/linux", + "source": "/installation/linux(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/keyboard-shortcuts", + "source": "/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/knowledge-and-collaboration/warp-drive/warp-drive-as-agent-mode-context", + "source": "/knowledge-and-collaboration/warp-drive/warp-drive-as-agent-mode-context(/?)", "destination": "/knowledge-and-collaboration/warp-drive/agent-mode-context/", "statusCode": 308 }, { - "source": "/knowledge-and-collaboration/warp-drive/warp-drive-on-the-web", + "source": "/knowledge-and-collaboration/warp-drive/warp-drive-on-the-web(/?)", "destination": "/knowledge-and-collaboration/warp-drive/web/", "statusCode": 308 }, { - "source": "/knowledge-and-collaboration/workflows", + "source": "/knowledge-and-collaboration/workflows(/?)", "destination": "/knowledge-and-collaboration/warp-drive/workflows/", "statusCode": 308 }, { - "source": "/quick-start", + "source": "/quick-start(/?)", "destination": "/quickstart/", "statusCode": 308 }, { - "source": "/readme", + "source": "/readme(/?)", "destination": "/", "statusCode": 308 }, { - "source": "/reference/agent-api-and-sdk", + "source": "/reference/agent-api-and-sdk(/?)", "destination": "/reference/api-and-sdk/", "statusCode": 308 }, { - "source": "/reference/ambient-agents/mcp-servers-for-agents", + "source": "/reference/ambient-agents/mcp-servers-for-agents(/?)", "destination": "/reference/cli/mcp-servers/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/agent", + "source": "/reference/api-and-sdk/agent(/?)", "destination": "/api#tag/agent", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/agent-1", + "source": "/reference/api-and-sdk/agent-1(/?)", "destination": "/api", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/schedules", + "source": "/reference/api-and-sdk/schedules(/?)", "destination": "/api#tag/schedules", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/authentication_required", + "source": "/reference/api-and-sdk/troubleshooting/errors/authentication_required(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/authentication-required/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/budget_exceeded", + "source": "/reference/api-and-sdk/troubleshooting/errors/budget_exceeded(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/budget-exceeded/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/content_policy_violation", + "source": "/reference/api-and-sdk/troubleshooting/errors/content_policy_violation(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/content-policy-violation/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/environment_setup_failed", + "source": "/reference/api-and-sdk/troubleshooting/errors/environment_setup_failed(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/external_authentication_required", + "source": "/reference/api-and-sdk/troubleshooting/errors/external_authentication_required(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/agent_process_failed", + "source": "/reference/api-and-sdk/troubleshooting/errors/agent_process_failed(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/agent-process-failed/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/feature_not_available", + "source": "/reference/api-and-sdk/troubleshooting/errors/feature_not_available(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/feature-not-available/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/infrastructure_timeout", + "source": "/reference/api-and-sdk/troubleshooting/errors/infrastructure_timeout(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/infrastructure-timeout/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/insufficient_credits", + "source": "/reference/api-and-sdk/troubleshooting/errors/insufficient_credits(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/integration_disabled", + "source": "/reference/api-and-sdk/troubleshooting/errors/integration_disabled(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/integration-disabled/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/integration_not_configured", + "source": "/reference/api-and-sdk/troubleshooting/errors/integration_not_configured(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/integration-not-configured/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/internal_error", + "source": "/reference/api-and-sdk/troubleshooting/errors/internal_error(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/internal-error/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/invalid_request", + "source": "/reference/api-and-sdk/troubleshooting/errors/invalid_request(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/invalid-request/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/not_authorized", + "source": "/reference/api-and-sdk/troubleshooting/errors/not_authorized(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/not-authorized/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/operation_not_supported", + "source": "/reference/api-and-sdk/troubleshooting/errors/operation_not_supported(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/operation-not-supported/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/resource_not_found", + "source": "/reference/api-and-sdk/troubleshooting/errors/resource_not_found(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/resource-not-found/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/troubleshooting/errors/resource_unavailable", + "source": "/reference/api-and-sdk/troubleshooting/errors/resource_unavailable(/?)", "destination": "/reference/api-and-sdk/troubleshooting/errors/resource-unavailable/", "statusCode": 308 }, @@ -2621,22 +2868,22 @@ "statusCode": 308 }, { - "source": "/reference/cli/integrations-and-environments", + "source": "/reference/cli/integrations-and-environments(/?)", "destination": "/reference/cli/integration-setup/", "statusCode": 308 }, { - "source": "/reference/cli/mcp-for-cloud-agents", + "source": "/reference/cli/mcp-for-cloud-agents(/?)", "destination": "/reference/cli/mcp-servers/", "statusCode": 308 }, { - "source": "/reference/cli/mcp-servers-for-cloud-agents", + "source": "/reference/cli/mcp-servers-for-cloud-agents(/?)", "destination": "/reference/cli/mcp-servers/", "statusCode": 308 }, { - "source": "/reference/developers/cli", + "source": "/reference/developers/cli(/?)", "destination": "/reference/cli/", "statusCode": 308 }, @@ -2656,7 +2903,7 @@ "statusCode": 308 }, { - "source": "/reference/integrations/integrations-overview/integrations-and-environments", + "source": "/reference/integrations/integrations-overview/integrations-and-environments(/?)", "destination": "/reference/cli/integration-setup/", "statusCode": 308 }, @@ -2666,17 +2913,17 @@ "statusCode": 308 }, { - "source": "/reference/keybindings", + "source": "/reference/keybindings(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/reference/keyboard-shortcuts", + "source": "/reference/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/reference/platform/agent-api-and-sdk", + "source": "/reference/platform/agent-api-and-sdk(/?)", "destination": "/reference/api-and-sdk/", "statusCode": 308 }, @@ -2686,22 +2933,22 @@ "statusCode": 308 }, { - "source": "/reference/platform/agent-api-and-sdk/agent", + "source": "/reference/platform/agent-api-and-sdk/agent(/?)", "destination": "/reference/api-and-sdk/", "statusCode": 308 }, { - "source": "/reference/platform/agent-api-and-sdk/agent-1", + "source": "/reference/platform/agent-api-and-sdk/agent-1(/?)", "destination": "/reference/api-and-sdk/", "statusCode": 308 }, { - "source": "/reference/platform/agent-api-and-sdk/demo-sentry-monitoring-with-sdk", + "source": "/reference/platform/agent-api-and-sdk/demo-sentry-monitoring-with-sdk(/?)", "destination": "/reference/api-and-sdk/demo-sentry-monitoring-with-sdk/", "statusCode": 308 }, { - "source": "/reference/platform/cli", + "source": "/reference/platform/cli(/?)", "destination": "/reference/cli/", "statusCode": 308 }, @@ -2711,62 +2958,62 @@ "statusCode": 308 }, { - "source": "/reference/platform/cli/api-keys", + "source": "/reference/platform/cli/api-keys(/?)", "destination": "/reference/cli/api-keys/", "statusCode": 308 }, { - "source": "/reference/platform/cli/integrations-and-environments", + "source": "/reference/platform/cli/integrations-and-environments(/?)", "destination": "/reference/cli/integration-setup/", "statusCode": 308 }, { - "source": "/reference/platform/cli/troubleshooting", + "source": "/reference/platform/cli/troubleshooting(/?)", "destination": "/reference/cli/troubleshooting/", "statusCode": 308 }, { - "source": "/reference/platform/warp-platform", + "source": "/reference/platform/warp-platform(/?)", "destination": "/reference/", "statusCode": 308 }, { - "source": "/reference/settings", + "source": "/reference/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/session-sharing", + "source": "/session-sharing(/?)", "destination": "/knowledge-and-collaboration/session-sharing/", "statusCode": 308 }, { - "source": "/settings", + "source": "/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/settings-menu/overview", + "source": "/settings-menu/overview(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/settings-overview", + "source": "/settings-overview(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/settings/features", + "source": "/settings/features(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/settings/keyboard-shortcuts", + "source": "/settings/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/shortcuts", + "source": "/shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, @@ -2776,47 +3023,47 @@ "statusCode": 308 }, { - "source": "/support-and-community/features/network-log", + "source": "/support-and-community/features/network-log(/?)", "destination": "/support-and-community/privacy-and-security/network-log/", "statusCode": 308 }, { - "source": "/support-and-community/features/secret-redaction", + "source": "/support-and-community/features/secret-redaction(/?)", "destination": "/support-and-community/privacy-and-security/secret-redaction/", "statusCode": 308 }, { - "source": "/support-and-community/getting-started/privacy", + "source": "/support-and-community/getting-started/privacy(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/getting-started/refer-a-friend", + "source": "/support-and-community/getting-started/refer-a-friend(/?)", "destination": "/support-and-community/community/refer-a-friend/", "statusCode": 308 }, { - "source": "/support-and-community/getting-started/warp-preview-and-alpha-program", + "source": "/support-and-community/getting-started/warp-preview-and-alpha-program(/?)", "destination": "/support-and-community/community/warp-preview-and-alpha-program/", "statusCode": 308 }, { - "source": "/support-and-community/help", + "source": "/support-and-community/help(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, { - "source": "/support-and-community/help/ai-features/bring-your-own-llm", + "source": "/support-and-community/help/ai-features/bring-your-own-llm(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, { - "source": "/support-and-community/help/faq/billing-and-payments", + "source": "/support-and-community/help/faq/billing-and-payments(/?)", "destination": "/support-and-community/plans-and-billing/pricing-faqs/", "statusCode": 308 }, { - "source": "/support-and-community/help/known-issues", + "source": "/support-and-community/help/known-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, @@ -2846,22 +3093,22 @@ "statusCode": 308 }, { - "source": "/support-and-community/help/licenses", + "source": "/support-and-community/help/licenses(/?)", "destination": "/support-and-community/community/open-source-licenses/", "statusCode": 308 }, { - "source": "/support-and-community/help/plans-subscriptions-and-pricing", + "source": "/support-and-community/help/plans-subscriptions-and-pricing(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-community/help/releasing-and-updating", + "source": "/support-and-community/help/releasing-and-updating(/?)", "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", "statusCode": 308 }, { - "source": "/support-and-community/help/sending-us-feedback", + "source": "/support-and-community/help/sending-us-feedback(/?)", "destination": "/support-and-community/troubleshooting-and-support/sending-us-feedback/", "statusCode": 308 }, @@ -2871,7 +3118,7 @@ "statusCode": 308 }, { - "source": "/support-and-community/help/troubleshooting-login-issues", + "source": "/support-and-community/help/troubleshooting-login-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", "statusCode": 308 }, @@ -2881,7 +3128,7 @@ "statusCode": 308 }, { - "source": "/support-and-community/help/uninstalling-warp", + "source": "/support-and-community/help/uninstalling-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", "statusCode": 308 }, @@ -2891,7 +3138,7 @@ "statusCode": 308 }, { - "source": "/support-and-community/help/updating-warp", + "source": "/support-and-community/help/updating-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", "statusCode": 308 }, @@ -2901,67 +3148,67 @@ "statusCode": 308 }, { - "source": "/support-and-community/help/using-warp-offline", + "source": "/support-and-community/help/using-warp-offline(/?)", "destination": "/support-and-community/troubleshooting-and-support/using-warp-offline/", "statusCode": 308 }, { - "source": "/support-and-community/known-issues", + "source": "/support-and-community/known-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, { - "source": "/support-and-community/plans-and-billing/overages-legacy", + "source": "/support-and-community/plans-and-billing/overages-legacy(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/plans-pricing-and-billing", + "source": "/support-and-community/plans-pricing-and-billing(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-community/plans-pricing-and-billing/add-on-credits", + "source": "/support-and-community/plans-pricing-and-billing/add-on-credits(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/plans-pricing-and-billing/ai-credits", + "source": "/support-and-community/plans-pricing-and-billing/ai-credits(/?)", "destination": "/support-and-community/plans-and-billing/credits/", "statusCode": 308 }, { - "source": "/support-and-community/plans-pricing-and-billing/bring-your-own-api-key", + "source": "/support-and-community/plans-pricing-and-billing/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, { - "source": "/support-and-community/plans-pricing-and-billing/overages-legacy", + "source": "/support-and-community/plans-pricing-and-billing/overages-legacy(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/plans-pricing-and-billing/pricing-faqs", + "source": "/support-and-community/plans-pricing-and-billing/pricing-faqs(/?)", "destination": "/support-and-community/plans-and-billing/pricing-faqs/", "statusCode": 308 }, { - "source": "/support-and-community/privacy", + "source": "/support-and-community/privacy(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/privacy-and-security", + "source": "/support-and-community/privacy-and-security(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/privacy/network-log", + "source": "/support-and-community/privacy/network-log(/?)", "destination": "/support-and-community/privacy-and-security/network-log/", "statusCode": 308 }, { - "source": "/support-and-community/privacy/privacy", + "source": "/support-and-community/privacy/privacy(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, @@ -2976,27 +3223,27 @@ "statusCode": 308 }, { - "source": "/support-and-community/privacy/secret-redaction", + "source": "/support-and-community/privacy/secret-redaction(/?)", "destination": "/support-and-community/privacy-and-security/secret-redaction/", "statusCode": 308 }, { - "source": "/support-and-community/security-and-privacy/data-handling", + "source": "/support-and-community/security-and-privacy/data-handling(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/security-and-privacy/data-ownership", + "source": "/support-and-community/security-and-privacy/data-ownership(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing", + "source": "/support-and-community/support-and-billing(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/known-issues", + "source": "/support-and-community/support-and-billing/known-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, @@ -3031,27 +3278,27 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/licenses", + "source": "/support-and-community/support-and-billing/licenses(/?)", "destination": "/support-and-community/community/open-source-licenses/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/licenses-intro", + "source": "/support-and-community/support-and-billing/licenses-intro(/?)", "destination": "/support-and-community/community/open-source-licenses/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-billing/bring-your-own-api-key", + "source": "/support-and-community/support-and-billing/plans-and-billing/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing", + "source": "/support-and-community/support-and-billing/plans-and-pricing(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/add-on-credits", + "source": "/support-and-community/support-and-billing/plans-and-pricing/add-on-credits(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, @@ -3061,12 +3308,12 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/ai-credits", + "source": "/support-and-community/support-and-billing/plans-and-pricing/ai-credits(/?)", "destination": "/support-and-community/plans-and-billing/credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/ai-requests", + "source": "/support-and-community/support-and-billing/plans-and-pricing/ai-requests(/?)", "destination": "/support-and-community/plans-and-billing/credits/", "statusCode": 308 }, @@ -3081,7 +3328,7 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/bring-your-own-api-key", + "source": "/support-and-community/support-and-billing/plans-and-pricing/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, @@ -3096,7 +3343,7 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/pricing-faqs", + "source": "/support-and-community/support-and-billing/plans-and-pricing/pricing-faqs(/?)", "destination": "/support-and-community/plans-and-billing/pricing-faqs/", "statusCode": 308 }, @@ -3111,27 +3358,27 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/reload-credits-add-on-credits", + "source": "/support-and-community/support-and-billing/plans-and-pricing/reload-credits-add-on-credits(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-pricing/usage-overages", + "source": "/support-and-community/support-and-billing/plans-and-pricing/usage-overages(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/plans-and-prilling/bring-your-own-api-key", + "source": "/support-and-community/support-and-billing/plans-and-prilling/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/pricing-faqs", + "source": "/support-and-community/support-and-billing/pricing-faqs(/?)", "destination": "/support-and-community/plans-and-billing/pricing-faqs/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/sending-us-feedback", + "source": "/support-and-community/support-and-billing/sending-us-feedback(/?)", "destination": "/support-and-community/troubleshooting-and-support/sending-us-feedback/", "statusCode": 308 }, @@ -3151,12 +3398,12 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/subscription-management", + "source": "/support-and-community/support-and-billing/subscription-management(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/troubleshooting-login-issues", + "source": "/support-and-community/support-and-billing/troubleshooting-login-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", "statusCode": 308 }, @@ -3176,77 +3423,77 @@ "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/uninstalling-warp", + "source": "/support-and-community/support-and-billing/uninstalling-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/updating-warp", + "source": "/support-and-community/support-and-billing/updating-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-billing/using-warp-offline", + "source": "/support-and-community/support-and-billing/using-warp-offline(/?)", "destination": "/support-and-community/troubleshooting-and-support/using-warp-offline/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-and-billing/ai-credits", + "source": "/support-and-community/support-and-community/plans-and-billing/ai-credits(/?)", "destination": "/support-and-community/plans-and-billing/credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing", + "source": "/support-and-community/support-and-community/plans-pricing-and-billing(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/add-on-credits", + "source": "/support-and-community/support-and-community/plans-pricing-and-billing/add-on-credits(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/ai-credits", + "source": "/support-and-community/support-and-community/plans-pricing-and-billing/ai-credits(/?)", "destination": "/support-and-community/plans-and-billing/credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/bring-your-own-api-key", + "source": "/support-and-community/support-and-community/plans-pricing-and-billing/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/overages-legacy", + "source": "/support-and-community/support-and-community/plans-pricing-and-billing/overages-legacy(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/pricing-faqs", + "source": "/support-and-community/support-and-community/plans-pricing-and-billing/pricing-faqs(/?)", "destination": "/support-and-community/plans-and-billing/pricing-faqs/", "statusCode": 308 }, { - "source": "/support-and-community/support-and-community/privacy-and-security/privacy", + "source": "/support-and-community/support-and-community/privacy-and-security/privacy(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/troubleshooting", + "source": "/support-and-community/troubleshooting(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, { - "source": "/support-and-community/troubleshooting-and-support/uninstalling-warp", + "source": "/support-and-community/troubleshooting-and-support/uninstalling-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", "statusCode": 308 }, { - "source": "/support-and-community/troubleshooting/common-issues", + "source": "/support-and-community/troubleshooting/common-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, { - "source": "/support-and-community/troubleshooting/general-troubleshooting", + "source": "/support-and-community/troubleshooting/general-troubleshooting(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, @@ -3256,7 +3503,7 @@ "statusCode": 308 }, { - "source": "/terminal/command-input/command-suggestions", + "source": "/terminal/command-input/command-suggestions(/?)", "destination": "/terminal/command-completions/completions/", "statusCode": 308 }, @@ -3266,462 +3513,462 @@ "statusCode": 308 }, { - "source": "/terminal/keybindings", + "source": "/terminal/keybindings(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/terminal/keyboard-shortcuts", + "source": "/terminal/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/terminal/sessions/tab-configs", + "source": "/terminal/sessions/tab-configs(/?)", "destination": "/terminal/windows/tab-configs/", "statusCode": 308 }, { - "source": "/terminal/shortcuts", + "source": "/terminal/shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/terminal/universal-input", + "source": "/terminal/universal-input(/?)", "destination": "/terminal/input/classic-input/", "statusCode": 308 }, { - "source": "/terminal/universal-input/classic-input", + "source": "/terminal/universal-input/classic-input(/?)", "destination": "/terminal/input/classic-input/", "statusCode": 308 }, { - "source": "/terminal/windows/keyboard-shortcuts", + "source": "/terminal/windows/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/terminal/windows/keyboard-shortcuts-windows", + "source": "/terminal/windows/keyboard-shortcuts-windows(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/terminal/windows/windows-shortcuts", + "source": "/terminal/windows/windows-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/warp-quickstart", + "source": "/warp-quickstart(/?)", "destination": "/quickstart/", "statusCode": 308 }, { - "source": "/warp-terminal-101/settings", + "source": "/warp-terminal-101/settings(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/warp/code/code-editor/code-editor-vim-keybindings", + "source": "/warp/code/code-editor/code-editor-vim-keybindings(/?)", "destination": "/code/code-editor/code-editor-vim-keybindings/", "statusCode": 308 }, { - "source": "/warp/code/code-editor/file-tree", + "source": "/warp/code/code-editor/file-tree(/?)", "destination": "/code/code-editor/file-tree/", "statusCode": 308 }, { - "source": "/warp/code/code-editor/find-and-replace", + "source": "/warp/code/code-editor/find-and-replace(/?)", "destination": "/code/code-editor/find-and-replace/", "statusCode": 308 }, { - "source": "/warp/code/code-editor/language-server-protocol", + "source": "/warp/code/code-editor/language-server-protocol(/?)", "destination": "/code/code-editor/language-server-protocol/", "statusCode": 308 }, { - "source": "/warp/code/code-review", + "source": "/warp/code/code-review(/?)", "destination": "/code/code-review/", "statusCode": 308 }, { - "source": "/warp/code/git-worktrees", + "source": "/warp/code/git-worktrees(/?)", "destination": "/code/git-worktrees/", "statusCode": 308 }, { - "source": "/warp/code/overview", + "source": "/warp/code/overview(/?)", "destination": "/code/overview/", "statusCode": 308 }, { - "source": "/warp/code/ssh-feature-support", + "source": "/warp/code/ssh-feature-support(/?)", "destination": "/code/ssh-feature-support/", "statusCode": 308 }, { - "source": "/warp/getting-started/coding-in-warp", + "source": "/warp/getting-started/coding-in-warp(/?)", "destination": "/getting-started/quickstart/coding-in-warp/", "statusCode": 308 }, { - "source": "/warp/getting-started/customizing-warp", + "source": "/warp/getting-started/customizing-warp(/?)", "destination": "/getting-started/quickstart/customizing-warp/", "statusCode": 308 }, { - "source": "/warp/getting-started/installation-and-setup", + "source": "/warp/getting-started/installation-and-setup(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/warp/getting-started/keyboard-shortcuts", + "source": "/warp/getting-started/keyboard-shortcuts(/?)", "destination": "/getting-started/keyboard-shortcuts/", "statusCode": 308 }, { - "source": "/warp/getting-started/migrate-to-warp", + "source": "/warp/getting-started/migrate-to-warp(/?)", "destination": "/getting-started/migrate-to-warp/", "statusCode": 308 }, { - "source": "/warp/getting-started/quickstart", + "source": "/warp/getting-started/quickstart(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/warp/getting-started/supported-shells", + "source": "/warp/getting-started/supported-shells(/?)", "destination": "/getting-started/supported-shells/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/admin-panel", + "source": "/warp/knowledge-and-collaboration/admin-panel(/?)", "destination": "/knowledge-and-collaboration/admin-panel/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/teams", + "source": "/warp/knowledge-and-collaboration/teams(/?)", "destination": "/knowledge-and-collaboration/teams/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/agent-mode-context", + "source": "/warp/knowledge-and-collaboration/warp-drive/agent-mode-context(/?)", "destination": "/knowledge-and-collaboration/warp-drive/agent-mode-context/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/ai-objects", + "source": "/warp/knowledge-and-collaboration/warp-drive/ai-objects(/?)", "destination": "/knowledge-and-collaboration/warp-drive/ai-objects/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/environment-variables", + "source": "/warp/knowledge-and-collaboration/warp-drive/environment-variables(/?)", "destination": "/knowledge-and-collaboration/warp-drive/environment-variables/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/notebooks", + "source": "/warp/knowledge-and-collaboration/warp-drive/notebooks(/?)", "destination": "/knowledge-and-collaboration/warp-drive/notebooks/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/prompts", + "source": "/warp/knowledge-and-collaboration/warp-drive/prompts(/?)", "destination": "/knowledge-and-collaboration/warp-drive/prompts/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/web", + "source": "/warp/knowledge-and-collaboration/warp-drive/web(/?)", "destination": "/knowledge-and-collaboration/warp-drive/web/", "statusCode": 308 }, { - "source": "/warp/knowledge-and-collaboration/warp-drive/workflows", + "source": "/warp/knowledge-and-collaboration/warp-drive/workflows(/?)", "destination": "/knowledge-and-collaboration/warp-drive/workflows/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/app-icons", + "source": "/warp/terminal/appearance/app-icons(/?)", "destination": "/terminal/appearance/app-icons/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/blocks-behavior", + "source": "/warp/terminal/appearance/blocks-behavior(/?)", "destination": "/terminal/appearance/blocks-behavior/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/custom-themes", + "source": "/warp/terminal/appearance/custom-themes(/?)", "destination": "/terminal/appearance/custom-themes/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/input-position", + "source": "/warp/terminal/appearance/input-position(/?)", "destination": "/terminal/appearance/input-position/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/pane-dimming", + "source": "/warp/terminal/appearance/pane-dimming(/?)", "destination": "/terminal/appearance/pane-dimming/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/prompt", + "source": "/warp/terminal/appearance/prompt(/?)", "destination": "/terminal/appearance/prompt/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/size-opacity-blurring", + "source": "/warp/terminal/appearance/size-opacity-blurring(/?)", "destination": "/terminal/appearance/size-opacity-blurring/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/tabs-behavior", + "source": "/warp/terminal/appearance/tabs-behavior(/?)", "destination": "/terminal/appearance/tabs-behavior/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/text-fonts-cursor", + "source": "/warp/terminal/appearance/text-fonts-cursor(/?)", "destination": "/terminal/appearance/text-fonts-cursor/", "statusCode": 308 }, { - "source": "/warp/terminal/appearance/themes", + "source": "/warp/terminal/appearance/themes(/?)", "destination": "/terminal/appearance/themes/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/background-blocks", + "source": "/warp/terminal/blocks/background-blocks(/?)", "destination": "/terminal/blocks/background-blocks/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/block-actions", + "source": "/warp/terminal/blocks/block-actions(/?)", "destination": "/terminal/blocks/block-actions/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/block-basics", + "source": "/warp/terminal/blocks/block-basics(/?)", "destination": "/terminal/blocks/block-basics/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/block-filtering", + "source": "/warp/terminal/blocks/block-filtering(/?)", "destination": "/terminal/blocks/block-filtering/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/block-sharing", + "source": "/warp/terminal/blocks/block-sharing(/?)", "destination": "/terminal/blocks/block-sharing/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/find", + "source": "/warp/terminal/blocks/find(/?)", "destination": "/terminal/blocks/find/", "statusCode": 308 }, { - "source": "/warp/terminal/blocks/sticky-command-header", + "source": "/warp/terminal/blocks/sticky-command-header(/?)", "destination": "/terminal/blocks/sticky-command-header/", "statusCode": 308 }, { - "source": "/warp/terminal/command-completions/autosuggestions", + "source": "/warp/terminal/command-completions/autosuggestions(/?)", "destination": "/terminal/command-completions/autosuggestions/", "statusCode": 308 }, { - "source": "/warp/terminal/command-completions/completions", + "source": "/warp/terminal/command-completions/completions(/?)", "destination": "/terminal/command-completions/completions/", "statusCode": 308 }, { - "source": "/warp/terminal/command-palette", + "source": "/warp/terminal/command-palette(/?)", "destination": "/terminal/command-palette/", "statusCode": 308 }, { - "source": "/warp/terminal/comparisons/performance", + "source": "/warp/terminal/comparisons/performance(/?)", "destination": "/terminal/comparisons/performance/", "statusCode": 308 }, { - "source": "/warp/terminal/comparisons/terminal-features", + "source": "/warp/terminal/comparisons/terminal-features(/?)", "destination": "/terminal/comparisons/terminal-features/", "statusCode": 308 }, { - "source": "/warp/terminal/editor/alias-expansion", + "source": "/warp/terminal/editor/alias-expansion(/?)", "destination": "/terminal/editor/alias-expansion/", "statusCode": 308 }, { - "source": "/warp/terminal/editor/command-inspector", + "source": "/warp/terminal/editor/command-inspector(/?)", "destination": "/terminal/editor/command-inspector/", "statusCode": 308 }, { - "source": "/warp/terminal/editor/syntax-error-highlighting", + "source": "/warp/terminal/editor/syntax-error-highlighting(/?)", "destination": "/terminal/editor/syntax-error-highlighting/", "statusCode": 308 }, { - "source": "/warp/terminal/editor/vim", + "source": "/warp/terminal/editor/vim(/?)", "destination": "/terminal/editor/vim/", "statusCode": 308 }, { - "source": "/warp/terminal/entry/command-corrections", + "source": "/warp/terminal/entry/command-corrections(/?)", "destination": "/terminal/entry/command-corrections/", "statusCode": 308 }, { - "source": "/warp/terminal/entry/command-history", + "source": "/warp/terminal/entry/command-history(/?)", "destination": "/terminal/entry/command-history/", "statusCode": 308 }, { - "source": "/warp/terminal/entry/command-search", + "source": "/warp/terminal/entry/command-search(/?)", "destination": "/terminal/entry/command-search/", "statusCode": 308 }, { - "source": "/warp/terminal/entry/synchronized-inputs", + "source": "/warp/terminal/entry/synchronized-inputs(/?)", "destination": "/terminal/entry/synchronized-inputs/", "statusCode": 308 }, { - "source": "/warp/terminal/entry/yaml-workflows", + "source": "/warp/terminal/entry/yaml-workflows(/?)", "destination": "/terminal/entry/yaml-workflows/", "statusCode": 308 }, { - "source": "/warp/terminal/input/classic-input", + "source": "/warp/terminal/input/classic-input(/?)", "destination": "/terminal/input/classic-input/", "statusCode": 308 }, { - "source": "/warp/terminal/integrations-and-plugins", + "source": "/warp/terminal/integrations-and-plugins(/?)", "destination": "/terminal/integrations-and-plugins/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/accessibility", + "source": "/warp/terminal/more-features/accessibility(/?)", "destination": "/terminal/more-features/accessibility/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/audible-bell", + "source": "/warp/terminal/more-features/audible-bell(/?)", "destination": "/terminal/more-features/audible-bell/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/files-and-links", + "source": "/warp/terminal/more-features/files-and-links(/?)", "destination": "/terminal/more-features/files-and-links/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/full-screen-apps", + "source": "/warp/terminal/more-features/full-screen-apps(/?)", "destination": "/terminal/more-features/full-screen-apps/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/linux", + "source": "/warp/terminal/more-features/linux(/?)", "destination": "/terminal/more-features/linux/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/markdown-viewer", + "source": "/warp/terminal/more-features/markdown-viewer(/?)", "destination": "/terminal/more-features/markdown-viewer/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/notifications", + "source": "/warp/terminal/more-features/notifications(/?)", "destination": "/terminal/more-features/notifications/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/quit-warning", + "source": "/warp/terminal/more-features/quit-warning(/?)", "destination": "/terminal/more-features/quit-warning/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/settings-sync", + "source": "/warp/terminal/more-features/settings-sync(/?)", "destination": "/terminal/more-features/settings-sync/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/text-selection", + "source": "/warp/terminal/more-features/text-selection(/?)", "destination": "/terminal/more-features/text-selection/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/uri-scheme", + "source": "/warp/terminal/more-features/uri-scheme(/?)", "destination": "/terminal/more-features/uri-scheme/", "statusCode": 308 }, { - "source": "/warp/terminal/more-features/working-directory", + "source": "/warp/terminal/more-features/working-directory(/?)", "destination": "/terminal/more-features/working-directory/", "statusCode": 308 }, { - "source": "/warp/terminal/sessions/launch-configurations", + "source": "/warp/terminal/sessions/launch-configurations(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/warp/terminal/sessions/session-navigation", + "source": "/warp/terminal/sessions/session-navigation(/?)", "destination": "/terminal/sessions/session-navigation/", "statusCode": 308 }, { - "source": "/warp/terminal/sessions/session-restoration", + "source": "/warp/terminal/sessions/session-restoration(/?)", "destination": "/terminal/sessions/session-restoration/", "statusCode": 308 }, { - "source": "/warp/terminal/settings/all-settings", + "source": "/warp/terminal/settings/all-settings(/?)", "destination": "/getting-started/quickstart/customizing-warp/", "statusCode": 308 }, { - "source": "/warp/terminal/warpify/ssh", + "source": "/warp/terminal/warpify/ssh(/?)", "destination": "/terminal/warpify/ssh/", "statusCode": 308 }, { - "source": "/warp/terminal/warpify/ssh-legacy", + "source": "/warp/terminal/warpify/ssh-legacy(/?)", "destination": "/terminal/warpify/ssh-legacy/", "statusCode": 308 }, { - "source": "/warp/terminal/warpify/subshells", + "source": "/warp/terminal/warpify/subshells(/?)", "destination": "/terminal/warpify/subshells/", "statusCode": 308 }, { - "source": "/warp/terminal/windows/global-hotkey", + "source": "/warp/terminal/windows/global-hotkey(/?)", "destination": "/terminal/windows/global-hotkey/", "statusCode": 308 }, { - "source": "/warp/terminal/windows/split-panes", + "source": "/warp/terminal/windows/split-panes(/?)", "destination": "/terminal/windows/split-panes/", "statusCode": 308 }, { - "source": "/warp/terminal/windows/tab-configs", + "source": "/warp/terminal/windows/tab-configs(/?)", "destination": "/terminal/windows/tab-configs/", "statusCode": 308 }, { - "source": "/warp/terminal/windows/tabs", + "source": "/warp/terminal/windows/tabs(/?)", "destination": "/terminal/windows/tabs/", "statusCode": 308 }, { - "source": "/warp/terminal/windows/vertical-tabs", + "source": "/warp/terminal/windows/vertical-tabs(/?)", "destination": "/terminal/windows/vertical-tabs/", "statusCode": 308 }, @@ -4061,112 +4308,112 @@ "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/integrations/github-actions/quickstart-github-actions", + "source": "/agent-platform/cloud-agents/integrations/github-actions/quickstart-github-actions(/?)", "destination": "/platform/integrations/github-actions/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context", + "source": "/agent-platform/warp-agents/agent-context(/?)", "destination": "/agent-platform/local-agents/agent-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/agent-context/mcp", + "source": "/agent-platform/warp-agents/agent-context/mcp(/?)", "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/agent-notifications", + "source": "/agent-platform/warp-agents/capabilities-overview/agent-notifications(/?)", "destination": "/agent-platform/capabilities/agent-notifications/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/agent-profiles-permissions", + "source": "/agent-platform/warp-agents/capabilities-overview/agent-profiles-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/cloud-conversations", + "source": "/agent-platform/warp-agents/capabilities-overview/cloud-conversations(/?)", "destination": "/agent-platform/local-agents/cloud-conversations/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/codebase-context", + "source": "/agent-platform/warp-agents/capabilities-overview/codebase-context(/?)", "destination": "/agent-platform/capabilities/codebase-context/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/computer-use", + "source": "/agent-platform/warp-agents/capabilities-overview/computer-use(/?)", "destination": "/agent-platform/capabilities/computer-use/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/full-terminal-use", + "source": "/agent-platform/warp-agents/capabilities-overview/full-terminal-use(/?)", "destination": "/agent-platform/capabilities/full-terminal-use/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/model-choice", + "source": "/agent-platform/warp-agents/capabilities-overview/model-choice(/?)", "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/planning", + "source": "/agent-platform/warp-agents/capabilities-overview/planning(/?)", "destination": "/agent-platform/capabilities/planning/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/rules", + "source": "/agent-platform/warp-agents/capabilities-overview/rules(/?)", "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/session-sharing", + "source": "/agent-platform/warp-agents/capabilities-overview/session-sharing(/?)", "destination": "/agent-platform/local-agents/session-sharing/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/skills", + "source": "/agent-platform/warp-agents/capabilities-overview/skills(/?)", "destination": "/agent-platform/capabilities/skills/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/slash-commands", + "source": "/agent-platform/warp-agents/capabilities-overview/slash-commands(/?)", "destination": "/agent-platform/capabilities/slash-commands/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/task-lists", + "source": "/agent-platform/warp-agents/capabilities-overview/task-lists(/?)", "destination": "/agent-platform/capabilities/task-lists/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/capabilities-overview/web-search", + "source": "/agent-platform/warp-agents/capabilities-overview/web-search(/?)", "destination": "/agent-platform/capabilities/web-search/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/interacting-with-agents", + "source": "/agent-platform/warp-agents/interacting-with-agents(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/interacting-with-agents/code-diffs", + "source": "/agent-platform/warp-agents/interacting-with-agents/code-diffs(/?)", "destination": "/agent-platform/local-agents/code-diffs/", "statusCode": 308 }, { - "source": "/agent-platform/warp-agents/warp-agents", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/warp-agents/warp-agents(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/getting-started/quickstart", + "source": "/getting-started/quickstart(/?)", "destination": "/quickstart/", "statusCode": 308 }, { - "source": "/guides/agent-workflows/how-to-run-3-agents-in-parallel-summarize-logs-\\+-analyze-pr-\\+-modify-ui", + "source": "/guides/agent-workflows/how-to-run-3-agents-in-parallel-summarize-logs-\\+-analyze-pr-\\+-modify-ui(/?)", "destination": "/guides/agent-workflows/how-to-run-3-agents-in-parallel-summarize-logs-analyze-pr-modify-ui/", "statusCode": 308 }, @@ -4176,4143 +4423,478 @@ "statusCode": 308 }, { - "source": "/guides/build-an-app-in-warp/building-a-slackbot", + "source": "/guides/build-an-app-in-warp/building-a-slackbot(/?)", "destination": "/platform/integrations/slack/", "statusCode": 308 }, { - "source": "/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-\\+-railway", + "source": "/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-\\+-railway(/?)", "destination": "/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-railway/", "statusCode": 308 }, { - "source": "/guides/configuration/how-to-create-project-rules-for-an-existing-project-astro-\\+-typescript-\\+-tailwind", + "source": "/guides/configuration/how-to-create-project-rules-for-an-existing-project-astro-\\+-typescript-\\+-tailwind(/?)", "destination": "/guides/configuration/how-to-create-project-rules-for-an-existing-project-astro-typescript-tailwind/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/how-to-analyze-cloud-run-logs-gcloud", + "source": "/guides/devops-and-infrastructure/how-to-analyze-cloud-run-logs-gcloud(/?)", "destination": "/guides/devops/how-to-analyze-cloud-run-logs-gcloud/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/how-to-create-a-production-ready-docker-setup", + "source": "/guides/devops-and-infrastructure/how-to-create-a-production-ready-docker-setup(/?)", "destination": "/guides/devops/how-to-create-a-production-ready-docker-setup/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/how-to-create-priority-matrix-for-database-optimization", + "source": "/guides/devops-and-infrastructure/how-to-create-priority-matrix-for-database-optimization(/?)", "destination": "/guides/devops/how-to-create-priority-matrix-for-database-optimization/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/how-to-generate-unit-and-security-tests-to-debug-faster", + "source": "/guides/devops-and-infrastructure/how-to-generate-unit-and-security-tests-to-debug-faster(/?)", "destination": "/guides/devops/how-to-generate-unit-and-security-tests-to-debug-faster/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/how-to-prevent-secrets-from-leaking", + "source": "/guides/devops-and-infrastructure/how-to-prevent-secrets-from-leaking(/?)", "destination": "/guides/devops/how-to-prevent-secrets-from-leaking/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/how-to-write-sql-commands-inside-a-postgres-repl", + "source": "/guides/devops-and-infrastructure/how-to-write-sql-commands-inside-a-postgres-repl(/?)", "destination": "/guides/devops/how-to-write-sql-commands-inside-a-postgres-repl/", "statusCode": 308 }, { - "source": "/guides/devops-and-infrastructure/improve-your-kubernetes-workflow-kubectl-\\+-helm", + "source": "/guides/devops-and-infrastructure/improve-your-kubernetes-workflow-kubectl-\\+-helm(/?)", "destination": "/guides/devops/improve-your-kubernetes-workflow-kubectl-helm/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/context7-mcp-update-astro-project-with-best-practices", + "source": "/guides/external-tools-and-integrations/context7-mcp-update-astro-project-with-best-practices(/?)", "destination": "/guides/external-tools/context7-mcp-update-astro-project-with-best-practices/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/figma-remote-mcp-create-a-website-from-a-figma-file-from-scratch", + "source": "/guides/external-tools-and-integrations/figma-remote-mcp-create-a-website-from-a-figma-file-from-scratch(/?)", "destination": "/guides/external-tools/figma-remote-mcp-create-a-website-from-a-figma-file-from-scratch/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/github-mcp-summarizing-open-prs-and-creating-gh-issues", + "source": "/guides/external-tools-and-integrations/github-mcp-summarizing-open-prs-and-creating-gh-issues(/?)", "destination": "/guides/external-tools/github-mcp-summarizing-open-prs-and-creating-gh-issues/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/how-to-set-up-claude-code", + "source": "/guides/external-tools-and-integrations/how-to-set-up-claude-code(/?)", "destination": "/guides/external-tools/how-to-set-up-claude-code/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/how-to-set-up-codex-cli", + "source": "/guides/external-tools-and-integrations/how-to-set-up-codex-cli(/?)", "destination": "/guides/external-tools/how-to-set-up-codex-cli/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/how-to-set-up-gemini-cli", + "source": "/guides/external-tools-and-integrations/how-to-set-up-gemini-cli(/?)", "destination": "/guides/external-tools/how-to-set-up-gemini-cli/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/how-to-set-up-ollama", + "source": "/guides/external-tools-and-integrations/how-to-set-up-ollama(/?)", "destination": "/guides/external-tools/how-to-set-up-ollama/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/how-to-set-up-opencode", + "source": "/guides/external-tools-and-integrations/how-to-set-up-opencode(/?)", "destination": "/guides/external-tools/how-to-set-up-opencode/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/linear-mcp-retrieve-issue-data", + "source": "/guides/external-tools-and-integrations/linear-mcp-retrieve-issue-data(/?)", "destination": "/guides/external-tools/linear-mcp-retrieve-issue-data/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/linear-mcp-updating-tickets-with-a-lean-build-approach", + "source": "/guides/external-tools-and-integrations/linear-mcp-updating-tickets-with-a-lean-build-approach(/?)", "destination": "/guides/external-tools/linear-mcp-updating-tickets-with-a-lean-build-approach/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/puppeteer-mcp-scraping-amazon-web-reviews", + "source": "/guides/external-tools-and-integrations/puppeteer-mcp-scraping-amazon-web-reviews(/?)", "destination": "/guides/external-tools/puppeteer-mcp-scraping-amazon-web-reviews/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/sentry-mcp-fix-sentry-error-in-empower-website", + "source": "/guides/external-tools-and-integrations/sentry-mcp-fix-sentry-error-in-empower-website(/?)", "destination": "/guides/external-tools/sentry-mcp-fix-sentry-error-in-empower-website/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up", + "source": "/guides/external-tools-and-integrations/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up(/?)", "destination": "/guides/external-tools/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up/", "statusCode": 308 }, { - "source": "/guides/external-tools-and-integrations/using-mcp-servers-with-warp", + "source": "/guides/external-tools-and-integrations/using-mcp-servers-with-warp(/?)", "destination": "/guides/external-tools/using-mcp-servers-with-warp/", "statusCode": 308 }, { - "source": "/guides/frontend-and-ui/how-to-actually-code-ui-that-matches-your-mockup-react-\\+-tailwind", + "source": "/guides/frontend-and-ui/how-to-actually-code-ui-that-matches-your-mockup-react-\\+-tailwind(/?)", "destination": "/guides/frontend/how-to-actually-code-ui-that-matches-your-mockup-react-tailwind/", "statusCode": 308 }, { - "source": "/guides/frontend-and-ui/how-to-replace-a-ui-element-in-warp-rust-codebase", + "source": "/guides/frontend-and-ui/how-to-replace-a-ui-element-in-warp-rust-codebase(/?)", "destination": "/guides/frontend/how-to-replace-a-ui-element-in-warp-rust-codebase/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/api-and-sdk", + "source": "/reference/api-and-sdk/api-and-sdk(/?)", "destination": "/reference/api-and-sdk/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/models", + "source": "/reference/api-and-sdk/models(/?)", "destination": "/reference/api-and-sdk/", "statusCode": 308 }, { - "source": "/reference/cli/cli", + "source": "/reference/cli/cli(/?)", "destination": "/reference/cli/", "statusCode": 308 }, { - "source": "/support-and-community/privacy-security-and-licensing/network-log", + "source": "/support-and-community/privacy-security-and-licensing/network-log(/?)", "destination": "/support-and-community/privacy-and-security/network-log/", "statusCode": 308 }, { - "source": "/support-and-community/privacy-security-and-licensing/open-source-licenses", + "source": "/support-and-community/privacy-security-and-licensing/open-source-licenses(/?)", "destination": "/support-and-community/community/open-source-licenses/", "statusCode": 308 }, { - "source": "/support-and-community/privacy-security-and-licensing/privacy", + "source": "/support-and-community/privacy-security-and-licensing/privacy(/?)", "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/support-and-community/privacy-security-and-licensing/secret-redaction", + "source": "/support-and-community/privacy-security-and-licensing/secret-redaction(/?)", "destination": "/support-and-community/privacy-and-security/secret-redaction/", "statusCode": 308 }, { - "source": "/terminal/classic-input", + "source": "/terminal/classic-input(/?)", "destination": "/terminal/input/classic-input/", "statusCode": 308 }, { - "source": "/terminal/terminal-features", + "source": "/terminal/terminal-features(/?)", "destination": "/terminal/comparisons/terminal-features/", "statusCode": 308 }, { - "source": "/terminal/windows/launch-configurations", + "source": "/terminal/windows/launch-configurations(/?)", "destination": "/terminal/sessions/launch-configurations/", "statusCode": 308 }, { - "source": "/agents/agents-overview", + "source": "/agents/agents-overview(/?)", "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agents/ai", + "source": "/agents/ai(/?)", "destination": "/agent-platform/", "statusCode": 308 }, { - "source": "/agents/ai-faqs", + "source": "/agents/ai-faqs(/?)", "destination": "/agent-platform/getting-started/faqs/", "statusCode": 308 }, { - "source": "/agents/autonomy", - "destination": "/agent-platform/getting-started/agents-in-warp/", + "source": "/agents/autonomy(/?)", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agents/using-agents/agent-context/blocks-as-context", + "source": "/agents/using-agents/agent-context/blocks-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", "statusCode": 308 }, { - "source": "/agents/using-agents/agent-context/images-as-context", + "source": "/agents/using-agents/agent-context/images-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/images-as-context/", "statusCode": 308 }, { - "source": "/agents/using-agents/agent-context/urls-as-context", + "source": "/agents/using-agents/agent-context/urls-as-context(/?)", "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", "statusCode": 308 }, { - "source": "/agents/using-agents/agent-context/using-to-add-context", + "source": "/agents/using-agents/agent-context/using-to-add-context(/?)", "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", "statusCode": 308 }, { - "source": "/agents/using-agents/agent-conversations/conversation-forking", + "source": "/agents/using-agents/agent-conversations/conversation-forking(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", "statusCode": 308 }, { - "source": "/agents/using-agents/managing-agents", + "source": "/agents/using-agents/managing-agents(/?)", "destination": "/platform/managing-cloud-agents/", "statusCode": 308 }, { - "source": "/agents/voice", + "source": "/agents/voice(/?)", "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", "statusCode": 308 }, { - "source": "/ambient-agents/ambient-agents-overview", + "source": "/ambient-agents/ambient-agents-overview(/?)", "destination": "/platform/", "statusCode": 308 }, { - "source": "/ambient-agents/managing-ambient-agents", + "source": "/ambient-agents/managing-ambient-agents(/?)", "destination": "/platform/managing-cloud-agents/", "statusCode": 308 }, { - "source": "/getting-started/readme", + "source": "/getting-started/readme(/?)", "destination": "/", "statusCode": 308 }, { - "source": "/getting-started/readme-1/coding-in-warp", + "source": "/getting-started/readme-1/coding-in-warp(/?)", "destination": "/getting-started/quickstart/coding-in-warp/", "statusCode": 308 }, { - "source": "/getting-started/readme-1/customizing-warp", + "source": "/getting-started/readme-1/customizing-warp(/?)", "destination": "/getting-started/quickstart/customizing-warp/", "statusCode": 308 }, { - "source": "/getting-started/readme-1/installation-and-setup", + "source": "/getting-started/readme-1/installation-and-setup(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/getting-started/readme/coding-in-warp", + "source": "/getting-started/readme/coding-in-warp(/?)", "destination": "/getting-started/quickstart/coding-in-warp/", "statusCode": 308 }, { - "source": "/getting-started/readme/customizing-warp", + "source": "/getting-started/readme/customizing-warp(/?)", "destination": "/getting-started/quickstart/customizing-warp/", "statusCode": 308 }, { - "source": "/getting-started/readme/installation-and-setup", + "source": "/getting-started/readme/installation-and-setup(/?)", "destination": "/getting-started/quickstart/installation-and-setup/", "statusCode": 308 }, { - "source": "/platform/warp-platform", + "source": "/platform/warp-platform(/?)", "destination": "/reference/", "statusCode": 308 }, { - "source": "/support-and-billing/known-issues", + "source": "/support-and-billing/known-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/known-issues/", "statusCode": 308 }, { - "source": "/support-and-billing/plans-and-pricing", + "source": "/support-and-billing/plans-and-pricing(/?)", "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/support-and-billing/plans-and-pricing/add-on-credits", + "source": "/support-and-billing/plans-and-pricing/add-on-credits(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-billing/plans-and-pricing/bring-your-own-api-key", + "source": "/support-and-billing/plans-and-pricing/bring-your-own-api-key(/?)", "destination": "/agent-platform/inference/bring-your-own-api-key/", "statusCode": 308 }, { - "source": "/support-and-billing/plans-and-pricing/pricing-faqs", + "source": "/support-and-billing/plans-and-pricing/pricing-faqs(/?)", "destination": "/support-and-community/plans-and-billing/pricing-faqs/", "statusCode": 308 }, { - "source": "/support-and-billing/plans-and-pricing/reload-credits-add-on-credits", + "source": "/support-and-billing/plans-and-pricing/reload-credits-add-on-credits(/?)", "destination": "/support-and-community/plans-and-billing/add-on-credits/", "statusCode": 308 }, { - "source": "/support-and-billing/sending-us-feedback", + "source": "/support-and-billing/sending-us-feedback(/?)", "destination": "/support-and-community/troubleshooting-and-support/sending-us-feedback/", "statusCode": 308 }, { - "source": "/support-and-billing/troubleshooting-login-issues", + "source": "/support-and-billing/troubleshooting-login-issues(/?)", "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", "statusCode": 308 }, { - "source": "/support-and-billing/uninstalling-warp", + "source": "/support-and-billing/uninstalling-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", "statusCode": 308 }, { - "source": "/support-and-billing/updating-warp", + "source": "/support-and-billing/updating-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/agent/", - "destination": "/api#tag/agent", + "source": "/errors/", + "destination": "/reference/api-and-sdk/troubleshooting/errors/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/schedules/", - "destination": "/api#tag/schedules", + "source": "/errors/:code/", + "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", "statusCode": 308 }, { - "source": "/reference/api-and-sdk/agent-1/", - "destination": "/api", + "source": "/getting-started/about-warps-ai/", + "destination": "/", "statusCode": 308 }, { - "source": "/advanced/command-line-flags/", - "destination": "/terminal/sessions/launch-configurations/", + "source": "/getting-started/introduction/", + "destination": "/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/", - "destination": "/agent-platform/capabilities/", + "source": "/what-is-warp/", + "destination": "/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/agent-profiles-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", + "source": "/warp/getting-started/what-is-warp/", + "destination": "/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/codebase-context/", - "destination": "/agent-platform/capabilities/codebase-context/", + "source": "/university/(.*)", + "destination": "/guides/$1", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/full-terminal-use/", - "destination": "/agent-platform/capabilities/full-terminal-use/", + "source": "/platform/cli", + "destination": "/reference/cli/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/mcp/", - "destination": "/agent-platform/capabilities/mcp/", + "source": "/support-and-community/plans-and-billing/plans-and-pricing", + "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/model-choice/", - "destination": "/agent-platform/inference/model-choice/", + "source": "/knowledge-and-collaboration/mcp", + "destination": "/agent-platform/capabilities/mcp/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/planning/", - "destination": "/agent-platform/capabilities/planning/", + "source": "/getting-started/readme-1", + "destination": "/quickstart/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/rules/", - "destination": "/agent-platform/capabilities/rules/", + "source": "/support-and-billing/plans-and-pricing/ai-credits", + "destination": "/support-and-community/plans-and-billing/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/skills/", - "destination": "/agent-platform/capabilities/skills/", + "source": "/getting-started/changelog", + "destination": "/changelog/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/slash-commands/", - "destination": "/agent-platform/capabilities/slash-commands/", + "source": "/university", + "destination": "/guides/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/task-lists/", - "destination": "/agent-platform/capabilities/task-lists/", + "source": "/code/codebase-context", + "destination": "/agent-platform/capabilities/codebase-context/", "statusCode": 308 }, { - "source": "/agent-platform/agent-concepts/web-search/", - "destination": "/agent-platform/capabilities/web-search/", + "source": "/platform/environments", + "destination": "/platform/environments/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agents/using-agents/model-choice", + "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/active-ai/", - "destination": "/agent-platform/local-agents/active-ai/", + "source": "/getting-started/readme/agents-in-warp", + "destination": "/agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/", - "destination": "/agent-platform/local-agents/agent-context/", + "source": "/privacy/privacy", + "destination": "/support-and-community/privacy-and-security/privacy/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/blocks-as-context/", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", + "source": "/agents/using-agents/third-party-cli-agents", + "destination": "/agent-platform/cli-agents/overview/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/images-as-context/", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", + "source": "/knowledge-and-collaboration/rules", + "destination": "/agent-platform/capabilities/rules/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/selection-as-context/", - "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", + "source": "/agent-platform/agent/skills", + "destination": "/agent-platform/capabilities/skills/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/urls-as-context/", - "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", + "source": "/community/refer-a-friend", + "destination": "/support-and-community/community/refer-a-friend/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agent-context/using-to-add-context/", - "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", + "source": "/agent-platform/agent/using-agents/model-choice", + "destination": "/agent-platform/inference/model-choice/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/agents-overview/", - "destination": "/agent-platform/local-agents/overview/", + "source": "/agent-platform/agent/using-agents", + "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/ambient-agents-session-sharing/", - "destination": "/platform/viewing-cloud-agent-runs/", + "source": "/agents/using-agents/planning", + "destination": "/agent-platform/capabilities/planning/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/code-diffs-in-agent-conversations/", - "destination": "/agent-platform/local-agents/code-diffs/", + "source": "/support-and-community/plans-and-billing/ai-credits", + "destination": "/support-and-community/plans-and-billing/", "statusCode": 308 }, { - "source": "/agent-platform/agent-mode/full-terminal-use/", - "destination": "/agent-platform/capabilities/full-terminal-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-mode/generate/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-mode/interacting-with-agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-mode/interacting-with-agents/agent-modality-beta/", - "destination": "/agent-platform/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/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-mode/interacting-with-agents/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-mode/interactive-code-review/", - "destination": "/agent-platform/local-agents/interactive-code-review/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-mode/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-mode/task-lists/", - "destination": "/agent-platform/capabilities/task-lists/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-mode/third-party-cli-agents/", - "destination": "/agent-platform/cli-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-mode/web-search/", - "destination": "/agent-platform/capabilities/web-search/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/active-ai/", - "destination": "/agent-platform/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/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/agent/agents-overview/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/agent/using-agents/agent-profiles-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/agents-md/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/agents-overview/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/ai/", - "destination": "/agent-platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/ai-faqs/", - "destination": "/agent-platform/getting-started/faqs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/ai-model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/ambient-agents/ambient-agents-overview/", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/autonomy/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/autonomy/agent-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/autonomy/run-to-completion/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/cloud-agents/cloud-agents-platform/", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/cloud-agents/warp-platform/", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/conversation-forking/", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/full-terminal-use/", - "destination": "/agent-platform/capabilities/full-terminal-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/generate/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/integrations/github-actions/readme/", - "destination": "/platform/integrations/github-actions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/integrations/integrations-overview/", - "destination": "/platform/integrations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/slash-commands/", - "destination": "/agent-platform/capabilities/slash-commands/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/agent-context/", - "destination": "/agent-platform/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/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/agent-context/images-as-context/", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/agent-context/selection-as-context/", - "destination": "/agent-platform/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/", - "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/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/agent-conversations/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/agent-conversations/conversation-forking/", - "destination": "/agent-platform/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/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/agent-profiles-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/agent-tasklists/", - "destination": "/agent-platform/capabilities/task-lists/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/managing-agents/", - "destination": "/platform/managing-cloud-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/planning/", - "destination": "/agent-platform/capabilities/planning/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/third-party-cli-agents/", - "destination": "/agent-platform/cli-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/using-agents/web-search/", - "destination": "/agent-platform/capabilities/web-search/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent-platform/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/active-ai/", - "destination": "/agent-platform/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/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/agents-md/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/agents-overview/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/ai/", - "destination": "/agent-platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/ai-commander/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/ai-commands/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/ai-faqs/", - "destination": "/agent-platform/getting-started/faqs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/ai-getting-started/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/autonomy/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/autonomy/agent-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/autonomy/run-to-completion/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/full-terminal-use/", - "destination": "/agent-platform/capabilities/full-terminal-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/generate/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/slash-commands/", - "destination": "/agent-platform/capabilities/slash-commands/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-context/", - "destination": "/agent-platform/local-agents/agent-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-context/blocks-as-context/", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-context/images-as-context/", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-context/selection-as-context/", - "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-context/urls-as-context/", - "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-context/using-to-add-context/", - "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-conversations/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-conversations/conversation-forking/", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-profiles-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/agent-tasklists/", - "destination": "/agent-platform/capabilities/task-lists/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/managing-agents/", - "destination": "/platform/managing-cloud-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/planning/", - "destination": "/agent-platform/capabilities/planning/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/profiles/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/third-party-cli-agents/", - "destination": "/agent-platform/cli-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/using-agents/web-search/", - "destination": "/agent-platform/capabilities/web-search/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agents/warp-ai/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ai/", - "destination": "/agent-platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ai-features/ai-commands/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ai-features/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ai/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ambient-agents/", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ambient-agents/agent-secrets/", - "destination": "/platform/secrets/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ambient-agents/ambient-agents-overview/", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ambient-agents/managing-ambient-agents/", - "destination": "/platform/managing-cloud-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/ambient-agents/managing-ambient-agents/scheduled-agents/", - "destination": "/platform/triggers/scheduled-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/agent-session-sharing/", - "destination": "/agent-platform/local-agents/session-sharing/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/cloud-agent-secrets/", - "destination": "/platform/secrets/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/cloud-agents-faqs/", - "destination": "/platform/faqs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/cloud-agents-overview/", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/cloud-agents-platform/", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/cloud-agents-session-sharing/", - "destination": "/platform/viewing-cloud-agent-runs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/warp-platform/", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/code/code-review/interactive-code-review/", - "destination": "/agent-platform/local-agents/interactive-code-review/", - "statusCode": 308 - }, - { - "source": "/agent-platform/code/codebase-context/", - "destination": "/agent-platform/capabilities/codebase-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/code/reviewing-code/", - "destination": "/agent-platform/local-agents/code-diffs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/agent-mode/agents-md/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/", - "destination": "/agent-platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-agents/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-agents/agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-ask-warp/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-ask-warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-session-history/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-stack-overflow/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-and-warpdrive/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-command/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-command-search/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-command-search/limits/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-command-search/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-command-suggestions/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-command/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-commands/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-features/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai-features/ai-chat/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/agent/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/ai-models-and-providers/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/ai-setup/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/assistant/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/commands/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/commands-and-agents/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/commands/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/commands/agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/commands/ai-agent/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/commands/ai-commands-overview/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/get-started-with-warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/using-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/ai/using-warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/generate/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/integrations/mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/knowledge/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/terminal-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/terminal-ai/ai-models/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/active-ai/", - "destination": "/agent-platform/local-agents/active-ai/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/agent-modea/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/ai-command-search/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/ai-command-suggestions/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/generate/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/knowledge/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/rules/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/features/warp-ai/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/getting-started/quickstart-guide/agents-in-warp/", - "destination": "/agent-platform/getting-started/agents-in-warp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/", - "destination": "/platform/integrations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations-overview/", - "destination": "/platform/integrations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/github-actions/", - "destination": "/platform/integrations/github-actions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/github-actions/demo-issue-triage-bot/", - "destination": "/platform/integrations/quickstart-github-actions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/integrations/demo-issue-triage-bot/", - "destination": "/platform/integrations/quickstart-github-actions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/integrations-overview/", - "destination": "/platform/integrations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/integrations-overview/team-access-billing-and-identity-permissions/", - "destination": "/platform/team-access-billing-and-identity/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/linear/", - "destination": "/platform/integrations/linear/", - "statusCode": 308 - }, - { - "source": "/agent-platform/integrations/slack/", - "destination": "/platform/integrations/slack/", - "statusCode": 308 - }, - { - "source": "/agent-platform/knowledge-and-collaboration/mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/knowledge-and-collaboration/rules/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/knowledge-and-collaboration/session-sharing/agent-session-sharing/", - "destination": "/agent-platform/local-agents/session-sharing/", - "statusCode": 308 - }, - { - "source": "/agent-platform/knowledge-and-collaboration/session-sharing/ambient-agents-session-sharing/", - "destination": "/platform/viewing-cloud-agent-runs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/knowledge-and-collaboration/warp-drive/model-context-protocol-mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/agent-notifications/", - "destination": "/agent-platform/capabilities/agent-notifications/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/agents-overview/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/ambient-agents-session-sharing/", - "destination": "/platform/viewing-cloud-agent-runs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/code-diffs-in-agent-conversations/", - "destination": "/agent-platform/local-agents/code-diffs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality-beta/", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/third-party-cli-agents/", - "destination": "/agent-platform/cli-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/platform/", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/platform/deployment-patterns/", - "destination": "/platform/deployment-patterns/", - "statusCode": 308 - }, - { - "source": "/agent-platform/platform/environments/", - "destination": "/platform/environments/", - "statusCode": 308 - }, - { - "source": "/agent-platform/platform/integrations/integrations-overview/", - "destination": "/platform/integrations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/platform/team-access-billing-and-identity-permissions/", - "destination": "/platform/team-access-billing-and-identity/", - "statusCode": 308 - }, - { - "source": "/agent-platform/platform/warp-platform/", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/settings/ai-agents/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/terminal-ai/getting-started/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/terminal/ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/terminal/ai/agent-mode/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/terminal/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents/claude-code/", - "destination": "/agent-platform/cli-agents/claude-code/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents/codex/", - "destination": "/agent-platform/cli-agents/codex/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents/opencode/", - "destination": "/agent-platform/cli-agents/opencode/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents/overview/", - "destination": "/agent-platform/cli-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents/remote-control/", - "destination": "/agent-platform/cli-agents/remote-control/", - "statusCode": 308 - }, - { - "source": "/agent-platform/third-party-agents/rich-input/", - "destination": "/agent-platform/cli-agents/rich-input/", - "statusCode": 308 - }, - { - "source": "/agent-platform/using-agents/managing-agents/", - "destination": "/platform/managing-cloud-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-ai/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-ai/assistant/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-ai/get-started/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-platform/", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/appearance/app-icons/", - "destination": "/terminal/appearance/app-icons/", - "statusCode": 308 - }, - { - "source": "/appearance/blocks-behavior/", - "destination": "/terminal/appearance/blocks-behavior/", - "statusCode": 308 - }, - { - "source": "/appearance/compact-mode/", - "destination": "/terminal/appearance/blocks-behavior/", - "statusCode": 308 - }, - { - "source": "/appearance/custom-themes/", - "destination": "/terminal/appearance/custom-themes/", - "statusCode": 308 - }, - { - "source": "/appearance/input-position/", - "destination": "/terminal/appearance/input-position/", - "statusCode": 308 - }, - { - "source": "/appearance/pane-dimming/", - "destination": "/terminal/appearance/pane-dimming/", - "statusCode": 308 - }, - { - "source": "/appearance/prompt/", - "destination": "/terminal/appearance/prompt/", - "statusCode": 308 - }, - { - "source": "/appearance/size-opacity-blurring/", - "destination": "/terminal/appearance/size-opacity-blurring/", - "statusCode": 308 - }, - { - "source": "/appearance/tab-indicators/", - "destination": "/terminal/appearance/tabs-behavior/", - "statusCode": 308 - }, - { - "source": "/appearance/tabs-behavior/", - "destination": "/terminal/appearance/tabs-behavior/", - "statusCode": 308 - }, - { - "source": "/appearance/text-fonts-cursor/", - "destination": "/terminal/appearance/text-fonts-cursor/", - "statusCode": 308 - }, - { - "source": "/appearance/themes/", - "destination": "/terminal/appearance/themes/", - "statusCode": 308 - }, - { - "source": "/appearance/transparency-and-blurring/", - "destination": "/terminal/appearance/size-opacity-blurring/", - "statusCode": 308 - }, - { - "source": "/changelog/changelog/rss/", - "destination": "/changelog/rss.xml", - "statusCode": 308 - }, - { - "source": "/changelog/getting-started/changelog/", - "destination": "/changelog/", - "statusCode": 308 - }, - { - "source": "/changelog/help/changelog/", - "destination": "/changelog/", - "statusCode": 308 - }, - { - "source": "/changelog/release-notes/", - "destination": "/changelog/", - "statusCode": 308 - }, - { - "source": "/changelog/rss/", - "destination": "/changelog/rss.xml", - "statusCode": 308 - }, - { - "source": "/changelog/url/docs.warp.dev/getting-started/changelog/", - "destination": "/changelog/", - "statusCode": 308 - }, - { - "source": "/changelog/warp/getting-started/changelog/", - "destination": "/changelog/", - "statusCode": 308 - }, - { - "source": "/code-editor/", - "destination": "/code/code-editor/", - "statusCode": 308 - }, - { - "source": "/code/code-overview/", - "destination": "/code/overview/", - "statusCode": 308 - }, - { - "source": "/code/code-review/interactive-code-review/", - "destination": "/code/code-review/", - "statusCode": 308 - }, - { - "source": "/code/reviewing-code/", - "destination": "/code/code-review/", - "statusCode": 308 - }, - { - "source": "/configuration/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/errors/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/", - "statusCode": 308 - }, - { - "source": "/errors/:code/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/:code/", - "statusCode": 308 - }, - { - "source": "/features/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/features/accessibility/", - "destination": "/terminal/more-features/accessibility/", - "statusCode": 308 - }, - { - "source": "/features/advanced/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/features/appearance/", - "destination": "/terminal/appearance/", - "statusCode": 308 - }, - { - "source": "/features/appearance/compact-mode/", - "destination": "/terminal/appearance/blocks-behavior/", - "statusCode": 308 - }, - { - "source": "/features/appearance/custom-themes/", - "destination": "/terminal/appearance/custom-themes/", - "statusCode": 308 - }, - { - "source": "/features/appearance/prompt/", - "destination": "/terminal/appearance/prompt/", - "statusCode": 308 - }, - { - "source": "/features/appearance/themes/", - "destination": "/terminal/appearance/themes/", - "statusCode": 308 - }, - { - "source": "/features/blocks/", - "destination": "/terminal/blocks/", - "statusCode": 308 - }, - { - "source": "/features/blocks/background-blocks/", - "destination": "/terminal/blocks/background-blocks/", - "statusCode": 308 - }, - { - "source": "/features/blocks/block-actions/", - "destination": "/terminal/blocks/block-actions/", - "statusCode": 308 - }, - { - "source": "/features/blocks/block-basics/", - "destination": "/terminal/blocks/block-basics/", - "statusCode": 308 - }, - { - "source": "/features/blocks/block-filtering/", - "destination": "/terminal/blocks/block-filtering/", - "statusCode": 308 - }, - { - "source": "/features/blocks/block-sharing/", - "destination": "/terminal/blocks/block-sharing/", - "statusCode": 308 - }, - { - "source": "/features/blocks/sticky-command-header/", - "destination": "/terminal/blocks/sticky-command-header/", - "statusCode": 308 - }, - { - "source": "/features/command-completions/", - "destination": "/terminal/command-completions/", - "statusCode": 308 - }, - { - "source": "/features/command-completions/autosuggestions/", - "destination": "/terminal/command-completions/autosuggestions/", - "statusCode": 308 - }, - { - "source": "/features/command-completions/completions/", - "destination": "/terminal/command-completions/completions/", - "statusCode": 308 - }, - { - "source": "/features/command-history/", - "destination": "/terminal/entry/command-history/", - "statusCode": 308 - }, - { - "source": "/features/command-inspector/", - "destination": "/terminal/editor/command-inspector/", - "statusCode": 308 - }, - { - "source": "/features/command-palette/", - "destination": "/terminal/command-palette/", - "statusCode": 308 - }, - { - "source": "/features/command-search/", - "destination": "/terminal/entry/command-search/", - "statusCode": 308 - }, - { - "source": "/features/compact-mode/", - "destination": "/terminal/appearance/blocks-behavior/", - "statusCode": 308 - }, - { - "source": "/features/completions/", - "destination": "/terminal/command-completions/completions/", - "statusCode": 308 - }, - { - "source": "/features/customize/custom-keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/features/editor/", - "destination": "/terminal/editor/", - "statusCode": 308 - }, - { - "source": "/features/editor/alias-expansion/", - "destination": "/terminal/editor/alias-expansion/", - "statusCode": 308 - }, - { - "source": "/features/editor/command-corrections/", - "destination": "/terminal/entry/command-corrections/", - "statusCode": 308 - }, - { - "source": "/features/editor/command-inspector/", - "destination": "/terminal/editor/command-inspector/", - "statusCode": 308 - }, - { - "source": "/features/editor/syntax-error-highlighting/", - "destination": "/terminal/editor/syntax-error-highlighting/", - "statusCode": 308 - }, - { - "source": "/features/editor/vim/", - "destination": "/terminal/editor/vim/", - "statusCode": 308 - }, - { - "source": "/features/entry/", - "destination": "/terminal/entry/", - "statusCode": 308 - }, - { - "source": "/features/entry/command-corrections/", - "destination": "/terminal/entry/command-corrections/", - "statusCode": 308 - }, - { - "source": "/features/entry/command-history/", - "destination": "/terminal/entry/command-history/", - "statusCode": 308 - }, - { - "source": "/features/entry/command-search/", - "destination": "/terminal/entry/command-search/", - "statusCode": 308 - }, - { - "source": "/features/entry/synchronized-inputs/", - "destination": "/terminal/entry/synchronized-inputs/", - "statusCode": 308 - }, - { - "source": "/features/entry/workflows/", - "destination": "/terminal/entry/yaml-workflows/", - "statusCode": 308 - }, - { - "source": "/features/entry/yaml-workflows/", - "destination": "/terminal/entry/yaml-workflows/", - "statusCode": 308 - }, - { - "source": "/features/files-and-links/", - "destination": "/terminal/more-features/files-and-links/", - "statusCode": 308 - }, - { - "source": "/features/find/", - "destination": "/terminal/blocks/find/", - "statusCode": 308 - }, - { - "source": "/features/full-screen-apps/", - "destination": "/terminal/more-features/full-screen-apps/", - "statusCode": 308 - }, - { - "source": "/features/global-hotkey/", - "destination": "/terminal/windows/global-hotkey/", - "statusCode": 308 - }, - { - "source": "/features/hotkey-window/", - "destination": "/terminal/windows/global-hotkey/", - "statusCode": 308 - }, - { - "source": "/features/integrations/", - "destination": "/terminal/integrations-and-plugins/", - "statusCode": 308 - }, - { - "source": "/features/integrations-and-plugins/", - "destination": "/terminal/integrations-and-plugins/", - "statusCode": 308 - }, - { - "source": "/features/integrations/urls-and-deep-links/", - "destination": "/terminal/more-features/uri-scheme/", - "statusCode": 308 - }, - { - "source": "/features/keybindings/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/features/keyboard-input/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/features/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/features/knowledge/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/features/launch-configurations/", - "destination": "/terminal/sessions/launch-configurations/", - "statusCode": 308 - }, - { - "source": "/features/linux/", - "destination": "/terminal/more-features/linux/", - "statusCode": 308 - }, - { - "source": "/features/markdown-viewer/", - "destination": "/terminal/more-features/markdown-viewer/", - "statusCode": 308 - }, - { - "source": "/features/notifications/", - "destination": "/terminal/more-features/notifications/", - "statusCode": 308 - }, - { - "source": "/features/overview/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/features/prompt/", - "destination": "/terminal/appearance/prompt/", - "statusCode": 308 - }, - { - "source": "/features/quit-warning/", - "destination": "/terminal/more-features/quit-warning/", - "statusCode": 308 - }, - { - "source": "/features/session-management-and-restoration/", - "destination": "/terminal/sessions/", - "statusCode": 308 - }, - { - "source": "/features/session-management/launch-configurations/", - "destination": "/terminal/sessions/launch-configurations/", - "statusCode": 308 - }, - { - "source": "/features/session-management/session-navigation/", - "destination": "/terminal/sessions/session-navigation/", - "statusCode": 308 - }, - { - "source": "/features/session-management/session-restoration/", - "destination": "/terminal/sessions/session-restoration/", - "statusCode": 308 - }, - { - "source": "/features/session-sharing/", - "destination": "/knowledge-and-collaboration/session-sharing/", - "statusCode": 308 - }, - { - "source": "/features/sessions/", - "destination": "/terminal/sessions/", - "statusCode": 308 - }, - { - "source": "/features/sessions/README/", - "destination": "/terminal/sessions/", - "statusCode": 308 - }, - { - "source": "/features/sessions/launch-configurations/", - "destination": "/terminal/sessions/launch-configurations/", - "statusCode": 308 - }, - { - "source": "/features/sessions/quit-warning-modal/", - "destination": "/terminal/more-features/quit-warning/", - "statusCode": 308 - }, - { - "source": "/features/sessions/session-navigation/", - "destination": "/terminal/sessions/session-navigation/", - "statusCode": 308 - }, - { - "source": "/features/sessions/session-restoration/", - "destination": "/terminal/sessions/session-restoration/", - "statusCode": 308 - }, - { - "source": "/features/sessions/sharing-sessions/", - "destination": "/knowledge-and-collaboration/session-sharing/", - "statusCode": 308 - }, - { - "source": "/features/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/features/settings-sync/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/features/settings/configuration-files/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/features/smart-select/", - "destination": "/terminal/more-features/text-selection/", - "statusCode": 308 - }, - { - "source": "/features/split-panes/", - "destination": "/terminal/windows/split-panes/", - "statusCode": 308 - }, - { - "source": "/features/ssh/", - "destination": "/terminal/warpify/ssh-legacy/", - "statusCode": 308 - }, - { - "source": "/features/subshells/", - "destination": "/terminal/warpify/subshells/", - "statusCode": 308 - }, - { - "source": "/features/system-settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/features/tabs/", - "destination": "/terminal/windows/tabs/", - "statusCode": 308 - }, - { - "source": "/features/teams/", - "destination": "/knowledge-and-collaboration/teams/", - "statusCode": 308 - }, - { - "source": "/features/terminal-features/", - "destination": "/terminal/blocks/", - "statusCode": 308 - }, - { - "source": "/features/the-input-editor/", - "destination": "/terminal/editor/", - "statusCode": 308 - }, - { - "source": "/features/themes/", - "destination": "/terminal/appearance/themes/", - "statusCode": 308 - }, - { - "source": "/features/themes/custom-themes/", - "destination": "/terminal/appearance/custom-themes/", - "statusCode": 308 - }, - { - "source": "/features/uri-scheme/", - "destination": "/terminal/more-features/uri-scheme/", - "statusCode": 308 - }, - { - "source": "/features/warp-ai/code/", - "destination": "/code/overview/", - "statusCode": 308 - }, - { - "source": "/features/warp-ai/knowledge/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/features/warp-ai/mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/features/warp-ai/rules/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/", - "destination": "/knowledge-and-collaboration/warp-drive/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/environment-variables/", - "destination": "/knowledge-and-collaboration/warp-drive/environment-variables/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/notebooks/", - "destination": "/knowledge-and-collaboration/warp-drive/notebooks/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/prompts/", - "destination": "/knowledge-and-collaboration/warp-drive/prompts/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/warp-drive-on-the-web/", - "destination": "/knowledge-and-collaboration/warp-drive/web/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/warp-drive-on-the-web-beta/", - "destination": "/knowledge-and-collaboration/warp-drive/web/", - "statusCode": 308 - }, - { - "source": "/features/warp-drive/workflows/", - "destination": "/knowledge-and-collaboration/warp-drive/workflows/", - "statusCode": 308 - }, - { - "source": "/features/warpify/", - "destination": "/terminal/warpify/", - "statusCode": 308 - }, - { - "source": "/features/warpify/ssh/", - "destination": "/terminal/warpify/ssh/", - "statusCode": 308 - }, - { - "source": "/features/warpify/ssh-legacy/", - "destination": "/terminal/warpify/ssh-legacy/", - "statusCode": 308 - }, - { - "source": "/features/warpify/subshells/", - "destination": "/terminal/warpify/subshells/", - "statusCode": 308 - }, - { - "source": "/features/windows/", - "destination": "/terminal/windows/", - "statusCode": 308 - }, - { - "source": "/features/windows/global-hotkey/", - "destination": "/terminal/windows/global-hotkey/", - "statusCode": 308 - }, - { - "source": "/features/windows/split-panes/", - "destination": "/terminal/windows/split-panes/", - "statusCode": 308 - }, - { - "source": "/features/windows/tabs/", - "destination": "/terminal/windows/tabs/", - "statusCode": 308 - }, - { - "source": "/features/windows/~/", - "destination": "/terminal/windows/", - "statusCode": 308 - }, - { - "source": "/features/workflows/", - "destination": "/terminal/entry/yaml-workflows/", - "statusCode": 308 - }, - { - "source": "/features/workflows/block-metrics/shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/features/working-directory/", - "destination": "/terminal/more-features/working-directory/", - "statusCode": 308 - }, - { - "source": "/features/workspaces/", - "destination": "/terminal/sessions/", - "statusCode": 308 - }, - { - "source": "/getting-started/about-warps-ai/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/getting-started/account-and-login/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/coding-in-warp/", - "destination": "/getting-started/quickstart/coding-in-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/customizing-warp/", - "destination": "/getting-started/quickstart/customizing-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/customizing-warp/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/getting-started/download-and-install/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/downloading-warp/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/getting-started-with-warp/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/getting-started-with-warp-on-linux/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/guides/shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/getting-started/how-to-use-warp/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/getting-started/installation/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/installation-and-setup/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/installation/linux/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/installing-warp/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/installing-warp-on-linux/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/introduction/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/getting-started/launch-configurations/", - "destination": "/terminal/sessions/launch-configurations/", - "statusCode": 308 - }, - { - "source": "/getting-started/launching-warp/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/linux/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/linux-installation/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/mac-permissions/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart-guide/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart-guide/README/", - "destination": "/quickstart/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart-guide/agents-in-warp/", - "destination": "/agent-platform/getting-started/agents-in-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart-guide/coding-in-warp/", - "destination": "/getting-started/quickstart/coding-in-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart-guide/customizing-warp/", - "destination": "/getting-started/quickstart/customizing-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart-guide/installation-and-setup/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/getting-started/syncing-your-terminal/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/getting-started/terminal/", - "destination": "/terminal/blocks/", - "statusCode": 308 - }, - { - "source": "/getting-started/using-warp-with-shells/", - "destination": "/getting-started/supported-shells/", - "statusCode": 308 - }, - { - "source": "/getting-started/what-is-warp/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/guide/ssh-guide/", - "destination": "/terminal/warpify/ssh/", - "statusCode": 308 - }, - { - "source": "/guides/ssh-quickstart/", - "destination": "/terminal/warpify/ssh/", - "statusCode": 308 - }, - { - "source": "/how-does-warp-compare/performance/", - "destination": "/terminal/comparisons/performance/", - "statusCode": 308 - }, - { - "source": "/how-does-warp-compare/terminal-features/", - "destination": "/terminal/comparisons/terminal-features/", - "statusCode": 308 - }, - { - "source": "/installation/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/installation/linux/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/knowledge-and-collaboration/warp-drive/warp-drive-as-agent-mode-context/", - "destination": "/knowledge-and-collaboration/warp-drive/agent-mode-context/", - "statusCode": 308 - }, - { - "source": "/knowledge-and-collaboration/warp-drive/warp-drive-on-the-web/", - "destination": "/knowledge-and-collaboration/warp-drive/web/", - "statusCode": 308 - }, - { - "source": "/knowledge-and-collaboration/workflows/", - "destination": "/knowledge-and-collaboration/warp-drive/workflows/", - "statusCode": 308 - }, - { - "source": "/quick-start/", - "destination": "/quickstart/", - "statusCode": 308 - }, - { - "source": "/readme/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/reference/agent-api-and-sdk/", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/ambient-agents/mcp-servers-for-agents/", - "destination": "/reference/cli/mcp-servers/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/authentication_required/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/authentication-required/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/budget_exceeded/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/budget-exceeded/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/content_policy_violation/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/content-policy-violation/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/environment_setup_failed/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/environment-setup-failed/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/external_authentication_required/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/external-authentication-required/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/agent_process_failed/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/agent-process-failed/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/feature_not_available/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/feature-not-available/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/infrastructure_timeout/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/infrastructure-timeout/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/insufficient_credits/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/insufficient-credits/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/integration_disabled/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/integration-disabled/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/integration_not_configured/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/integration-not-configured/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/internal_error/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/internal-error/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/invalid_request/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/invalid-request/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/not_authorized/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/not-authorized/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/operation_not_supported/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/operation-not-supported/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/resource_not_found/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/resource-not-found/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/troubleshooting/errors/resource_unavailable/", - "destination": "/reference/api-and-sdk/troubleshooting/errors/resource-unavailable/", - "statusCode": 308 - }, - { - "source": "/reference/cli/integrations-and-environments/", - "destination": "/reference/cli/integration-setup/", - "statusCode": 308 - }, - { - "source": "/reference/cli/mcp-for-cloud-agents/", - "destination": "/reference/cli/mcp-servers/", - "statusCode": 308 - }, - { - "source": "/reference/cli/mcp-servers-for-cloud-agents/", - "destination": "/reference/cli/mcp-servers/", - "statusCode": 308 - }, - { - "source": "/reference/developers/cli/", - "destination": "/reference/cli/", - "statusCode": 308 - }, - { - "source": "/reference/integrations/integrations-overview/integrations-and-environments/", - "destination": "/reference/cli/integration-setup/", - "statusCode": 308 - }, - { - "source": "/reference/keybindings/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/reference/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/reference/platform/agent-api-and-sdk/", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/platform/agent-api-and-sdk/agent/", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/platform/agent-api-and-sdk/agent-1/", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/platform/agent-api-and-sdk/demo-sentry-monitoring-with-sdk/", - "destination": "/reference/api-and-sdk/demo-sentry-monitoring-with-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/platform/cli/", - "destination": "/reference/cli/", - "statusCode": 308 - }, - { - "source": "/reference/platform/cli/api-keys/", - "destination": "/reference/cli/api-keys/", - "statusCode": 308 - }, - { - "source": "/reference/platform/cli/integrations-and-environments/", - "destination": "/reference/cli/integration-setup/", - "statusCode": 308 - }, - { - "source": "/reference/platform/cli/troubleshooting/", - "destination": "/reference/cli/troubleshooting/", - "statusCode": 308 - }, - { - "source": "/reference/platform/warp-platform/", - "destination": "/reference/", - "statusCode": 308 - }, - { - "source": "/reference/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/session-sharing/", - "destination": "/knowledge-and-collaboration/session-sharing/", - "statusCode": 308 - }, - { - "source": "/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/settings-menu/overview/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/settings-overview/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/settings/features/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/settings/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/support-and-community/features/network-log/", - "destination": "/support-and-community/privacy-and-security/network-log/", - "statusCode": 308 - }, - { - "source": "/support-and-community/features/secret-redaction/", - "destination": "/support-and-community/privacy-and-security/secret-redaction/", - "statusCode": 308 - }, - { - "source": "/support-and-community/getting-started/privacy/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/getting-started/refer-a-friend/", - "destination": "/support-and-community/community/refer-a-friend/", - "statusCode": 308 - }, - { - "source": "/support-and-community/getting-started/warp-preview-and-alpha-program/", - "destination": "/support-and-community/community/warp-preview-and-alpha-program/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/ai-features/bring-your-own-llm/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/faq/billing-and-payments/", - "destination": "/support-and-community/plans-and-billing/pricing-faqs/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/known-issues/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/licenses/", - "destination": "/support-and-community/community/open-source-licenses/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/plans-subscriptions-and-pricing/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/releasing-and-updating/", - "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/sending-us-feedback/", - "destination": "/support-and-community/troubleshooting-and-support/sending-us-feedback/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/troubleshooting-login-issues/", - "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/uninstalling-warp/", - "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/updating-warp/", - "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", - "statusCode": 308 - }, - { - "source": "/support-and-community/help/using-warp-offline/", - "destination": "/support-and-community/troubleshooting-and-support/using-warp-offline/", - "statusCode": 308 - }, - { - "source": "/support-and-community/known-issues/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-and-billing/overages-legacy/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-pricing-and-billing/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-pricing-and-billing/add-on-credits/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-pricing-and-billing/ai-credits/", - "destination": "/support-and-community/plans-and-billing/credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-pricing-and-billing/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-pricing-and-billing/overages-legacy/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-pricing-and-billing/pricing-faqs/", - "destination": "/support-and-community/plans-and-billing/pricing-faqs/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy-and-security/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy/network-log/", - "destination": "/support-and-community/privacy-and-security/network-log/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy/privacy/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy/secret-redaction/", - "destination": "/support-and-community/privacy-and-security/secret-redaction/", - "statusCode": 308 - }, - { - "source": "/support-and-community/security-and-privacy/data-handling/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/security-and-privacy/data-ownership/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/known-issues/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/licenses/", - "destination": "/support-and-community/community/open-source-licenses/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/licenses-intro/", - "destination": "/support-and-community/community/open-source-licenses/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-billing/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/add-on-credits/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/ai-credits/", - "destination": "/support-and-community/plans-and-billing/credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/ai-requests/", - "destination": "/support-and-community/plans-and-billing/credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/pricing-faqs/", - "destination": "/support-and-community/plans-and-billing/pricing-faqs/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/reload-credits-add-on-credits/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-pricing/usage-overages/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/plans-and-prilling/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/pricing-faqs/", - "destination": "/support-and-community/plans-and-billing/pricing-faqs/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/sending-us-feedback/", - "destination": "/support-and-community/troubleshooting-and-support/sending-us-feedback/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/subscription-management/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/troubleshooting-login-issues/", - "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/uninstalling-warp/", - "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/updating-warp/", - "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-billing/using-warp-offline/", - "destination": "/support-and-community/troubleshooting-and-support/using-warp-offline/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-and-billing/ai-credits/", - "destination": "/support-and-community/plans-and-billing/credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/add-on-credits/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/ai-credits/", - "destination": "/support-and-community/plans-and-billing/credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/overages-legacy/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/plans-pricing-and-billing/pricing-faqs/", - "destination": "/support-and-community/plans-and-billing/pricing-faqs/", - "statusCode": 308 - }, - { - "source": "/support-and-community/support-and-community/privacy-and-security/privacy/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/troubleshooting/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/troubleshooting/common-issues/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-community/troubleshooting/general-troubleshooting/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/terminal/command-input/command-suggestions/", - "destination": "/terminal/command-completions/completions/", - "statusCode": 308 - }, - { - "source": "/terminal/keybindings/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/terminal/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/terminal/sessions/tab-configs/", - "destination": "/terminal/windows/tab-configs/", - "statusCode": 308 - }, - { - "source": "/terminal/shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/terminal/universal-input/", - "destination": "/terminal/input/classic-input/", - "statusCode": 308 - }, - { - "source": "/terminal/universal-input/classic-input/", - "destination": "/terminal/input/classic-input/", - "statusCode": 308 - }, - { - "source": "/terminal/windows/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/terminal/windows/keyboard-shortcuts-windows/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/terminal/windows/windows-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/warp-quickstart/", - "destination": "/quickstart/", - "statusCode": 308 - }, - { - "source": "/warp-terminal-101/settings/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/what-is-warp/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/support-and-community/troubleshooting-and-support/uninstalling-warp/", - "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/active-ai/", - "destination": "/agent-platform/local-agents/active-ai/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/blocks-as-context/", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/images-as-context/", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/selection-as-context/", - "destination": "/agent-platform/local-agents/agent-context/selection-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/urls-as-context/", - "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/using-to-add-context/", - "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-notifications/", - "destination": "/agent-platform/capabilities/agent-notifications/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-profiles-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/", - "destination": "/agent-platform/capabilities/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/cloud-conversations/", - "destination": "/agent-platform/local-agents/cloud-conversations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/code-diffs/", - "destination": "/agent-platform/local-agents/code-diffs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/codebase-context/", - "destination": "/agent-platform/capabilities/codebase-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/computer-use/", - "destination": "/agent-platform/capabilities/computer-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/full-terminal-use/", - "destination": "/agent-platform/capabilities/full-terminal-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/interacting-with-agents/conversation-forking/", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/interacting-with-agents/terminal-and-agent-modes/", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/interacting-with-agents/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/interactive-code-review/", - "destination": "/agent-platform/local-agents/interactive-code-review/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/planning/", - "destination": "/agent-platform/capabilities/planning/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/rules/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/session-sharing/", - "destination": "/agent-platform/local-agents/session-sharing/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/skills/", - "destination": "/agent-platform/capabilities/skills/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/slash-commands/", - "destination": "/agent-platform/capabilities/slash-commands/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/task-lists/", - "destination": "/agent-platform/capabilities/task-lists/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/web-search/", - "destination": "/agent-platform/capabilities/web-search/", - "statusCode": 308 - }, - { - "source": "/warp/code/code-editor/code-editor-vim-keybindings/", - "destination": "/code/code-editor/code-editor-vim-keybindings/", - "statusCode": 308 - }, - { - "source": "/warp/code/code-editor/file-tree/", - "destination": "/code/code-editor/file-tree/", - "statusCode": 308 - }, - { - "source": "/warp/code/code-editor/find-and-replace/", - "destination": "/code/code-editor/find-and-replace/", - "statusCode": 308 - }, - { - "source": "/warp/code/code-editor/language-server-protocol/", - "destination": "/code/code-editor/language-server-protocol/", - "statusCode": 308 - }, - { - "source": "/warp/code/code-review/", - "destination": "/code/code-review/", - "statusCode": 308 - }, - { - "source": "/warp/code/git-worktrees/", - "destination": "/code/git-worktrees/", - "statusCode": 308 - }, - { - "source": "/warp/code/overview/", - "destination": "/code/overview/", - "statusCode": 308 - }, - { - "source": "/warp/code/ssh-feature-support/", - "destination": "/code/ssh-feature-support/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/coding-in-warp/", - "destination": "/getting-started/quickstart/coding-in-warp/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/customizing-warp/", - "destination": "/getting-started/quickstart/customizing-warp/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/installation-and-setup/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/keyboard-shortcuts/", - "destination": "/getting-started/keyboard-shortcuts/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/migrate-to-warp/", - "destination": "/getting-started/migrate-to-warp/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/quickstart/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/supported-shells/", - "destination": "/getting-started/supported-shells/", - "statusCode": 308 - }, - { - "source": "/warp/getting-started/what-is-warp/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/admin-panel/", - "destination": "/knowledge-and-collaboration/admin-panel/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/teams/", - "destination": "/knowledge-and-collaboration/teams/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/agent-mode-context/", - "destination": "/knowledge-and-collaboration/warp-drive/agent-mode-context/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/ai-objects/", - "destination": "/knowledge-and-collaboration/warp-drive/ai-objects/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/environment-variables/", - "destination": "/knowledge-and-collaboration/warp-drive/environment-variables/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/notebooks/", - "destination": "/knowledge-and-collaboration/warp-drive/notebooks/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/prompts/", - "destination": "/knowledge-and-collaboration/warp-drive/prompts/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/web/", - "destination": "/knowledge-and-collaboration/warp-drive/web/", - "statusCode": 308 - }, - { - "source": "/warp/knowledge-and-collaboration/warp-drive/workflows/", - "destination": "/knowledge-and-collaboration/warp-drive/workflows/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/app-icons/", - "destination": "/terminal/appearance/app-icons/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/blocks-behavior/", - "destination": "/terminal/appearance/blocks-behavior/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/custom-themes/", - "destination": "/terminal/appearance/custom-themes/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/input-position/", - "destination": "/terminal/appearance/input-position/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/pane-dimming/", - "destination": "/terminal/appearance/pane-dimming/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/prompt/", - "destination": "/terminal/appearance/prompt/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/size-opacity-blurring/", - "destination": "/terminal/appearance/size-opacity-blurring/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/tabs-behavior/", - "destination": "/terminal/appearance/tabs-behavior/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/text-fonts-cursor/", - "destination": "/terminal/appearance/text-fonts-cursor/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/appearance/themes/", - "destination": "/terminal/appearance/themes/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/background-blocks/", - "destination": "/terminal/blocks/background-blocks/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/block-actions/", - "destination": "/terminal/blocks/block-actions/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/block-basics/", - "destination": "/terminal/blocks/block-basics/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/block-filtering/", - "destination": "/terminal/blocks/block-filtering/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/block-sharing/", - "destination": "/terminal/blocks/block-sharing/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/find/", - "destination": "/terminal/blocks/find/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/blocks/sticky-command-header/", - "destination": "/terminal/blocks/sticky-command-header/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/command-completions/autosuggestions/", - "destination": "/terminal/command-completions/autosuggestions/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/command-completions/completions/", - "destination": "/terminal/command-completions/completions/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/command-palette/", - "destination": "/terminal/command-palette/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/comparisons/performance/", - "destination": "/terminal/comparisons/performance/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/comparisons/terminal-features/", - "destination": "/terminal/comparisons/terminal-features/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/editor/alias-expansion/", - "destination": "/terminal/editor/alias-expansion/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/editor/command-inspector/", - "destination": "/terminal/editor/command-inspector/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/editor/syntax-error-highlighting/", - "destination": "/terminal/editor/syntax-error-highlighting/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/editor/vim/", - "destination": "/terminal/editor/vim/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/entry/command-corrections/", - "destination": "/terminal/entry/command-corrections/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/entry/command-history/", - "destination": "/terminal/entry/command-history/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/entry/command-search/", - "destination": "/terminal/entry/command-search/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/entry/synchronized-inputs/", - "destination": "/terminal/entry/synchronized-inputs/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/entry/yaml-workflows/", - "destination": "/terminal/entry/yaml-workflows/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/input/classic-input/", - "destination": "/terminal/input/classic-input/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/integrations-and-plugins/", - "destination": "/terminal/integrations-and-plugins/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/accessibility/", - "destination": "/terminal/more-features/accessibility/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/audible-bell/", - "destination": "/terminal/more-features/audible-bell/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/files-and-links/", - "destination": "/terminal/more-features/files-and-links/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/full-screen-apps/", - "destination": "/terminal/more-features/full-screen-apps/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/linux/", - "destination": "/terminal/more-features/linux/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/markdown-viewer/", - "destination": "/terminal/more-features/markdown-viewer/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/notifications/", - "destination": "/terminal/more-features/notifications/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/quit-warning/", - "destination": "/terminal/more-features/quit-warning/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/settings-sync/", - "destination": "/terminal/more-features/settings-sync/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/text-selection/", - "destination": "/terminal/more-features/text-selection/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/uri-scheme/", - "destination": "/terminal/more-features/uri-scheme/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/more-features/working-directory/", - "destination": "/terminal/more-features/working-directory/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/sessions/launch-configurations/", - "destination": "/terminal/sessions/launch-configurations/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/sessions/session-navigation/", - "destination": "/terminal/sessions/session-navigation/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/sessions/session-restoration/", - "destination": "/terminal/sessions/session-restoration/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/settings/all-settings/", - "destination": "/getting-started/quickstart/customizing-warp/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/warpify/ssh/", - "destination": "/terminal/warpify/ssh/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/warpify/ssh-legacy/", - "destination": "/terminal/warpify/ssh-legacy/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/warpify/subshells/", - "destination": "/terminal/warpify/subshells/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/windows/global-hotkey/", - "destination": "/terminal/windows/global-hotkey/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/windows/split-panes/", - "destination": "/terminal/windows/split-panes/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/windows/tab-configs/", - "destination": "/terminal/windows/tab-configs/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/windows/tabs/", - "destination": "/terminal/windows/tabs/", - "statusCode": 308 - }, - { - "source": "/warp/terminal/windows/vertical-tabs/", - "destination": "/terminal/windows/vertical-tabs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/integrations/github-actions/quickstart-github-actions/", - "destination": "/platform/integrations/github-actions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/", - "destination": "/agent-platform/local-agents/agent-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/agent-context/mcp/", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/agent-notifications/", - "destination": "/agent-platform/capabilities/agent-notifications/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/agent-profiles-permissions/", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/cloud-conversations/", - "destination": "/agent-platform/local-agents/cloud-conversations/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/codebase-context/", - "destination": "/agent-platform/capabilities/codebase-context/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/computer-use/", - "destination": "/agent-platform/capabilities/computer-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/full-terminal-use/", - "destination": "/agent-platform/capabilities/full-terminal-use/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/model-choice/", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/planning/", - "destination": "/agent-platform/capabilities/planning/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/rules/", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/session-sharing/", - "destination": "/agent-platform/local-agents/session-sharing/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/skills/", - "destination": "/agent-platform/capabilities/skills/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/slash-commands/", - "destination": "/agent-platform/capabilities/slash-commands/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/task-lists/", - "destination": "/agent-platform/capabilities/task-lists/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/capabilities-overview/web-search/", - "destination": "/agent-platform/capabilities/web-search/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/interacting-with-agents/", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/interacting-with-agents/code-diffs/", - "destination": "/agent-platform/local-agents/code-diffs/", - "statusCode": 308 - }, - { - "source": "/agent-platform/warp-agents/warp-agents/", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/getting-started/quickstart/", - "destination": "/quickstart/", - "statusCode": 308 - }, - { - "source": "/guides/agent-workflows/how-to-run-3-agents-in-parallel-summarize-logs-\\+-analyze-pr-\\+-modify-ui/", - "destination": "/guides/agent-workflows/how-to-run-3-agents-in-parallel-summarize-logs-analyze-pr-modify-ui/", - "statusCode": 308 - }, - { - "source": "/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-\\+-railway/", - "destination": "/guides/build-an-app-in-warp/building-a-real-time-chat-app-github-mcp-railway/", - "statusCode": 308 - }, - { - "source": "/guides/build-an-app-in-warp/building-a-slackbot/", - "destination": "/platform/integrations/slack/", - "statusCode": 308 - }, - { - "source": "/guides/configuration/how-to-create-project-rules-for-an-existing-project-astro-\\+-typescript-\\+-tailwind/", - "destination": "/guides/configuration/how-to-create-project-rules-for-an-existing-project-astro-typescript-tailwind/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/how-to-analyze-cloud-run-logs-gcloud/", - "destination": "/guides/devops/how-to-analyze-cloud-run-logs-gcloud/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/how-to-create-a-production-ready-docker-setup/", - "destination": "/guides/devops/how-to-create-a-production-ready-docker-setup/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/how-to-create-priority-matrix-for-database-optimization/", - "destination": "/guides/devops/how-to-create-priority-matrix-for-database-optimization/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/how-to-generate-unit-and-security-tests-to-debug-faster/", - "destination": "/guides/devops/how-to-generate-unit-and-security-tests-to-debug-faster/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/how-to-prevent-secrets-from-leaking/", - "destination": "/guides/devops/how-to-prevent-secrets-from-leaking/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/how-to-write-sql-commands-inside-a-postgres-repl/", - "destination": "/guides/devops/how-to-write-sql-commands-inside-a-postgres-repl/", - "statusCode": 308 - }, - { - "source": "/guides/devops-and-infrastructure/improve-your-kubernetes-workflow-kubectl-\\+-helm/", - "destination": "/guides/devops/improve-your-kubernetes-workflow-kubectl-helm/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/context7-mcp-update-astro-project-with-best-practices/", - "destination": "/guides/external-tools/context7-mcp-update-astro-project-with-best-practices/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/figma-remote-mcp-create-a-website-from-a-figma-file-from-scratch/", - "destination": "/guides/external-tools/figma-remote-mcp-create-a-website-from-a-figma-file-from-scratch/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/github-mcp-summarizing-open-prs-and-creating-gh-issues/", - "destination": "/guides/external-tools/github-mcp-summarizing-open-prs-and-creating-gh-issues/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/how-to-set-up-claude-code/", - "destination": "/guides/external-tools/how-to-set-up-claude-code/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/how-to-set-up-codex-cli/", - "destination": "/guides/external-tools/how-to-set-up-codex-cli/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/how-to-set-up-gemini-cli/", - "destination": "/guides/external-tools/how-to-set-up-gemini-cli/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/how-to-set-up-ollama/", - "destination": "/guides/external-tools/how-to-set-up-ollama/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/how-to-set-up-opencode/", - "destination": "/guides/external-tools/how-to-set-up-opencode/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/linear-mcp-retrieve-issue-data/", - "destination": "/guides/external-tools/linear-mcp-retrieve-issue-data/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/linear-mcp-updating-tickets-with-a-lean-build-approach/", - "destination": "/guides/external-tools/linear-mcp-updating-tickets-with-a-lean-build-approach/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/puppeteer-mcp-scraping-amazon-web-reviews/", - "destination": "/guides/external-tools/puppeteer-mcp-scraping-amazon-web-reviews/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/sentry-mcp-fix-sentry-error-in-empower-website/", - "destination": "/guides/external-tools/sentry-mcp-fix-sentry-error-in-empower-website/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up/", - "destination": "/guides/external-tools/sqlite-and-stripe-mcp-basic-queries-you-can-make-after-set-up/", - "statusCode": 308 - }, - { - "source": "/guides/external-tools-and-integrations/using-mcp-servers-with-warp/", - "destination": "/guides/external-tools/using-mcp-servers-with-warp/", - "statusCode": 308 - }, - { - "source": "/guides/frontend-and-ui/how-to-actually-code-ui-that-matches-your-mockup-react-\\+-tailwind/", - "destination": "/guides/frontend/how-to-actually-code-ui-that-matches-your-mockup-react-tailwind/", - "statusCode": 308 - }, - { - "source": "/guides/frontend-and-ui/how-to-replace-a-ui-element-in-warp-rust-codebase/", - "destination": "/guides/frontend/how-to-replace-a-ui-element-in-warp-rust-codebase/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/api-and-sdk/", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/api-and-sdk/models/", - "destination": "/reference/api-and-sdk/", - "statusCode": 308 - }, - { - "source": "/reference/cli/cli/", - "destination": "/reference/cli/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy-security-and-licensing/network-log/", - "destination": "/support-and-community/privacy-and-security/network-log/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy-security-and-licensing/open-source-licenses/", - "destination": "/support-and-community/community/open-source-licenses/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy-security-and-licensing/privacy/", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/support-and-community/privacy-security-and-licensing/secret-redaction/", - "destination": "/support-and-community/privacy-and-security/secret-redaction/", - "statusCode": 308 - }, - { - "source": "/terminal/classic-input/", - "destination": "/terminal/input/classic-input/", - "statusCode": 308 - }, - { - "source": "/terminal/terminal-features/", - "destination": "/terminal/comparisons/terminal-features/", - "statusCode": 308 - }, - { - "source": "/terminal/windows/launch-configurations/", - "destination": "/terminal/sessions/launch-configurations/", - "statusCode": 308 - }, - { - "source": "/agents/agents-overview/", - "destination": "/agent-platform/", - "statusCode": 308 - }, - { - "source": "/agents/ai/", - "destination": "/agent-platform/", - "statusCode": 308 - }, - { - "source": "/agents/ai-faqs/", - "destination": "/agent-platform/getting-started/faqs/", - "statusCode": 308 - }, - { - "source": "/agents/autonomy/", - "destination": "/agent-platform/getting-started/agents-in-warp/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-context/blocks-as-context/", - "destination": "/agent-platform/local-agents/agent-context/blocks-as-context/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-context/images-as-context/", - "destination": "/agent-platform/local-agents/agent-context/images-as-context/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-context/urls-as-context/", - "destination": "/agent-platform/local-agents/agent-context/urls-as-context/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-context/using-to-add-context/", - "destination": "/agent-platform/local-agents/agent-context/using-to-add-context/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-conversations/conversation-forking/", - "destination": "/agent-platform/local-agents/interacting-with-agents/conversation-forking/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/managing-agents/", - "destination": "/platform/managing-cloud-agents/", - "statusCode": 308 - }, - { - "source": "/agents/voice/", - "destination": "/agent-platform/local-agents/interacting-with-agents/voice/", - "statusCode": 308 - }, - { - "source": "/ambient-agents/ambient-agents-overview/", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/ambient-agents/managing-ambient-agents/", - "destination": "/platform/managing-cloud-agents/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme/", - "destination": "/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme-1/coding-in-warp/", - "destination": "/getting-started/quickstart/coding-in-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme-1/customizing-warp/", - "destination": "/getting-started/quickstart/customizing-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme-1/installation-and-setup/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme/coding-in-warp/", - "destination": "/getting-started/quickstart/coding-in-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme/customizing-warp/", - "destination": "/getting-started/quickstart/customizing-warp/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme/installation-and-setup/", - "destination": "/getting-started/quickstart/installation-and-setup/", - "statusCode": 308 - }, - { - "source": "/platform/warp-platform/", - "destination": "/reference/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/known-issues/", - "destination": "/support-and-community/troubleshooting-and-support/known-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/plans-and-pricing/", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/plans-and-pricing/add-on-credits/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/plans-and-pricing/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/plans-and-pricing/pricing-faqs/", - "destination": "/support-and-community/plans-and-billing/pricing-faqs/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/plans-and-pricing/reload-credits-add-on-credits/", - "destination": "/support-and-community/plans-and-billing/add-on-credits/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/sending-us-feedback/", - "destination": "/support-and-community/troubleshooting-and-support/sending-us-feedback/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/troubleshooting-login-issues/", - "destination": "/support-and-community/troubleshooting-and-support/troubleshooting-login-issues/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/uninstalling-warp/", - "destination": "/support-and-community/troubleshooting-and-support/logging-out-and-uninstalling/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/updating-warp/", - "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/managed-worker-reference/", - "destination": "/platform/self-hosting/reference/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/managed-worker-reference/direct-backend/", - "destination": "/platform/self-hosting/managed-direct/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/managed-worker-reference/docker-connectivity/", - "destination": "/platform/self-hosting/managed-docker/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/managed-worker-reference/helm-chart/", - "destination": "/platform/self-hosting/managed-kubernetes/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/managed-worker-reference/kubernetes-backend/", - "destination": "/platform/self-hosting/managed-kubernetes/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/managed-worker-reference/private-docker-registries/", - "destination": "/platform/self-hosting/managed-docker/", - "statusCode": 308 - }, - { - "source": "/agent-platform/local-agents/interacting-with-agents/agent-modality/", - "destination": "/agent-platform/local-agents/interacting-with-agents/terminal-and-agent-modes/", - "statusCode": 308 - }, - { - "source": "/university/(.*)", - "destination": "/guides/$1", - "statusCode": 308 - }, - { - "source": "/platform/cli", - "destination": "/reference/cli/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-and-billing/plans-and-pricing", - "destination": "/support-and-community/plans-and-billing/plans-pricing-refunds/", - "statusCode": 308 - }, - { - "source": "/knowledge-and-collaboration/mcp", - "destination": "/agent-platform/capabilities/mcp/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme-1", - "destination": "/quickstart/", - "statusCode": 308 - }, - { - "source": "/support-and-billing/plans-and-pricing/ai-credits", - "destination": "/support-and-community/plans-and-billing/", - "statusCode": 308 - }, - { - "source": "/getting-started/changelog", - "destination": "/changelog/", - "statusCode": 308 - }, - { - "source": "/university", - "destination": "/guides/", - "statusCode": 308 - }, - { - "source": "/code/codebase-context", - "destination": "/agent-platform/capabilities/codebase-context/", - "statusCode": 308 - }, - { - "source": "/platform/environments", - "destination": "/platform/environments/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/model-choice", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/getting-started/readme/agents-in-warp", - "destination": "/agent-platform/local-agents/overview/", - "statusCode": 308 - }, - { - "source": "/privacy/privacy", - "destination": "/support-and-community/privacy-and-security/privacy/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/third-party-cli-agents", - "destination": "/agent-platform/cli-agents/overview/", - "statusCode": 308 - }, - { - "source": "/knowledge-and-collaboration/rules", - "destination": "/agent-platform/capabilities/rules/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/skills", - "destination": "/agent-platform/capabilities/skills/", - "statusCode": 308 - }, - { - "source": "/community/refer-a-friend", - "destination": "/support-and-community/community/refer-a-friend/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/using-agents/model-choice", - "destination": "/agent-platform/inference/model-choice/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/using-agents", - "destination": "/agent-platform/local-agents/interacting-with-agents/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/planning", - "destination": "/agent-platform/capabilities/planning/", - "statusCode": 308 - }, - { - "source": "/support-and-community/plans-and-billing/ai-credits", - "destination": "/support-and-community/plans-and-billing/", - "statusCode": 308 - }, - { - "source": "/agent-platform/agent/using-agents/agent-conversations", - "destination": "/agent-platform/local-agents/interacting-with-agents/", + "source": "/agent-platform/agent/using-agents/agent-conversations", + "destination": "/agent-platform/local-agents/interacting-with-agents/", "statusCode": 308 }, { @@ -8517,7 +5099,7 @@ }, { "source": "/agent-platform/agent/agents-overview", - "destination": "/agent-platform/local-agents/overview/", + "destination": "/agents/", "statusCode": 308 }, { @@ -8547,7 +5129,7 @@ }, { "source": "/agent-platform/warps-agent/warp-agents", - "destination": "/agent-platform/local-agents/overview/", + "destination": "/agents/", "statusCode": 308 }, { @@ -8582,7 +5164,7 @@ }, { "source": "/agents/agent-modality-beta", - "destination": "/agent-platform/local-agents/overview/", + "destination": "/agents/", "statusCode": 308 }, { @@ -8617,7 +5199,7 @@ }, { "source": "/agents/generate", - "destination": "/agent-platform/local-agents/overview/", + "destination": "/agents/local-agents/generate/", "statusCode": 308 }, { @@ -8657,7 +5239,7 @@ }, { "source": "/agent-platform/agent/generate", - "destination": "/agent-platform/local-agents/overview/", + "destination": "/agents/local-agents/generate/", "statusCode": 308 }, { @@ -9176,12 +5758,7 @@ "statusCode": 308 }, { - "source": "/agents/using-agents/agent-permissions", - "destination": "/agent-platform/capabilities/agent-profiles-permissions/", - "statusCode": 308 - }, - { - "source": "/agents/using-agents/agent-permissions/", + "source": "/agents/using-agents/agent-permissions(/?)", "destination": "/agent-platform/capabilities/agent-profiles-permissions/", "statusCode": 308 }, @@ -9701,7 +6278,12 @@ "statusCode": 308 }, { - "source": "/support-and-community/plans-and-billing/bring-your-own-api-key", + "source": "/agent-platform/capabilities/computer-use-testing-and-recordings", + "destination": "/agent-platform/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/", "statusCode": 308 }, @@ -9891,57 +6473,27 @@ "statusCode": 308 }, { - "source": "/support-and-community/plans-and-billing/bring-your-own-api-key/", - "destination": "/agent-platform/inference/bring-your-own-api-key/", - "statusCode": 308 - }, - { - "source": "/help/updating-warp", - "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", - "statusCode": 308 - }, - { - "source": "/help/updating-warp/", + "source": "/help/updating-warp(/?)", "destination": "/support-and-community/troubleshooting-and-support/updating-warp/", "statusCode": 308 }, { - "source": "/help/licenses", - "destination": "/support-and-community/community/open-source-licenses/", - "statusCode": 308 - }, - { - "source": "/help/licenses/", + "source": "/help/licenses(/?)", "destination": "/support-and-community/community/open-source-licenses/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/overview", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/overview/", + "source": "/agent-platform/cloud-agents/overview(/?)", "destination": "/platform/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents/platform", - "destination": "/platform/overview/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/platform/", + "source": "/agent-platform/cloud-agents/platform(/?)", "destination": "/platform/overview/", "statusCode": 308 }, { - "source": "/agent-platform/cloud-agents", - "destination": "/platform/", - "statusCode": 308 - }, - { - "source": "/agent-platform/cloud-agents/", + "source": "/agent-platform/cloud-agents(/?)", "destination": "/platform/", "statusCode": 308 }, @@ -9961,13 +6513,28 @@ "statusCode": 308 }, { - "source": "/team", + "source": "/team(/?)", "destination": "/knowledge-and-collaboration/teams/", "statusCode": 308 }, { - "source": "/team/", - "destination": "/knowledge-and-collaboration/teams/", + "source": "/agents/local-agents/overview", + "destination": "/agents/", + "statusCode": 308 + }, + { + "source": "/agents/local-agents/overview/", + "destination": "/agents/", + "statusCode": 308 + }, + { + "source": "/agents/getting-started/agents-in-warp", + "destination": "/agents/", + "statusCode": 308 + }, + { + "source": "/agents/getting-started/agents-in-warp/", + "destination": "/agents/", "statusCode": 308 } ]