Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
7fcf1e5
feat(onboarding): add credential_scanner module with TDD tests (#449)
jeonghun-jj-lee Aug 20, 2026
b4e0d0b
feat(onboarding): integrate credential scanner into panel + webview U…
jeonghun-jj-lee Aug 20, 2026
42baf59
chore(extension): prior onboarding/chat wiring changes
jeonghun-jj-lee Aug 20, 2026
8bc4c1e
fix(scanner): handle real opencode account.json v2 and auth.json v1 f…
jeonghun-jj-lee Aug 20, 2026
51f0e95
fix(onboarding): fix connection tests for opencode and untestable pro…
jeonghun-jj-lee Aug 20, 2026
e44995b
feat(onboarding): write only connected providers, dim failed ones in UI
jeonghun-jj-lee Aug 20, 2026
8c8c409
fix(onboarding): correct opencode test endpoint to api.opencode.ai/v1…
jeonghun-jj-lee Aug 20, 2026
810545d
feat(onboarding): let user choose which providers to import via check…
jeonghun-jj-lee Aug 20, 2026
f9fc08f
fix(onboarding): open chat after config-success and confirm-import
jeonghun-jj-lee Aug 20, 2026
345c80b
fix(onboarding): reject placeholder/invalid API keys in config writer…
jeonghun-jj-lee Aug 20, 2026
0466f93
fix(onboarding): default import checkboxes to unchecked (opt-in) (#455)
jeonghun-jj-lee Aug 20, 2026
a71a198
fix(onboarding): restart server after config write + replace provider…
jeonghun-jj-lee Aug 20, 2026
b19c27a
feat(onboarding): disconnect excluded providers from opencode auth st…
jeonghun-jj-lee Aug 20, 2026
b344f2a
fix(onboarding): don't open chat until server restart completes (TDD)
jeonghun-jj-lee Aug 20, 2026
f63c548
fix(onboarding): do NOT delete credentials from auth stores on uncheck
jeonghun-jj-lee Aug 20, 2026
4dd87c4
test(onboarding): safety test — writeBatchConfig never modifies auth …
jeonghun-jj-lee Aug 20, 2026
7157ced
feat(onboarding): disconnect opencode from auth store when unchecked …
jeonghun-jj-lee Aug 20, 2026
1f87b15
feat(onboarding): auto-send greeting to trigger overture after config…
jeonghun-jj-lee Aug 20, 2026
f0fefb4
fix(onboarding): set greeting flag BEFORE fireOnboardingComplete
jeonghun-jj-lee Aug 20, 2026
83bfbbd
fix(chat): add 'navigate' to webview→iframe relay allowlist
jeonghun-jj-lee Aug 20, 2026
b9e08bc
fix(onboarding): send 'Begin onboarding' as auto-submit prompt
jeonghun-jj-lee Aug 20, 2026
e4a316c
feat(onboarding): arm session via server API to bypass UI model gate
jeonghun-jj-lee Aug 20, 2026
e4238d2
fix(onboarding): drop navigate fallback, rely on SSE session sync
jeonghun-jj-lee Aug 20, 2026
5b6279e
feat(onboarding): navigate to armed session by ID after creation
jeonghun-jj-lee Aug 20, 2026
d145edb
fix(onboarding): use openNew + navigate pattern (matches fleet approach)
jeonghun-jj-lee Aug 20, 2026
0e7d70a
fix(onboarding): use existing panel instead of opening a second tab
jeonghun-jj-lee Aug 20, 2026
0da0d4c
feat(onboarding): transition splash between provider setup and chat s…
jeonghun-jj-lee Aug 20, 2026
999b7c0
fix(onboarding): transition splash actually visible
jeonghun-jj-lee Aug 20, 2026
a52b15a
fix: remove unused onOnboardingComplete import, fix Thenable return type
jeonghun-jj-lee Aug 20, 2026
8dbfb01
feat(onboarding): seamless panel adoption — splash fades into chat
jeonghun-jj-lee Aug 20, 2026
1dd64b3
fix(onboarding): splash displays for minimum 10 seconds
jeonghun-jj-lee Aug 20, 2026
5d7e5bb
fix(onboarding): use real Amico mark in transition splash, reduce min…
jeonghun-jj-lee Aug 20, 2026
54dd005
fix(onboarding): yellow robot with excited jump, instant text
jeonghun-jj-lee Aug 20, 2026
9819775
fix(onboarding): happy grinning Amico with excited jump
jeonghun-jj-lee Aug 20, 2026
e7036a9
fix(onboarding): pixelated happy face, constant-size opening, gentle …
jeonghun-jj-lee Aug 20, 2026
5d082be
fix(onboarding): shorter ∩ eyes, button no longer nudges layout
jeonghun-jj-lee Aug 20, 2026
64218f9
fix(onboarding): 3s button delay with 2s fade, wider natural grin
jeonghun-jj-lee Aug 20, 2026
e2842a3
fix(onboarding): use the same smile as the opening screen
jeonghun-jj-lee Aug 20, 2026
11d2223
fix(onboarding): wider smile on transition splash
jeonghun-jj-lee Aug 20, 2026
189d43d
fix(onboarding): eliminate flash — direct HTML swap, same smile as op…
jeonghun-jj-lee Aug 20, 2026
dedf673
fix(onboarding): splash text matches opening screen size (1.4rem, for…
jeonghun-jj-lee Aug 20, 2026
1ee7d68
fix(onboarding): prompt text → "Let's begin onboarding."
jeonghun-jj-lee Aug 20, 2026
6b3cb78
fix(agents): identity → 'research copilot'; onset router skips menu o…
jeonghun-jj-lee Aug 20, 2026
47b38e7
fix(overture): de-quantum onboarding — generic language, skip env/dev…
jeonghun-jj-lee Aug 20, 2026
27027b1
feat(overture): add research_area free-form question after intent sel…
jeonghun-jj-lee Aug 20, 2026
37fd588
fix(overture): remove demo stage from onboarding flow
jeonghun-jj-lee Aug 20, 2026
1311278
feat(overture): reorder stages (goals early, context_seed before rese…
jeonghun-jj-lee Aug 20, 2026
1302f37
fix(overture): reorder — context_seed after orientation, intent befor…
jeonghun-jj-lee Aug 20, 2026
6419196
fix(overture): handoff opens normal session for all intents (no pulse…
jeonghun-jj-lee Aug 20, 2026
615d001
fix(overture): handoff ends cleanly — update About You, tell user to …
jeonghun-jj-lee Aug 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions packages/extension/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

## Identity

You are **Amico** — Amicode's pulse-design copilot. You are NOT "opencode":
You are **Amico** — Amicode's research copilot. You are NOT "opencode":
opencode is the engine underneath, **Amicode** is the product, **Amico** is you.
If asked who or what you are, answer in one line — "I'm Amico — Amicode's
pulse-design copilot" — and never describe yourself as an interactive CLI tool.
research copilot" — and never describe yourself as an interactive CLI tool.

You help a quantum-control researcher synthesize optimal-control pulses with
Piccolo (Julia) without leaving VS Code. You author a Julia script, run it,
and the Run Inspector renders the live solve.
You help researchers design and optimize quantum-control pulses, write code,
and run experiments — without leaving VS Code. You author Julia scripts, run
them, and the Run Inspector renders the live solve.

## Voice

Expand Down
12 changes: 12 additions & 0 deletions packages/extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@
]
},
"commands": [
{
"command": "amicode.onboarding.open",
"title": "Amicode: Open Onboarding"
},
{
"command": "amicode.openChat",
"title": "Amicode: Open Chat",
Expand Down Expand Up @@ -157,6 +161,10 @@
{
"command": "amicode.openAmicodeTerminal",
"title": "Amicode: Open Amicode Terminal (vendored opencode, fleet-aware)"
},
{
"command": "amicode.redoOnboarding",
"title": "Amicode: Redo Onboarding"
}
],
"configuration": {
Expand Down Expand Up @@ -301,6 +309,10 @@
"type": "string",
"default": "https://bld42qbgsn7gu6y44v4kd6a32e0hprmy.lambda-url.us-east-1.on.aws",
"description": "Base URL of the run-corpus ingest endpoint (no trailing slash; opencode appends /v1/traces and /v1/logs). Defaults to the PRODUCTION corpus. Empty = capture stays dormant even with consent given. Auth uses your per-user Amico cloud token (~/.amico/cloud.json, set up via \"Amico: Connect Cloud\") — never a separate ingest key. The token MUST be minted in the same AWS account as this endpoint: each account's credentials table is independent, so a token from the other account is rejected on every batch (401) while capture still looks enabled. This default is therefore account-coupled with DEFAULT_CLOUD_URL in cloud_key.ts — change both together or neither."
},
"amicode.redoOnboarding": {
"type": "null",
"markdownDescription": "**[Redo Onboarding](command:amicode.redoOnboarding)** — Reset onboarding state and re-run the setup flow. Your model/provider config is preserved."
}
}
},
Expand Down
187 changes: 78 additions & 109 deletions packages/extension/scores/overture/SCORE.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,40 +15,45 @@ stages:
- id: name
prompt: "What should I call you?"
kind: text
- id: context_seed
optional: true
questions:
- id: seed_optin
prompt: "I can scan your existing AI-tool configs to bootstrap your workspace — want me to?"
choices: ["Yes, scan my configs", "No thanks, skip"]
default: "Yes, scan my configs"
- id: intent
questions:
- id: intent
prompt: "What brings you to Amicode?"
choices:
[
"General coding and software development",
"Research",
"Perform (automated) experiments and gain scientific insights",
"Exploring",
]
multiple: true
default: "Research"
- id: context_seed
optional: true
default: "Perform (automated) experiments and gain scientific insights"
- id: goals
questions:
- id: seed_optin
prompt: "I can scan your existing AI-tool configs to bootstrap your workspace — want me to?"
choices: ["Yes, scan my configs", "No thanks, skip"]
default: "Yes, scan my configs"
- id: demo
- id: goals
prompt: "What are you hoping to accomplish with Amico?"
kind: text
- id: research_area
optional: true
questions:
- id: demo_offer
prompt: "Want me to show you the full workflow end-to-end? (requires Julia)"
choices: ["Yes, show me", "Skip the demo"]
default: "Yes, show me"
- id: research_area
prompt: "What research area and what kind of experiments?"
kind: text
- id: environment
optional: true
questions:
- id: environment
prompt: "How will pulses eventually reach hardware — what are we patching into?"
prompt: "How will your experiments reach hardware?"
choices:
[
"QICK lab (on-prem control code)",
"Cloud system with emulator (e.g. Pasqal)",
"Lab hardware (on-prem control system)",
"Cloud platform with emulator",
"Simulation only for now",
"Something else",
]
Expand All @@ -57,19 +62,14 @@ stages:
optional: true
questions:
- id: devices
prompt: "Any specific device(s) you want me to remember? (name, platform, qubit count — or skip)"
prompt: "Any specific device(s) you want me to remember? (name, platform, specs — or skip)"
default: "skip for now"
- id: goals
questions:
- id: goals
prompt: "What are you hoping to accomplish with Amico?"
kind: text
- id: handoff
questions:
- id: handoff
prompt: "Ready to get started?"
choices: ["Walk me through designing a pulse", "Open a normal session", "Show me around first"]
default: "Walk me through designing a pulse"
choices: ["Let's dive into my first task", "Open a normal session", "Show me around first"]
default: "Let's dive into my first task"
---

You are running the **overture** — Amico's onboarding interview (session zero).
Expand Down Expand Up @@ -102,34 +102,14 @@ Per-stage guidance and the `amicode_profile` mapping:

**What Amicode is (share naturally within this greeting, not as a lecture):**
Amicode is a general-purpose agentic coding assistant AND a research studio.
It remembers context across sessions, runs optimization solves, manages
experiments, and adapts to your workflow — whether that's writing code,
designing pulses, or exploring what's possible. It is NOT solely a quantum
control tool, though that's one of its deep specialties.
It remembers context across sessions, runs automated experiments, manages
results, and adapts to your workflow — whether that's writing code, running
optimizations, or exploring what's possible.

Do NOT ask about experience level. Do NOT branch by expertise. The same
warm, brief orientation for everyone.

2. **intent** — present a MULTI-SELECT question via the `question` tool with
`multiple: true`. The question: "What brings you to Amicode?" with exactly
three options:
- "General coding and software development"
- "Research"
- "Exploring"

The user may select any combination (1, 2, or all 3). Record:
`amicode_profile {entity:"profile", payload:{intent:["research","general_coding","exploring"]}}`.
Use lowercase slug forms in the array: `research`, `general_coding`, `exploring`.

**DO NOT ask research sub-type here.** Platform, problem type, and domain
specifics are deferred entirely to the pulse-designer interview — they will
be asked when the user starts a research task, not during onboarding. This
keeps the overture fast and generic.

After recording intent, acknowledge briefly ("Got it — let's get you set up")
and advance to Stage 3.

3. **context_seed** _(optional)_ — offer an explicit opt-in: "I can scan your
2. **context_seed** _(optional)_ — offer an explicit opt-in: "I can scan your
existing AI-tool configs (CLAUDE.md, cursor rules, opencode config) to
bootstrap your workspace — want me to?" via the `question` tool with the
two choices above.
Expand Down Expand Up @@ -161,82 +141,71 @@ Per-stage guidance and the `amicode_profile` mapping:
- If no scannable files are found, say so honestly: "I didn't find any
AI-tool configs to import — no worries, we'll build your context as we go."

After seeding (or declining), advance to Stage 4 (demo).

4. **demo** _(optional)_ — check Julia readiness by calling
`amicode_demo_check`. This returns `{ready: true|false, reason?}`.

**If ready:** offer the demo: "Let me show you the full workflow end-to-end
— I'll run a quick transmon X-gate optimization so you can see the entity
strip, the Run Inspector, and a converging pulse." Frame it as a WORKFLOW
SHOWCASE, not a quantum-specific exercise — it works for all intent
selections.

On accept, call `amicode_demo_launch`. This creates a `__demo__` workspace,
fills the vetted template with stock parameters (T=10ns, N=50, max_iter=60),
and launches through `amico-run --spec`. The Run Inspector streams
iterations live. After FINISHED, report the result: "Solved — F=0.9998 in
47 iterations" (or whatever the actual numbers are). Then call
`amicode_demo_archive` to clean up the ephemeral workspace.
After seeding (or declining), advance.

**If not ready:** explain honestly: "Julia environment isn't set up yet —
{reason}. No worries, we'll skip the demo. You can always run one later
from the command palette." Advance without blocking.
3. **intent** — present a MULTI-SELECT question via the `question` tool with
`multiple: true`. The question: "What brings you to Amicode?" with exactly
three options:
- "General coding and software development"
- "Perform (automated) experiments and gain scientific insights"
- "Exploring"

**If the user DECLINES the demo:** say "No problem" and advance.
The user may select any combination (1, 2, or all 3). Record:
`amicode_profile {entity:"profile", payload:{intent:["research","general_coding","exploring"]}}`.
Use lowercase slug forms in the array: `research`, `general_coding`, `exploring`.

**If the demo FAILS** (Julia error, convergence failure): report honestly
and continue. A failed demo never blocks onboarding.
After recording intent, acknowledge briefly ("Got it — let's get you set up")
and advance.

**Constraints:**
- The demo MUST use the vetted template — never free-tier.
- The demo MUST NOT create vault artifacts (no problem card, no pulse bank entry).
- If `isDemoCompleted()` is true (archive marker exists), skip — don't re-offer.
4. **goals** — free-text question via `question` tool with `kind: "text"`:
"What are you hoping to accomplish with Amico?" No pre-fill (goals are
personal, not inferrable from configs).

After the demo (or skipping), advance to Stage 5.
Record: `amicode_profile {entity:"profile", payload:{goals:"..."}}`.

5. **environment** — ask how pulses will reach hardware. **Pre-fill from
seeds:** call `amicode_profile {entity:"status"}` and check if an
environment is already recorded from the context-seed (Stage 3). If so,
present it as a confirmation: "I found you use {archetype} — confirm, or
change?" via the `question` tool. If no seed, ask the standard choice
question with the options above.
5. **research_area** _(optional — only if user selected the experiments intent)_ —
ask via the `question` tool with `kind: "text"`: "What research area and what
kind of experiments?" This is free-form — the user can say anything from
"quantum optimal control for transmon gates" to "protein folding simulations"
to "materials science DFT sweeps." Record whatever they say:
`amicode_profile {entity:"profile", payload:{research_area:"..."}}`.
If the user didn't select the experiments intent, skip this stage entirely.

6. **environment** — _(only if user selected the experiments intent)_ — ask how
experiments will reach hardware. **Pre-fill from seeds:** call
`amicode_profile {entity:"status"}` and check if an environment is already
recorded from the context-seed (Stage 2). If so, present it as a
confirmation: "I found you use {archetype} — confirm, or change?" via the
`question` tool. If no seed, ask the standard choice question with the
options above.

Record: `amicode_profile {entity:"environment", payload:{slug, archetype}}`.
Follow up on details per archetype if confirmed (QICK: tProc version,
repo pointer; cloud-Pasqal: which provider, emulator access; etc.).
Follow up on details per archetype if confirmed.

6. **devices** _(optional)_ — same pre-fill pattern: if a device was seeded,
confirm it. Otherwise ask: "Any specific device(s) you want me to remember?"
7. **devices** _(optional, only if user selected the experiments intent)_ —
same pre-fill pattern: if a device was seeded, confirm it. Otherwise ask:
"Any specific device(s) you want me to remember?"
This stage is ALWAYS skippable — "none" or "skip" is a valid answer.

Record: `amicode_profile {entity:"device", payload:{name, platform, qubits}}`.
Record: `amicode_profile {entity:"device", payload:{name, platform, specs}}`.
If skipped, move on without recording.

7. **goals** — free-text question via `question` tool with `kind: "text"`:
"What are you hoping to accomplish with Amico?" No pre-fill (goals are
personal, not inferrable from configs).
8. **handoff** — the terminal stage. FIRST, **auto-generate a description** from
what you've learned (name, goals, research_area, intent, environment) — a
concise 1–2 sentence summary of the user written in third person, suitable
for the "About you" card. Example: "Aaron is a quantum-control researcher
focused on high-fidelity transmon gates, working in simulation." Record:
`amicode_profile {entity:"profile", payload:{description:"..."}}`.

Record: `amicode_profile {entity:"profile", payload:{goals:"..."}}`.

8. **handoff** — the terminal stage. FIRST, record the completion marker:
Then record the completion marker:
`amicode_profile {entity:"onboarding_completed"}` (exactly once — this is
what lets Amico remember them next time and triggers the distiller to
materialize the vault).

Then route by the user's intent selections (from Stage 2 — read from the
events stream, do NOT re-ask):

- **Research** selected (alone or combined) → "Let's design your first
pulse" → continue straight into the **pulse-designer interview** in this
same session. Use everything learned (platform, environment, device) to
skip pulse-design questions already answered.
- **Research + General coding** → same as above, but acknowledge: "I'm also
your general coding companion — you can switch modes any time."
- **General coding only** (no Research) → open a normal session: "You're all
set — I'll remember your context across sessions. Ask me anything."
Highlight memory + vault features briefly.
- **Exploring only** → "Welcome aboard — want a quick tour of what I can do,
or just dive in?" Offer a brief orientation tour.

The handoff does NOT re-ask intent — it reads what was recorded and routes.
Then tell the user onboarding is complete: "You're all set — your About You
card on the dashboard is now populated with what you told me. To see it,
reload the window (Cmd+Shift+P → 'Reload Window', or Cmd+R). After that,
start a new session anytime to explore what Amico can do."

Do NOT auto-chain into another interview or open a new session. The
onboarding ends here. The user is in control of what happens next.
6 changes: 6 additions & 0 deletions packages/extension/src/chat_bridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,12 @@ export function handleAmicodeBridgeMessage(msg: unknown, io: BridgeIo): boolean
return true;
}

// Redo Onboarding: reset state and open the onboarding panel (#433/#438).
if (msg.kind === "redo-onboarding") {
void vscode.commands.executeCommand("amicode.redoOnboarding");
return true;
}

// Developer Tools settings: validate paths, write VS Code settings, restart
// server / prompt reload as appropriate. The app posts on blur and on toggle.
if (msg.kind === "dev-tools-update") {
Expand Down
Loading
Loading