From 8dd8521c5e649a0619a4b3da100c2421f0e830eb Mon Sep 17 00:00:00 2001 From: JJ Lee Date: Fri, 21 Aug 2026 00:31:02 +0200 Subject: [PATCH 1/4] =?UTF-8?q?fix(ui):=20de-quantum=20all=20user-facing?= =?UTF-8?q?=20copy=20=E2=80=94=20about-you,=20wizard,=20starters,=20taglin?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/server/amicode/widgets-src/about-you.ts | 6 +++--- packages/ui/src/amicode/getting-started.tsx | 16 ++++++++-------- packages/ui/src/amicode/onboarding-wizard.tsx | 8 ++++---- packages/ui/src/amicode/tagline.tsx | 9 ++++----- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/packages/opencode/src/server/amicode/widgets-src/about-you.ts b/packages/opencode/src/server/amicode/widgets-src/about-you.ts index 0ece63b61..19c23589f 100644 --- a/packages/opencode/src/server/amicode/widgets-src/about-you.ts +++ b/packages/opencode/src/server/amicode/widgets-src/about-you.ts @@ -95,7 +95,7 @@ export default { }).join('') + '' : '') + '' + - '' + + '' + '' + '
' + '' + @@ -121,7 +121,7 @@ export default { if (fresh && !editing) { body = '
' + - '
No solves yet \\u2014 tell Amico what you're working on and it'll start remembering.
' + + '
No experiments yet \\u2014 tell Amico what you're working on and it'll start remembering.
' + '' } else if (!editing) { var cells = chosen.map(function (k) { @@ -169,7 +169,7 @@ export default { amico.action('open-external', { url: you.scholar }) }) on('[data-firstrun]', 'click', function () { - amico.prompt('help me set up my first pulse-design problem') + amico.prompt('help me get started with my first project') }) on('[data-cancel]', 'click', function () { editing = false diff --git a/packages/ui/src/amicode/getting-started.tsx b/packages/ui/src/amicode/getting-started.tsx index 0d7462586..39379921a 100644 --- a/packages/ui/src/amicode/getting-started.tsx +++ b/packages/ui/src/amicode/getting-started.tsx @@ -21,19 +21,19 @@ import { AmicodeTagline } from "./tagline" // BE the recommendation, so we honor it verbatim and let the row wrap. export const AMICODE_STARTERS: readonly { label: string; prompt: string }[] = [ { - label: "Design a pulse — walk me through it", - prompt: "walk me through designing a pulse", + label: "Walk me through my first experiment", + prompt: "walk me through setting up my first experiment", }, { - label: "Optimize an X gate on my transmon", - prompt: "optimize an X gate on my transmon — use what you know from my history", + label: "Help me with a coding task", + prompt: "I have a coding task — let's get started", }, // NOTE(spec B): the static "Resume my pulse design" chip was replaced by the // conditional resumeName-driven chip below — Resume renders only when a // problem workspace actually exists (no empty chrome). { - label: "Warm-start from my pulse bank", - prompt: "warm-start a new solve from my pulse bank", + label: "Warm-start from a previous result", + prompt: "warm-start a new experiment from my previous results", }, { label: "Go fast with Veloce", @@ -45,8 +45,8 @@ export const AMICODE_STARTERS: readonly { label: string; prompt: string }[] = [ }, ] -// The three-beat arc of a pulse-design session, from setup to hardware. -const STEPS = ["① Define your system and problem", "② Optimize and iterate", "③ Execute and tune on hardware"] +// The three-beat arc of a research session, from setup to results. +const STEPS = ["① Define your system and problem", "② Optimize and iterate", "③ Analyze and refine"] /** amicode chat-redesign (Kate): chips-only row for the composer-as-hero start * screen — no tagline, no byline, no steps. Quiet neutral pills (Kimi-style): diff --git a/packages/ui/src/amicode/onboarding-wizard.tsx b/packages/ui/src/amicode/onboarding-wizard.tsx index 641ea01b9..57cec68cd 100644 --- a/packages/ui/src/amicode/onboarding-wizard.tsx +++ b/packages/ui/src/amicode/onboarding-wizard.tsx @@ -264,8 +264,8 @@ export function AmicodeOnboardingWizard(props: { "max-width": "380px", }} > - Amico is your quantum-computing agent — it designs pulses from a conversation, warm-starts from your - pulse bank, and tunes on real hardware. Thirty seconds of setup makes it yours. + Amico is your research and coding companion — it runs experiments from a conversation, remembers your + results, and adapts to your workflow. Thirty seconds of setup makes it yours.
setFields({ ...fields(), focus: e.currentTarget.value })} - placeholder="e.g. high-fidelity gates on transmons" + placeholder="e.g. optimal control, ML research, materials science" />
@@ -544,7 +544,7 @@ export function AmicodeOnboardingWizard(props: {
- You're set — a personal vault is ready. Amico will remember this; say hi and design your first pulse. + You're set — a personal vault is ready. Amico will remember your context across sessions.
{/* attach-your-own-vault: quiet by default so it never crowds the payoff shot */} diff --git a/packages/ui/src/amicode/tagline.tsx b/packages/ui/src/amicode/tagline.tsx index 64118f967..c975f64c6 100644 --- a/packages/ui/src/amicode/tagline.tsx +++ b/packages/ui/src/amicode/tagline.tsx @@ -5,11 +5,10 @@ import { createSignal, onCleanup, onMount } from "solid-js" // v2-token styling (dark/light correct); timings tuned to read, not distract. export const TAGLINE_PHRASES = [ - "Your friendly Quantum Computing Agent", - "designs pulses from a conversation", - "warm-starts from your pulse bank", - "tunes & calibrates on real hardware", - "powered by the Piccolo engine", + "your research copilot", + "runs experiments from a conversation", + "remembers your results and context", + "adapts to your workflow", "Andiamo.", ] From f0c7d28b7b880aec3276680e0dc4101eb24d14de Mon Sep 17 00:00:00 2001 From: JJ Lee Date: Fri, 21 Aug 2026 00:31:55 +0200 Subject: [PATCH 2/4] fix(ui): rename 'focus' label to 'Research area' in about-you, wizard, home-cards --- packages/opencode/src/server/amicode/widgets-src/about-you.ts | 2 +- packages/ui/src/amicode/home-cards.tsx | 4 ++-- packages/ui/src/amicode/onboarding-wizard.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/server/amicode/widgets-src/about-you.ts b/packages/opencode/src/server/amicode/widgets-src/about-you.ts index 19c23589f..5275efb95 100644 --- a/packages/opencode/src/server/amicode/widgets-src/about-you.ts +++ b/packages/opencode/src/server/amicode/widgets-src/about-you.ts @@ -95,7 +95,7 @@ export default { }).join('') + '' : '') + '' + - '' + + '' + '' + '
' + '' + diff --git a/packages/ui/src/amicode/home-cards.tsx b/packages/ui/src/amicode/home-cards.tsx index 626dddd33..904ee0583 100644 --- a/packages/ui/src/amicode/home-cards.tsx +++ b/packages/ui/src/amicode/home-cards.tsx @@ -924,8 +924,8 @@ function AboutYouCard(props: { data-amc-clipboard="self" class="amc-input amc-input--compact" value={draft().focus} - placeholder="What you work on" - aria-label="Research focus" + placeholder="Research area" + aria-label="Research area" onInput={(e) => setDraft({ ...draft(), focus: e.currentTarget.value })} onKeyDown={pasteFallback((v) => setDraft({ ...draft(), focus: v }))} /> diff --git a/packages/ui/src/amicode/onboarding-wizard.tsx b/packages/ui/src/amicode/onboarding-wizard.tsx index 57cec68cd..c98f1c2e6 100644 --- a/packages/ui/src/amicode/onboarding-wizard.tsx +++ b/packages/ui/src/amicode/onboarding-wizard.tsx @@ -393,7 +393,7 @@ export function AmicodeOnboardingWizard(props: {
-
What you work on
+
Research area
Date: Fri, 21 Aug 2026 00:39:23 +0200 Subject: [PATCH 3/4] =?UTF-8?q?feat(about-you):=20add=20description=20fiel?= =?UTF-8?q?d,=20render=20in=20widget=20+=20home-cards;=20fix=20'No=20solve?= =?UTF-8?q?s'=20=E2=86=92=20'No=20experiments'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/amicode/widgets-src/about-you.ts | 1 + packages/ui/src/amicode/home-cards.tsx | 20 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/server/amicode/widgets-src/about-you.ts b/packages/opencode/src/server/amicode/widgets-src/about-you.ts index 5275efb95..63d98b050 100644 --- a/packages/opencode/src/server/amicode/widgets-src/about-you.ts +++ b/packages/opencode/src/server/amicode/widgets-src/about-you.ts @@ -114,6 +114,7 @@ export default { ? editForm : '
' + esc(you.focus || you.affiliation || 'tell Amico about your work') + '
' + + (you.description ? '
' + esc(you.description) + '
' : '') + (platforms ? '
' + platforms + '
' : '')) + '
' diff --git a/packages/ui/src/amicode/home-cards.tsx b/packages/ui/src/amicode/home-cards.tsx index 904ee0583..a1a3fecad 100644 --- a/packages/ui/src/amicode/home-cards.tsx +++ b/packages/ui/src/amicode/home-cards.tsx @@ -35,6 +35,7 @@ export interface ProfileYou { scholar: string | null affiliation_logo: string | null focus: string | null + description: string | null avatar: string | null platforms: string[] stats: ProfileStats @@ -57,6 +58,7 @@ export function parseProfileResponse(raw: unknown): ProfileView { scholar: typeof you.scholar === "string" ? you.scholar : null, affiliation_logo: typeof you.affiliation_logo === "string" ? you.affiliation_logo : null, focus: typeof you.focus === "string" ? you.focus : null, + description: typeof you.description === "string" ? you.description : null, avatar: typeof you.avatar === "string" ? you.avatar : null, platforms: Array.isArray(you.platforms) ? you.platforms.filter((p: unknown) => typeof p === "string") : [], stats: { @@ -989,6 +991,22 @@ function AboutYouCard(props: {
+ +
+ {y().description} +
+
@@ -998,7 +1016,7 @@ function AboutYouCard(props: { <>
- No solves yet — tell Amico what you're working on and it'll start remembering. + No experiments yet — tell Amico what you're working on and it'll start remembering.
Date: Fri, 21 Aug 2026 01:02:14 +0200 Subject: [PATCH 4/4] =?UTF-8?q?fix(onboarding):=20auto-submit=20race=20?= =?UTF-8?q?=E2=80=94=20set=20pendingAutoSend=20after=20draft=20exists,=20c?= =?UTF-8?q?heck=20content=20not=20just=20array=20length?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/app/src/app.tsx | 2 +- .../new-session-draft-controller.ts | 36 +++++++++++-------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx index f3045d492..fc84096af 100644 --- a/packages/app/src/app.tsx +++ b/packages/app/src/app.tsx @@ -475,8 +475,8 @@ function AmicodeNavigateBridge() { if (url.pathname === "/new-session") { const prompt = url.searchParams.get("prompt") || undefined const autoSend = url.searchParams.get("autoSend") === "1" - if (autoSend) setPendingAutoSend(true) await tabs.newDraft({ server: server.key, directory: server.projects.list()[0]?.worktree ?? "" }, prompt) + if (autoSend) setPendingAutoSend(true) } else { // Navigate to an existing session by path (e.g. /session/:id) const sessionMatch = url.pathname.match(/^\/session\/([^/?]+)/) diff --git a/packages/app/src/pages/new-session/new-session-draft-controller.ts b/packages/app/src/pages/new-session/new-session-draft-controller.ts index 807074057..fbc01d979 100644 --- a/packages/app/src/pages/new-session/new-session-draft-controller.ts +++ b/packages/app/src/pages/new-session/new-session-draft-controller.ts @@ -52,24 +52,30 @@ export function createNewSessionDraftController(workspace: { worktree: () => str prompt.set([{ type: "text", content: text, start: 0, end: text.length }], text.length) setSearchParams({ ...searchParams, prompt: undefined, autoSend: undefined }) } - // amicode#363: auto-submit when the navigate bridge flagged it - if (pendingAutoSend()) { - setPendingAutoSend(false) - // Retry until model selection is ready and submit succeeds. - // After restart, providers may take a moment to load. - const trySubmit = (attempts = 0) => { - if (attempts > 20) return // give up after ~10s - if (model.ready() && model.current()) { - input.view.submit.onSubmit() - } else { - setTimeout(() => trySubmit(attempts + 1), 500) - } - } - setTimeout(() => trySubmit(), 500) - } }) }) + // amicode#363: auto-submit when the navigate bridge flagged it. + // Separated from the text-fill effect so it works even when the draft + // controller is already mounted (no sessions open → already on /new-session). + createEffect(() => { + if (!pendingAutoSend()) return + if (!prompt.ready()) return + setPendingAutoSend(false) + // Retry until model selection is ready and the prompt has content. + const trySubmit = (attempts = 0) => { + if (attempts > 20) return // give up after ~10s + const parts = prompt.current() + const hasContent = Array.isArray(parts) && parts.some((p: any) => p.content && p.content.length > 0) + if (model.ready() && model.current() && hasContent) { + input.view.submit.onSubmit() + } else { + setTimeout(() => trySubmit(attempts + 1), 500) + } + } + setTimeout(() => trySubmit(), 500) + }) + return { input, prompt: {