mirror of
https://github.com/nexu-io/open-design.git
synced 2026-10-27 09:51:12 +01:00
* fix chat runs surviving web disconnects * fix chat run create abort propagation Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5) * fix daemon keepalive reconnect budget Generated-By: looper 0.0.0-dev (runner=fixer, agent=gpt-5.5) * fix daemon stream disconnect cancellation Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5) * fix daemon stream abort cancellation race Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5) * fix daemon run cancellation semantics * fix load * doc * 2 * add run refresh recovery * fix active run refresh status * fix reattach abort handling * fix * fix chat initial scroll * fix daemon start failures Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5) * fix background run recovery Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5) * fix stop run status Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5) * fix background run recovery Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5) * extract daemon run service * move prompt composition to daemon * fix prompt module resolution * fix project id generation * add project run status * add designs kanban view with awaiting_input status - add grid/kanban view toggle on Designs tab; persist choice in localStorage - introduce awaiting_input project display status (daemon-derived from unanswered <question-form>) so projects asking the user aren't shown as Completed; ordered between Running and Completed with amber accent - hide transient queued state from users: coerce queued/starting to running in daemon /api/projects projection and drop the queued kanban column - a11y polish on Designs cards: Space activation, aria-labels on delete, focus-visible outlines, reveal delete on focus-within and touch, prefers-reduced-motion handling - kanban layout uses flex sizing instead of viewport math; scoped icon- only pill button rule fixes view-toggle icon alignment --------- Co-authored-by: mrcfps <mrc@powerformer.com>
95 lines
2.9 KiB
Markdown
95 lines
2.9 KiB
Markdown
# Project Status
|
|
|
|
## Goal
|
|
|
|
Show a compact status on each project card that reflects the current state of the project's most relevant run.
|
|
|
|
## Status source
|
|
|
|
Project status should be a derived display value, based on runs associated with the project.
|
|
|
|
The recommended logic is:
|
|
|
|
1. If the project has an active run, show that active run's status.
|
|
2. If the project has no active run, show the latest run's terminal status.
|
|
3. If the project has no runs, show `not_started`.
|
|
|
|
An active run takes priority over the latest terminal run because it tells the user that work is currently happening in the project.
|
|
|
|
## Display statuses
|
|
|
|
```ts
|
|
type ProjectDisplayStatus =
|
|
| 'not_started'
|
|
| 'queued'
|
|
| 'running'
|
|
| 'succeeded'
|
|
| 'failed'
|
|
| 'canceled';
|
|
```
|
|
|
|
| Display status | Label | Source status | Meaning |
|
|
| --- | --- | --- | --- |
|
|
| `not_started` | Not started | No run | The project exists and has no run history. |
|
|
| `queued` | Queued | `queued` | A run exists and is waiting to start. |
|
|
| `running` | Running | `running`, `starting` | A run is currently executing. |
|
|
| `succeeded` | Completed | `succeeded` | The latest relevant run completed successfully. |
|
|
| `failed` | Failed | `failed` | The latest relevant run failed. |
|
|
| `canceled` | Canceled | `canceled`, `cancelled` | The latest relevant run was canceled. |
|
|
|
|
## Derivation logic
|
|
|
|
```ts
|
|
function deriveProjectDisplayStatus(projectRuns: Run[]): ProjectDisplayStatus {
|
|
const activeRun = projectRuns
|
|
.filter((run) => run.status === 'queued' || run.status === 'running' || run.status === 'starting')
|
|
.sort(byMostRecent)[0];
|
|
|
|
if (activeRun) {
|
|
return normalizeRunStatus(activeRun.status);
|
|
}
|
|
|
|
const latestRun = projectRuns.sort(byMostRecent)[0];
|
|
|
|
if (latestRun) {
|
|
return normalizeRunStatus(latestRun.status);
|
|
}
|
|
|
|
return 'not_started';
|
|
}
|
|
|
|
function normalizeRunStatus(status: RunStatus): ProjectDisplayStatus {
|
|
if (status === 'starting') return 'running';
|
|
if (status === 'cancelled') return 'canceled';
|
|
return status;
|
|
}
|
|
```
|
|
|
|
## UI guidance
|
|
|
|
The project card should show the status near the existing metadata line, together with the relative timestamp when useful.
|
|
|
|
Examples:
|
|
|
|
- `Running · just now`
|
|
- `Queued · 1 minute ago`
|
|
- `Completed · 6 minutes ago`
|
|
- `Failed · 36 minutes ago`
|
|
- `Canceled · 3 hours ago`
|
|
- `Not started`
|
|
|
|
Use stronger visual treatment for active and error states:
|
|
|
|
- `running`: primary or accent indicator.
|
|
- `queued`: neutral pending indicator.
|
|
- `failed`: error indicator.
|
|
- `canceled`: muted neutral indicator.
|
|
- `succeeded`: subtle success indicator.
|
|
- `not_started`: muted placeholder indicator.
|
|
|
|
## Rationale
|
|
|
|
Project status represents the user's project-level mental model. Users need to know whether a project is waiting, actively running, completed, failed, canceled, or untouched.
|
|
|
|
Using `running` as the primary active label keeps the UI aligned with the underlying run model and covers generation, editing, repair, analysis, export, and future run types.
|