livepilot 1.20.2 → 1.20.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/README.md +6 -6
- package/m4l_device/LivePilot_Analyzer.amxd +0 -0
- package/m4l_device/livepilot_bridge.js +1 -1
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/tools/analyzer.py +125 -0
- package/package.json +2 -2
- package/remote_script/LivePilot/__init__.py +1 -1
- package/server.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,55 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.20.3 — Automated analyzer pre-flight (April 24 2026)
|
|
4
|
+
|
|
5
|
+
Micro-release closing one class of operator error that broke the v1.20.1
|
|
6
|
+
five-project live-test campaign: the LLM operator had a clear memory
|
|
7
|
+
instruction to load `LivePilot_Analyzer` on master at the start of a
|
|
8
|
+
fresh Ableton session but missed it in 5 of 5 projects — producing
|
|
9
|
+
basic mixes instead of the intended mix-polish outcomes because every
|
|
10
|
+
analyzer-gated move (`tighten_low_end`, `sculpt_midrange`,
|
|
11
|
+
`balance_stereo_image`, etc.) silently degraded. Fixed forward with a
|
|
12
|
+
new idempotent pre-flight tool + Director skill wiring.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
**New tool: `ensure_analyzer_on_master`** (`mcp_server/tools/analyzer.py`).
|
|
17
|
+
Idempotent pre-flight that loads `LivePilot_Analyzer.amxd` on master
|
|
18
|
+
when missing, no-ops when already loaded. Returns one of:
|
|
19
|
+
- `already_loaded` (with `is_last_on_master`, `duplicate_count`)
|
|
20
|
+
- `loaded` (first-time load from Ableton browser)
|
|
21
|
+
- `install_required` (device not in browser — actionable hint points at
|
|
22
|
+
`install_m4l_device`)
|
|
23
|
+
- `failed` (any other error)
|
|
24
|
+
|
|
25
|
+
Post-load report surfaces the CLAUDE.md invariant "LivePilot_Analyzer
|
|
26
|
+
must be LAST on master" via `is_last_on_master: bool` and warns when
|
|
27
|
+
violated. Duplicate-count warning covers the edge case of multiple
|
|
28
|
+
analyzers on the master chain.
|
|
29
|
+
|
|
30
|
+
Safe to call every turn — subsequent calls short-circuit via one
|
|
31
|
+
`get_master_track` read. Tool count: 429 → 430. 6 new contract tests
|
|
32
|
+
covering already-loaded, missing-loads, install-required,
|
|
33
|
+
duplicate-handling, is-last warning, and two-call idempotence.
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
**Director Phase 1** (`livepilot-creative-director/SKILL.md`). Added
|
|
38
|
+
`ensure_analyzer_on_master` at the top of the "Ground" reads as a
|
|
39
|
+
REQUIRED call, ahead of `get_session_info`. Wording explicitly connects
|
|
40
|
+
the step to the failure it prevents so future agents don't rationalize
|
|
41
|
+
skipping it: "Skipping it is how the v1.20.1 live-test campaign
|
|
42
|
+
produced basic mixes — the analyzer-gated moves degrade silently when
|
|
43
|
+
there's no master spectrum to read."
|
|
44
|
+
|
|
45
|
+
### Notes
|
|
46
|
+
|
|
47
|
+
No breaking changes. Calling code that assumed the analyzer was loaded
|
|
48
|
+
continues to work; the new tool adds an explicit pre-flight path.
|
|
49
|
+
`install_m4l_device` contract unchanged.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
3
53
|
## 1.20.2 — 5 bugs + 1 race condition from the live-test campaign (April 24 2026)
|
|
4
54
|
|
|
5
55
|
Patch release fixing every issue surfaced during the v1.20.1 five-project
|
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
<p align="center">
|
|
19
19
|
An agentic production system for Ableton Live 12.<br>
|
|
20
|
-
|
|
20
|
+
430 tools. 53 domains. Device atlas. Plan-aware Splice integration. Auto-composition. Spectral perception. Technique memory. Drum-rack pad builder. Live dead-device detection.
|
|
21
21
|
</p>
|
|
22
22
|
|
|
23
23
|
<br>
|
|
@@ -80,7 +80,7 @@ Most MCP servers are tool collections — they execute commands. LivePilot is an
|
|
|
80
80
|
│ └─────────────────┼──────────────────┘ │
|
|
81
81
|
│ ▼ │
|
|
82
82
|
│ ┌─────────────────┐ │
|
|
83
|
-
│ │
|
|
83
|
+
│ │ 430 MCP Tools │ │
|
|
84
84
|
│ │ 53 domains │ │
|
|
85
85
|
│ └────────┬────────┘ │
|
|
86
86
|
│ │ │
|
|
@@ -121,7 +121,7 @@ Most MCP servers are tool collections — they execute commands. LivePilot is an
|
|
|
121
121
|
|
|
122
122
|
## The Intelligence Layer
|
|
123
123
|
|
|
124
|
-
12 engines sit on top of the
|
|
124
|
+
12 engines sit on top of the 430 tools. They give the AI musical judgment, not just musical execution.
|
|
125
125
|
|
|
126
126
|
### SongBrain — What the Song Is
|
|
127
127
|
|
|
@@ -173,7 +173,7 @@ Every engine follows: **measure before → act → measure after → compare**.
|
|
|
173
173
|
|
|
174
174
|
## Tools
|
|
175
175
|
|
|
176
|
-
|
|
176
|
+
430 tools across 53 domains. Highlights below — [full catalog here](docs/manual/tool-catalog.md).
|
|
177
177
|
|
|
178
178
|
<br>
|
|
179
179
|
|
|
@@ -362,7 +362,7 @@ The V2 intelligence layer. These tools analyze, diagnose, plan, evaluate, and le
|
|
|
362
362
|
| Creative Constraints | 5 | constraint activation, reference-inspired variants |
|
|
363
363
|
| Preview Studio | 5 | variant creation, preview rendering, comparison, commit |
|
|
364
364
|
|
|
365
|
-
> **[View all
|
|
365
|
+
> **[View all 430 tools →](docs/manual/tool-catalog.md)**
|
|
366
366
|
|
|
367
367
|
<br>
|
|
368
368
|
|
|
@@ -589,7 +589,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for architecture details, code guidelines
|
|
|
589
589
|
|
|
590
590
|
| Document | What's inside |
|
|
591
591
|
|----------|---------------|
|
|
592
|
-
| [Manual](docs/manual/index.md) | Complete reference: architecture, all
|
|
592
|
+
| [Manual](docs/manual/index.md) | Complete reference: architecture, all 430 tools, workflows |
|
|
593
593
|
| [Intelligence Layer](docs/manual/intelligence.md) | How the 12 engines connect — conductor, moves, preview, evaluation |
|
|
594
594
|
| [Device Atlas](docs/manual/device-atlas.md) | 1305 devices indexed — search, suggest, chain building |
|
|
595
595
|
| [Samples & Slicing](docs/manual/samples.md) | 3-source search, fitness critics, slice workflows |
|
|
Binary file
|
|
@@ -34,7 +34,7 @@ outlets = 2; // 0: to udpsend (responses), 1: to buffer~/status
|
|
|
34
34
|
// Single source of truth for the bridge version — bumped alongside the
|
|
35
35
|
// rest of the release manifest. Surfaced in the UI via messnamed("livepilot_version", ...)
|
|
36
36
|
// so the frozen .amxd visibly reports which build it was last exported from.
|
|
37
|
-
var VERSION = "1.20.
|
|
37
|
+
var VERSION = "1.20.3";
|
|
38
38
|
|
|
39
39
|
// ── State ──────────────────────────────────────────────────────────────────
|
|
40
40
|
|
package/mcp_server/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""LivePilot MCP Server — bridges MCP protocol to Ableton Live."""
|
|
2
|
-
__version__ = "1.20.
|
|
2
|
+
__version__ = "1.20.3"
|
|
@@ -1913,3 +1913,128 @@ async def compressor_set_sidechain(
|
|
|
1913
1913
|
params["source_channel"] = str(source_channel)
|
|
1914
1914
|
ableton = ctx.lifespan_context["ableton"]
|
|
1915
1915
|
return ableton.send_command("set_compressor_sidechain", params)
|
|
1916
|
+
|
|
1917
|
+
|
|
1918
|
+
# ──────────────────────────────────────────────────────────────────────
|
|
1919
|
+
# v1.20.3 — ensure_analyzer_on_master
|
|
1920
|
+
#
|
|
1921
|
+
# Motivated by the v1.20.1 live-test campaign operator-error (see
|
|
1922
|
+
# ~/Desktop/DREAM AI/demo Project/REPORT.md). The LLM operator had a
|
|
1923
|
+
# clear global-memory instruction to load LivePilot_Analyzer on master
|
|
1924
|
+
# proactively on a fresh session, and missed it — leaving analyzer-
|
|
1925
|
+
# gated moves brittle. This tool closes that class of error by making
|
|
1926
|
+
# the load idempotent + automatable.
|
|
1927
|
+
|
|
1928
|
+
_ANALYZER_DEVICE_NAME = "LivePilot_Analyzer"
|
|
1929
|
+
|
|
1930
|
+
|
|
1931
|
+
def _load_analyzer_impl(ctx, track_index: int, device_name: str,
|
|
1932
|
+
allow_duplicate: bool = False) -> dict:
|
|
1933
|
+
"""Indirection so tests can monkeypatch the load call without having
|
|
1934
|
+
to fake the full find_and_load_device MCP-tool machinery. Production
|
|
1935
|
+
calls straight through to the existing tool."""
|
|
1936
|
+
from .devices import find_and_load_device
|
|
1937
|
+
return find_and_load_device(
|
|
1938
|
+
ctx,
|
|
1939
|
+
track_index=track_index,
|
|
1940
|
+
device_name=device_name,
|
|
1941
|
+
allow_duplicate=allow_duplicate,
|
|
1942
|
+
)
|
|
1943
|
+
|
|
1944
|
+
|
|
1945
|
+
@mcp.tool()
|
|
1946
|
+
def ensure_analyzer_on_master(ctx: Context) -> dict:
|
|
1947
|
+
"""Idempotent pre-flight: load LivePilot_Analyzer on master if missing.
|
|
1948
|
+
|
|
1949
|
+
Safe to call at the start of any session or before any move that
|
|
1950
|
+
declares analyzer dependency. Calling it repeatedly is cheap —
|
|
1951
|
+
subsequent calls short-circuit via a single get_master_track read.
|
|
1952
|
+
|
|
1953
|
+
CLAUDE.md invariant: "LivePilot_Analyzer must be LAST on master."
|
|
1954
|
+
This tool reports whether the invariant holds via ``is_last_on_master``;
|
|
1955
|
+
it does NOT move the device (that's a user action in Ableton's GUI).
|
|
1956
|
+
|
|
1957
|
+
Return shape:
|
|
1958
|
+
- status: one of {"already_loaded", "loaded", "install_required", "failed"}
|
|
1959
|
+
- device_index: int — position of the analyzer on master (when present)
|
|
1960
|
+
- is_last_on_master: bool — True when analyzer is the last device
|
|
1961
|
+
- duplicate_count: int — 2+ when multiple analyzers exist (shouldn't)
|
|
1962
|
+
- warning: str | None — surfaces last-on-master violations
|
|
1963
|
+
- hint: str — actionable next step when status != "already_loaded"/"loaded"
|
|
1964
|
+
- error: str | None — present on status="failed"
|
|
1965
|
+
"""
|
|
1966
|
+
ableton = ctx.lifespan_context["ableton"]
|
|
1967
|
+
|
|
1968
|
+
# 1. Inspect the master chain for an existing analyzer.
|
|
1969
|
+
try:
|
|
1970
|
+
master = ableton.send_command("get_master_track")
|
|
1971
|
+
except Exception as exc:
|
|
1972
|
+
return {
|
|
1973
|
+
"status": "failed",
|
|
1974
|
+
"error": f"Could not read master track: {exc}",
|
|
1975
|
+
"hint": "Verify MCP connection to Ableton; retry with get_session_info first.",
|
|
1976
|
+
}
|
|
1977
|
+
|
|
1978
|
+
devices = (master or {}).get("devices") or []
|
|
1979
|
+
matches = [d for d in devices if d.get("name") == _ANALYZER_DEVICE_NAME]
|
|
1980
|
+
|
|
1981
|
+
if matches:
|
|
1982
|
+
# 2. Already loaded — build a status report without side effects.
|
|
1983
|
+
first = matches[0]
|
|
1984
|
+
device_index = first.get("index")
|
|
1985
|
+
is_last = False
|
|
1986
|
+
if devices:
|
|
1987
|
+
last_name = devices[-1].get("name")
|
|
1988
|
+
is_last = (last_name == _ANALYZER_DEVICE_NAME)
|
|
1989
|
+
|
|
1990
|
+
result: dict = {
|
|
1991
|
+
"status": "already_loaded",
|
|
1992
|
+
"device_index": device_index,
|
|
1993
|
+
"is_last_on_master": is_last,
|
|
1994
|
+
"duplicate_count": len(matches),
|
|
1995
|
+
}
|
|
1996
|
+
if len(matches) > 1:
|
|
1997
|
+
result["warning"] = (
|
|
1998
|
+
f"{len(matches)} instances of {_ANALYZER_DEVICE_NAME} on master — "
|
|
1999
|
+
"only one is needed. Remove extras in Ableton's GUI."
|
|
2000
|
+
)
|
|
2001
|
+
elif not is_last:
|
|
2002
|
+
result["warning"] = (
|
|
2003
|
+
f"{_ANALYZER_DEVICE_NAME} is not the LAST device on master. "
|
|
2004
|
+
"CLAUDE.md invariant requires it to come after ALL effects so "
|
|
2005
|
+
"it reads the final output, not pre-effect signal. "
|
|
2006
|
+
"Move it to the end of the master chain in Ableton's GUI."
|
|
2007
|
+
)
|
|
2008
|
+
return result
|
|
2009
|
+
|
|
2010
|
+
# 3. Not on master — try loading from the Ableton browser.
|
|
2011
|
+
try:
|
|
2012
|
+
loaded = _load_analyzer_impl(
|
|
2013
|
+
ctx,
|
|
2014
|
+
track_index=-1000, # master convention
|
|
2015
|
+
device_name=_ANALYZER_DEVICE_NAME,
|
|
2016
|
+
allow_duplicate=False,
|
|
2017
|
+
)
|
|
2018
|
+
except Exception as exc:
|
|
2019
|
+
# Typical path: device not in browser (user hasn't installed via
|
|
2020
|
+
# install_m4l_device yet).
|
|
2021
|
+
return {
|
|
2022
|
+
"status": "install_required",
|
|
2023
|
+
"error": str(exc),
|
|
2024
|
+
"hint": (
|
|
2025
|
+
"LivePilot_Analyzer not found in Ableton's browser. Install "
|
|
2026
|
+
"first with install_m4l_device(source_path="
|
|
2027
|
+
"\"<repo>/m4l_device/LivePilot_Analyzer.amxd\") — that copies "
|
|
2028
|
+
"the .amxd into ~/Music/Ableton/User Library/Presets/Audio "
|
|
2029
|
+
"Effects/Max Audio Effect/. Then call ensure_analyzer_on_master "
|
|
2030
|
+
"again to complete the load."
|
|
2031
|
+
),
|
|
2032
|
+
}
|
|
2033
|
+
|
|
2034
|
+
device_index = (loaded or {}).get("device_index")
|
|
2035
|
+
return {
|
|
2036
|
+
"status": "loaded",
|
|
2037
|
+
"device_index": device_index,
|
|
2038
|
+
"is_last_on_master": True, # fresh load always lands at the end
|
|
2039
|
+
"duplicate_count": 1,
|
|
2040
|
+
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.3",
|
|
4
4
|
"mcpName": "io.github.dreamrec/livepilot",
|
|
5
|
-
"description": "Agentic production system for Ableton Live 12 —
|
|
5
|
+
"description": "Agentic production system for Ableton Live 12 — 430 tools, 53 domains. Device atlas (1305 devices), sample engine (Splice + browser + filesystem), auto-composition, spectral perception, technique memory, creative intelligence (12 engines)",
|
|
6
6
|
"author": "Pilot Studio",
|
|
7
7
|
"license": "BSL-1.1",
|
|
8
8
|
"type": "commonjs",
|
|
@@ -5,7 +5,7 @@ Entry point for the ControlSurface. Ableton calls create_instance(c_instance)
|
|
|
5
5
|
when this script is selected in Preferences > Link, Tempo & MIDI.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
__version__ = "1.20.
|
|
8
|
+
__version__ = "1.20.3"
|
|
9
9
|
|
|
10
10
|
from _Framework.ControlSurface import ControlSurface
|
|
11
11
|
from . import router
|
package/server.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
3
|
"name": "io.github.dreamrec/livepilot",
|
|
4
|
-
"description": "
|
|
4
|
+
"description": "430-tool agentic MCP production system for Ableton Live 12 — device atlas, sample engine, composer",
|
|
5
5
|
"repository": {
|
|
6
6
|
"url": "https://github.com/dreamrec/LivePilot",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "1.20.
|
|
9
|
+
"version": "1.20.3",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "livepilot",
|
|
14
|
-
"version": "1.20.
|
|
14
|
+
"version": "1.20.3",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
}
|