diff --git a/.changeset/activity-without-nested-scroll.md b/.changeset/activity-without-nested-scroll.md new file mode 100644 index 00000000000..499de9f104e --- /dev/null +++ b/.changeset/activity-without-nested-scroll.md @@ -0,0 +1,5 @@ +--- +"@hashintel/petrinaut": patch +--- + +Show every reasoning step and tool in the Brunch Activity fold instead of clipping them in a nested scroll area, so the visible list always matches the tool count. diff --git a/.changeset/brunch-activity-labels.md b/.changeset/brunch-activity-labels.md new file mode 100644 index 00000000000..f84c1cbabed --- /dev/null +++ b/.changeset/brunch-activity-labels.md @@ -0,0 +1,5 @@ +--- +"@hashintel/petrinaut": patch +--- + +Show activity wording instead of naming Brunch during a turn. The waiting row and the default working status read "Working…", and the Voice brief reads "Preparing request", "Sending request", then "Request sent". diff --git a/.changeset/brunch-activity-stays-put.md b/.changeset/brunch-activity-stays-put.md new file mode 100644 index 00000000000..0cf0f681962 --- /dev/null +++ b/.changeset/brunch-activity-stays-put.md @@ -0,0 +1,5 @@ +--- +"@hashintel/petrinaut": patch +--- + +Keep the Brunch Activity row in place through a turn. A spoken Live reply no longer takes over the Working… row, and the row's label no longer shifts when the spinner gives way to the Activity icon. diff --git a/.changeset/brunch-tab-fade.md b/.changeset/brunch-tab-fade.md new file mode 100644 index 00000000000..6989d8924cf --- /dev/null +++ b/.changeset/brunch-tab-fade.md @@ -0,0 +1,5 @@ +--- +"@hashintel/petrinaut": patch +--- + +Stop Brunch assistant tabs inheriting the stock tab fade, so the Brunch selected and hover treatment applies on its own. diff --git a/.changeset/brunch-waiting-in-activity.md b/.changeset/brunch-waiting-in-activity.md new file mode 100644 index 00000000000..400593f6f83 --- /dev/null +++ b/.changeset/brunch-waiting-in-activity.md @@ -0,0 +1,5 @@ +--- +"@hashintel/petrinaut": patch +--- + +Show Brunch's waiting state in the transcript, where the turn's Activity will appear, and keep the spinner in the Activity header while Brunch works. The status row above the composer now appears only while the host tab is shown. diff --git a/.changeset/voice-settings-copy.md b/.changeset/voice-settings-copy.md new file mode 100644 index 00000000000..475c9486b21 --- /dev/null +++ b/.changeset/voice-settings-copy.md @@ -0,0 +1,5 @@ +--- +"@hashintel/petrinaut": patch +--- + +Shorten Voice audio settings help: the voice note reads "Applies next session. To preview, mute your mic while the agent is idle." and disabled controls read "Connect Voice to use audio controls." diff --git a/apps/petrinaut-website/src/main/app/local-storage-demo/assistant-labs-settings.test.tsx b/apps/petrinaut-website/src/main/app/local-storage-demo/assistant-labs-settings.test.tsx index 092a87b8064..8c7d7c33213 100644 --- a/apps/petrinaut-website/src/main/app/local-storage-demo/assistant-labs-settings.test.tsx +++ b/apps/petrinaut-website/src/main/app/local-storage-demo/assistant-labs-settings.test.tsx @@ -127,8 +127,7 @@ test.each([ props: { brunchConfigured: false }, control: "Use Brunch", checked: false, - description: - "Brunch is unavailable because this site has no Brunch endpoint configured.", + description: "Brunch isn’t set up on this site.", }, { name: "Voice preference loading", diff --git a/apps/petrinaut-website/src/main/app/local-storage-demo/assistant-labs-settings.tsx b/apps/petrinaut-website/src/main/app/local-storage-demo/assistant-labs-settings.tsx index e8f232fa63a..68bcf4ff04d 100644 --- a/apps/petrinaut-website/src/main/app/local-storage-demo/assistant-labs-settings.tsx +++ b/apps/petrinaut-website/src/main/app/local-storage-demo/assistant-labs-settings.tsx @@ -119,8 +119,8 @@ export const AssistantLabsSettings = ({ const brunchDescription = !assistantReady ? "Loading your assistant preference…" : !brunchConfigured - ? "Brunch is unavailable because this site has no Brunch endpoint configured." - : "Use Brunch instead of the stock Petrinaut assistant."; + ? "Brunch isn’t set up on this site." + : "Use Brunch instead of the default assistant."; const voiceDescription = !voicePreferenceReady ? "Loading your Voice preference…" : !brunchSelected @@ -129,7 +129,7 @@ export const AssistantLabsSettings = ({ ? "Checking whether Voice is available…" : openAIVoiceConfig === null ? "Voice is unavailable in this deployment." - : "Make Voice mode available for Brunch conversations."; + : "Talk to Brunch by voice."; return (
@@ -155,7 +155,7 @@ export const AssistantLabsSettings = ({ /> {brunchSelected && voicePreferenceReady && voiceEnabled && ( { await waitFor(() => expect(submit).toHaveBeenCalledTimes(1)); expect(heading()).toEqual(["Preparing draft"]); expect(screen.getByText(/being prepared/u)).toBeTruthy(); - expect(screen.queryByText(/before this editor was loaded/u)).toBeNull(); + expect(screen.queryByText(/is from an earlier session/u)).toBeNull(); expect(screen.queryByRole("button", { name: "Run" })).toBeNull(); await act(async () => submission.resolve()); @@ -423,7 +423,7 @@ describe("BrunchDraftExperimentWidget", () => { name: "Run", }); expect(run.disabled).toBe(true); - expect(screen.getByRole("alert").textContent).toContain("Run is blocked"); + expect(screen.getByRole("alert").textContent).toContain("Can’t run"); fireEvent.click(run); expect(runExperiment).not.toHaveBeenCalled(); }, @@ -534,7 +534,7 @@ describe("BrunchDraftExperimentWidget", () => { await waitFor(() => expect(submit).toHaveBeenCalledTimes(1)); expect(submit.mock.calls[0]?.[0]).toMatchObject({ status: "invalid" }); expect(submit.mock.calls[0]?.[0].diagnostics[0]).toMatch( - /changed since the canonical read/u, + /changed since the AI assistant read it/u, ); expect(heading()).toEqual(["Could not be prepared"]); expect(screen.queryByRole("button", { name: "Run" })).toBeNull(); @@ -1441,9 +1441,7 @@ describe("BrunchDraftExperimentWidget", () => { expect(submit).not.toHaveBeenCalled(); expect(heading()).toEqual(["Not retained in this editor"]); - expect( - screen.getByText(/prepared before this editor was loaded/u), - ).toBeTruthy(); + expect(screen.getByText(/draft is from an earlier session/u)).toBeTruthy(); expect(screen.queryByRole("button", { name: "Run" })).toBeNull(); }); diff --git a/apps/petrinaut-website/src/main/app/local-storage-demo/brunch-draft-experiment-interactive-tool.tsx b/apps/petrinaut-website/src/main/app/local-storage-demo/brunch-draft-experiment-interactive-tool.tsx index c94d3851d36..bc353f281af 100644 --- a/apps/petrinaut-website/src/main/app/local-storage-demo/brunch-draft-experiment-interactive-tool.tsx +++ b/apps/petrinaut-website/src/main/app/local-storage-demo/brunch-draft-experiment-interactive-tool.tsx @@ -183,7 +183,7 @@ export const resolveDraftAuthorityFromHistory = async ( latest.state !== "output-available" ) throw new Error( - "Draft requires the latest settled canonical net read after changes.", + "The AI assistant needs to read the latest model before drafting.", ); const envelope = latest.output; const metadata = @@ -192,7 +192,9 @@ export const resolveDraftAuthorityFromHistory = async ( : undefined; const revision = metadata?.documentRevision.before; if (revision === undefined) - throw new Error("The latest canonical read has no document revision."); + throw new Error( + "The AI assistant’s latest model read has no document revision.", + ); return revision; }; @@ -320,7 +322,7 @@ export const BrunchDraftExperimentWidget = ({ : { prepared: null, error: - "The model changed since the canonical read. Ask Brunch to read the current model and draft again.", + "The model changed since the AI assistant read it. Ask it to draft again.", }; } catch (caught) { outcome = { @@ -606,7 +608,7 @@ export const BrunchDraftExperimentWidget = ({ ? preparationFailure.kind === "prepare" ? `The experiment proposal could not be prepared: ${preparationFailure.message}` : `The prepared proposal could not be submitted: ${preparationFailure.message}` - : "This draft was prepared before this editor was loaded. Ask Brunch to draft it again to run it.")} + : "This draft is from an earlier session. Ask the AI assistant to draft it again to run it.")}

)}

Declared

@@ -620,8 +622,7 @@ export const BrunchDraftExperimentWidget = ({

Not carried into execution

{input.unsupported.length === 0 ? (

- No restrictions were stated. The request carries no constraints, so - none are enforced. + No restrictions were stated, so none are enforced.

) : (