# Changelog All notable changes to Agnes AI Data Analyst. Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html), pre-1.0 — public surface (CLI flags, REST endpoints, `instance.yaml` schema, `extract.duckdb` contract) may shift between minor versions; breaking changes called out under **Changed** or **Removed** with the **BREAKING** marker. CalVer image tags (`stable-YYYY.MM.N`, `dev-YYYY.MM.N`) are produced for every CI build; semver tags (`v0.X.Y`) are cut at release boundaries and reference the same commit as a `stable-*` tag from the same day. --- ## [Unreleased] ### Added - `instance.custom_scripts`: operator-injected HTML/JS blocks rendered into every page that extends `base.html`. Each entry takes `name`, `enabled`, `placement` (`head_start` | `head_end` | `body_end`), and `html`. Use for feedback widgets (Marker.io), analytics (GTM, PostHog), error capture (Sentry). Admin-only; rendered with `| safe` — same trust boundary as `instance.logo_svg` / `instance.overview`. Empty default keeps the OSS vendor-neutral. Resolved by `app/instance_config.py::get_custom_scripts()`; surfaced in `/admin/server-config` via `_KNOWN_FIELDS["instance"]`. Example Marker.io block in `config/instance.yaml.example`. - New `marketplace.curators_url` config item (editable via `/admin/server-config` → **Marketplace** section). Drives the "See all curators →" link on the `/marketplace` curated-tab info block; when empty the link is hidden (matches today's behaviour). SSRF-guarded on save (private-IP allowlist, same posture as `data_source.keboola.stack_url`). - `/home` now opens with a value-first intro hero — eyebrow greeting, one-line product framing, **Set up in ~15 min** / **Just browse** CTAs, and a four-pillar row (Data packages · Plugins · Skills · Memory) — so analysts understand *what* the instance is before any install step. - New **Your first session** narrative on `/home` walks through the five beats of a real session (launch → pick project → memory loads → ask → close) with mock terminal frames so the visual rhythm is obvious before the user copies their first command. - Setup wizard inside the install-hero now carries a progress chip (`Step 1 of N · ~15 min · One-time · Reversible`), a thin progress bar, and per-step number badges next to each install block. - `/home` welcome hero gains a *footnotes* row beneath the four pillars: a hairline-separated block rendering operator-authored HTML from `instance.overview` (`AGNES_INSTANCE_OVERVIEW` env override). This is the same `| safe`-filtered body that used to drive the standalone Overview section between the walkthrough and surfaces grid — the rendering contract is unchanged, only the location and styling moved. Empty yaml → footnotes absent (OSS stays vendor-neutral). Renders for both onboarded and not-onboarded users. - Welcome hero's *"AI Chief of Staff"* lede gains a trailing sentence ("*You run all your projects inside and it learns from it.*") so the workspace-folder framing lands before the reader scrolls past. - Default `instance.theme` flipped from `navy` to `blue`. The brand-blue palette is now the out-of-the-box look; `navy` (dark hero + mint-green CTAs) is the opt-in via `AGNES_INSTANCE_THEME` / `instance.theme` / admin server-config. Existing instances that explicitly set `navy` are unaffected; instances relying on the implicit default will switch to blue. - `/home` palette shifted from blue to green/navy: brand accent is now `#2ea877` (mint green) on light surfaces, hero card is navy `#0f1b3a`, code panels are near-black `#0c1224` with warm-yellow `#ffd866` accents. The existing `--hp-primary` token alias is reused so all downstream rules pick up the new green automatically; instance theme overrides via `config.theme_overrides()` still win. - VS Code surface tile on `/home` carries a **Recommended** pill so new analysts default to the editor flow. - "Want to look around first?" section renamed to **Explore your workspace**, with an `id="look-around"` anchor wired to the new hero's secondary CTA. - `/home` setup wizard restructured to match the published design spec section by section: header (eyebrow + heading + lede) floats above the card, install hero is a plain bordered surface (no accent strip), per-step labels drop the `Step N —` prefix, and the closing strip is a single flex row with the `agnes pull` waiting status on the left and the *Already set up? Mark me as onboarded →* fallback link on the right. - VS Code surface tile on `/home` now renders the recommended-layout screenshot (served from `/static/img/vscode-layout.png`) and opens a full-page lightbox on click. Falls back to the labeled EXPLORER/TERMINAL panel when the image is missing. - Workspace install path moved to `~/Desktop/{workspace_dir}` across every step, surface card, and shortcut command. The Step 2 recommendation callout acknowledges home-folder placement as a valid fallback. - Step 1 verify text in the install hero reintroduces the Enterprise plan as the Finance and Legal option alongside Pro / Max 5× / Max 20×. - Step 6 shortcut installs a shell *function* (not an alias) so arguments pass through with `"$@"` (unix) and `@args` (Windows), and offers an end-user **Auto / YOLO** permission toggle — `--permission-mode auto` by default, `--dangerously-skip-permissions` for the YOLO variant. - Step 5 *Or paste manually* fallback `
` is now inline on the copy-script button row (right-aligned when closed, full-width preview when opened); the description above the row reads at the standard step-lede size instead of the previous 13px chip. ### Fixed - Google Workspace connector prompt's Step 8 verify no longer asks Claude to parse a row count out of `gws drive files list` / `gws chat spaces list` JSON. Claude would improvise a `python3 -c 'f"… {len(d.get(\"files\",[]))}…"'` snippet that fails two ways: f-string expressions reject backslashes in Python <3.12 (`SyntaxError`), and `gws` can emit a banner before the JSON body (`json.JSONDecodeError`). Step 8 now treats exit code 0 as success, drops the ` drive file(s), chat space(s) visible` counts, and explicitly warns against both anti-patterns. The summary-grep prefix (`✅ Google Workspace ready —`) is preserved. - Install-script Step 2 + Step 9 restart cue + post-install `/home` hero now reference `~/Desktop/` to match the `/home` "Step 2 — pick a folder" recommendation users actually run (`mkdir -p ~/Desktop/`). Previously the pasted setup script checked `pwd` against `$HOME/` and would warn "Foundry AI is normally installed in ~/FoundryAI" even though the /home page had just sent the user to `~/Desktop/FoundryAI`. - Pre-login pages (`/login`, magic-link screens, first-time `/setup`) now honour the configured `instance.theme`. `base_login.html` sets `` from `instance_theme`, additionally loads `design-tokens.css` so the `.btn-primary` Google SSO button gets its `--ds-primary` green fill (previously rendered as invisible white text on a white card because the `--ds-*` tokens weren't defined), and the navy variant flips the `.login-features` hero panel from brand-blue `--primary` to the deep-navy gradient — eliminating the jarring blue → navy flip after sign-in on navy-configured instances. - Skill / agent detail pages nested inside a Flea Market plugin rendered the parent plugin's title on the hero instead of the skill/agent name. The frontend fallback chain branched on `source === 'curated'` and so flea-inner items fell through to `d.plugin_name`, which the inner-detail API populates with the parent entity name. Branch now keys on the presence of an inner segment in the URL so inner items use `d.name || innerName` (the actual skill/agent name) and standalone flea plugins keep their `d.plugin_name`. - `/activity-center` audit-log hero rendered as half-width because `_page_hero.html` was nested inside `
`, a flex row that pinned the time-range + auto-refresh controls beside it. The hero is now a sibling rendered before the `
` so it spans the full container width like every other admin page; the controls keep their original flex row underneath. - Same flex-row squeeze applied to `/admin/users`, `/admin/access`, `/admin/groups`, `/admin/marketplaces`, `/admin/server-config`, `/admin/welcome`, `/admin/workspace-prompt`, `/admin/sessions`, `/admin/sessions/`, `/admin/usage`. Each had `_page_hero.html` nested inside a `display: flex; justify-content: space-between` toolbar that pinned the page filter/search controls next to the hero. Hero now renders outside the toolbar so it spans the full container width; toolbar continues to hold only the controls. - Page-shell canonicalised — `.container` in `style-custom.css` now sets the canonical `1280px` max-width and `16px 32px 48px` padding so every page (admin, marketplace, catalog, profile, /home, /setup-advanced) inherits the same nav-to-hero gap and side gutters. Per-page `.container:has(.) { max-width: none }` + `.-page { max-width: 1400px }` overrides removed from `admin_users`, `admin_access`, `admin_groups`, `admin_marketplaces`, `admin_welcome`, `admin_workspace_prompt`. `.page-header--hero` no longer self-constrains via `max-width: var(--width-app)`; the container provides the width so the hero sits flush with the toolbar / table beneath it. - `_page_chrome.html` trimmed to just the page-background tint for the redesign scopes (`/home`, `/store`, `/setup-advanced`); the duplicate `.container` + `.container > main` rules it carried are redundant with the new canonical container. - Marketplace hero unified with the canonical `.page-header--hero` box. The bespoke `.mp-hero` rule duplicated padding, radius, gradient, shadow, and font sizes that already lived on `.page-header--hero`; markup is now `