livepilot 1.10.4 → 1.10.6
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/.claude-plugin/marketplace.json +3 -3
- package/AGENTS.md +3 -3
- package/CHANGELOG.md +148 -0
- package/CONTRIBUTING.md +1 -1
- package/README.md +6 -6
- package/livepilot/.Codex-plugin/plugin.json +2 -2
- package/livepilot/.claude-plugin/plugin.json +2 -2
- package/livepilot/skills/livepilot-core/SKILL.md +4 -4
- package/livepilot/skills/livepilot-core/references/overview.md +3 -3
- package/livepilot/skills/livepilot-evaluation/references/capability-modes.md +1 -1
- package/livepilot/skills/livepilot-release/SKILL.md +5 -5
- package/m4l_device/LivePilot_Analyzer.amxd +0 -0
- package/m4l_device/livepilot_bridge.js +12 -1
- package/manifest.json +3 -3
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/composer/sample_resolver.py +10 -6
- package/mcp_server/composer/tools.py +10 -6
- package/mcp_server/connection.py +6 -1
- package/mcp_server/creative_constraints/tools.py +9 -8
- package/mcp_server/experiment/engine.py +9 -5
- package/mcp_server/experiment/tools.py +9 -9
- package/mcp_server/hook_hunter/tools.py +14 -9
- package/mcp_server/m4l_bridge.py +11 -0
- package/mcp_server/memory/taste_graph.py +7 -2
- package/mcp_server/mix_engine/tools.py +8 -3
- package/mcp_server/musical_intelligence/tools.py +15 -10
- package/mcp_server/performance_engine/tools.py +6 -2
- package/mcp_server/preview_studio/tools.py +21 -15
- package/mcp_server/project_brain/tools.py +18 -10
- package/mcp_server/reference_engine/tools.py +7 -5
- package/mcp_server/runtime/capability_probe.py +10 -4
- package/mcp_server/runtime/tools.py +8 -2
- package/mcp_server/sample_engine/tools.py +394 -33
- package/mcp_server/semantic_moves/tools.py +5 -1
- package/mcp_server/server.py +10 -9
- package/mcp_server/services/motif_service.py +9 -3
- package/mcp_server/session_continuity/tools.py +7 -3
- package/mcp_server/session_continuity/tracker.py +9 -8
- package/mcp_server/song_brain/tools.py +17 -12
- package/mcp_server/splice_client/client.py +19 -6
- package/mcp_server/stuckness_detector/tools.py +8 -5
- package/mcp_server/tools/_agent_os_engine/__init__.py +52 -0
- package/mcp_server/tools/_agent_os_engine/critics.py +134 -0
- package/mcp_server/tools/_agent_os_engine/evaluation.py +206 -0
- package/mcp_server/tools/_agent_os_engine/models.py +132 -0
- package/mcp_server/tools/_agent_os_engine/taste.py +192 -0
- package/mcp_server/tools/_agent_os_engine/techniques.py +161 -0
- package/mcp_server/tools/_agent_os_engine/world_model.py +170 -0
- package/mcp_server/tools/_composition_engine/__init__.py +67 -0
- package/mcp_server/tools/_composition_engine/analysis.py +174 -0
- package/mcp_server/tools/_composition_engine/critics.py +522 -0
- package/mcp_server/tools/_composition_engine/gestures.py +230 -0
- package/mcp_server/tools/_composition_engine/harmony.py +70 -0
- package/mcp_server/tools/_composition_engine/models.py +193 -0
- package/mcp_server/tools/_composition_engine/sections.py +371 -0
- package/mcp_server/tools/_perception_engine.py +18 -11
- package/mcp_server/tools/agent_os.py +23 -15
- package/mcp_server/tools/analyzer.py +166 -7
- package/mcp_server/tools/automation.py +6 -1
- package/mcp_server/tools/composition.py +25 -16
- package/mcp_server/tools/devices.py +10 -6
- package/mcp_server/tools/motif.py +7 -2
- package/mcp_server/tools/planner.py +6 -2
- package/mcp_server/tools/research.py +13 -10
- package/mcp_server/transition_engine/tools.py +6 -1
- package/mcp_server/translation_engine/tools.py +8 -6
- package/mcp_server/wonder_mode/engine.py +8 -3
- package/mcp_server/wonder_mode/tools.py +29 -21
- package/package.json +2 -2
- package/remote_script/LivePilot/__init__.py +1 -1
- package/requirements.txt +6 -0
- package/livepilot.mcpb +0 -0
- package/mcp_server/tools/_agent_os_engine.py +0 -947
- package/mcp_server/tools/_composition_engine.py +0 -1530
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
|
3
3
|
"name": "dreamrec-LivePilot",
|
|
4
|
-
"description": "Agentic MCP production system for Ableton Live 12 —
|
|
4
|
+
"description": "Agentic MCP production system for Ableton Live 12 — 320 tools, 43 domains",
|
|
5
5
|
"owner": {
|
|
6
6
|
"name": "dreamrec",
|
|
7
7
|
"email": "dreamrec@users.noreply.github.com"
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
"plugins": [
|
|
10
10
|
{
|
|
11
11
|
"name": "livepilot",
|
|
12
|
-
"description": "Agentic production system for Ableton Live 12 —
|
|
13
|
-
"version": "1.10.
|
|
12
|
+
"description": "Agentic production system for Ableton Live 12 — 320 tools, 43 domains, device atlas, spectral perception, technique memory, sample intelligence, auto-composition, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
13
|
+
"version": "1.10.6",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "Pilot Studio"
|
|
16
16
|
},
|
package/AGENTS.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# LivePilot v1.10.
|
|
1
|
+
# LivePilot v1.10.6 — Ableton Live 12
|
|
2
2
|
|
|
3
3
|
## Project
|
|
4
4
|
- **Repo:** This directory (LivePilot)
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
## Key Rules
|
|
23
23
|
- ALL Live Object Model (LOM) calls must execute on Ableton's main thread via schedule_message queue
|
|
24
24
|
- Live 12 minimum — use modern note API (add_new_notes, get_notes_extended, apply_note_modifications)
|
|
25
|
-
-
|
|
25
|
+
- 320 tools across 43 domains: transport, tracks, clips, notes, devices, scenes, mixing, browser, arrangement, memory, analyzer, automation, theory, generative, harmony, midi_io, perception, agent_os, composition, motif, research, planner, project_brain, runtime, evaluation, mix_engine, sound_design, transition_engine, reference_engine, translation_engine, performance_engine, song_brain, preview_studio, hook_hunter, stuckness_detector, wonder_mode, session_continuity, creative_constraints, device_forge, sample_engine, atlas, composer
|
|
26
26
|
- JSON over TCP, newline-delimited, port 9878
|
|
27
27
|
- Structured errors with codes: INDEX_ERROR, NOT_FOUND, INVALID_PARAM, STATE_ERROR, TIMEOUT, INTERNAL
|
|
28
28
|
|
|
@@ -43,4 +43,4 @@ When modifying .amxd attributes that Max editor won't persist (e.g., `openinpres
|
|
|
43
43
|
4. Structure: 24-byte `ampf` header + `ptch` chunk + `mx@c` header + JSON patcher + frozen deps
|
|
44
44
|
|
|
45
45
|
## Tool Count
|
|
46
|
-
Currently
|
|
46
|
+
Currently 320 tools. If adding/removing tools, update: README.md, package.json description, livepilot/.Codex-plugin/plugin.json, livepilot/.claude-plugin/plugin.json, server.json, livepilot/skills/livepilot-core/SKILL.md, livepilot/skills/livepilot-core/references/overview.md, AGENTS.md, CLAUDE.md, CHANGELOG.md, tests/test_tools_contract.py, docs/manual/index.md, docs/manual/tool-reference.md
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,153 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.10.6 — Debuggability + Engine Modularization (April 17 2026)
|
|
4
|
+
|
|
5
|
+
Defensive-programming release. Zero behavior change for users; substantial
|
|
6
|
+
quality-of-life gains for developers and future debugging sessions.
|
|
7
|
+
|
|
8
|
+
### Debuggability
|
|
9
|
+
|
|
10
|
+
- **Silent-exception sweep.** All 79 `except Exception: pass` sites across
|
|
11
|
+
`mcp_server/` now emit a `logger.debug("<func> failed: %s", exc)` breadcrumb
|
|
12
|
+
while preserving the original body (pass / return X / continue). Previously
|
|
13
|
+
invisible failures now leave a trail. Run with `LOG_LEVEL=DEBUG` to surface.
|
|
14
|
+
- **Credit-floor guard hardened.** `SpliceGRPCClient.download_sample()` now
|
|
15
|
+
enforces `CREDIT_HARD_FLOOR` defensively via `can_afford(1, budget=1)` before
|
|
16
|
+
the gRPC call. Tool-layer callers still gate upstream for UX; this closes
|
|
17
|
+
the hole if any future caller forgets. The docstring claimed this guard
|
|
18
|
+
existed — now the code matches.
|
|
19
|
+
|
|
20
|
+
### Engine modularization
|
|
21
|
+
|
|
22
|
+
Two single-file engines (2,477 LOC combined) split into packages while keeping
|
|
23
|
+
the public surface identical. Callers that did `from . import X as engine` or
|
|
24
|
+
`from .X import Symbol` continue to work unchanged.
|
|
25
|
+
|
|
26
|
+
- **`mcp_server/tools/_composition_engine/`** — 6 sub-modules (models, sections,
|
|
27
|
+
critics, gestures, harmony, analysis) + facade. Was 1,530 LOC in one file;
|
|
28
|
+
now no sub-module exceeds 522 LOC.
|
|
29
|
+
- **`mcp_server/tools/_agent_os_engine/`** — 6 sub-modules (models, world_model,
|
|
30
|
+
critics, evaluation, techniques, taste) + facade. Was 947 LOC; now no
|
|
31
|
+
sub-module exceeds 207 LOC. `_clamp` promoted to models.py to resolve a
|
|
32
|
+
circular-dep risk between `evaluation` and `taste`.
|
|
33
|
+
|
|
34
|
+
### Infra
|
|
35
|
+
|
|
36
|
+
- **CI matrix adds Python 3.11.** Ableton 12.3's embedded Python is 3.11 on
|
|
37
|
+
some platforms — catching drift pre-merge.
|
|
38
|
+
- **`livepilot.mcpb` removed from git tracking.** It was already excluded from
|
|
39
|
+
`.npmignore` and `.mcpbignore`; now it's no longer bloating git history every
|
|
40
|
+
release. Distribute via GitHub Releases.
|
|
41
|
+
- **`.git-backup-full/` deleted.** 3.4 MB worktree reclaim.
|
|
42
|
+
|
|
43
|
+
### Docs
|
|
44
|
+
|
|
45
|
+
- **OSC address convention** documented in both `m4l_device/livepilot_bridge.js`
|
|
46
|
+
and `mcp_server/m4l_bridge.py` — the existing tolerant normalization at
|
|
47
|
+
`_parse_osc` now has a written contract.
|
|
48
|
+
|
|
49
|
+
### Tests
|
|
50
|
+
|
|
51
|
+
1756 pass, 1 skipped (macOS-only path test on non-darwin), 0 failures.
|
|
52
|
+
|
|
53
|
+
## 1.10.5 — Splice online catalog unblocked + Simpler sample-loading fixes (April 14 2026)
|
|
54
|
+
|
|
55
|
+
The Splice integration was **never working online** in previous releases. The
|
|
56
|
+
`SpliceGRPCClient` existed in the codebase but silently fell back to a
|
|
57
|
+
SQLite-only path that returned only locally-downloaded samples (2 files on the
|
|
58
|
+
test user's machine). The bug was a missing `grpcio` dependency in the venv
|
|
59
|
+
combined with `sources.py` never checking for the gRPC client. Once unblocked,
|
|
60
|
+
a single query returns 19,690+ catalog hits. The "Beatles × Boards of Canada"
|
|
61
|
+
session that surfaced these bugs is archived at
|
|
62
|
+
`docs/2026-04-14-bugs-discovered.md` with 13 bugs categorized P0–P3.
|
|
63
|
+
|
|
64
|
+
Tool count: **317 → 320** (three new Splice catalog tools added).
|
|
65
|
+
|
|
66
|
+
### Added
|
|
67
|
+
- **`get_splice_credits`** — query the Splice user's subscription tier and
|
|
68
|
+
remaining credit balance. Returns `{connected, username, plan,
|
|
69
|
+
credits_remaining, credit_floor, can_download}`. Graceful degradation when
|
|
70
|
+
Splice desktop isn't running or grpcio is missing.
|
|
71
|
+
- **`splice_catalog_hunt`** — search Splice's ONLINE catalog via gRPC (not
|
|
72
|
+
just local downloads). Supports query, bpm_min/max, key, sample_type,
|
|
73
|
+
genre filters. Returns full sample metadata including `file_hash` for
|
|
74
|
+
downloads. This is the tool that unblocks 19,690+ results previously
|
|
75
|
+
inaccessible.
|
|
76
|
+
- **`splice_download_sample`** — download a sample by `file_hash` (costs 1
|
|
77
|
+
credit), with automatic credit-floor safety check. Optionally copies the
|
|
78
|
+
downloaded file into `~/Music/Ableton/User Library/Samples/Splice/` so
|
|
79
|
+
Ableton's browser indexes it, returning a `browser_uri` ready for
|
|
80
|
+
`load_browser_item`.
|
|
81
|
+
- **Smart warped-loop defaults** in `load_sample_to_simpler` and
|
|
82
|
+
`replace_simpler_sample`: when the filename contains a BPM marker (e.g.
|
|
83
|
+
`86bpm`), Simpler's `S Start` is set to 0, `S Length` to 100%, and
|
|
84
|
+
`S Loop On` to 1 so the full musical loop plays. Previously these tools
|
|
85
|
+
used crop defaults designed for one-shots, which chopped warped loops.
|
|
86
|
+
|
|
87
|
+
### Fixed
|
|
88
|
+
- **P0-2 — Splice online catalog is finally reachable.** `grpcio>=1.60.0`
|
|
89
|
+
and `protobuf>=4.25.0` are now REQUIRED dependencies (added to
|
|
90
|
+
`requirements.txt`). `search_samples(source="splice")` now uses the gRPC
|
|
91
|
+
client from `ctx.lifespan_context["splice_client"]` when connected and
|
|
92
|
+
only falls back to SQLite when the gRPC path is unavailable. Before this
|
|
93
|
+
fix, a query like `"mellotron"` returned 0 hits; after, it returns 851.
|
|
94
|
+
Queries like `"lofi chord"` 80-92 BPM return 19,690 hits.
|
|
95
|
+
- **P0-1 — Simpler sample replacement is verified.** Both
|
|
96
|
+
`replace_simpler_sample` and `load_sample_to_simpler` now verify by
|
|
97
|
+
reading the device name back after the replace. If the name doesn't
|
|
98
|
+
match the requested filename stem, the tool returns a clear error
|
|
99
|
+
instead of silently shipping a wrong sample (the previous behavior
|
|
100
|
+
caused the test session to play a kick drum named as a vocal for two
|
|
101
|
+
consecutive rebuilds). The error message recommends
|
|
102
|
+
`load_browser_item` as a more reliable alternative.
|
|
103
|
+
- **P1-1 — Simpler `Snap` is automatically turned OFF** after sample load.
|
|
104
|
+
With Snap ON, the Sample Start position gets snapped to a zero-crossing
|
|
105
|
+
outside the newly loaded sample's data, causing silent playback. This was
|
|
106
|
+
the root cause of every "sample loaded but doesn't play" symptom in
|
|
107
|
+
previous sessions. The fix also applies to `replace_simpler_sample`.
|
|
108
|
+
- **P2-6 — Warped-loop sample defaults** no longer crop arbitrary sections.
|
|
109
|
+
When `load_sample_to_simpler` or `replace_simpler_sample` detects a BPM
|
|
110
|
+
marker in the filename, it applies loop-appropriate defaults instead of
|
|
111
|
+
one-shot-appropriate defaults.
|
|
112
|
+
|
|
113
|
+
### Removed
|
|
114
|
+
Nothing removed — all additions are additive.
|
|
115
|
+
|
|
116
|
+
### Verified
|
|
117
|
+
- `tests/test_tools_contract.py::test_total_tool_count` — 320 tools
|
|
118
|
+
(up from 317)
|
|
119
|
+
- `tests/test_tools_contract.py::test_sample_engine_tools_registered` —
|
|
120
|
+
includes `get_splice_credits`, `splice_catalog_hunt`,
|
|
121
|
+
`splice_download_sample`
|
|
122
|
+
- Live gRPC round-trip: searched 3 queries against Splice online, found
|
|
123
|
+
21,488 combined catalog hits, downloaded 3 samples (credits 100 → 97),
|
|
124
|
+
copied into User Library, loaded onto 3 Ableton tracks via
|
|
125
|
+
`load_browser_item` — all verified via `get_track_info` device name
|
|
126
|
+
matching.
|
|
127
|
+
|
|
128
|
+
### Known limitations
|
|
129
|
+
- **Unlimited downloads inside Splice Sounds.vst3 are not yet drivable**
|
|
130
|
+
programmatically. The gRPC download path always decrements monthly
|
|
131
|
+
credits (100/month on most subscription tiers) regardless of
|
|
132
|
+
`SoundsStatus: subscribed`. The Splice Sounds VST3 uses a separate HTTPS
|
|
133
|
+
API that LivePilot cannot drive through Ableton's plugin boundary.
|
|
134
|
+
Treat this as a research item — see P2-7 in
|
|
135
|
+
`docs/2026-04-14-bugs-discovered.md`.
|
|
136
|
+
- **The M4L bridge `.amxd` still reports 1.10.4** in its ping response.
|
|
137
|
+
Source code is at 1.10.5 but the frozen JS inside the .amxd wasn't
|
|
138
|
+
re-exported. For users installing via `npm install -g livepilot@1.10.5`
|
|
139
|
+
this is cosmetic — no bridge commands changed. If publishing a new
|
|
140
|
+
`.mcpb`, re-freeze or binary-patch the version bytes first (see
|
|
141
|
+
`feedback_amxd_freeze_drift.md`).
|
|
142
|
+
|
|
143
|
+
### Why a new patch version
|
|
144
|
+
The P0-2 fix (missing grpcio dependency) is a correctness bug: users
|
|
145
|
+
installed previous versions believed the Splice integration worked, when
|
|
146
|
+
in fact every "online" search returned only locally-downloaded files.
|
|
147
|
+
This is a silent incorrect-behavior bug — the tool returned 0-2 results
|
|
148
|
+
confidently without any warning. Users deserve a clearly-communicated
|
|
149
|
+
fix release and the ability to `npm install -g livepilot@1.10.5`.
|
|
150
|
+
|
|
3
151
|
## 1.10.4 — Bridge ping sync (April 14 2026)
|
|
4
152
|
|
|
5
153
|
A pure ship-fix release. The frozen JS inside `LivePilot_Analyzer.amxd` was
|
package/CONTRIBUTING.md
CHANGED
|
@@ -98,7 +98,7 @@ Prefix with `fix:`, `feat:`, `docs:`, `refactor:`, `test:`, or `chore:`.
|
|
|
98
98
|
|
|
99
99
|
## Tool Count Discipline
|
|
100
100
|
|
|
101
|
-
Currently **
|
|
101
|
+
Currently **320 tools**. If you add or remove a `@mcp.tool()` decorator, update all of these files:
|
|
102
102
|
|
|
103
103
|
- `README.md`
|
|
104
104
|
- `CLAUDE.md`
|
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
|
+
320 tools. 43 domains. Device atlas. Splice integration. Auto-composition. Spectral perception. Technique memory.
|
|
21
21
|
</p>
|
|
22
22
|
|
|
23
23
|
<br>
|
|
@@ -79,7 +79,7 @@ Most MCP servers are tool collections — they execute commands. LivePilot is an
|
|
|
79
79
|
│ └─────────────────┼──────────────────┘ │
|
|
80
80
|
│ ▼ │
|
|
81
81
|
│ ┌─────────────────┐ │
|
|
82
|
-
│ │
|
|
82
|
+
│ │ 320 MCP Tools │ │
|
|
83
83
|
│ │ 43 domains │ │
|
|
84
84
|
│ └────────┬────────┘ │
|
|
85
85
|
│ │ │
|
|
@@ -120,7 +120,7 @@ Most MCP servers are tool collections — they execute commands. LivePilot is an
|
|
|
120
120
|
|
|
121
121
|
## The Intelligence Layer
|
|
122
122
|
|
|
123
|
-
12 engines sit on top of the
|
|
123
|
+
12 engines sit on top of the 320 tools. They give the AI musical judgment, not just musical execution.
|
|
124
124
|
|
|
125
125
|
### SongBrain — What the Song Is
|
|
126
126
|
|
|
@@ -172,7 +172,7 @@ Every engine follows: **measure before → act → measure after → compare**.
|
|
|
172
172
|
|
|
173
173
|
## Tools
|
|
174
174
|
|
|
175
|
-
|
|
175
|
+
320 tools across 43 domains. Highlights below — [full catalog here](docs/manual/tool-catalog.md).
|
|
176
176
|
|
|
177
177
|
<br>
|
|
178
178
|
|
|
@@ -360,7 +360,7 @@ The V2 intelligence layer. These tools analyze, diagnose, plan, evaluate, and le
|
|
|
360
360
|
| Creative Constraints | 5 | constraint activation, reference-inspired variants |
|
|
361
361
|
| Preview Studio | 5 | variant creation, preview rendering, comparison, commit |
|
|
362
362
|
|
|
363
|
-
> **[View all
|
|
363
|
+
> **[View all 320 tools →](docs/manual/tool-catalog.md)**
|
|
364
364
|
|
|
365
365
|
<br>
|
|
366
366
|
|
|
@@ -585,7 +585,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for architecture details, code guidelines
|
|
|
585
585
|
|
|
586
586
|
| Document | What's inside |
|
|
587
587
|
|----------|---------------|
|
|
588
|
-
| [Manual](docs/manual/index.md) | Complete reference: architecture, all
|
|
588
|
+
| [Manual](docs/manual/index.md) | Complete reference: architecture, all 320 tools, workflows |
|
|
589
589
|
| [Intelligence Layer](docs/manual/intelligence.md) | How the 12 engines connect — conductor, moves, preview, evaluation |
|
|
590
590
|
| [Device Atlas](docs/manual/device-atlas.md) | 1305 devices indexed — search, suggest, chain building |
|
|
591
591
|
| [Samples & Slicing](docs/manual/samples.md) | 3-source search, fitness critics, slice workflows |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.10.
|
|
4
|
-
"description": "Agentic production system for Ableton Live 12 —
|
|
3
|
+
"version": "1.10.6",
|
|
4
|
+
"description": "Agentic production system for Ableton Live 12 — 320 tools, 43 domains, device atlas, sample intelligence, auto-composition, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Pilot Studio"
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.10.
|
|
4
|
-
"description": "Agentic production system for Ableton Live 12 —
|
|
3
|
+
"version": "1.10.6",
|
|
4
|
+
"description": "Agentic production system for Ableton Live 12 — 320 tools, 43 domains, device atlas, sample intelligence, auto-composition, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Pilot Studio"
|
|
7
7
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: livepilot-core
|
|
3
|
-
description: Core discipline for LivePilot — agentic production system for Ableton Live 12.
|
|
3
|
+
description: Core discipline for LivePilot — agentic production system for Ableton Live 12. 320 tools across 43 domains. This skill should be used whenever working with Ableton Live through MCP tools. Provides golden rules, tool speed tiers, error handling protocol, and pointers to domain and engine skills.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# LivePilot Core — Ableton Live 12
|
|
7
7
|
|
|
8
|
-
Agentic production system for Ableton Live 12.
|
|
8
|
+
Agentic production system for Ableton Live 12. 320 tools across 43 domains, three layers:
|
|
9
9
|
|
|
10
10
|
- **Device Atlas** — 1305 devices indexed (81 enriched with sonic intelligence, 683 drum kits). Consult `atlas_search` or `atlas_suggest` before loading any device. Never guess a device name.
|
|
11
11
|
- **M4L Analyzer** — Real-time audio analysis on the master bus (8-band spectrum, RMS/peak, key detection). Optional — all core tools work without it.
|
|
@@ -39,7 +39,7 @@ Agentic production system for Ableton Live 12. 317 tools across 43 domains, thre
|
|
|
39
39
|
## Tool Speed Tiers
|
|
40
40
|
|
|
41
41
|
### Instant (<1s) — Use freely
|
|
42
|
-
All
|
|
42
|
+
All 320 tools plus M4L perception tools.
|
|
43
43
|
|
|
44
44
|
### Fast (1-5s) — Use freely
|
|
45
45
|
`analyze_loudness` · `analyze_mix` · `analyze_sound_design`
|
|
@@ -128,7 +128,7 @@ Deep production knowledge in `references/`:
|
|
|
128
128
|
|
|
129
129
|
| File | Content |
|
|
130
130
|
|------|---------|
|
|
131
|
-
| `references/overview.md` | All
|
|
131
|
+
| `references/overview.md` | All 320 tools with params and ranges |
|
|
132
132
|
| `references/device-atlas/` | 280+ device corpus with URIs and presets |
|
|
133
133
|
| `references/midi-recipes.md` | Drum patterns, chord voicings, humanization |
|
|
134
134
|
| `references/sound-design.md` | Synth recipes, device chain patterns |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# LivePilot v1.10.
|
|
1
|
+
# LivePilot v1.10.6 — Architecture & Tool Reference
|
|
2
2
|
|
|
3
|
-
Agentic production system for Ableton Live 12.
|
|
3
|
+
Agentic production system for Ableton Live 12. 320 tools across 43 domains. Device atlas (1305 devices, 81 enriched), spectral perception (M4L analyzer), technique memory, automation intelligence (16 curve types, 15 recipes), music theory (Krumhansl-Schmuckler, species counterpoint), generative algorithms (Euclidean rhythm, tintinnabuli, phase shift, additive process), neo-Riemannian harmony (PRL transforms, Tonnetz), MIDI file I/O, Splice online catalog search and download via gRPC (v1.10.6 unblocked 19,690+ catalog hits previously inaccessible).
|
|
4
4
|
|
|
5
5
|
## Architecture
|
|
6
6
|
|
|
@@ -32,7 +32,7 @@ A flat tool list lets the AI press buttons. LivePilot's three layers give it con
|
|
|
32
32
|
|
|
33
33
|
This turns "set EQ band 3 to -4 dB" into "cut 400 Hz by 4 dB, then read the spectrum to confirm the mud is actually reduced."
|
|
34
34
|
|
|
35
|
-
## The
|
|
35
|
+
## The 320 Tools — What Each One Does
|
|
36
36
|
|
|
37
37
|
### Transport (12) — Playback, tempo, global state, diagnostics
|
|
38
38
|
|
|
@@ -104,7 +104,7 @@ Call `get_capability_state` at the start of any evaluation session. The response
|
|
|
104
104
|
{
|
|
105
105
|
"mode": "normal",
|
|
106
106
|
"analyzer_connected": true,
|
|
107
|
-
"bridge_version": "1.10.
|
|
107
|
+
"bridge_version": "1.10.6",
|
|
108
108
|
"spectral_cache_age_ms": 1200,
|
|
109
109
|
"flucoma_available": false,
|
|
110
110
|
"session_connected": true
|
|
@@ -28,20 +28,20 @@ Run this checklist EVERY time the user says "update everything", "push", "releas
|
|
|
28
28
|
|
|
29
29
|
## 2. Tool Count (must ALL match)
|
|
30
30
|
|
|
31
|
-
Current: **
|
|
32
|
-
Core (no M4L): **
|
|
31
|
+
Current: **320 tools across 43 domains**.
|
|
32
|
+
Core (no M4L): **289**. Bridge (M4L): **30** (backed by 28 bridge commands).
|
|
33
33
|
|
|
34
34
|
Verify: `grep -rc "@mcp.tool" mcp_server/tools/ | grep -v ":0" | awk -F: '{sum+=$2} END{print sum}'`
|
|
35
35
|
|
|
36
36
|
Files that reference tool count:
|
|
37
|
-
- [ ] `README.md` — header ("
|
|
37
|
+
- [ ] `README.md` — header ("320 tools. 43 domains"), bridge section ("281 core...36 bridge")
|
|
38
38
|
- [ ] `package.json` → `"description"`
|
|
39
39
|
- [ ] `server.json` → `"description"`
|
|
40
40
|
- [ ] `manifest.json` → `"description"`
|
|
41
41
|
- [ ] `livepilot/.Codex-plugin/plugin.json` → `"description"` (primary Codex manifest)
|
|
42
42
|
- [ ] `livepilot/.claude-plugin/plugin.json` → `"description"` (must match Codex plugin)
|
|
43
43
|
- [ ] `.claude-plugin/marketplace.json` → `"description"`
|
|
44
|
-
- [ ] `CLAUDE.md` → "
|
|
44
|
+
- [ ] `CLAUDE.md` → "320 tools across 43 domains"
|
|
45
45
|
- [ ] `CONTRIBUTING.md` → tool count in intro
|
|
46
46
|
- [ ] `livepilot/skills/livepilot-core/SKILL.md` — tool/domain count
|
|
47
47
|
- [ ] `livepilot/skills/livepilot-core/references/overview.md` — tool/domain count
|
|
@@ -93,7 +93,7 @@ Current: **43 domains**: transport, tracks, clips, notes, devices, scenes, mixin
|
|
|
93
93
|
|
|
94
94
|
- [ ] `README.md` — features match current capabilities, "Coming" section is accurate
|
|
95
95
|
- [ ] `docs/manual/getting-started.md` — install instructions current
|
|
96
|
-
- [ ] `docs/manual/tool-reference.md` — all 43 domains listed, all
|
|
96
|
+
- [ ] `docs/manual/tool-reference.md` — all 43 domains listed, all 320 tools present
|
|
97
97
|
- [ ] `docs/TOOL_REFERENCE.md` — all 43 domains present with correct counts
|
|
98
98
|
- [ ] `docs/M4L_BRIDGE.md` — architecture accurate, core/bridge counts correct
|
|
99
99
|
|
|
Binary file
|
|
@@ -14,6 +14,17 @@
|
|
|
14
14
|
* - Chunk parameter reads: 4 per batch, 50ms delay
|
|
15
15
|
* - Base64 encode all JSON responses
|
|
16
16
|
* - Defer all LiveAPI operations via deferlow()
|
|
17
|
+
*
|
|
18
|
+
* OSC address convention:
|
|
19
|
+
* - OUTGOING (this file → server via udpsend): use WITH leading slash,
|
|
20
|
+
* e.g. outlet(0, "/response", encoded). The slash is part of the
|
|
21
|
+
* OSC address that udpsend packs into the packet.
|
|
22
|
+
* - INCOMING (server → this file via udpreceive): Max's udpreceive
|
|
23
|
+
* routes on the selector, so the server's address string must be
|
|
24
|
+
* "response"/"cmd" WITHOUT a leading slash (Max would otherwise
|
|
25
|
+
* treat the slash as a literal selector character). See
|
|
26
|
+
* mcp_server/m4l_bridge.py for the sending side and `_parse_osc`
|
|
27
|
+
* for the tolerant normalization.
|
|
17
28
|
*/
|
|
18
29
|
|
|
19
30
|
autowatch = 1;
|
|
@@ -84,7 +95,7 @@ function anything() {
|
|
|
84
95
|
function dispatch(cmd, args) {
|
|
85
96
|
switch(cmd) {
|
|
86
97
|
case "ping":
|
|
87
|
-
send_response({"ok": true, "version": "1.10.
|
|
98
|
+
send_response({"ok": true, "version": "1.10.6"});
|
|
88
99
|
break;
|
|
89
100
|
case "get_params":
|
|
90
101
|
cmd_get_params(args);
|
package/manifest.json
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"manifest_version": "0.3",
|
|
3
3
|
"name": "livepilot",
|
|
4
4
|
"display_name": "LivePilot — AI for Ableton Live",
|
|
5
|
-
"version": "1.10.
|
|
6
|
-
"description": "Agentic production system for Ableton Live 12. Make beats, mix tracks, design sounds, and arrange songs with
|
|
7
|
-
"long_description": "LivePilot is an agentic production system for Ableton Live 12.
|
|
5
|
+
"version": "1.10.6",
|
|
6
|
+
"description": "Agentic production system for Ableton Live 12. Make beats, mix tracks, design sounds, and arrange songs with 320 AI-powered tools.",
|
|
7
|
+
"long_description": "LivePilot is an agentic production system for Ableton Live 12. 320 tools across 43 domains — device atlas (1305 devices), sample intelligence (Splice + browser + filesystem), auto-composition, spectral perception, technique memory, and 12 creative engines.\n\n**What it does:**\n- Creates MIDI clips with notes, chords, and rhythms\n- Loads instruments and effects via Device Atlas (1305 devices indexed)\n- Searches samples across Splice, Ableton browser, and filesystem\n- Plans compositions from text prompts with genre-aware layering\n- Slices samples with intent-based MIDI generation\n- Mixes with volume, panning, sends, and automation\n- Analyzes your mix with real-time spectral data (M4L bridge)\n- Diagnoses stuck sessions and generates creative rescue variants\n- Remembers your production style across sessions\n\n**How it works:**\nLivePilot installs a Remote Script in Ableton that communicates with the AI over a local TCP connection. Everything runs on your machine — no audio leaves your computer.",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "Pilot Studio",
|
|
10
10
|
"url": "https://github.com/dreamrec/LivePilot"
|
package/mcp_server/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""LivePilot MCP Server — bridges MCP protocol to Ableton Live."""
|
|
2
|
-
__version__ = "1.10.
|
|
2
|
+
__version__ = "1.10.6"
|
|
@@ -45,6 +45,10 @@ from pathlib import Path
|
|
|
45
45
|
from typing import Optional, Tuple
|
|
46
46
|
|
|
47
47
|
from .layer_planner import LayerSpec
|
|
48
|
+
import logging
|
|
49
|
+
|
|
50
|
+
logger = logging.getLogger(__name__)
|
|
51
|
+
|
|
48
52
|
|
|
49
53
|
|
|
50
54
|
_AUDIO_EXTENSIONS = (".wav", ".aif", ".aiff", ".flac")
|
|
@@ -216,9 +220,9 @@ async def _splice_resolve(
|
|
|
216
220
|
query=layer.search_query,
|
|
217
221
|
per_page=5,
|
|
218
222
|
)
|
|
219
|
-
except Exception:
|
|
223
|
+
except Exception as exc:
|
|
224
|
+
logger.debug("_splice_resolve failed: %s", exc)
|
|
220
225
|
return None, "unresolved"
|
|
221
|
-
|
|
222
226
|
samples = list(result.samples) if result and hasattr(result, "samples") else []
|
|
223
227
|
if not samples:
|
|
224
228
|
return None, "unresolved"
|
|
@@ -243,7 +247,8 @@ async def _splice_resolve(
|
|
|
243
247
|
downloaded = await splice_client.download_sample(file_hash)
|
|
244
248
|
if downloaded and Path(downloaded).exists():
|
|
245
249
|
return downloaded, "splice_remote"
|
|
246
|
-
except Exception:
|
|
250
|
+
except Exception as exc:
|
|
251
|
+
logger.debug("_splice_resolve failed: %s", exc)
|
|
247
252
|
continue # try next hit
|
|
248
253
|
|
|
249
254
|
return None, "unresolved"
|
|
@@ -286,7 +291,6 @@ async def resolve_sample_for_layer(
|
|
|
286
291
|
lp = hit.get("file_path") if isinstance(hit, dict) else None
|
|
287
292
|
if lp and Path(lp).exists():
|
|
288
293
|
return lp, "browser"
|
|
289
|
-
except Exception:
|
|
290
|
-
|
|
291
|
-
|
|
294
|
+
except Exception as exc:
|
|
295
|
+
logger.debug("resolve_sample_for_layer failed: %s", exc)
|
|
292
296
|
return None, "unresolved"
|
|
@@ -14,6 +14,10 @@ from fastmcp import Context
|
|
|
14
14
|
from ..server import mcp
|
|
15
15
|
from .prompt_parser import parse_prompt
|
|
16
16
|
from .engine import ComposerEngine
|
|
17
|
+
import logging
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
17
21
|
|
|
18
22
|
|
|
19
23
|
# Singleton engine — stateless, safe to reuse
|
|
@@ -29,8 +33,8 @@ def _get_search_roots(ctx: Context) -> list:
|
|
|
29
33
|
cfg = ctx.lifespan_context.get("sample_search_roots") if hasattr(ctx, "lifespan_context") else None
|
|
30
34
|
if cfg:
|
|
31
35
|
roots.extend(cfg)
|
|
32
|
-
except Exception:
|
|
33
|
-
|
|
36
|
+
except Exception as exc:
|
|
37
|
+
logger.debug("_get_search_roots failed: %s", exc)
|
|
34
38
|
return roots
|
|
35
39
|
|
|
36
40
|
|
|
@@ -52,7 +56,8 @@ async def _credit_safety_prelude(splice_client, max_credits: int) -> tuple[int,
|
|
|
52
56
|
try:
|
|
53
57
|
info = await splice_client.get_credits()
|
|
54
58
|
credits_remaining = getattr(info, "credits", None)
|
|
55
|
-
except Exception:
|
|
59
|
+
except Exception as exc:
|
|
60
|
+
logger.debug("_credit_safety_prelude failed: %s", exc)
|
|
56
61
|
credits_remaining = None
|
|
57
62
|
|
|
58
63
|
if credits_remaining is None:
|
|
@@ -153,9 +158,8 @@ async def augment_with_samples(
|
|
|
153
158
|
info = ableton.send_command("get_session_info", {})
|
|
154
159
|
session_context["tempo"] = info.get("tempo", 120)
|
|
155
160
|
session_context["track_count"] = info.get("track_count", 0)
|
|
156
|
-
except Exception:
|
|
157
|
-
|
|
158
|
-
|
|
161
|
+
except Exception as exc:
|
|
162
|
+
logger.debug("augment_with_samples failed: %s", exc)
|
|
159
163
|
result = await _engine.augment(
|
|
160
164
|
request=request,
|
|
161
165
|
max_credits=max_credits,
|
package/mcp_server/connection.py
CHANGED
|
@@ -11,6 +11,10 @@ import time
|
|
|
11
11
|
import uuid
|
|
12
12
|
from collections import deque
|
|
13
13
|
from typing import Optional
|
|
14
|
+
import logging
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
14
18
|
|
|
15
19
|
CONNECT_TIMEOUT = 5
|
|
16
20
|
RECV_TIMEOUT = 20
|
|
@@ -153,7 +157,8 @@ class AbletonConnection:
|
|
|
153
157
|
"""Send a ping and return True if a pong is received."""
|
|
154
158
|
try:
|
|
155
159
|
return self.send_command("ping").get("pong") is True
|
|
156
|
-
except Exception:
|
|
160
|
+
except Exception as exc:
|
|
161
|
+
logger.debug("ping failed: %s", exc)
|
|
157
162
|
return False
|
|
158
163
|
|
|
159
164
|
def send_command(self, command_type: str, params: Optional[dict] = None) -> dict:
|
|
@@ -17,7 +17,9 @@ from fastmcp import Context
|
|
|
17
17
|
from ..server import mcp
|
|
18
18
|
from . import engine
|
|
19
19
|
from .models import CONSTRAINT_MODES
|
|
20
|
+
import logging
|
|
20
21
|
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
21
23
|
|
|
22
24
|
# Module-level cache for active constraints and distillations
|
|
23
25
|
_active_constraints: Optional[engine.ConstraintSet] = None
|
|
@@ -110,9 +112,8 @@ def distill_reference_principles(
|
|
|
110
112
|
"groove_posture": tactics.get("groove_posture", {}),
|
|
111
113
|
"harmonic_character": tactics.get("harmonic_character", ""),
|
|
112
114
|
}
|
|
113
|
-
except Exception:
|
|
114
|
-
|
|
115
|
-
|
|
115
|
+
except Exception as exc:
|
|
116
|
+
logger.debug("distill_reference_principles failed: %s", exc)
|
|
116
117
|
# Try to get a reference profile from the reference engine
|
|
117
118
|
if not reference_profile:
|
|
118
119
|
try:
|
|
@@ -121,7 +122,8 @@ def distill_reference_principles(
|
|
|
121
122
|
style_name or reference_description
|
|
122
123
|
)
|
|
123
124
|
reference_profile = profile.to_dict()
|
|
124
|
-
except Exception:
|
|
125
|
+
except Exception as exc:
|
|
126
|
+
logger.debug("distill_reference_principles failed: %s", exc)
|
|
125
127
|
# Fallback: build from description keywords
|
|
126
128
|
reference_profile = _profile_from_description(reference_description)
|
|
127
129
|
|
|
@@ -204,9 +206,8 @@ def generate_constrained_variants(
|
|
|
204
206
|
taste_store = ctx.lifespan_context.setdefault("taste_memory", TasteMemoryStore())
|
|
205
207
|
anti_store = ctx.lifespan_context.setdefault("anti_memory", AntiMemoryStore())
|
|
206
208
|
taste_graph = build_taste_graph(taste_store=taste_store, anti_store=anti_store).to_dict()
|
|
207
|
-
except Exception:
|
|
208
|
-
|
|
209
|
-
|
|
209
|
+
except Exception as exc:
|
|
210
|
+
logger.debug("generate_constrained_variants failed: %s", exc)
|
|
210
211
|
ps = ps_engine.create_preview_set(
|
|
211
212
|
request_text=f"[Constrained: {', '.join(active.constraints)}] {request_text}",
|
|
212
213
|
kernel_id=kernel_id,
|
|
@@ -293,7 +294,6 @@ def generate_reference_inspired_variants(
|
|
|
293
294
|
except Exception as e:
|
|
294
295
|
return {"error": f"Failed to generate reference-inspired variants: {e}"}
|
|
295
296
|
|
|
296
|
-
|
|
297
297
|
# ── Helpers ───────────────────────────────────────────────────────
|
|
298
298
|
|
|
299
299
|
|
|
@@ -305,6 +305,7 @@ def _get_song_brain_dict() -> dict:
|
|
|
305
305
|
except Exception as _e:
|
|
306
306
|
if __debug__:
|
|
307
307
|
import sys
|
|
308
|
+
|
|
308
309
|
print(f"LivePilot: SongBrain unavailable in creative_constraints: {_e}", file=sys.stderr)
|
|
309
310
|
return {}
|
|
310
311
|
|