dsh-factory-client-ui
v0.1.9
Published
Factory Work, all-run Triage, task card, and workspace settings UI
Readme
dsh-factory-client-ui
A root Factory application integrated through application.surface and sidebar.navigation, plus a blank-Session intake control in conversation.input.left.
The browser mounts generated Typert descriptors and keeps only transient tab, card, filter, intent, editor, and request state. Durable projects, tasks, flows, tracker notes, attachments, assignments, schedules, runs, and Triage review state round-trip through ctx.remote.factory; pending and posted user prompts remain authoritative in the active or latest DSH Session.
New Session remains the only human creation workflow. The compact Task/Flow selector sits after Full access and wraps the composer through ctx.conversation.submissions. Task defaults to Run immediately: the ordinary Host sink starts the Session, and automatic Agent observation captures it in the workspace's Emerging work. Task's nested Run later option and every Flow destination consume submission without starting or binding the blank Session. Flow can start a generated flow or add a parallel, sequential, or always-run finalizer node to a nonterminal flow in the same workspace. Each consumed submission mints a distinct intake identity, so repeated work from one blank Session appends tasks instead of replacing the earlier task. Factory acceptance resets Task to Run immediately, clears the shared text draft through the input machine before navigation, lets successful input settlement release its images, and opens the resulting draft card; rejection preserves the draft, images, and selection.
Work always renders Emerging work before named flows, topologically orders each graph, and retains counted priority/status menus, label pills, project/lane metadata, task-and-flow search, searchable dependencies, and reachability rails. Tasks with linked Sessions project the Harness sessionDisposition service instead of storing a second lifecycle: settled Sessions move their tasks into a collapsed history shelf with an Un-settle action, while snoozed or archived Sessions hide their tasks, including named-flow nodes. The task page exposes Settle and Archive actions for its linked Session. A cancelled task without a linked Session instead exposes a permanent Delete task action behind an explicit risk acknowledgement; runnable dependents, retained checkouts, and checkout-reuse relationships remain protected by the domain. Dependency search omits terminal tasks and tasks whose linked Session is settled, snoozed, or archived. Pending rail nodes use closed Lucide geometry: a circle for ordinary nodes, triangle for parallel branches, diamond for joins, and square for finalizers. Main, branch, and horizontal segments share one neutral color; nodes become a blue spinner while running, a green check after success, and a red cross after abrupt failure. Factory contains no task or flow creation modal.
One-time and recurring hourly, daily, weekday, weekly, monthly, or custom-cron timing remains editable on task cards. Scheduled tasks use a distinct lifecycle status and Run now/pause/resume controls. Task prompts expose only schedule and a concrete effective model name. Searchable label chips, including creation from an unmatched query, live in the right properties sidebar. Task cards also expose fixed-height prompts, output, attachments, activity, dependency relationships, and a first-class prompt discussion. Task detail polls the active/latest run checkout and Triage binds the exact selected historical run, rendering .artifacts images and videos in the shared 64px horizontally paged thumbnail rail; one click opens a fullscreen keyboard carousel where the selected media floats over a blurred backdrop with compact controls. A listed Session id is an accessible link that selects that Session and returns to its conversation; an id absent from the current Session list remains visible but inert. During an active run, comments submit through the Session Queue or Steer path; a run whose Session binding has not arrived keeps the composer disabled instead of saving a prompt as a tracker note. A pending ask_user_question request replaces ordinary prompt entry with a human-response gate that renders question Markdown in a bounded scroll region and keeps the action for opening the same Session's canonical DSH answer surface reachable. Posted user messages and saved notes render chronologically in one feed, followed by pending steering and queued rows with stable-identity adjacent movement, editing, removal, and strict steering until claim. Pasted images, initial task screenshots, and images in queued, steered, posted, and durable Factory-note rows use the shared 64px rail and blurred-backdrop carousel; each row navigates all of its attached images without enlarging a lone thumbnail. Terminal cards retain Session history read-only and save new text or images as ordinary Factory notes.
The root tabs are Work, Triage, and Settings. Triage lists immutable regular, observed-Session, and recurring-run results with unread/failed filters, inline key/value details, artifacts, and receipt-backed changed files. At mobile widths, Triage discloses one result detail at a time with an animated return path, task properties stack after the document, editor controls become full-width, and the Factory title aligns with the host drawer control's row. Settings keeps Models and Worktrees section glyphs without app/header icon tiles, equalizes field heights, and places title/description instructions and Reset prompts on a spaced advanced-settings track. Both light and dark themes use Harness semantic tokens.
