diff --git a/dashboards/tracker-web/src/app/dashboard/fleet/jobs/[id]/page.tsx b/dashboards/tracker-web/src/app/dashboard/fleet/jobs/[id]/page.tsx index 68e00d95..8a2e7f08 100644 --- a/dashboards/tracker-web/src/app/dashboard/fleet/jobs/[id]/page.tsx +++ b/dashboards/tracker-web/src/app/dashboard/fleet/jobs/[id]/page.tsx @@ -255,6 +255,9 @@ export default function FleetJobDetailPage() { + {/* Prompt (the job body) + PR/target config */} + + {/* Review gate (multi-reviewer human gate) */} {job.stage === 'review' && ( = [ + ['Repo', job.repo], + ['Base branch', job.repo ? (job.baseBranch ?? 'main') : undefined], + ['Verify', job.verify], + ['Auto-merge', job.repo ? (job.autoMerge ? 'yes' : 'no') : undefined], + ['Capabilities', job.capabilities?.length ? job.capabilities.join(', ') : undefined], + ['Deps', job.deps?.length ? job.deps.join(', ') : undefined], + ['Idempotency key', job.idempotencyKey], + ]; + const shown = cfg.filter(([, v]) => v != null && v !== ''); + return ( + + + Prompt + + {locked ? 'read-only — picked up' : 'queued — not yet picked up'} + + + + {job.bodyMd?.trim() ? job.bodyMd : 'No prompt body.'} + + {shown.length > 0 && ( + + {shown.map(([k, v]) => ( + + {k} + {v} + + ))} + + )} + + ); +} + /** Compact stat chip for the per-job cost/token/time totals. */ function Stat({ label, value }: { label: string; value: string }) { return ( diff --git a/dashboards/tracker-web/src/lib/fleet-client.ts b/dashboards/tracker-web/src/lib/fleet-client.ts index e96ad552..b5a40ce9 100644 --- a/dashboards/tracker-web/src/lib/fleet-client.ts +++ b/dashboards/tracker-web/src/lib/fleet-client.ts @@ -27,6 +27,12 @@ export interface FleetJob { reviewDecisions?: ReviewDecision[]; repo?: string; baseBranch?: string; + /** PR mode: verify command run in the checkout before the PR opens. */ + verify?: string; + /** PR mode: squash-merge the PR automatically when verify passes. */ + autoMerge?: boolean; + /** Job dependencies (idempotency keys this job is gated on). */ + deps?: string[]; } export interface FleetFactory {
+ {job.bodyMd?.trim() ? job.bodyMd : 'No prompt body.'} +
{k}
{v}