From af4b108dd9cbe35d42437e197ebeb7b2c8945ac3 Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Thu, 5 Nov 2026 23:09:41 -0800 Subject: [PATCH] fix(web): restore the changes from #204 and #205 that #199 undid --- apps/web/src/config.ts | 19 ++++++++++++++++++- apps/web/src/pages/home-view.ts | 4 ++-- apps/web/src/pages/projects.tsx | 2 +- .../src/pages/workspace/work-unit-view.tsx | 1 + apps/web/src/pages/workspace/work-unit.ts | 6 +++++- docs/USER_MANUAL.md | 8 ++++---- 6 files changed, 31 insertions(+), 9 deletions(-) diff --git a/apps/web/src/config.ts b/apps/web/src/config.ts index d9a2d8ae..9de7e4b4 100644 --- a/apps/web/src/config.ts +++ b/apps/web/src/config.ts @@ -510,6 +510,21 @@ export const wording = { review_artifact: (document?: string) => document ? `Asked for a review · ${document}` : "Asked for a review", } as Record string>, + /** A hand-off the hub refused, by tool name: who it did not start. */ + handoffRefused: { + deploy_writer: (document?: string) => + document + ? `Could not start the writer · ${document}` + : "Could not start the writer", + design_app: () => "Could not start the designer", + deploy_coder: () => "Could not start the app builder", + deploy_presenter: () => "Could not start the presenter", + instruct_coder: () => "Could not send the app builder a change", + review_artifact: (document?: string) => + document + ? `Could not ask for a review · ${document}` + : "Could not ask for a review", + } as Record string>, /** What a tool call is doing, by tool name, given its one identifying argument. */ tool: { read_file: (subject?: string) => @@ -708,6 +723,8 @@ export const wording = { timeout: "Not started — the go-ahead ran out of time", expired: "Not started — the go-ahead expired", }, + /** The hub refused the hand-off, so nothing started. */ + refused: "Not started", starting: "Starting…", /** At work before its run reports a step of its own. */ working: (subject: string) => `Working on ${subject}`, @@ -979,7 +996,7 @@ export const wording = { coordinatorNotStarted: "The coordinator for this project did not start.", projectNotOpened: "The project could not be opened.", projectLoading: "Loading this project…", - projectTooShort: "At least ten characters to start a project.", + projectEmpty: "Describe what you want built to start a project.", stepFailed: "That step could not finish.", }, /** The coordinator's questions as a card the person answers in the conversation. */ diff --git a/apps/web/src/pages/home-view.ts b/apps/web/src/pages/home-view.ts index d32d7256..bfd751d1 100644 --- a/apps/web/src/pages/home-view.ts +++ b/apps/web/src/pages/home-view.ts @@ -2,7 +2,7 @@ export const HOME_COMPOSER_PLACEHOLDER = "Describe the thing you want built…"; -/** Ten characters is the create gate. */ +/** Any idea starts a project; only an empty box does not. */ export function canStartProject(problem: string): boolean { - return problem.trim().length >= 10; + return problem.trim().length > 0; } diff --git a/apps/web/src/pages/projects.tsx b/apps/web/src/pages/projects.tsx index a3032f9c..f07df24e 100644 --- a/apps/web/src/pages/projects.tsx +++ b/apps/web/src/pages/projects.tsx @@ -51,7 +51,7 @@ export function Projects({ if (busy !== null) return; if (shell.answers(problem)) return setProblem(""); if (!canStartProject(problem)) { - toast.error(wording.message.projectTooShort); + toast.error(wording.message.projectEmpty); return; } setBusy("start"); diff --git a/apps/web/src/pages/workspace/work-unit-view.tsx b/apps/web/src/pages/workspace/work-unit-view.tsx index 19e92a16..c3b6a746 100644 --- a/apps/web/src/pages/workspace/work-unit-view.tsx +++ b/apps/web/src/pages/workspace/work-unit-view.tsx @@ -109,6 +109,7 @@ function WorkLine({ return text.steps(text.done[dispatch.role](subject), steps); case "finished": case "failed": + if (dispatch.refused !== undefined) return text.refused; return text.steps(text.ended(subject), steps); } } diff --git a/apps/web/src/pages/workspace/work-unit.ts b/apps/web/src/pages/workspace/work-unit.ts index d82195ea..e131973b 100644 --- a/apps/web/src/pages/workspace/work-unit.ts +++ b/apps/web/src/pages/workspace/work-unit.ts @@ -200,7 +200,11 @@ export function workUnitMessage( !dispatch.pending && status.state !== "waiting" && status.state !== "declined"; - const handoff = wording.activity.handoff[dispatch.tool]; + const handoff = ( + dispatch.refused === undefined + ? wording.activity.handoff + : wording.activity.handoffRefused + )[dispatch.tool]; const parts: ConversationPart[] = [ { kind: "tool-trace", diff --git a/docs/USER_MANUAL.md b/docs/USER_MANUAL.md index 663f3278..9e1832db 100644 --- a/docs/USER_MANUAL.md +++ b/docs/USER_MANUAL.md @@ -98,8 +98,8 @@ tips**) and your **Account**, with **Sign out**. From **New project** in the sidebar you see "What do you want to build today?" -1. Type your idea in the box that says "Describe the thing you want built…". It - needs at least ten characters. You can also dictate with the microphone. +1. Type your idea in the box that says "Describe the thing you want built…". + You can also dictate with the microphone. 2. The **Model profile** picker in the box shows the profile the project will use. Change it here if you want a different one. 3. Send it. You see "Starting your project…" and then the project opens. @@ -379,8 +379,8 @@ provider's status in **Settings → Providers**, then send your message again. whoever runs it to restart it. - **"Builder is responding slowly"**: everything waits on the server. If it stays slow, restart it. -- **"At least ten characters to start a project."**: describe the idea in a - little more detail. +- **"Describe what you want built to start a project."**: the box is empty; + type your idea first. - **"No model provider connected"**: choose **Connect a model provider**. - **"The provider refused this key."**: check the key and test again. - **"The provider did not answer with a model list."**: check the **Base URL**