diff --git a/.agents/skills/missing_docs/references/feature_surface_map.md b/.agents/skills/missing_docs/references/feature_surface_map.md index 6e1732a2..c395f6e0 100644 --- a/.agents/skills/missing_docs/references/feature_surface_map.md +++ b/.agents/skills/missing_docs/references/feature_surface_map.md @@ -325,13 +325,30 @@ GET /.well-known/openid-configuration -> internal # RFC 8414 / RFC 9728 OAuth discovery documents that MCP clients fetch # automatically before authenticating against the hosted Factory MCP endpoint -# (router/handlers/public_api/oauth2.go, registered only when the dogfood-only -# factory_mcp flag is on). They are machine-facing protocol metadata for an -# unreleased product, absent from warp-server's canonical public spec, so they -# are not a documentable public API surface. +# (router/handlers/public_api/oauth2.go, registered by registerMCPDiscoveryRoutes +# only when the dogfood-only factory_mcp flag is on). They are machine-facing +# protocol metadata for an unreleased product, absent from warp-server's +# canonical public spec, so they are not a documentable public API surface. The +# path-suffixed variants implement RFC 8414 section 5 path-aware discovery for +# the /api/v1/mcp/factory resource. GET /.well-known/oauth-authorization-server -> internal +GET /.well-known/oauth-authorization-server/api/v1/mcp/factory -> internal +GET /.well-known/openid-configuration/api/v1/mcp/factory -> internal GET /.well-known/oauth-protected-resource/api/v1/mcp/factory -> internal +# OAuth consent screen, connected-apps (grant) management, token revocation, and +# RFC 7591 dynamic client registration backing the MCP harness OAuth flows +# (router/handlers/public_api/oauth2.go; registration is additionally +# flag-gated). Like the device-flow endpoints above, these are protocol and web +# plumbing rather than a released public REST surface, and they are absent from +# warp-server's canonical public spec. +GET /oauth/consent/info -> internal +POST /oauth/consent -> internal +GET /oauth/grants -> internal +DELETE /oauth/grants/{client_id} -> internal +POST /oauth/register -> internal +POST /oauth/revoke -> internal + # Anonymous-viewer redirect probes (documented exceptions to auth, not API surfaces). GET /agent/sessions/{session_uuid}/redirect -> internal GET /agent/conversations/{conversation_id}/redirect -> internal @@ -361,6 +378,7 @@ POST /harness-support/notify-user -> internal POST /harness-support/finish-task -> internal POST /harness-support/report-shutdown -> internal POST /harness-support/upload-snapshot -> internal +POST /harness-support/commit-snapshot -> internal # Oz Factory REST API (router/handlers/public_api/factory*.go). Factory is a # private, not-yet-released product (the FactoryMcp flag is dogfood and the @@ -403,10 +421,44 @@ PUT /factory/automations/{id}/subscriptions -> internal DELETE /factory/automations/{id}/subscriptions/{subscription_id} -> internal GET /factory/scorers -> internal POST /factory/scorers -> internal +PATCH /factory/scorers/{scorer_id} -> internal +DELETE /factory/scorers/{scorer_id} -> internal +POST /factory/scorers/{scorer_id}/pause -> internal +POST /factory/scorers/{scorer_id}/resume -> internal GET /factory/scorers/{scorer_id}/results -> internal +GET /factory/scorers/{scorer_id}/results/reasons -> internal GET /factory/scorers/{scorer_id}/autofix-config -> internal PUT /factory/scorers/{scorer_id}/autofix-config -> internal DELETE /factory/scorers/{scorer_id}/autofix-config -> internal +GET /factory/runs/{run_id}/scores -> internal +POST /factory/run-scoring/dispatches -> internal +POST /factory/autofix/runs/{autofix_run_id}/file-tasks -> internal +POST /factory/autofix/worker-results/{worker_result_id}/report -> internal +PUT /factory/automations/{id}/subscriptions/{subscription_id} -> internal +GET /factory/{uid}/integrations/github/branches -> internal +GET /factory/{uid}/integrations/github/labels -> internal +GET /factory/{uid}/integrations/github/teams -> internal +GET /factory/{uid}/integrations/github/users -> internal +GET /factory/{uid}/integrations/github/workflows -> internal +GET /factory/{uid}/integrations/linear/issues -> internal +GET /factory/{uid}/integrations/linear/projects -> internal +GET /factory/{uid}/integrations/linear/users -> internal +GET /factory/{uid}/integrations/linear/workflow-states -> internal +GET /factory/{uid}/integrations/slack/conversations -> internal +GET /factory/{uid}/integrations/slack/users -> internal +# Factory benchmark suites and benchmark runs +# (router/handlers/public_api/benchmarks.go). Same unreleased Factory product as +# the routes above, and absent from warp-server's canonical public spec. +GET /factory/{uid}/benchmarks/suites -> internal +POST /factory/{uid}/benchmarks/suites -> internal +GET /factory/{uid}/benchmarks/suites/{suite_uid} -> internal +PATCH /factory/{uid}/benchmarks/suites/{suite_uid} -> internal +DELETE /factory/{uid}/benchmarks/suites/{suite_uid} -> internal +POST /factory/{uid}/benchmarks/suites/{suite_uid}/runs -> internal +GET /factory/{uid}/benchmarks/runs -> internal +GET /factory/{uid}/benchmarks/runs/{run_uid} -> internal +GET /factory/{uid}/benchmarks/runs/{run_uid}/results -> internal +POST /factory/{uid}/benchmarks/runs/{run_uid}/cancel -> internal # Orchestration messaging and lifecycle-event endpoints. These are marked # `x-internal: true` in warp-server's canonical spec (public_api/openapi.yaml), @@ -539,7 +591,7 @@ appearance.zero_state.show_animation -> internal # while the terminal is unfocused (app/src/settings/tui_zero_state.rs). Like the # other zero-state knobs it isn't in the GUI settings UI, so it's documented on # the Warp Agent CLI configuration page instead of the all-settings reference. -appearance.zero_state.freeze_animation_when_unfocused -> src/content/docs/cli/configuration.mdx +appearance.zero_state.freeze_animation_when_unfocused -> src/content/docs/agents/cli/configuration.mdx # Warp Agent CLI-only (crates/warp_tui) push-to-talk key for voice input (surface: # SettingSurfaces::TUI in app/src/settings/tui_voice.rs). The GUI equivalent is the @@ -618,6 +670,10 @@ OpenWarpLaunchModal # One-time launch modal announcing multi-agent orchestration; the feature itself # is documented via RunAgentsTool -> orchestration/multi-agent-runs.mdx. OrchestrationLaunchModal +# One-time launch modal announcing the Warp Agent CLI. Its "Get started" button +# links to the CLI quickstart, and the CLI itself is documented under +# agents/cli/, so the modal has no separate documentable surface. +AgentCliLaunchModal GetStartedTab CreateProjectFlow # Account-first onboarding is an internal login/onboarding flow variant with no diff --git a/.agents/skills/missing_docs/references/surface_snapshot.json b/.agents/skills/missing_docs/references/surface_snapshot.json index ef037781..6c6c7d5f 100644 --- a/.agents/skills/missing_docs/references/surface_snapshot.json +++ b/.agents/skills/missing_docs/references/surface_snapshot.json @@ -12,6 +12,7 @@ "APIKeyManagement": "ga", "AccountFirstOnboarding": "ga", "ActiveConversationRequiresInteraction": "ga", + "AgentCliLaunchModal": "ga", "AgentDecidesCommandExecution": "ga", "AgentHarness": "ga", "AgentManagementDetailsView": "ga", @@ -182,6 +183,7 @@ "McpOauth": "ga", "McpServer": "ga", "MinimalistUI": "ga", + "MultiLevelOrchestration": "dogfood", "MultiProfile": "ga", "MultiWorkspace": "dogfood", "NamedAgents": "ga", @@ -202,9 +204,11 @@ "PRCommentsV2": "ga", "PartialNextCommandSuggestions": "other", "PendingUserQueryIndicator": "ga", + "PeriodicHandoffCheckpoints": "other", "PinnedTabs": "ga", "PluggableNotifications": "ga", "PredictAMQueries": "other", + "PricingTransparency": "dogfood", "ProfilesDesignRevamp": "ga", "Projects": "dogfood", "PromptCacheExpiryWarning": "dogfood", @@ -264,7 +268,6 @@ "ToggleBootstrapBlock": "dogfood", "TransferControlTool": "ga", "TrimTrailingBlankLines": "ga", - "TuiCostTransparency": "dogfood", "UIZoom": "ga", "UndoClosedPanes": "ga", "UsageBasedPricing": "ga", @@ -814,15 +817,20 @@ "DELETE /api/v1/agent/schedules/{id}", "DELETE /api/v1/factory/automations/{id}", "DELETE /api/v1/factory/automations/{id}/subscriptions/{subscription_id}", + "DELETE /api/v1/factory/scorers/{scorer_id}", "DELETE /api/v1/factory/scorers/{scorer_id}/autofix-config", "DELETE /api/v1/factory/{uid}", + "DELETE /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}", "DELETE /api/v1/factory/{uid}/source", "DELETE /api/v1/factory/{uid}/tasks/{task_uid}", "DELETE /api/v1/memory_stores/{uid}", "DELETE /api/v1/memory_stores/{uid}/memories/{memoryUid}", + "DELETE /api/v1/oauth/grants/{client_id}", "GET /.well-known/oauth-authorization-server", + "GET /.well-known/oauth-authorization-server/api/v1/mcp/factory", "GET /.well-known/oauth-protected-resource/api/v1/mcp/factory", "GET /.well-known/openid-configuration", + "GET /.well-known/openid-configuration/api/v1/mcp/factory", "GET /api/v1/agent", "GET /api/v1/agent/artifacts/{uid}", "GET /api/v1/agent/artifacts/{uid}/download", @@ -851,12 +859,30 @@ "GET /api/v1/factory/automations", "GET /api/v1/factory/automations/events/{provider}", "GET /api/v1/factory/automations/{id}", + "GET /api/v1/factory/runs/{run_id}/scores", "GET /api/v1/factory/scorers", "GET /api/v1/factory/scorers/{scorer_id}/autofix-config", "GET /api/v1/factory/scorers/{scorer_id}/results", + "GET /api/v1/factory/scorers/{scorer_id}/results/reasons", "GET /api/v1/factory/{uid}", + "GET /api/v1/factory/{uid}/benchmarks/runs", + "GET /api/v1/factory/{uid}/benchmarks/runs/{run_uid}", + "GET /api/v1/factory/{uid}/benchmarks/runs/{run_uid}/results", + "GET /api/v1/factory/{uid}/benchmarks/suites", + "GET /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}", + "GET /api/v1/factory/{uid}/integrations/github/branches", + "GET /api/v1/factory/{uid}/integrations/github/labels", + "GET /api/v1/factory/{uid}/integrations/github/teams", + "GET /api/v1/factory/{uid}/integrations/github/users", + "GET /api/v1/factory/{uid}/integrations/github/workflows", + "GET /api/v1/factory/{uid}/integrations/linear/issues", + "GET /api/v1/factory/{uid}/integrations/linear/projects", "GET /api/v1/factory/{uid}/integrations/linear/teams", "GET /api/v1/factory/{uid}/integrations/linear/teams/{team_id}/labels", + "GET /api/v1/factory/{uid}/integrations/linear/users", + "GET /api/v1/factory/{uid}/integrations/linear/workflow-states", + "GET /api/v1/factory/{uid}/integrations/slack/conversations", + "GET /api/v1/factory/{uid}/integrations/slack/users", "GET /api/v1/factory/{uid}/metrics", "GET /api/v1/factory/{uid}/source", "GET /api/v1/factory/{uid}/syncs", @@ -871,9 +897,13 @@ "GET /api/v1/memory_stores/{uid}/memories/{memoryUid}", "GET /api/v1/memory_stores/{uid}/memories/{memoryUid}/versions", "GET /api/v1/oauth/authorize", + "GET /api/v1/oauth/consent/info", + "GET /api/v1/oauth/grants", "GET /api/v1/oauth/jwks.json", "PATCH /api/v1/agent/runs/{runId}/event-sequence", + "PATCH /api/v1/factory/scorers/{scorer_id}", "PATCH /api/v1/factory/{uid}", + "PATCH /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}", "PATCH /api/v1/factory/{uid}/tasks/{task_uid}", "POST /api/v1/agent/events/{run_id}", "POST /api/v1/agent/handoff/upload-snapshot", @@ -894,13 +924,22 @@ "POST /api/v1/agent/schedules/{id}/resume", "POST /api/v1/agent/tasks/{id}/cancel", "POST /api/v1/factory", + "POST /api/v1/factory/autofix/runs/{autofix_run_id}/file-tasks", + "POST /api/v1/factory/autofix/worker-results/{worker_result_id}/report", "POST /api/v1/factory/automations", "POST /api/v1/factory/avatar", + "POST /api/v1/factory/run-scoring/dispatches", "POST /api/v1/factory/scorers", + "POST /api/v1/factory/scorers/{scorer_id}/pause", + "POST /api/v1/factory/scorers/{scorer_id}/resume", "POST /api/v1/factory/{uid}/apply", + "POST /api/v1/factory/{uid}/benchmarks/runs/{run_uid}/cancel", + "POST /api/v1/factory/{uid}/benchmarks/suites", + "POST /api/v1/factory/{uid}/benchmarks/suites/{suite_uid}/runs", "POST /api/v1/factory/{uid}/plan", "POST /api/v1/factory/{uid}/tasks", "POST /api/v1/harness-support/block-snapshot", + "POST /api/v1/harness-support/commit-snapshot", "POST /api/v1/harness-support/external-conversation", "POST /api/v1/harness-support/finish-task", "POST /api/v1/harness-support/notify-user", @@ -911,13 +950,17 @@ "POST /api/v1/harness-support/upload-snapshot", "POST /api/v1/memory_stores", "POST /api/v1/memory_stores/{uid}/memories", + "POST /api/v1/oauth/consent", "POST /api/v1/oauth/device/auth", + "POST /api/v1/oauth/register", + "POST /api/v1/oauth/revoke", "POST /api/v1/oauth/session", "POST /api/v1/oauth/token", "PUT /api/v1/agent/identities/{uid}", "PUT /api/v1/agent/schedules/{id}", "PUT /api/v1/factory/automations/{id}", "PUT /api/v1/factory/automations/{id}/subscriptions", + "PUT /api/v1/factory/automations/{id}/subscriptions/{subscription_id}", "PUT /api/v1/factory/scorers/{scorer_id}/autofix-config", "PUT /api/v1/factory/{uid}/integrations/linear/teams/{team_id}/labels", "PUT /api/v1/factory/{uid}/source", @@ -936,6 +979,7 @@ "/cloud-agent", "/compact", "/compact-and", + "/connect-grok", "/continue-locally", "/conversations", "/copy-debugging-id", @@ -957,6 +1001,7 @@ "/index", "/init", "/logout", + "/manage-billing", "/mcp", "/model", "/natural-language-detection", @@ -982,6 +1027,7 @@ "/status", "/statusline", "/theme", + "/upgrade", "/usage", "/view-logs", "/vim-mode", @@ -1225,8 +1271,6 @@ "artifacts/:artifactUid", "design", "environments", - "evaluations", - "evaluations/:evaluationId", "integrations", "login", "login/callback", @@ -1321,6 +1365,7 @@ "claude-api": "bundled", "create-skill": "bundled", "create-tab-config": "bundled", + "factory-mcp": "bundled", "modify-settings": "bundled", "oz-platform": "bundled", "pr-comments": "bundled", @@ -1332,5 +1377,5 @@ "verify-ui-change-in-cloud": "dogfood", "warpctrl": "bundled" }, - "changelog_last_version": "2026.07.31" + "changelog_last_version": "2026.08.07" } diff --git a/.agents/skills/missing_docs/scripts/audit_docs.py b/.agents/skills/missing_docs/scripts/audit_docs.py index 16fa5b6c..ee32cbf1 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 = []