Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/architecture/frontend-feature-map.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ cannot infer.
| `/jobs` | `Jobs.tsx` | scheduled jobs and run history |
| `/reports` | `Reports.tsx` | reports list/detail APIs |
| `/notifications` | notification bell/modal | notification APIs |
| `/pull-requests` | `PullRequests.tsx` | GitHub, PR dev, release/deploy services |
| `/delivery` | `Delivery.tsx` | GitHub, PR dev, release/deploy services |
| `/docker` | `Docker.tsx` | Docker inventory/updater APIs |
| `/files` | `Files.tsx` | workspace file APIs |
| `/logs` | `Logs.tsx` | log file APIs |
Expand Down
34 changes: 17 additions & 17 deletions docs/architecture/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,23 +38,23 @@ Mira Dashboard worker |

Primary pages:

| Path | Purpose |
| ---------------- | ---------------------------------------------------------- |
| `/` | Operations dashboard overview. |
| `/tasks` | Local task board and task updates. |
| `/agents` | Agent status and task history. |
| `/sessions` | OpenClaw session table and actions. |
| `/chat` | Gateway-backed chat UI. |
| `/logs` | Log file browsing/tailing. |
| `/jobs` | Dashboard scheduled jobs. |
| `/reports` | Daily briefs, summaries, heartbeats, and custom reports. |
| `/pull-requests` | PR review, trusted PR dev, releases, deploy, and rollback. |
| `/files` | Workspace file browser/editor. |
| `/docker` | Docker state and managed updater. |
| `/database` | Postgres/PgBouncer and Dashboard SQLite overview. |
| `/moltbook` | Moltbook dashboard. |
| `/settings` | OpenClaw/Dashboard settings. |
| `/terminal` | Terminal helper/completion UI. |
| Path | Purpose |
| ----------- | ---------------------------------------------------------- |
| `/` | Operations dashboard overview. |
| `/tasks` | Local task board and task updates. |
| `/agents` | Agent status and task history. |
| `/sessions` | OpenClaw session table and actions. |
| `/chat` | Gateway-backed chat UI. |
| `/logs` | Log file browsing/tailing. |
| `/jobs` | Dashboard scheduled jobs. |
| `/reports` | Daily briefs, summaries, heartbeats, and custom reports. |
| `/delivery` | PR review, trusted PR dev, releases, deploy, and rollback. |
| `/files` | Workspace file browser/editor. |
| `/docker` | Docker state and managed updater. |
| `/database` | Postgres/PgBouncer and Dashboard SQLite overview. |
| `/moltbook` | Moltbook dashboard. |
| `/settings` | OpenClaw/Dashboard settings. |
| `/terminal` | Terminal helper/completion UI. |

## Backend

Expand Down
2 changes: 1 addition & 1 deletion docs/development/local-dev.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ the frontend proxy strips non-dev Dashboard cookies before forwarding requests.

## Managed PR Dev

The Pull requests page exposes one shared **PR dev** slot:
The Delivery page exposes one shared **PR dev** slot:

- Only PRs targeting `main` from the configured trusted-author allowlist can
start.
Expand Down
2 changes: 1 addition & 1 deletion docs/setup/production-deploy.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ must still return `401`.
## Rollback

Normal activation automatically rolls back on restart or commit-bound readiness
failure. The preferred manual path is **Pull requests → Production releases →
failure. The preferred manual path is **Delivery → Production releases →
Roll back**, which uses the same exclusive release lock, persistent job,
detached guardian, web/worker restart, commit-bound readiness, and automatic
restoration of the original release if the rollback target fails.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ function previewLabel(status: PullRequestPreviewStatus["status"]): string {
}

/** Renders the global single-slot trusted PR development status. */
export function PullRequestPreviewCard({
export function PullRequestDevelopmentCard({
error,
isStopPending = false,
onStop,
Expand Down
10 changes: 5 additions & 5 deletions src/components/layout/Layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import {
Database,
FileText,
FolderOpen,
GitPullRequest,
Home,
MessageSquare,
Newspaper,
Rocket,
Settings,
Terminal,
Users,
Expand All @@ -24,7 +24,7 @@ import {
useState,
} from "react";

import { PULL_REQUEST_NAV_REFRESH_MS, useCacheEntry, usePullRequests } from "../../hooks";
import { DELIVERY_NAV_REFRESH_MS, useCacheEntry, usePullRequests } from "../../hooks";
import { cn } from "../../utils/cn";
import { AppHeader } from "./AppHeader";

Expand All @@ -37,7 +37,7 @@ const navItems = [
{ to: "/logs", icon: FileText, label: "Logs" },
{ to: "/jobs", icon: Clock3, label: "Jobs" },
{ to: "/reports", icon: Newspaper, label: "Reports" },
{ to: "/pull-requests", icon: GitPullRequest, label: "PRs" },
{ to: "/delivery", icon: Rocket, label: "Delivery" },
{ to: "/files", icon: FolderOpen, label: "Files" },
{ to: "/docker", icon: Boxes, label: "Docker" },
{ to: "/database", icon: Database, label: "Database" },
Expand Down Expand Up @@ -65,7 +65,7 @@ export function Layout({ children }: LayoutProperties) {
const sidebarId = useId();
const [isSidebarOpen, setIsSidebarOpen] = useState(false);
const { data: systemHost } = useCacheEntry<SystemHostCache>("system.host", 60_000);
const { data: pullRequests = [] } = usePullRequests(PULL_REQUEST_NAV_REFRESH_MS);
const { data: pullRequests = [] } = usePullRequests(DELIVERY_NAV_REFRESH_MS);
const openClawVersion = systemHost?.data.version?.current;
const openPullRequestCount = pullRequests.length;

Expand Down Expand Up @@ -120,7 +120,7 @@ export function Layout({ children }: LayoutProperties) {
>
<item.icon size={20} aria-hidden="true" />
<span>{item.label}</span>
{item.to === "/pull-requests" && openPullRequestCount > 0 ? (
{item.to === "/delivery" && openPullRequestCount > 0 ? (
<span
className={cn(
"ml-auto min-w-5 rounded-full px-1.5 py-0.5 text-center text-xs font-semibold",
Expand Down
12 changes: 6 additions & 6 deletions src/hooks/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,25 +117,25 @@ export type {
PullRequestPreviewStatus,
PullRequestSummary,
WorktreeCleanupResult,
} from "./usePullRequests";
} from "./useDelivery";
export {
PULL_REQUEST_NAV_REFRESH_MS,
PULL_REQUEST_PAGE_REFRESH_MS,
pullRequestKeys,
DELIVERY_NAV_REFRESH_MS,
DELIVERY_PAGE_REFRESH_MS,
deliveryKeys,
useApprovePullRequest,
useApprovePullRequestReview,
useDashboardDeployments,
useDashboardReleaseStatus,
useDeployDashboard,
useProductionCheckout,
usePullRequestDeployments,
usePullRequestPreview,
usePullRequests,
useRejectPullRequest,
useRollbackDashboard,
useStartPullRequestPreview,
useStopPullRequestPreview,
useUpdatePullRequestBranch,
} from "./usePullRequests";
} from "./useDelivery";
export { hasQuotaStatus, useQuotas } from "./useQuotas";
export type { ReportItem, ReportStatus, ReportType } from "./useReports";
export {
Expand Down
74 changes: 37 additions & 37 deletions src/hooks/usePullRequests.ts → src/hooks/useDelivery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,18 +148,18 @@ interface PullRequestActionResponse {
pullRequest?: PullRequestSummary;
}

/** Defines pull request keys. */
export const pullRequestKeys = {
all: ["pull-requests"] as const,
list: () => [...pullRequestKeys.all, "list"] as const,
deployments: () => [...pullRequestKeys.all, "deployments"] as const,
preview: () => [...pullRequestKeys.all, "preview"] as const,
productionCheckout: () => [...pullRequestKeys.all, "production-checkout"] as const,
releaseStatus: () => [...pullRequestKeys.all, "releases"] as const,
/** Defines delivery page query keys. */
export const deliveryKeys = {
all: ["delivery"] as const,
list: () => [...deliveryKeys.all, "pull-requests"] as const,
deployments: () => [...deliveryKeys.all, "deployments"] as const,
preview: () => [...deliveryKeys.all, "preview"] as const,
productionCheckout: () => [...deliveryKeys.all, "production-checkout"] as const,
releaseStatus: () => [...deliveryKeys.all, "releases"] as const,
};

export const PULL_REQUEST_NAV_REFRESH_MS = 60_000;
export const PULL_REQUEST_PAGE_REFRESH_MS = AUTO_REFRESH_MS;
export const DELIVERY_NAV_REFRESH_MS = 60_000;
export const DELIVERY_PAGE_REFRESH_MS = AUTO_REFRESH_MS;

/** Fetches pull requests. */
async function fetchPullRequests(): Promise<PullRequestSummary[]> {
Expand Down Expand Up @@ -280,19 +280,19 @@ async function stopPullRequestPreview(number: number): Promise<PullRequestPrevie
}

/** Provides pull requests. */
export function usePullRequests(refreshInterval = PULL_REQUEST_PAGE_REFRESH_MS) {
export function usePullRequests(refreshInterval = DELIVERY_PAGE_REFRESH_MS) {
return useQuery({
queryKey: pullRequestKeys.list(),
queryKey: deliveryKeys.list(),
queryFn: fetchPullRequests,
staleTime: 10_000,
refetchInterval: refreshInterval,
});
}

/** Provides pull request deployments. */
export function usePullRequestDeployments() {
/** Provides Dashboard deployment and rollback jobs. */
export function useDashboardDeployments() {
return useQuery({
queryKey: pullRequestKeys.deployments(),
queryKey: deliveryKeys.deployments(),
queryFn: fetchDeployments,
staleTime: 5000,
refetchInterval: AUTO_REFRESH_MS,
Expand All @@ -302,7 +302,7 @@ export function usePullRequestDeployments() {
/** Provides production checkout. */
export function useProductionCheckout() {
return useQuery({
queryKey: pullRequestKeys.productionCheckout(),
queryKey: deliveryKeys.productionCheckout(),
queryFn: fetchProductionCheckout,
staleTime: 5000,
refetchInterval: AUTO_REFRESH_MS,
Expand All @@ -312,7 +312,7 @@ export function useProductionCheckout() {
/** Provides active and previous managed release status. */
export function useDashboardReleaseStatus() {
return useQuery({
queryKey: pullRequestKeys.releaseStatus(),
queryKey: deliveryKeys.releaseStatus(),
queryFn: fetchDashboardReleaseStatus,
staleTime: 5000,
refetchInterval: AUTO_REFRESH_MS,
Expand All @@ -322,7 +322,7 @@ export function useDashboardReleaseStatus() {
/** Provides the managed single-slot PR preview status. */
export function usePullRequestPreview() {
return useQuery({
queryKey: pullRequestKeys.preview(),
queryKey: deliveryKeys.preview(),
queryFn: fetchPullRequestPreview,
staleTime: 2000,
refetchInterval: 5000,
Expand All @@ -337,15 +337,15 @@ export function useApprovePullRequest() {
mutationFn: ({ number, willDeploy }: { number: number; willDeploy: boolean }) =>
approvePullRequest(number, willDeploy),
onSuccess: () => {
void queryClient.invalidateQueries({ queryKey: pullRequestKeys.list() });
void queryClient.invalidateQueries({ queryKey: deliveryKeys.list() });
void queryClient.invalidateQueries({
queryKey: pullRequestKeys.deployments(),
queryKey: deliveryKeys.deployments(),
});
void queryClient.invalidateQueries({
queryKey: pullRequestKeys.productionCheckout(),
queryKey: deliveryKeys.productionCheckout(),
});
void queryClient.invalidateQueries({
queryKey: pullRequestKeys.releaseStatus(),
queryKey: deliveryKeys.releaseStatus(),
});
},
});
Expand All @@ -361,7 +361,7 @@ export function useApprovePullRequestReview() {
const updatedPullRequest = response.pullRequest;
if (updatedPullRequest) {
queryClient.setQueryData<PullRequestSummary[]>(
pullRequestKeys.list(),
deliveryKeys.list(),
(current = []) =>
current.map((pullRequest) =>
pullRequest.number === updatedPullRequest.number
Expand All @@ -370,7 +370,7 @@ export function useApprovePullRequestReview() {
)
);
}
void queryClient.invalidateQueries({ queryKey: pullRequestKeys.list() });
void queryClient.invalidateQueries({ queryKey: deliveryKeys.list() });
},
});
}
Expand All @@ -385,7 +385,7 @@ export function useUpdatePullRequestBranch() {
const updatedPullRequest = response.pullRequest;
if (updatedPullRequest) {
queryClient.setQueryData<PullRequestSummary[]>(
pullRequestKeys.list(),
deliveryKeys.list(),
(current = []) =>
current.map((pullRequest) =>
pullRequest.number === updatedPullRequest.number
Expand All @@ -394,7 +394,7 @@ export function useUpdatePullRequestBranch() {
)
);
}
void queryClient.invalidateQueries({ queryKey: pullRequestKeys.list() });
void queryClient.invalidateQueries({ queryKey: deliveryKeys.list() });
},
});
}
Expand All @@ -407,7 +407,7 @@ export function useRejectPullRequest() {
mutationFn: ({ number, comment }: { number: number; comment?: string }) =>
rejectPullRequest(number, comment),
onSuccess: () => {
void queryClient.invalidateQueries({ queryKey: pullRequestKeys.list() });
void queryClient.invalidateQueries({ queryKey: deliveryKeys.list() });
},
});
}
Expand All @@ -420,13 +420,13 @@ export function useDeployDashboard() {
mutationFn: deployDashboard,
onSuccess: () => {
void queryClient.invalidateQueries({
queryKey: pullRequestKeys.deployments(),
queryKey: deliveryKeys.deployments(),
});
void queryClient.invalidateQueries({
queryKey: pullRequestKeys.productionCheckout(),
queryKey: deliveryKeys.productionCheckout(),
});
void queryClient.invalidateQueries({
queryKey: pullRequestKeys.releaseStatus(),
queryKey: deliveryKeys.releaseStatus(),
});
},
});
Expand All @@ -441,13 +441,13 @@ export function useRollbackDashboard() {
rollbackDashboard(targetCommit),
onSuccess: () => {
void queryClient.invalidateQueries({
queryKey: pullRequestKeys.deployments(),
queryKey: deliveryKeys.deployments(),
});
void queryClient.invalidateQueries({
queryKey: pullRequestKeys.productionCheckout(),
queryKey: deliveryKeys.productionCheckout(),
});
void queryClient.invalidateQueries({
queryKey: pullRequestKeys.releaseStatus(),
queryKey: deliveryKeys.releaseStatus(),
});
},
});
Expand All @@ -460,9 +460,9 @@ export function useStartPullRequestPreview() {
return useMutation({
mutationFn: ({ number }: { number: number }) => startPullRequestPreview(number),
onSuccess: (preview) => {
queryClient.setQueryData(pullRequestKeys.preview(), preview);
queryClient.setQueryData(deliveryKeys.preview(), preview);
void queryClient.invalidateQueries({
queryKey: pullRequestKeys.preview(),
queryKey: deliveryKeys.preview(),
});
},
});
Expand All @@ -475,9 +475,9 @@ export function useStopPullRequestPreview() {
return useMutation({
mutationFn: ({ number }: { number: number }) => stopPullRequestPreview(number),
onSuccess: (preview) => {
queryClient.setQueryData(pullRequestKeys.preview(), preview);
queryClient.setQueryData(deliveryKeys.preview(), preview);
void queryClient.invalidateQueries({
queryKey: pullRequestKeys.preview(),
queryKey: deliveryKeys.preview(),
});
},
});
Expand Down
Loading
Loading