Skip to content
Open
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
00bf30d
refine jobs and operations design
mira-2026 Aug 18, 2026
7b200d2
Refine Delivery layout and responsive actions
mira-2026 Aug 19, 2026
515fbdc
Refine release alert width
mira-2026 Aug 19, 2026
f08b41e
feat(greenfield): refine database UI and table sorting
mira-2026 Aug 19, 2026
2a62a7b
test(storybook): stabilize jobs run detail
mira-2026 Aug 19, 2026
883d7ee
fix: address dashboard review feedback
mira-2026 Aug 19, 2026
ea91c67
fix(greenfield): address dashboard review follow-ups
mira-2026 Aug 19, 2026
1e86aac
fix(greenfield): address follow-up review findings
mira-2026 Aug 19, 2026
692f9e6
fix(greenfield): address latest review findings
mira-2026 Aug 19, 2026
ae0916e
fix(greenfield): start table sorting ascending
mira-2026 Aug 19, 2026
e45bb23
fix(greenfield): preserve paginated operational history
mira-2026 Aug 19, 2026
e7e4f79
fix(greenfield): balance job history columns
mira-2026 Aug 19, 2026
76893dc
fix(greenfield): widen job history timestamps
mira-2026 Aug 19, 2026
eda4a0c
fix(greenfield): keep job timestamps on one line
mira-2026 Aug 19, 2026
b40d3f6
fix(greenfield): expose error-only retry controls
mira-2026 Aug 19, 2026
e20124d
fix(greenfield): address follow-up review findings
mira-2026 Aug 19, 2026
e027c77
fix(greenfield): refine history refresh and retained states
mira-2026 Aug 19, 2026
a3dd5cf
fix(greenfield): refresh mutable history archives
mira-2026 Aug 19, 2026
d6ac3ac
fix(greenfield): stabilize live history pagination
mira-2026 Aug 19, 2026
99a46f7
fix(greenfield): address retained history review
mira-2026 Aug 19, 2026
5a27c22
fix(greenfield): preserve history recovery and paging
mira-2026 Aug 20, 2026
5280856
fix(greenfield): refresh prefixed security audit
mira-2026 Aug 20, 2026
2ecd6f5
fix(greenfield): restore production blocker alerts
mira-2026 Aug 20, 2026
c09d24d
fix(greenfield): order production blockers responsively
mira-2026 Aug 20, 2026
c9da977
fix(greenfield): retain latest live history values
mira-2026 Aug 20, 2026
751bf3a
fix(greenfield): propagate retained heartbeat freshness
mira-2026 Aug 20, 2026
2e8c003
fix(greenfield): reset filtered history after rebase
mira-2026 Aug 20, 2026
9851011
fix(greenfield): reset task history after rebase
mira-2026 Aug 20, 2026
41c11c3
fix(greenfield): restore partial read recovery
mira-2026 Aug 20, 2026
7ce2b26
fix(greenfield): preserve partial dashboard history
mira-2026 Aug 20, 2026
5ff9f40
fix(greenfield): stabilize legacy run page identities
mira-2026 Aug 20, 2026
2d8bff2
fix(greenfield): close remaining history edge cases
mira-2026 Aug 20, 2026
5492d87
fix(greenfield): align retained story fixtures
mira-2026 Aug 20, 2026
c3c07b8
fix(greenfield): preserve incidents when paging archive
mira-2026 Aug 20, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,11 @@
},
"minItems": 1,
"maxItems": 100
},
"stackNumber": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"required": [
Expand Down Expand Up @@ -683,6 +688,11 @@
},
"minItems": 1,
"maxItems": 100
},
"stackNumber": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"required": [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"maximum": 5000,
"default": 200
},
"query": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
],
"additionalProperties": false
},
"maxItems": 500,
"maxItems": 5000,
"$comment": "Live Valibot validation additionally requires every redacted log line ID to be unique."
},
"observedAtMs": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"maximum": 5000,
"default": 200
},
"sourceId": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
],
"additionalProperties": false
},
"maxItems": 500,
"maxItems": 5000,
"$comment": "Live Valibot validation additionally requires every redacted log line ID to be unique."
},
"observedAtMs": {
Expand Down
3 changes: 0 additions & 3 deletions greenfield/scripts/storybookPageCoverage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,9 +151,6 @@ export const dashboardPageStoryRequirements = Object.freeze([
"RunDetail",
"ScheduleDetail",
"Busy",
"Confirmation",
"Queued",
"UnknownOutcome",
],
file: "src/browser/jobs/stories/JobsRoute.stories.tsx",
path: "/jobs",
Expand Down
10 changes: 8 additions & 2 deletions greenfield/src/browser/agents/AgentHistoryTable.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import { createColumnHelper, tableFeatures, useTable } from "@tanstack/react-table";
import { createColumnHelper, useTable } from "@tanstack/react-table";
import { History } from "lucide-react";

import type { AgentTaskRun } from "../../contracts/agentModel.ts";
import { formatDashboardDateTime } from "../lib/formatDateTime.ts";
import { Badge } from "../ui/Badge.tsx";
import { dashboardTableFeatures } from "../ui/dashboardTableFeatures.ts";
import { DataTable } from "../ui/DataTable.tsx";
import { EmptyState } from "../ui/EmptyState.tsx";
import { Heading } from "../ui/Heading.tsx";
import { Text } from "../ui/Text.tsx";
import { Virtualizer, type VirtualizerRenderState } from "../ui/Virtualizer.tsx";

const minimumVirtualizedRows = 50;
const historyTableFeatures = tableFeatures({});
const historyTableFeatures = dashboardTableFeatures;
Comment thread
rajohan marked this conversation as resolved.
const historyColumnHelper = createColumnHelper<
typeof historyTableFeatures,
AgentTaskRun
Expand All @@ -25,10 +26,12 @@ const historyColumns = historyColumnHelper.columns([
</Text>
),
header: "Agent",
enableSorting: false,
}),
historyColumnHelper.accessor("task", {
cell: ({ getValue }) => <Text className="wrap-break-word">{getValue()}</Text>,
header: "Task",
enableSorting: false,
}),
historyColumnHelper.accessor("status", {
cell: ({ getValue }) => (
Expand All @@ -37,6 +40,7 @@ const historyColumns = historyColumnHelper.columns([
</Badge>
),
header: "Status",
enableSorting: false,
}),
historyColumnHelper.accessor("startedAtMs", {
cell: ({ getValue }) => (
Expand All @@ -45,6 +49,7 @@ const historyColumns = historyColumnHelper.columns([
</time>
),
header: "Started",
enableSorting: false,
}),
historyColumnHelper.accessor(
(run) => (run.status === "completed" ? run.completedAtMs : undefined),
Expand All @@ -63,6 +68,7 @@ const historyColumns = historyColumnHelper.columns([
},
header: "Completed",
id: "completedAtMs",
enableSorting: false,
}
),
]);
Expand Down
3 changes: 3 additions & 0 deletions greenfield/src/browser/agents/AgentsRoute.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,9 @@ describe("Dashboard agents route", () => {

await expectAgentShellReady();
expect(await screen.findByText("Newest agent task")).toBeTruthy();
expect(
screen.getByRole("columnheader", { name: "Started" }).querySelector("button")
).toBeNull();
await user.click(screen.getByRole("button", { name: "Load older tasks" }));
expect(await screen.findByText("Older agent task")).toBeTruthy();
expect(screen.getByText("Newest agent task")).toBeTruthy();
Expand Down
5 changes: 3 additions & 2 deletions greenfield/src/browser/cache/CacheStatusTable.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { createColumnHelper, tableFeatures, useTable } from "@tanstack/react-table";
import { createColumnHelper, useTable } from "@tanstack/react-table";

import type { CacheEntryStatus } from "../../contracts/cache.ts";
import { cn } from "../lib/classNames.ts";
import { formatDashboardDateTime } from "../lib/formatDateTime.ts";
import { Badge } from "../ui/Badge.tsx";
import { Button } from "../ui/Button.tsx";
import { dashboardTableFeatures } from "../ui/dashboardTableFeatures.ts";
import { DataTable } from "../ui/DataTable.tsx";
import { Text } from "../ui/Text.tsx";
import { Virtualizer, type VirtualizerRenderState } from "../ui/Virtualizer.tsx";
Expand All @@ -16,7 +17,7 @@ import {
} from "./cachePresentation.ts";

const minimumVirtualizedRows = 50;
const cacheStatusTableFeatures = tableFeatures({});
const cacheStatusTableFeatures = dashboardTableFeatures;

interface CacheStatusTableRow {
readonly entry: CacheEntryStatus;
Expand Down
Loading