---
title: Task
---
```js
import {API} from "../components/config.js";
import {fieldRow} from "../components/field-help.js";
import {statusControl, TASK_STATUSES} from "../components/status-control.js";
```
```js
const taskId = observable.params.id;
const raw = await fetch(`${API}/tasks/${taskId}`)
.then(r => r.ok ? r.json() : r.json().then(e => ({error: e.detail ?? `HTTP ${r.status}`})))
.catch(e => ({error: String(e)}));
```
```js
if (raw.error) {
display(html`
⚠️ ${raw.error}
`);
} else {
const name = raw.title || taskId;
const shortName = name.length > 60 ? name.slice(0, 60) + "…" : name;
display(html`Task · ${shortName}
`);
display(html`← Tasks | ← Token Cost
`);
display(html`
Status
${statusControl({
entity: raw,
type: "task",
statuses: TASK_STATUSES,
onSaved: () => setTimeout(() => location.reload(), 450),
})}
Priority${raw.priority ?? "—"}
Assignee${raw.assignee ?? "—"}
`);
const FIELD_ORDER = [
"id","title","status","priority","assignee",
"workstream_id","due_date","needs_human","intervention_note",
"created_at","updated_at",
];
const HIDDEN_FIELDS = ["description"];
const taskContent = (raw.description ?? "").trim();
if (taskContent) {
display(html`
Task Content
${taskContent}
`);
} else {
display(html`No task content recorded.
`);
}
const rows = FIELD_ORDER.map(k => fieldRow(k, raw[k] ?? null));
for (const k of Object.keys(raw)) {
if (!FIELD_ORDER.includes(k) && !HIDDEN_FIELDS.includes(k)) rows.push(fieldRow(k, raw[k]));
}
display(html``);
}
```