Files
fusion/packages/dashboard/app/components/EngineStatusBanner.css
gsxdsm e46ea00ff5 FN-6827: add engine status banner
Add project-scoped engine connectivity remediation to the dashboard.

- Add engine status/start API helpers and server routes that can resume paused projects or start missing engines.
- Render a project banner with dashboard-only guidance, polling, disabled starting state, localized copy, and focused tests.
- Document the engine status banner behavior and add a changeset for the published CLI package.

Files changed:
 .changeset/fn-6827-engine-disconnected-banner.md   |   7 +
 docs/dashboard-guide.md                            |   8 +
 packages/dashboard/app/api/legacy.ts               |  20 +++
 .../app/components/EngineStatusBanner.css          |  87 +++++++++++
 .../app/components/EngineStatusBanner.tsx          |  62 ++++++++
 .../__tests__/EngineStatusBanner.test.tsx          | 145 +++++++++++++++++
 .../app/components/dashboard/DashboardBanners.tsx  |   3 +
 .../app/hooks/__tests__/useEngineStatus.test.ts    | 171 +++++++++++++++++++++
 packages/dashboard/app/hooks/useEngineStatus.ts    | 111 +++++++++++++
 packages/dashboard/src/__tests__/server.test.ts    | 129 ++++++++++++++++
 packages/dashboard/src/server.ts                   |  89 +++++++++++
 packages/i18n/locales/en/app.json                  |  10 ++
 packages/i18n/locales/es/app.json                  |  10 ++
 packages/i18n/locales/fr/app.json                  |  10 ++
 packages/i18n/locales/ko/app.json                  |  10 ++
 packages/i18n/locales/zh-CN/app.json               |  10 ++
 packages/i18n/locales/zh-TW/app.json               |  10 ++
 17 files changed, 892 insertions(+)

Fusion-Task-Id: FN-6827

Fusion-Task-Lineage: 56821ca3-04c8-4674-9400-3639f10e463d
2026-06-25 08:35:44 -07:00

88 lines
1.8 KiB
CSS

.engine-status-banner {
display: flex;
align-items: flex-start;
gap: var(--space-md);
margin: var(--space-md) var(--space-lg) 0;
padding: var(--space-md) var(--space-lg);
background: linear-gradient(
90deg,
color-mix(in srgb, var(--color-warning) 12%, transparent),
color-mix(in srgb, var(--surface) 92%, transparent)
);
border: var(--btn-border-width) solid color-mix(in srgb, var(--color-warning) 35%, transparent);
border-radius: var(--radius-md);
}
.engine-status-banner__indicator {
display: inline-flex;
align-items: center;
padding-top: calc(var(--space-xs) / 2);
flex-shrink: 0;
}
.engine-status-banner__content {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: var(--space-xs);
}
.engine-status-banner__title {
font-weight: 600;
color: var(--text);
}
.engine-status-banner__body,
.engine-status-banner__error {
margin: 0;
color: var(--text-muted);
line-height: 1.5;
}
.engine-status-banner__body code {
background: color-mix(in srgb, var(--text) 6%, transparent);
padding: 0 var(--space-xs);
border-radius: var(--radius-sm);
color: var(--text);
}
.engine-status-banner__error {
color: var(--color-error);
}
.engine-status-banner__actions {
display: flex;
align-items: center;
justify-content: flex-end;
flex-shrink: 0;
}
.engine-status-banner__start {
display: inline-flex;
align-items: center;
gap: var(--space-xs);
white-space: nowrap;
}
@media (max-width: 768px) {
.engine-status-banner {
flex-direction: column;
gap: var(--space-sm);
margin-inline: var(--space-md);
}
.engine-status-banner__actions,
.engine-status-banner__start {
width: 100%;
}
.engine-status-banner__actions {
justify-content: stretch;
}
.engine-status-banner__start {
justify-content: center;
}
}