Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
22 changes: 14 additions & 8 deletions packages/extension/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,25 @@

## Identity

You are **Amico** — Amicode's research copilot. You are NOT "opencode":
You are **Amico** — Amicode's autoresearch 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
research copilot" — and never describe yourself as an interactive CLI tool.

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.
autoresearch copilot" — and never describe yourself as an interactive CLI tool.

You run the research loop first — campaigns, hypotheses, spec gates,
experiments, mechanical verdicts — plus the dev work that loop needs (issues,
PRs, skills, fleet ops) — and you adapt to the user's field from their
recorded state (profile, mounts, memory): their platforms, their prior
results, their open questions. Your deepest domain is quantum control: you
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. That is the first domain pack, not the boundary — QEC, other
physics, anything modelable: the loop is the same.

## Voice

You're a _friend_ — "Amico" is Italian for it — who's done pulse design with this
researcher for years. You know the toolchain, the failure modes, the literature.
You're a _friend_ — "Amico" is Italian for it — who's done research with this
user for years. You know their toolchain, the failure modes, the literature.
Sound like it — not a generic assistant.

- **Witty and plucky, never chummy.** Dry, confident, a little cheeky. A clean
Expand Down
2 changes: 1 addition & 1 deletion packages/extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "amicode",
"displayName": "Amicode",
"description": "Open autonomous research in VS Code \u2014 vaults, fleet, and live solves for quantum control and physical intelligence.",
"version": "0.2.5",
"version": "0.2.6",
"publisher": "harmoniqs",
"license": "Apache-2.0",
"icon": "media/icon.png",
Expand Down
35 changes: 1 addition & 34 deletions packages/extension/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import { watchSolverMode, applyEntitlementForMode, readSolverModeState } from ".
import { runSetCloudKeyCommand } from "./cloud_key";
import { amicodeOpsDir } from "./substrate/vault_store";
import { registerOnboardingPanel, onOnboardingCancelled, getOnboardingPanel, releaseOnboardingPanel } from "./onboarding_panel";
import { isModelConfigured, writeWelcomeShown } from "./onboarding_routing";
import { isModelConfigured } from "./onboarding_routing";
import { stagePasqalConnector } from "./pasqal_assets";
import { needsProvision, pasqalVenvDir, provisionPasqalPython } from "./pasqal_python";
import { createLocalPersonalVault, sanitizeVaultName, suggestVaultName } from "./substrate/vault_setup";
Expand Down Expand Up @@ -208,39 +208,6 @@ async function refreshDeviceInspector(channel: vscode.OutputChannel): Promise<vo
* second Stop click must not stack a second dialog. */
const pendingStops = new Set<string>();

/** Create a session and arm it with "Let's begin onboarding." via the server API.
* Bypasses the UI model gate (the server resolves its own default model).
* Returns the session ID on success, undefined on failure. */
async function armOnboardingSession(
serverUrl: URL,
authHeaders: Record<string, string>,
projectDir?: string,
): Promise<string | undefined> {
try {
const collectionUrl = new URL("/session", serverUrl);
if (projectDir) collectionUrl.searchParams.set("directory", projectDir);
const createRes = await fetch(collectionUrl.toString(), {
method: "POST",
headers: { "Content-Type": "application/json", ...authHeaders },
body: JSON.stringify({ title: "Onboarding" }),
});
if (!createRes.ok) return undefined;
const { id } = (await createRes.json()) as { id?: string };
if (!id) return undefined;

const commandUrl = new URL(`/session/${id}/command`, serverUrl);
const commandRes = await fetch(commandUrl.toString(), {
method: "POST",
headers: { "Content-Type": "application/json", ...authHeaders },
body: JSON.stringify({ command: "Let's begin onboarding.", arguments: "" }),
});
if (!commandRes.ok) return undefined;
return id;
} catch {
return undefined;
}
}

export async function activate(ctx: vscode.ExtensionContext): Promise<void> {
const opencodeChannel = vscode.window.createOutputChannel("Amicode — opencode");
const runsChannel = vscode.window.createOutputChannel("Amicode — runs");
Expand Down
3 changes: 0 additions & 3 deletions packages/extension/src/onboarding_webview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -929,9 +929,6 @@ window.addEventListener("message", (event) => {
if (ring) ring.style.animation = "none";
}

// Find the inner-most animated group to switch animation
const enterGroup = svg.querySelector(".mark-enter") || svg.querySelector(".mark-breathe");

// Switch from idle animations to excited jump
const breatheGroup = svg.querySelector(".mark-breathe") as HTMLElement;
if (breatheGroup) {
Expand Down
Loading