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.
Files changed (74) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/AGENTS.md +3 -3
  3. package/CHANGELOG.md +148 -0
  4. package/CONTRIBUTING.md +1 -1
  5. package/README.md +6 -6
  6. package/livepilot/.Codex-plugin/plugin.json +2 -2
  7. package/livepilot/.claude-plugin/plugin.json +2 -2
  8. package/livepilot/skills/livepilot-core/SKILL.md +4 -4
  9. package/livepilot/skills/livepilot-core/references/overview.md +3 -3
  10. package/livepilot/skills/livepilot-evaluation/references/capability-modes.md +1 -1
  11. package/livepilot/skills/livepilot-release/SKILL.md +5 -5
  12. package/m4l_device/LivePilot_Analyzer.amxd +0 -0
  13. package/m4l_device/livepilot_bridge.js +12 -1
  14. package/manifest.json +3 -3
  15. package/mcp_server/__init__.py +1 -1
  16. package/mcp_server/composer/sample_resolver.py +10 -6
  17. package/mcp_server/composer/tools.py +10 -6
  18. package/mcp_server/connection.py +6 -1
  19. package/mcp_server/creative_constraints/tools.py +9 -8
  20. package/mcp_server/experiment/engine.py +9 -5
  21. package/mcp_server/experiment/tools.py +9 -9
  22. package/mcp_server/hook_hunter/tools.py +14 -9
  23. package/mcp_server/m4l_bridge.py +11 -0
  24. package/mcp_server/memory/taste_graph.py +7 -2
  25. package/mcp_server/mix_engine/tools.py +8 -3
  26. package/mcp_server/musical_intelligence/tools.py +15 -10
  27. package/mcp_server/performance_engine/tools.py +6 -2
  28. package/mcp_server/preview_studio/tools.py +21 -15
  29. package/mcp_server/project_brain/tools.py +18 -10
  30. package/mcp_server/reference_engine/tools.py +7 -5
  31. package/mcp_server/runtime/capability_probe.py +10 -4
  32. package/mcp_server/runtime/tools.py +8 -2
  33. package/mcp_server/sample_engine/tools.py +394 -33
  34. package/mcp_server/semantic_moves/tools.py +5 -1
  35. package/mcp_server/server.py +10 -9
  36. package/mcp_server/services/motif_service.py +9 -3
  37. package/mcp_server/session_continuity/tools.py +7 -3
  38. package/mcp_server/session_continuity/tracker.py +9 -8
  39. package/mcp_server/song_brain/tools.py +17 -12
  40. package/mcp_server/splice_client/client.py +19 -6
  41. package/mcp_server/stuckness_detector/tools.py +8 -5
  42. package/mcp_server/tools/_agent_os_engine/__init__.py +52 -0
  43. package/mcp_server/tools/_agent_os_engine/critics.py +134 -0
  44. package/mcp_server/tools/_agent_os_engine/evaluation.py +206 -0
  45. package/mcp_server/tools/_agent_os_engine/models.py +132 -0
  46. package/mcp_server/tools/_agent_os_engine/taste.py +192 -0
  47. package/mcp_server/tools/_agent_os_engine/techniques.py +161 -0
  48. package/mcp_server/tools/_agent_os_engine/world_model.py +170 -0
  49. package/mcp_server/tools/_composition_engine/__init__.py +67 -0
  50. package/mcp_server/tools/_composition_engine/analysis.py +174 -0
  51. package/mcp_server/tools/_composition_engine/critics.py +522 -0
  52. package/mcp_server/tools/_composition_engine/gestures.py +230 -0
  53. package/mcp_server/tools/_composition_engine/harmony.py +70 -0
  54. package/mcp_server/tools/_composition_engine/models.py +193 -0
  55. package/mcp_server/tools/_composition_engine/sections.py +371 -0
  56. package/mcp_server/tools/_perception_engine.py +18 -11
  57. package/mcp_server/tools/agent_os.py +23 -15
  58. package/mcp_server/tools/analyzer.py +166 -7
  59. package/mcp_server/tools/automation.py +6 -1
  60. package/mcp_server/tools/composition.py +25 -16
  61. package/mcp_server/tools/devices.py +10 -6
  62. package/mcp_server/tools/motif.py +7 -2
  63. package/mcp_server/tools/planner.py +6 -2
  64. package/mcp_server/tools/research.py +13 -10
  65. package/mcp_server/transition_engine/tools.py +6 -1
  66. package/mcp_server/translation_engine/tools.py +8 -6
  67. package/mcp_server/wonder_mode/engine.py +8 -3
  68. package/mcp_server/wonder_mode/tools.py +29 -21
  69. package/package.json +2 -2
  70. package/remote_script/LivePilot/__init__.py +1 -1
  71. package/requirements.txt +6 -0
  72. package/livepilot.mcpb +0 -0
  73. package/mcp_server/tools/_agent_os_engine.py +0 -947
  74. 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 — 317 tools, 43 domains",
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 — 317 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.4",
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.4 — Ableton Live 12
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
- - 317 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
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 317 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
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 **317 tools**. If you add or remove a `@mcp.tool()` decorator, update all of these files:
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
- 317 tools. 43 domains. Device atlas. Splice integration. Auto-composition. Spectral perception. Technique memory.
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
- │ │ 317 MCP Tools │ │
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 317 tools. They give the AI musical judgment, not just musical execution.
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
- 317 tools across 43 domains. Highlights below — [full catalog here](docs/manual/tool-catalog.md).
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 317 tools →](docs/manual/tool-catalog.md)**
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 317 tools, workflows |
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",
4
- "description": "Agentic production system for Ableton Live 12 — 317 tools, 43 domains, device atlas, sample intelligence, auto-composition, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
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",
4
- "description": "Agentic production system for Ableton Live 12 — 317 tools, 43 domains, device atlas, sample intelligence, auto-composition, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
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. 317 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.
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. 317 tools across 43 domains, three layers:
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 317 tools plus M4L perception tools.
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 317 tools with params and ranges |
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.4 — Architecture & Tool Reference
1
+ # LivePilot v1.10.6 — Architecture & Tool Reference
2
2
 
3
- Agentic production system for Ableton Live 12. 317 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.
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 317 Tools — What Each One Does
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.4",
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: **317 tools across 43 domains**.
32
- Core (no M4L): **286**. Bridge (M4L): **30** (backed by 28 bridge commands).
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 ("317 tools. 43 domains"), bridge section ("281 core...36 bridge")
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` → "317 tools across 43 domains"
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 317 tools present
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.4"});
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.4",
6
- "description": "Agentic production system for Ableton Live 12. Make beats, mix tracks, design sounds, and arrange songs with 317 AI-powered tools.",
7
- "long_description": "LivePilot is an agentic production system for Ableton Live 12. 317 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.",
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"
@@ -1,2 +1,2 @@
1
1
  """LivePilot MCP Server — bridges MCP protocol to Ableton Live."""
2
- __version__ = "1.10.4"
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
- pass
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
- pass
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
- pass
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,
@@ -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
- pass
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
- pass
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