Skip to content
Home Reference Project Changelog

Changelog

For the complete release history, see CHANGELOG.md in the AMX repository or the GitHub Releases page.

The repo's CHANGELOG is generated from Conventional Commits by python-semantic-release.

Latest highlights

0.19.0 — VS Code extension + native management from the editor

AMX now ships a full VS Code extension — Activity Bar trees for Profiles, Catalog, History, and Schedules; the Studio surfaces (Ask chat, run launch with live SSE progress, Run detail, the Lineage canvas, Pages, Settings) rendered as webview panels inside the editor; catalog-backed SQL intelligence in .sql files (hover descriptions, completion, CodeLens, optional coverage diagnostics across every configured profile); and a granularity-aware selection lookup that resolves a table reference selected in any file — even inside a Python spark.sql("""…""") string — to its Studio page. The extension works in VS Code, VS Code Insiders, Cursor, Windsurf, and VSCodium. See the new AMX in VS Code (extension) guide for the full tour.

The distribution model is deliberately in-product, not Marketplace: the extension is bundled inside the amx-cli wheel, so its version always equals the AMX that shipped it and the editor surface can never drift from the server API. Installation is one command — the new /vscode REPL wizard detects installed editors across macOS, Windows, and Linux and installs through each editor's own CLI, with /vscode status reporting installed-vs-bundled versions and a manual .vsix fallback when no editor CLI is on PATH. Studio gains a matching Settings → VS Code tab with per-editor cards, an update-available badge, Install / Reinstall / Uninstall buttons, and a Download .vsix link.

Under the hood the server learned to host this: an embedded Studio mode serves the SPA into editor webviews against the local API, and the extension either adopts a Studio server already running from the REPL or starts its own headless one on 127.0.0.1 behind a per-session bearer token. If no AMX install is found at all, the extension offers to install amx-cli into a managed environment. Updating stays in lockstep too: after pip install -U amx-cli, run /vscode install again (or click Reinstall in Studio).

0.18.0 — MCP for IDE agents + native Databricks lineage + lineage in RUN/ASK

AMX now exposes its catalog to the code agents inside your IDE over the Model Context Protocol. Once the local stdio server is registered in Cursor, Claude Desktop, or VS Code Copilot, the agent can list_schemas, describe_table, lineage_for_table, search_docs, search_code, and the rest of the read-only catalog surface against AMX's local cache — without a database password, without a network service, and without exposing the underlying data. See the new Connect your IDE (MCP) guide for setup snippets per client and the full tool list.

Native Databricks lineage lands as a first-class surface on the Lineage canvas. The picker hits Databricks' lineage REST endpoints (rather than system.access.*) and renders neighbours as privilege- tiered name-only ghost nodes when the caller has only directory-level visibility — names without column counts, so the canvas is honest about what AMX actually saw. Clicking a ghost lazy-ingests that single asset into AMX: notebooks resolve through a persisted workspace path index (no 40-second workspace scan, no broken object_id round-trips), and queries / jobs / pipelines ingest by id. After ingest, assets open inside AMX by default with an explicit "open in Databricks" link for power users — the previous deep-link plumbing that shipped to Databricks UI on every click has been removed in favour of this in-AMX-first flow. The asset-ingest endpoint requires the writer role so view-only members cannot mutate the shared catalog.

Lineage neighbours in RUN and ASK. A shared one-hop neighbour query core now feeds both /run and /ask so CLI and Studio reach parity on canvas-free lineage context. RUN's analysis blocks for a table carry the named neighbours plus their descriptions (no canvas required); ASK's retrieval surfaces the same neighbour appendix at the bottom of the answer with explicit artifact_filter semantics so it's clear which assets contributed. Performance is bounded with a sanity test so the new join cannot regress hot-path latency.

This release also rolls in the docs catch-up itself: the /pages and /admin CLI namespaces, the remote code-asset ingestion flow for Snowflake notebooks and Databricks notebooks / jobs / pipelines / queries, the Browse-page per-asset chunking override, and the shared catalog / lineage / pages collaboration tables all gain dedicated documentation. Previously these surfaces only appeared as one-liners in earlier changelog entries; the topic-specific pages are now caught up to the shipped behaviour.

0.17.0 — Trino / Presto + Hive (HiveServer2) backends

Two new first-class adapters land, taking the supported-backend count to twelve.

Trino / Presto (backend: trino, install with pip install 'amx-cli[trino]') targets the distributed-SQL coordinator over the standard HTTP protocol. Trino and Presto share the same wire protocol so the adapter covers both. ANSI COMMENT ON TABLE / COLUMN / VIEW / MATERIALIZED VIEW / SCHEMA writeback flows straight through to whatever connector the coordinator is pointed at — hive, iceberg, delta, memory, tpch — with single-quote escaping handled by the adapter. Three-level catalog hierarchy (catalog.schema.table) is wired through the picker, the cache, and Studio's settings form. Basic and JWT auth modes ship in the wizard; OAuth2 and Kerberos are accepted as hand-edit paths for power users. See the Trino / Presto page for the wizard walkthrough, sample configs, capability matrix, and a Docker dev compose snippet.

Hive (HiveServer2) (backend: hive, install with pip install 'amx-cli[hive]') targets the HiveServer2 SQL gateway over Thrift. The [hive] extra uses pure-sasl (pure Python) instead of the legacy sasl C extension, so it wheels cleanly on macOS, Linux, and Windows. Table / view / database (== schema) comments write back via ALTER TABLE / VIEW … SET TBLPROPERTIES and ALTER DATABASE … SET DBPROPERTIES. The wizard surfaces PLAIN / LDAP / NOSASL for the four mainstream deployments (local Docker / on-prem Hadoop / AWS EMR / Cloudera CDH+CDP); KERBEROS and CUSTOM auth modes are accepted as hand-edit YAML overrides. Bulk metadata caches via Hive 3.x information_schema with a DESCRIBE FORMATTED parser fallback that handles the row-shape drift between Hive 2.x, 3.x, and 4.x. Column-comment write-back is intentionally OFF on Hive — Hive's only column path requires re-declaring the original column type, which is lossy for complex types (struct, map, array); /apply raises UnsupportedDatabaseOperation cleanly upstream so users get a clear error instead of a silently-broken schema. Apply Hive column comments through dbt or Apache Atlas instead, or migrate the table to Trino / Databricks Unity Catalog / PostgreSQL where native column-comment DDL is safe. See the Hive page for the deployment matrix, the disambiguation against Databricks legacy hive_metastore catalogs, and copy-paste configs for each scenario.

This release closes [issue

518](https://github.com/omeryasirkucuk/amx/issues/518) — thanks to

@ying-w for the request.

0.16.0 — Lineage canvas rebuild + AI Generate quality

The Lineage canvas is rebuilt from the ground up. Per-column typed handles render every table as a column-row card with its own connection ports; Bezier edges carry hover labels colored by relationship type; a rich top toolbar adds undo / auto-arrange / search / attribute-tracker / PNG export / SQL import-export. A single canvas can host nodes from any number of DB profiles, so Postgres tables, Snowflake tables, and a Power BI logo can all sit in the same diagram and connect to each other. See the Lineage page for the full feature surface.

AI Generate gets a three-layer quality pass. The LLM now sees the anchor's full context — table + column descriptions, FK partners, views that join the anchor, and recent query-log co-occurrence — instead of bare metadata, and candidates are ranked by a weighted sum over six signals (FK partnership, view co-mentions, query co-occurrence, shared column names, name prefix, matching column-name tokens) so SAP-style sibling-prefix tables never fill the prompt. The output contract switched to explicit column-pair edges with an evidence enum (FK | view | co-query | name | inferred); self-loops are rejected at the parser; the streaming hook reuses existing canvas nodes so picking an anchor never spawns a duplicate. Anchor resolution falls back to (profile, schema, table) when the picker's database label differs from the catalog row's synced label, and a ghost-endpoint filter drops streamed edges whose source / target isn't in catalog_entities. Prompt size is capped so LLM provider errors (e.g. out-of-credit) surface as clean SSE warnings within seconds instead of hanging until the tunnel cuts the connection.

New node types: standalone Logo nodes for external systems (22 default brand logos seeded inline from SimpleIcons with Iconify fallback; custom uploads shadow any default under the same key) and a rich-text Label node (font size, bold, color, bullet list, auto-grow with paragraphs). Every node type carries an explicit floating delete button on selection; multi- select via ⌘/Ctrl-click and Shift-drag rubber-band removes every selected node and its incident edges in one pass. Save-canvas re-opens by id (?artifact=<id>), so naming a canvas the same as a real table no longer collides with the anchor resolver. New sticky-note Comment node with a six-color palette + resizable NodeResizer.

Catalog cache stops auto-expiring at 7 days — a profile with state='done' is fully synced regardless of age. The /api/catalog/freshness pill still flags profiles past one week (was 24 h) as stale: true. Ask gets three new cache-only tools (catalog_coverage_summary, catalog_inventory, describe_column), a 1-second LLM heartbeat surface during long tool rounds, a live activity feed per tool dispatch, a structured needs_live_refresh envelope (instead of hidden tools) with a one-click "Enable Live refresh & retry" affordance, and a catalog_sync_status tool that short-circuits every "are my tables fresh?" question to a single zero-DB-query call. The Scheduler daemon now actually loads on modern macOS (launchctl bootstrap / enable / kickstart) and distinguishes installed from loaded so Studio's Schedules page stops showing misleading green checks for unloaded plists.

0.15.0 — Scheduled jobs, hybrid RAG, LLM price browser

Recurring runs ship as a first-class feature: a cron-based daemon runs on macOS, Linux, and Windows; Studio adds a schedule edit dialog and a one-click install/uninstall flow. The scheduler plumbs the full cascading scope tree (profile → database → schema → table → column) into the orchestrator and persists column_overrides so a "/analyze on Mondays" schedule lands exactly the same scope you would have picked interactively.

Document RAG gets serious hardening. An FTS5 sidecar with RRF fusion adds hybrid lexical + semantic retrieval; an opt-in cross-encoder reranks the top candidates; MMR diversity reorders the rerank output to avoid near-duplicates; a format-dispatching chunker respects Markdown headers so chunk boundaries fall on natural sections. A gold-set runner with a baseline regression CI gate locks retrieval quality in place. Edges-first context assembly with a model-aware budget gives the agent the citation chain it actually needs to ground its answer.

The LLM price browser lets you pick prices for any LiteLLM / OpenRouter model from Studio or CLI; the sidebar surfaces the live token-consuming rate and the run detail page records both the price the run actually used and the price it would consume today. Code RAG defaults to jina-embeddings-v2-base-code (MiniLM fallback) and collection identity v2 records embedding_dim so port mismatches surface in Catalog Search instead of silently returning wrong neighbours.

The bulk-review UX adds filter / search / sort / group, multi-select with bulk actions, pagination, URL-shareable state, keyboard navigation, and column-level compare. Cancellation is now real across /ask, /run, and the scheduler: cancelled runs are tagged cancelled (never success), runs where every asset failed flip to failed, and the Studio SSE consumer no longer hangs waiting for a terminal frame. See the detailed sub-sections below for variations, the re-run modal override parity, the CLI override picker, and the docs update covering alternatives mode and confidence signals.

Variations: seeded re-run + per-run model selector

Studio's run-detail page now renders a ✨ trigger next to every alternative in the Results tab. Click it to open the Variations modal: the chosen alternative is shown read-only as the seed, a top-level radio picks between semantic (paraphrase the seed) and lexical (share vocabulary with the seed, allow meaning to drift), and the existing Advanced LLM settings disclosure exposes every LLM knob with the diversity-mode row suppressed because mode lives at the top-level. Submit → a worker thread fires; the new run_results row carries five new audit columns (seed_alternative_id, seed_alternative_text, parent_run_id, model, provider) so /history show <run> and Studio can trace the seed lineage and the effective LLM identity per row. The seed text is filtered back out of the alternatives list before persistence.

The same Advanced LLM settings block grows a per-run profile selector at the top of the Generation section. Pick a different saved profile to swap the whole provider / model / api_key / api_base bundle for this single run only — per-knob overrides (temperature, max tokens, …) layer on top. Profiles on disk are never mutated. Profiles whose API key isn't configured surface a no key suffix in the picker and the submit button disables with an inline pointer to Settings → LLM. The Advanced block also gates thinking_budget and the logprob_* rows on whether the (provider, model) pair actually supports those knobs — the capability table now lives centrally at amx/llm/capabilities.py and ships through GET /api/llm/capabilities.

CLI parity: /variations <result_id> <letter> mirrors the modal flow (A / zero-based index both accepted, --mode, --instructions, --temperature). When --mode is omitted the CLI defaults to the parent run's alternatives_mode so a follow-up exploration stays consistent.

Backend: new POST /api/runs/variations endpoint (separate from /rerun-item because the wire shape differs: result_id + alternative_index + seed_text + top-level mode instead of result_ids). LLMOverrides.profile lets callers swap the whole saved-profile bundle atomically; unknown profile names degrade safely to the active profile. The profiles router exposes has_credentials with a lazy in-process cache: literal keys take a fast path with no keyring lookup; keyring: references resolve once per (profile, ref) pair and are invalidated on profile mutation. GET /api/runs/{id}/results?include_descendants=true returns the descendant Variations + Re-Run tree (Variations recurse three levels, Re-Run one) — wired ahead of the upcoming inline-nested run-detail display.

Re-Run modal: full LLM override parity with RunNew

Studio's Re-Run modal (asset-row ↻ and the multi-select batch re-run that reuses the same modal) now mounts the same Advanced LLM settings form block as RunNew. Every knob exposed on RunNew is exposable on Re-Run: temperature, max output tokens, alternatives per column, column batch size, prompt detail, description verbosity, confidence signal, alternatives diversity mode (disabled when alternatives per column is 1), thinking budget, plus the confidence thresholds (high / medium) and cost overrides.

Resolution semantics match RunNew: each field shows the active profile's value as a hint, edits become per-run overrides only, the Reset to profile defaults link rewinds in one click, and the saved LLM profile on disk is never mutated. Batch re-run notes that defaults reflect your active LLM profile and overrides apply uniformly to all selected items.

Backend: POST /api/runs/rerun-item now accepts an llm_overrides field with the same shape as LLMOverrides on /api/runs; the legacy temperature_override shim stays for one release so in-flight Studio bundles don't break. The orchestrator's _llm_for_rerun adopts the immutable dataclasses.replace pattern used by /api/runs. New rerun runs persist the effective LLM config in analysis_runs.settings_json so /history show <run> reports what actually ran.

CLI parity exception: the CLI does not expose per-run /rerun --alternatives-mode (or --confidence-signal, etc.). The single tactical exception is /rerun --temperature for diversity nudges. The full override surface on the CLI side lives in the interactive picker on /run. Documented on Studio run detail and Concepts → Alternatives mode.

CLI override picker parity

The CLI's interactive /run override gate ("Override LLM settings for this run? [y/N]") now exposes the alternatives_mode and confidence_signal rows, reaching parity with Studio's RunNew → Advanced LLM settings panel. The picker:

  • Skips the alternatives_mode row when the effective n_alternatives is 1 (mirrors Studio's tile-disabled rule).
  • Always prompts for confidence_signal — single-answer runs still surface a band.
  • Writes the chosen values to a derived LLMConfig for the run only; ~/.amx/config.yml is never written.
  • Lands the effective values in analysis_runs.settings_json so /history show <run> can explain after the fact why a given run produced what it produced.

Per-run CLI flags (--alternatives-mode, --confidence-signal) remain deliberately out of scope: the picker is the interactive parity surface; non-interactive /run invocations stay fully profile-driven so config.yml is the single source of truth for scripted runs. See the new design note on Alternatives mode → Override per run.

The cli/run-and-apply.md page also drops the misleading /generate REPL section — single-shot generation is a Studio-only path (POST /api/generate/column etc.); the documented CLI flags never existed.

Docs — Alternatives mode + Confidence signals

Two new Concepts pages cover features that were under-documented:

  • Alternatives mode explains the semantic vs lexical diversity dimension on every LLM profile. Includes the Definition 1 wording (semantic = paraphrase / same meaning, different words; lexical = shared vocabulary / shifted meaning), worked examples per mode, profile + per-run set instructions for CLI and Studio, and where the [Semantic] / [Lexical] badge surfaces in results.
  • Confidence signals documents the five scorers (self_consistency, logprob, self_decl, judge, none) end-to-end: what each one measures, how it's computed at a high level, the score range, how to read the HIGH / MED / LOW bands, and the per-alternatives_mode expected SC distribution that AMX's runtime guardrail watches. Includes a short "how to read the score" guide for non-ML-literate readers.

config.yml gains the alternatives_mode and confidence_signal rows in the LLM-profile example and a cross-link block after it. Run & Apply, Setup, and Studio Settings cross-link into the new pages.

0.14.0 — Live cost everywhere, Re-Run, Studio Landing

Every LLM call AMX makes now reports tokens and USD cost at every surface — /ask, /run, the run progress header, the Tokens & cost card on the run detail page, the lifetime card on the Studio Overview, and a top-bar pricing-cache freshness badge with a one-click refresh button. Pricing is fetched live from a versioned per-(provider, model) table, cached on disk with a freshness timestamp, and overrideable per model from Settings → LLM. Every run records both the price it ran at (frozen) and the price it would cost today (live), so a stale price never silently rewrites history.

Re-Run. A run_results row, or a multi-row selection, can now be re-executed with the original context preserved — DB scope, prompt detail, alternatives count, and the cached first-run table profile are reused so a re-run is comparable to its source instead of a fresh shot. The introspection cost absorbed on the first run is amortized across every subsequent re-run.

Studio Landing. / is a calm landing page; the dashboard moved to /overview (with a redirect from the legacy URL). The sidebar gets a DB profile search box and per-profile collapse, so a workspace with many profiles stays navigable. The brand renders as "AMX Studio" — a pixel mark + text wordmark in the top bar — and the browser tab title is consistent across pages.

Run lifecycle controls. A running run can be cancelled from both the Runs list and the Run detail page. Applying the pending queue opens a confirmation modal that names the row count and target database. An already-applied row can be revised inline and writes a new audit entry. The live /runs/new-{jobId} view redirects to the persisted detail page as soon as run.created fires, so the user gains access to the full edit / pick / apply controls immediately.

Compare rebuild. New asset picker, surfaces per-row confidence and log-prob, marks winners, includes a cost row, and computes overlap against the actual same-asset set rather than the union of asset sets (which over-stated agreement on partial coverage).

Audit timeline. /audit is reorganized into day groups with inline before/after diffs and author chips, so a row's history is readable at a glance. Filters by run id and DB profile still apply on top.

LLM reasoning trace. When the provider returns one (Anthropic extended thinking, GPT-5 / o-series, DeepSeek-reasoner, Kimi K2.x), the reasoning trace is rendered alongside the answer on the Run detail page rather than thrown away.

/run parity. Single-shot /run now respects n_alternatives, verbosity, temperature, and prompt_detail the same way the full /run path does. The run row captures the target database / catalog so a re-run can reproduce the original scope. Per-table Gen in Studio spawns a background run instead of blocking the UI on an inline LLM call.

/max-tokens REPL command plus raised default max_tokens ceilings and modernized reasoning-token handling so reasoning models get a 32 k reasoning floor on top of the configured output budget.

Concept cleanup. The "Active backend" Overview card and the entire "Active DB profile" concept are gone. Every saved DB profile is its own expandable row in the Browse sidebar; two browser tabs on different profiles never collide; and the apply path is pinned to the run's own DB scope rather than whatever profile the user happens to have selected. The Studio's per-table comment and Generate buttons all carry the per-page profile so the write lands on the right backend.

Hygiene. Console no longer leaks Rich markup tags into terminal output. /usage aggregates every run kind (not just analyze.run), and list_recent_runs pulls tokens_json so the aggregation has data to sum. Residual Turkish content has been purged from CLI text, Studio surfaces, the agent path, and earlier CHANGELOG entries.

0.13.0 — Doc & code RAG into /ask, Studio polish, durable secrets

/ask finally reads the user's documentation and codebase. Two new LLM-callable tools (search_docs, search_code) ground answers in the doc RAG and the amx_code Chroma index that previous releases already built — both surfaces existed in 0.12.x but were never wired into the agent loop. When nothing is in scope, the tools short-circuit with a structured no_*_for_scope payload so the LLM doesn't hallucinate definitions or callsites. Lazy-init keeps the no-context /ask path zero-cost.

Doc/code ↔ DB profile linking. Each doc or code profile can now be linked to one or more DB profiles. /ask running against scope {X} only pulls from doc/code profiles whose link list contains X (or is empty = global). New CLI commands /doc-link, /code-link, /ask-context. Studio's Settings → Docs/Code wizards expose the link as a multi-select chip control, and AskChat shows a small 📄 N docs · 💻 M code badge above the scope dropdown so you always know what the agent has in its tool window.

Drag-drop document upload. Studio's Settings → Docs gets per-card and per-wizard drop zones. Files land under ~/.amx/uploads/<profile>/<sha256>.<ext> with per-file 25 MB and per-batch 100 MB caps and idempotent profile-path registration. The CLI counterpart /doc-add <profile> <file>... shares the same storage module, accept-list, and size guards. Empty-state nudges and a small cli_support/hints.py helper point terminal users at the visual surface and vice versa.

Studio Code Search & Code Analyze. A new Search code box on Settings → Code mirrors the docs search (no LLM, just embedding similarity over amx_code). Each code-profile row gains an Analyze button that runs the Code Agent against the cached /code-index and streams per-table progress; the on-disk JSON cache shape is byte-identical to what /code-results writes from the CLI, since both call into the new shared amx/codebase/agent_service.py. The CLI gains /code-search for the keyboard-only equivalent.

Live progress on numeric run-detail pages. A run still being processed by a worker thread now exposes live_job_id on GET /api/history/runs/{id}; the run-detail page subscribes to the SSE stream and renders a compact activity card above the tabs. The live /runs/new-{jobId} view also redirects to the persisted detail page as soon as run.created fires, so users gain access to the full edit / pick / apply controls immediately instead of waiting for the worker to finish.

Apply path is finally well-behaved on Postgres. Per-row SAVEPOINT isolation in apply_review_results_to_db so one failed COMMENT (eg. wrong schema name) no longer cascade-poisons the whole batch with InFailedSqlTransaction. The Studio Apply pending queue button now pins the worker to the run's own database/catalog instead of falling back to the active profile's pinned default — old runs that didn't capture scope on the row get an inline database picker on the run-detail page.

Inline scope picker on /runs/new. Clicking + New run on the Runs list without a sidebar-scoped URL now shows a chip-based DB profile + database/catalog picker instead of a "no scope selected" warning, so a run can start without first navigating through the sidebar.

Keyring references survive reinstalls on every OS. Previously, a single transient keyring backend outage (macOS Keychain ACL miss after a binary path change, gnome-keyring / KWallet not running on Linux, Credential Manager access denied on Windows) permanently deleted the YAML's keyring: pointer because the next cfg.save() overwrote it with "". The resolver now leaves unresolved references intact, the LLM provider substitutes AMX_LLM_API_KEY for outgoing auth, and the DB connector strips them on a replace() copy — so the dataclass + YAML keep their pointers and the next process with a healthy backend resolves the secret automatically.

Cold-path bench guard in CI. tests/perf/bench_ask_no_context.py pins the four no-context guarantees the doc/code RAG plumbing introduced (search_docs / search_code short-circuit, scope-resolver micro-cost, ToolBox.schemas() constant time) so future regressions don't sneak in unnoticed.

0.12.9 — Multi-profile browse, /ask, and AMX Studio launch

AMX is multi-profile end-to-end. Both Studio and the CLI's /ask now operate across every saved DB profile simultaneously — no more switch dance.

Browse (Studio). The sidebar tree shows every saved DB profile as its own expandable row (profile → database/catalog → schema → table). Click any node to open it; per-request scope means two browser tabs on different profiles never collide. The legacy "Switch" pill is gone. Routes are explicit: /db/:profile/:database/:schema/:table for 2-level backends and /cat/:profile/:catalog/:schema/:table for 3-level (Databricks UC, BigQuery). Inline comment editors and the "Generate description" buttons all carry the per-page profile so the write lands on the right backend.

Multi-profile /ask. Catalog tools span the configured profile list in a single SQL pass via db_profile IN (?, ?, …). Live-DB tools (list_schemas, list_tables_in_schema, list_databases) parallel-query each profile via ThreadPoolExecutor (cap 8 workers, 8s per-profile timeout — slow profile never blocks the others). Result rows always carry db_profile so the LLM cites the right source. New find_joinable_across_profiles tool scores cross-DB join candidates with a 4-signal mix (column-name token overlap, dtype compatibility, vector similarity, FK pattern) so "what can I join this table with from a different DB?" is one tool call away.

Studio scope dropdown. Above the Ask textarea: a multi-select profile picker (sticky per chat session, resets on + New) plus a read-only "Focus: X (auto)" hint when the conversation has gravitated toward one profile in recent turns. The auto-focus heuristic scans the last 3 assistant turns; ≥60% mention dominance biases the system prompt without locking out cross-profile questions. Answer footer shows N profiles · X.Ys · focus: WAREHOUSE per turn.

CLI /session everywhere. /session list, /session resume <id>, /session new, /session end, /session scope now dispatch from every tab (was previously failing inside /search). The slash registry lists /session next to /ask under the search group. Resumed chats now replay the prior 4 Q/A pairs into the agent so follow-up references like "that table" / "the second one" resolve without re-explaining context.

Profile cleanup. Deleting the active or last DB / LLM profile is now allowed. Empty config surfaces a friendly "configure an LLM profile" prompt (Studio: 412 + configure-llm hint with "Open LLM settings" / "Run doctor" CTAs; CLI: /search discussion-requires-LLM message).

Robustness.

  • Friendly LLM errors. /ask no longer hangs on "Reasoning…" when the LLM is broken. Studio shows the configure-llm banner immediately on a missing provider/model (412 pre-flight); worker failures emit a job.failed SSE event with classification (auth / rate-limit / network / model-not-found → configure-llm hint; generic errors stay generic).
  • CLI Ctrl-C cancels cleanly. First press sets a cancel_token the agent loop polls between iterations; second press also raises KeyboardInterrupt for stuck socket I/O. The chat surfaces "Cancelled by user." rather than draining the question to completion.
  • Last/active profile delete. /remove-db-profile and /remove-llm-profile no longer refuse the only profile — config resets to empty, downstream surfaces handle it.
  • list_databases shows full reach. Asking "which databases do I have" across two profiles now enumerates every reachable database/catalog per connection, not just the pinned default.
  • LiteLLM startup chatter silenced. Corp-network TLS proxies no longer surface a "Failed to fetch remote model cost map" warning on every /askLITELLM_LOCAL_MODEL_COST_MAP=True skips the GitHub fetch entirely.

AMX Studio launch. The local web UI is AMX Studio. The slash command is /studio, the Click subcommand is amx studio, and the Python entry point is amx.web.launch_studio. The user-facing brand (FastAPI title, browser tab, auth error messages, Settings copy) all reads "AMX Studio." See the Studio docs for a full walkthrough.

amx.core Python library API cleanup (BREAKING). amx.init, AMXApplication.ask_with_tools, LoopBasedAskAgent, AskToolbox, ToolAskResponse, ToolResult, ReasoningTraceStep, and infer_table_metadata (free function) are removed. Use AMXApplication.load(...), app.ask(...), and the new typed app.infer_metadata(schema, table, ...) -> list[InferenceResult] instead. See the migration block in the repo CHANGELOG.

On-demand driver and dependency install. Connecting to a new DB backend (Snowflake, BigQuery, Databricks, MySQL, MS SQL, Trino, Redshift, …) installs the driver on first connect; feature-gated packages (RAG, codebase analysis, optional LLM provider SDKs) auto-install on first use. The pip install amx-cli[…] extras still work for reproducible environments.

0.12.8 — AMX Studio umbrella release

AMX Studio reaches feature parity with the REPL. Thirteen UI-overhaul PRs + Stage 2–7 parity work + a design-system reset land together in 0.12.8: the SPA can now drive /run end-to-end (with live SSE progress and a tabbed run-detail view that surfaces every alternative), full DB / LLM / Docs / Code wizards live on Settings, the new System page covers amx doctor / token usage / catalog status / team history-store / one-click placeholder cleanup, and every Browse page (database / schema / table / column) gets inline-edit + per-asset Generate that drafts a single comment through the same human-in-the-loop queue the CLI uses. AMX Studio is dark-only, sits on a warm-amber palette, and ships under a pixel-art AMX brand mark. README and amxcli.com both grow a /studio entry point with the Overview screenshot.

Also in 0.12.8: Ctrl-C now interrupts the running command instead of tearing down the whole REPL session, and /edit "Bulk by table" respects mode selection + survives a stale catalog (live-DB fallback splices the user's pick back in).

0.12.7 — databricks_serving is a first-class LLM provider

/add-llm-profile now lists databricks_serving alongside OpenAI / Anthropic / Gemini / etc. Pick a Foundation Model endpoint (e.g. databricks-meta-llama-3-1-70b-instruct, databricks-dbrx-instruct) or a custom serving endpoint published in your workspace, paste the workspace host, paste a PAT — done. AMX builds the /serving-endpoints URL for you. The big win: the LLM lives in the same workspace as the SQL warehouse you're documenting, so there's no extra vendor contract, no second authentication path, and inference cost stays on your existing Databricks bill. See Databricks Serving for the full walkthrough.

Also fixed in 0.12.7: OpenAI Responses-style structured content blocks ({"type":"output_text",...}) are flattened before pydantic validation, so reasoning routes that emit content arrays no longer fail draft parsing.

0.12.6 — Databricks /ask polish + list_volumes tool

The Databricks experience for /ask is noticeably less wizard-y in 0.12.6:

  • Auto-pick the user catalog. When the workspace has exactly one user-visible catalog (the common case for analyst sandboxes and team workspaces), /ask picks it silently instead of looping through a "select catalog" prompt for every question.
  • Catalog-scoped tools all auto-pick. list_schemas, list_tables, describe, sample — every tool that needs a catalog now uses the same auto-pick logic, not just the first one.
  • list_volumes tool. /ask can now answer questions about Unity Catalog Volumes ("what volumes exist?", "what's in volume_x?"), not just tables.
  • TLS asked first in /db /add-db-profile. The wizard used to probe catalogs before knowing whether the workspace had custom TLS — corporate-CA setups would fail the probe and you'd have to start over. TLS now comes first, the catalog probe runs with the right truststore on the first try.

0.12.5 — /edit-db-profile + /use-rag-llm + safer profile writes

  • /edit-db-profile. Edit an existing DB profile in place — same wizard as /add-db-profile but pre-fills with the current values, so press Enter to keep, type to change. Pairs with the existing collision-detection on /add-db-profile, which now points you at /edit-db-profile instead of failing.
  • /use-rag-llm. Pin a different LLM profile to the RAG agent (the one that fuses documentation + codebase evidence into a description) than the one drafting columns. Useful when a cheaper fast model is enough for prose synthesis but you want a stronger model on the column-drafting path. Run with no args for an interactive picker, or /use-rag-llm none to clear the override.
  • Profile writes are transactional. A bug where newly-created profiles could be silently empty after an amx restart (autosave running between two assignments with stale state) is fixed — upsert_db_profile + set_active_db_profile now run inside cfg.transaction() so save() sees consistent state.
  • Validating catalog/database picker. The wizard now validates the catalog/database name against what the connection actually exposes, instead of taking the user's typo at face value and failing on the first query.
  • /schema and /table (singular) removed. Use the plural /schemas and /tables (under the /db namespace) — they were the canonical commands all along and the singular forms were undocumented duplicates.

0.12.0 — /doctor streams staged progress like /run

/doctor (and the in-session /doctor) now print one [Stage] line per phase as the check runs — [Binary], [Python], [Schema], [FS], [Drivers], [DB], [LLM], [History] — using the same live progress format /run uses. A stalled probe (typically the LLM models-endpoint ping) is now visible as in progress for much longer than its peers instead of looking like a hang, and the closing ✓ /doctor finished in Xs. N passed, M failed. summary mirrors /run's footer with the first remediation inline. Exit codes are unchanged (0 clean, 1 if any ✗); under --skip-network the [LLM] stage collapses to a single skipped line. See /doctor for the full sample output.

0.12.0 — shared run-history store for team collaboration

AMX has always kept its run history in a single SQLite file at ~/.amx/history.db — fine for one engineer, invisible to teammates. 0.12.0 introduces an optional shared mode: every /run, /run-apply, and /ask invocation is dual-written to a backend the team already owns (PostgreSQL, MySQL, MSSQL, Oracle, Snowflake, Databricks, Redshift, or BigQuery) under a dedicated AMX schema, so two engineers running AMX against the same warehouse can finally see each other's analyses, results, and review decisions.

Onboarding is one command — /history-store (under the /db tab) opens an interactive picker. See Shared history store for the full walkthrough.

0.12.0 — six new database backends + extended object model

AMX now ships adapters for MySQL, Oracle, SQL Server, Redshift, ClickHouse, and DuckDB, bringing the supported backend count to 10. Each adapter exposes the object types its backend treats as first-class — not just tables and views. See Backends for the full capability matrix.

0.12.0 — Apache-2.0 license

AMX now ships under the Apache License, Version 2.0, replacing the previous MIT licence. Apache-2.0 layers an explicit patent grant on top of the permissive redistribution terms — a better fit for a tool that integrates with managed warehouses (Databricks, Snowflake, BigQuery, Redshift) where downstream redistributors care about patent posture.

0.12.0 — /temperature slash command and wizard prompt

The LLM sampling temperature is now user-configurable from the interactive CLI instead of being locked at the 0.2 default. The /add-llm-profile wizard prompts for it alongside the existing generation settings, and /temperature shows or sets the value on the active profile (e.g. /temperature 0.7). Values are clamped to [0.0, 2.0] and persist to ~/.amx/config.yml.

0.12.0 — /search improvements (selected)

  • Live verification for high-risk structural claims uses deterministic read-only probe selection instead of a second LLM planning hop.
  • Explicit table mentions take precedence over fuzzy catalog matches; AMX refuses to substitute similar candidates.
  • Inventory and superlative questions answer with one fact, not a dump.
  • Seven explicit answer shapes: single_fact, short_table, full_table, ranked_list, table_summary, join_candidates, prose.

See /ask and /search for the full feature surface.

0.12.0 — Reasoning-route token-budget fixes

  • OpenRouter reasoning routes (kimi-k2-thinking, deepseek-reasoner, claude-sonnet-4 / opus-4 / 3.7-sonnet, o-series, gpt-5) now get the AMX_LLM_MIN_MAX_TOKENS floor (default 16384) so they don't burn the whole output budget on internal thinking.
  • AMX sends reasoning.effort only — never with reasoning.max_tokens — because OpenRouter's API rejects that combination.
  • Default AMX_REASONING_EFFORT for OpenRouter dropped from mediumlow so token burn stays bounded by default.

0.12.0 — /search typo handling

Typo'd slash commands inside /search no longer silently become 30-second LLM calls. Bare-text questions are still auto-prefixed with /ask, but explicit slash commands that don't match anything print Unknown command: /asl. Type /help. like every other namespace.

Following along