Download src/tasks/pillLabel.ts from chenbhao/codev: direct link, hf CLI and curl.
- Browser
- Download file 2.9 kB
-
https://huggingface.co/chenbhao/codev/resolve/afbc7edaae4e6bb0102ba024b49ce8be89d2264c/src/tasks/pillLabel.ts
- Command line
-
hf download hf://chenbhao/codev@afbc7edaae4e6bb0102ba024b49ce8be89d2264c/src/tasks/pillLabel.ts
-
curl -L -o pillLabel.ts https://huggingface.co/chenbhao/codev/resolve/afbc7edaae4e6bb0102ba024b49ce8be89d2264c/src/tasks/pillLabel.ts
2.9 kB
| import { DIAMOND_FILLED, DIAMOND_OPEN } from '../constants/figures.js' | |
| import { count } from '../utils/array.js' | |
| import type { BackgroundTaskState } from './types.js' | |
| /** | |
| * Produces the compact footer-pill label for a set of background tasks. | |
| * Used by both the footer pill and the turn-duration transcript line so the | |
| * two surfaces agree on terminology. | |
| */ | |
| export function getPillLabel(tasks: BackgroundTaskState[]): string { | |
| const n = tasks.length | |
| const allSameType = tasks.every(t => t.type === tasks[0]!.type) | |
| if (allSameType) { | |
| switch (tasks[0]!.type) { | |
| case 'local_bash': { | |
| const monitors = count( | |
| tasks, | |
| t => t.type === 'local_bash' && t.kind === 'monitor', | |
| ) | |
| const shells = n - monitors | |
| const parts: string[] = [] | |
| if (shells > 0) | |
| parts.push(shells === 1 ? '1 shell' : `${shells} shells`) | |
| if (monitors > 0) | |
| parts.push(monitors === 1 ? '1 monitor' : `${monitors} monitors`) | |
| return parts.join(', ') | |
| } | |
| case 'in_process_teammate': { | |
| const teamCount = new Set( | |
| tasks.map(t => | |
| t.type === 'in_process_teammate' ? t.identity.teamName : '', | |
| ), | |
| ).size | |
| return teamCount === 1 ? '1 team' : `${teamCount} teams` | |
| } | |
| case 'local_agent': | |
| return n === 1 ? '1 local agent' : `${n} local agents` | |
| case 'remote_agent': { | |
| const first = tasks[0]! | |
| // Per design mockup: ◇ open diamond while running/needs-input, | |
| // ◆ filled once ExitPlanMode is awaiting approval. | |
| if (n === 1 && first.type === 'remote_agent' && first.isUltraplan) { | |
| switch (first.ultraplanPhase) { | |
| case 'plan_ready': | |
| return `${DIAMOND_FILLED} ultraplan ready` | |
| case 'needs_input': | |
| return `${DIAMOND_OPEN} ultraplan needs your input` | |
| default: | |
| return `${DIAMOND_OPEN} ultraplan` | |
| } | |
| } | |
| return n === 1 | |
| ? `${DIAMOND_OPEN} 1 cloud session` | |
| : `${DIAMOND_OPEN} ${n} cloud sessions` | |
| } | |
| case 'local_workflow': | |
| return n === 1 ? '1 background workflow' : `${n} background workflows` | |
| case 'monitor_mcp': | |
| return n === 1 ? '1 monitor' : `${n} monitors` | |
| case 'dream': | |
| return 'dreaming' | |
| } | |
| } | |
| return `${n} background ${n === 1 ? 'task' : 'tasks'}` | |
| } | |
| /** | |
| * True when the pill should show the dimmed " · ↓ to view" call-to-action. | |
| * Per the state diagram: only the two attention states (needs_input, | |
| * plan_ready) surface the CTA; plain running shows just the diamond + label. | |
| */ | |
| export function pillNeedsCta(tasks: BackgroundTaskState[]): boolean { | |
| if (tasks.length !== 1) return false | |
| const t = tasks[0]! | |
| return ( | |
| t.type === 'remote_agent' && | |
| t.isUltraplan === true && | |
| t.ultraplanPhase !== undefined | |
| ) | |
| } | |