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: { 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..63d98b050 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('') + '' : '') + '' + - '' + + '' + '' + '
' + '' + @@ -114,6 +114,7 @@ export default { ? editForm : '
' + esc(you.focus || you.affiliation || 'tell Amico about your work') + '
' + + (you.description ? '
' + esc(you.description) + '
' : '') + (platforms ? '
' + platforms + '
' : '')) + '
' @@ -121,7 +122,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 +170,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/home-cards.tsx b/packages/ui/src/amicode/home-cards.tsx index 626dddd33..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: { @@ -924,8 +926,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 }))} /> @@ -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.
- 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.
-
What you work on
+
Research area
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.", ]