// GENERATED from docs/v10/CP-ENTERPRISE-UI.md section 5.2 (one row per legacy dashboard route that the shim answers). // test/server/legacy-shim.test.ts asserts this table and the doc table agree. Regenerate both together, never one alone. export type LegacyAction = "map" | "308" | "410" | "501"; export interface LegacyRoute { method: string; path: string; action: LegacyAction; open: boolean; migrate: string } export const LEGACY_ROUTES: readonly LegacyRoute[] = [ { method: "GET", path: "/openapi.json", action: "410", open: true, migrate: "" }, { method: "GET", path: "/docs", action: "410", open: true, migrate: "" }, { method: "GET", path: "/docs/oauth2-redirect", action: "410", open: true, migrate: "" }, { method: "GET", path: "/redoc", action: "410", open: true, migrate: "" }, { method: "POST", path: "/api/v2/tenants", action: "410", open: false, migrate: "no tenants: local single user" }, { method: "GET", path: "/api/v2/tenants", action: "410", open: false, migrate: "no tenants: local single user" }, { method: "GET", path: "/api/v2/tenants/{tenant_id}", action: "410", open: false, migrate: "no tenants: local single user" }, { method: "PUT", path: "/api/v2/tenants/{tenant_id}", action: "410", open: false, migrate: "" }, { method: "DELETE", path: "/api/v2/tenants/{tenant_id}", action: "410", open: false, migrate: "no tenants: local single user" }, { method: "GET", path: "/api/v2/tenants/{tenant_id}/projects", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/v2/runs", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/v2/runs", action: "map", open: false, migrate: "/v1/runs" }, { method: "GET", path: "/api/v2/runs/{run_id}", action: "map", open: false, migrate: "/v1/runs/:id" }, { method: "POST", path: "/api/v2/runs/{run_id}/cancel", action: "501", open: false, migrate: "" }, { method: "POST", path: "/api/v2/runs/{run_id}/replay", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/v2/runs/{run_id}/timeline", action: "map", open: false, migrate: "/v1/runs/:id" }, { method: "POST", path: "/api/v2/api-keys", action: "410", open: false, migrate: "CP bearer token set by env (LOKI_CONTROL_TOKEN)" }, { method: "GET", path: "/api/v2/api-keys", action: "410", open: false, migrate: "CP bearer token set by env (LOKI_CONTROL_TOKEN)" }, { method: "GET", path: "/api/v2/api-keys/{identifier}", action: "410", open: false, migrate: "" }, { method: "PUT", path: "/api/v2/api-keys/{identifier}", action: "410", open: false, migrate: "" }, { method: "DELETE", path: "/api/v2/api-keys/{identifier}", action: "410", open: false, migrate: "CP bearer token set by env (LOKI_CONTROL_TOKEN)" }, { method: "POST", path: "/api/v2/api-keys/{identifier}/rotate", action: "410", open: false, migrate: "CP bearer token set by env (LOKI_CONTROL_TOKEN)" }, { method: "GET", path: "/api/v2/policies", action: "410", open: false, migrate: "" }, { method: "PUT", path: "/api/v2/policies", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/v2/policies/evaluate", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/v2/audit", action: "map", open: false, migrate: "/v1/audit" }, { method: "GET", path: "/api/v2/audit/verify", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/v2/audit/export", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/operator/runs/{run_id}", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/operator/tests", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/operator/receipts", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/operator/releases", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/operator/phases", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/operator/workspaces/runs", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/operator/workspaces/runs/{ws}/{run_id}", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/onboarding/state", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/onboarding/provider", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/onboarding/github", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/onboarding/repos", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/onboarding/repo", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/backlog/issues", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/backlog/run", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/backlog/status", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/v1/runs", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/v1/runs/{run_id}", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/v1/runs", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/v1/runs/{run_id}/stop", action: "410", open: false, migrate: "" }, { method: "GET", path: "/start", action: "308", open: false, migrate: "/" }, { method: "MOUNT", path: "/lab", action: "308", open: true, migrate: "/" }, { method: "GET", path: "/api/providers/models", action: "410", open: true, migrate: "" }, { method: "GET", path: "/.well-known/agent.json", action: "map", open: true, migrate: "/v1/runs" }, { method: "GET", path: "/api/status", action: "map", open: false, migrate: "/v1/runs" }, { method: "GET", path: "/api/projects", action: "501", open: false, migrate: "" }, { method: "POST", path: "/api/projects", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/projects/{project_id}", action: "501", open: false, migrate: "" }, { method: "PUT", path: "/api/projects/{project_id}", action: "501", open: false, migrate: "" }, { method: "DELETE", path: "/api/projects/{project_id}", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/tasks", action: "map", open: false, migrate: "/v1/tasks" }, { method: "POST", path: "/api/tasks", action: "410", open: false, migrate: "no v10 task queue; read-only GET /v1/tasks" }, { method: "GET", path: "/api/tasks/{task_id}", action: "410", open: false, migrate: "no v10 task queue; read-only GET /v1/tasks" }, { method: "PUT", path: "/api/tasks/{task_id}", action: "410", open: false, migrate: "no v10 task queue; read-only GET /v1/tasks" }, { method: "DELETE", path: "/api/tasks/{task_id}", action: "410", open: false, migrate: "no v10 task queue; read-only GET /v1/tasks" }, { method: "POST", path: "/api/tasks/{task_id}/move", action: "410", open: false, migrate: "no v10 task queue; read-only GET /v1/tasks" }, { method: "WS", path: "/ws", action: "410", open: true, migrate: "SSE at GET /v1/stream" }, { method: "GET", path: "/api/registry/projects", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/registry/projects", action: "410", open: false, migrate: "repos are discovered locally; GET /v1/repos" }, { method: "GET", path: "/api/registry/projects/{identifier}", action: "410", open: false, migrate: "" }, { method: "DELETE", path: "/api/registry/projects/{identifier}", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/registry/projects/{identifier}/health", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/registry/projects/{identifier}/access", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/registry/discover", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/registry/sync", action: "410", open: false, migrate: "repos are discovered locally; GET /v1/repos" }, { method: "GET", path: "/api/registry/tasks", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/registry/learnings", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/fleet/runs", action: "map", open: false, migrate: "/v1/fleet/runs" }, { method: "GET", path: "/api/fleet/summary", action: "map", open: false, migrate: "/v1/fleet/summary" }, { method: "GET", path: "/api/fleet/runs/{identifier}", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/focus", action: "map", open: false, migrate: "/v1/focus" }, { method: "GET", path: "/api/focus", action: "410", open: false, migrate: "" }, { method: "DELETE", path: "/api/focus", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/session/model", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/session/model", action: "410", open: false, migrate: "no mid-run model switch; start a new run with another model (POST /v1/runs)" }, { method: "GET", path: "/api/running-projects", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/control/start", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/control/builds/{execution_id}", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/control/builds/{execution_id}/proof", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/control/builds/{execution_id}/stop", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/running-projects/stop", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/fleet/runs/{identifier}/retry", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/fleet/runs/{identifier}/cancel", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/enterprise/status", action: "410", open: true, migrate: "" }, { method: "GET", path: "/api/auth/info", action: "410", open: true, migrate: "" }, { method: "POST", path: "/api/enterprise/tokens", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/enterprise/tokens", action: "410", open: false, migrate: "" }, { method: "DELETE", path: "/api/enterprise/tokens/{identifier}", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/enterprise/audit", action: "map", open: false, migrate: "/v1/audit" }, { method: "GET", path: "/api/enterprise/audit/summary", action: "map", open: false, migrate: "/v1/audit/summary" }, { method: "GET", path: "/api/compliance", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/memory/summary", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/memory/episodes", action: "map", open: false, migrate: "/v1/memory/episodes" }, { method: "GET", path: "/api/memory/episodes/{episode_id}", action: "map", open: false, migrate: "/v1/memory/episodes/{id}" }, { method: "GET", path: "/api/memory/patterns", action: "map", open: false, migrate: "/v1/memory/patterns" }, { method: "GET", path: "/api/memory/patterns/{pattern_id}", action: "map", open: false, migrate: "/v1/memory/patterns/{id}" }, { method: "GET", path: "/api/memory/skills", action: "map", open: false, migrate: "/v1/memory/skills" }, { method: "GET", path: "/api/memory/skills/{skill_id}", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/memory/economics", action: "map", open: false, migrate: "/v1/memory/economics" }, { method: "POST", path: "/api/memory/consolidate", action: "410", open: false, migrate: "read-only GET /v1/memory/*" }, { method: "POST", path: "/api/memory/retrieve", action: "410", open: false, migrate: "read-only GET /v1/memory/*" }, { method: "GET", path: "/api/memory/index", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/memory/timeline", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/memory/files", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/memory/file", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/memory/search", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/memory/stats", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/learning/metrics", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/learning/trends", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/learning/signals", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/learning/aggregation", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/learning/aggregate", action: "410", open: false, migrate: "read-only GET /v1/memory/patterns" }, { method: "GET", path: "/api/learning/preferences", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/learning/errors", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/learning/success", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/learning/tools", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/control/pause", action: "map", open: false, migrate: "/v1/control/pause" }, { method: "POST", path: "/api/control/resume", action: "map", open: false, migrate: "/v1/control/resume" }, { method: "POST", path: "/api/control/stop", action: "map", open: false, migrate: "/v1/control/stop" }, { method: "GET", path: "/api/cost", action: "map", open: false, migrate: "/v1/cost/snapshot" }, { method: "GET", path: "/api/budget", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/cost/timeline", action: "map", open: false, migrate: "/v1/cost/timeline" }, { method: "GET", path: "/api/trust/trajectory", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/gate-policy", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/pricing", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/council/state", action: "map", open: false, migrate: "/v1/council/state" }, { method: "GET", path: "/api/council/verdicts", action: "map", open: false, migrate: "/v1/council/verdicts" }, { method: "GET", path: "/api/council/convergence", action: "map", open: false, migrate: "/v1/council/convergence" }, { method: "GET", path: "/api/council/report", action: "map", open: false, migrate: "/v1/council/report" }, { method: "POST", path: "/api/council/force-review", action: "map", open: false, migrate: "/v1/control/council-review" }, { method: "GET", path: "/api/council/transcripts", action: "map", open: false, migrate: "/v1/council/transcripts" }, { method: "GET", path: "/api/council/transcripts/{iteration_id}", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/context", action: "map", open: false, migrate: "/v1/context" }, { method: "GET", path: "/api/notifications", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/notifications/triggers", action: "410", open: false, migrate: "" }, { method: "PUT", path: "/api/notifications/triggers", action: "410", open: false, migrate: "GET /v1/notifications (derived from events)" }, { method: "POST", path: "/api/notifications/{notification_id}/acknowledge", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/notifications/{notification_id}/unacknowledge", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/checkpoints", action: "map", open: false, migrate: "/v1/checkpoints" }, { method: "GET", path: "/api/checkpoints/{checkpoint_id}", action: "map", open: false, migrate: "/v1/checkpoints/{id}" }, { method: "POST", path: "/api/checkpoints", action: "map", open: false, migrate: "/v1/checkpoints" }, { method: "POST", path: "/api/checkpoints/{checkpoint_id}/rollback", action: "map", open: false, migrate: "/v1/checkpoints/{id}/rollback" }, { method: "GET", path: "/api/agents", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/agents/{agent_id}/kill", action: "410", open: false, migrate: "POST /v1/control/stop" }, { method: "POST", path: "/api/agents/{agent_id}/pause", action: "410", open: false, migrate: "POST /v1/control/stop (v10 has no pause)" }, { method: "POST", path: "/api/agents/{agent_id}/resume", action: "410", open: false, migrate: "POST /v1/control/resume" }, { method: "GET", path: "/api/logs", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/collab/join", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/collab/leave", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/collab/users", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/collab/users/{user_id}", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/collab/users/{user_id}/heartbeat", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/collab/users/{user_id}/cursor", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/collab/users/{user_id}/status", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/collab/presence", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/collab/file/{file_path:path}", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/collab/state", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/collab/state/value", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/collab/operation", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/collab/sync", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/collab/history", action: "410", open: false, migrate: "" }, { method: "WS", path: "/ws/collab", action: "410", open: true, migrate: "" }, { method: "GET", path: "/api/collab/status", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/secrets/status", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/github/status", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/github/tasks", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/github/sync-log", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/health/processes", action: "410", open: false, migrate: "" }, { method: "GET", path: "/metrics", action: "map", open: false, migrate: "/v1/metrics" }, { method: "GET", path: "/api/checklist", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/usage", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/checklist/summary", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/prd-observations", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/checklist/waivers", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/checklist/waivers", action: "410", open: false, migrate: "plan.json and receipt claims in GET /v1/runs/:id" }, { method: "DELETE", path: "/api/checklist/waivers/{item_id}", action: "410", open: false, migrate: "plan.json and receipt claims in GET /v1/runs/:id" }, { method: "GET", path: "/api/council/gate", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/app-runner/status", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/app-runner/logs", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/app-runner/errors", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/control/app-restart", action: "410", open: false, migrate: "evidence in GET /v1/runs/:source/:run/artifact/*" }, { method: "POST", path: "/api/control/app-stop", action: "410", open: false, migrate: "evidence in GET /v1/runs/:source/:run/artifact/*" }, { method: "GET", path: "/api/playwright/results", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/playwright/screenshot", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/failures", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/prompt-versions", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/prompt-optimize", action: "410", open: false, migrate: "verify stage: POST /v1/runs/:source/:run/verify" }, { method: "GET", path: "/api/activity", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/session-diff", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/activity", action: "410", open: false, migrate: "" }, { method: "GET", path: "/cost", action: "308", open: false, migrate: "/" }, { method: "GET", path: "/trust", action: "308", open: false, migrate: "/" }, { method: "GET", path: "/", action: "308", open: false, migrate: "/" }, { method: "GET", path: "/api/quality-score", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/quality-score/history", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/quality-scan", action: "410", open: false, migrate: "verify stage: POST /v1/runs/:source/:run/verify" }, { method: "GET", path: "/api/quality-report", action: "410", open: false, migrate: "verify stage: POST /v1/runs/:source/:run/verify" }, { method: "GET", path: "/api/migration/list", action: "501", open: false, migrate: "" }, { method: "POST", path: "/api/migration/start", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/migration/{migration_id}/status", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/migration/{migration_id}/plan", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/migration/{migration_id}/features", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/migration/{migration_id}/seams", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/migration/{migration_id}/advance", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/migration/{migration_id}/start-phase", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/managed/events", action: "410", open: false, migrate: "managed memory dropped; GET /v1/runs/:source/:run/events" }, { method: "GET", path: "/api/managed/status", action: "410", open: false, migrate: "managed memory dropped; GET /v1/runs" }, { method: "GET", path: "/api/managed/memory_versions/{memory_id}", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/findings/{iteration}", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/quality/architecture", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/learnings", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/escalations", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/escalations/{filename}", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/phases", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/proofs", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/proofs/summary", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/proofs/{run_id}", action: "501", open: false, migrate: "" }, { method: "GET", path: "/api/proofs/{run_id}/html", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/spec", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/spec/history", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/wiki", action: "410", open: false, migrate: "" }, { method: "GET", path: "/api/wiki/{section}", action: "410", open: false, migrate: "" }, { method: "POST", path: "/api/wiki/ask", action: "410", open: false, migrate: "wiki deleted; no replacement" }, ];