livepilot 1.15.0-beta → 1.16.1

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 (70) hide show
  1. package/CHANGELOG.md +206 -3
  2. package/README.md +11 -11
  3. package/m4l_device/LivePilot_Analyzer.amxd +0 -0
  4. package/m4l_device/livepilot_bridge.js +1 -1
  5. package/mcp_server/__init__.py +1 -1
  6. package/mcp_server/atlas/device_atlas.json +91219 -7161
  7. package/mcp_server/atlas/enrichments/audio_effects/pitch_hack.yaml +61 -0
  8. package/mcp_server/atlas/enrichments/audio_effects/pitchloop89.yaml +111 -0
  9. package/mcp_server/atlas/enrichments/audio_effects/re_enveloper.yaml +51 -0
  10. package/mcp_server/atlas/enrichments/audio_effects/snipper.yaml +36 -0
  11. package/mcp_server/atlas/enrichments/audio_effects/spectral_blur.yaml +64 -0
  12. package/mcp_server/atlas/enrichments/instruments/bell_tower.yaml +37 -0
  13. package/mcp_server/atlas/enrichments/instruments/granulator_iii.yaml +124 -0
  14. package/mcp_server/atlas/enrichments/instruments/harmonic_drone_generator.yaml +83 -0
  15. package/mcp_server/atlas/enrichments/instruments/impulse.yaml +47 -0
  16. package/mcp_server/atlas/enrichments/instruments/sting_iftah.yaml +44 -0
  17. package/mcp_server/atlas/enrichments/midi_effects/expressive_chords.yaml +38 -0
  18. package/mcp_server/atlas/enrichments/midi_effects/filler.yaml +32 -0
  19. package/mcp_server/atlas/enrichments/midi_effects/microtuner.yaml +83 -0
  20. package/mcp_server/atlas/enrichments/midi_effects/patterns_iftah.yaml +38 -0
  21. package/mcp_server/atlas/enrichments/midi_effects/phase_pattern.yaml +51 -0
  22. package/mcp_server/atlas/enrichments/midi_effects/polyrhythm.yaml +46 -0
  23. package/mcp_server/atlas/enrichments/midi_effects/retrigger.yaml +40 -0
  24. package/mcp_server/atlas/enrichments/midi_effects/slice_shuffler.yaml +39 -0
  25. package/mcp_server/atlas/enrichments/midi_effects/sq_sequencer.yaml +39 -0
  26. package/mcp_server/atlas/enrichments/midi_effects/stages.yaml +38 -0
  27. package/mcp_server/atlas/enrichments/utility/arrangement_looper.yaml +31 -0
  28. package/mcp_server/atlas/enrichments/utility/cv_clock_in.yaml +25 -0
  29. package/mcp_server/atlas/enrichments/utility/cv_clock_out.yaml +25 -0
  30. package/mcp_server/atlas/enrichments/utility/cv_envelope_follower.yaml +38 -0
  31. package/mcp_server/atlas/enrichments/utility/cv_in.yaml +26 -0
  32. package/mcp_server/atlas/enrichments/utility/cv_instrument.yaml +34 -0
  33. package/mcp_server/atlas/enrichments/utility/cv_lfo.yaml +38 -0
  34. package/mcp_server/atlas/enrichments/utility/cv_shaper.yaml +35 -0
  35. package/mcp_server/atlas/enrichments/utility/cv_triggers.yaml +26 -0
  36. package/mcp_server/atlas/enrichments/utility/cv_utility.yaml +37 -0
  37. package/mcp_server/atlas/enrichments/utility/performer.yaml +36 -0
  38. package/mcp_server/atlas/enrichments/utility/prearranger.yaml +36 -0
  39. package/mcp_server/atlas/enrichments/utility/rotating_rhythm_generator.yaml +35 -0
  40. package/mcp_server/atlas/enrichments/utility/surround_panner.yaml +40 -0
  41. package/mcp_server/atlas/enrichments/utility/variations.yaml +40 -0
  42. package/mcp_server/atlas/enrichments/utility/vector_map.yaml +36 -0
  43. package/mcp_server/atlas/tools.py +30 -2
  44. package/mcp_server/runtime/remote_commands.py +3 -0
  45. package/mcp_server/sample_engine/tools.py +738 -60
  46. package/mcp_server/server.py +18 -6
  47. package/mcp_server/splice_client/client.py +583 -65
  48. package/mcp_server/splice_client/http_bridge.py +434 -0
  49. package/mcp_server/splice_client/models.py +278 -2
  50. package/mcp_server/splice_client/quota.py +229 -0
  51. package/mcp_server/tools/_analyzer_engine/__init__.py +4 -0
  52. package/mcp_server/tools/_analyzer_engine/sample.py +73 -0
  53. package/mcp_server/tools/analyzer.py +730 -29
  54. package/mcp_server/tools/browser.py +164 -13
  55. package/mcp_server/tools/devices.py +56 -11
  56. package/mcp_server/tools/mixing.py +64 -15
  57. package/mcp_server/tools/scales.py +18 -6
  58. package/mcp_server/tools/tracks.py +92 -4
  59. package/package.json +2 -2
  60. package/remote_script/LivePilot/__init__.py +1 -1
  61. package/remote_script/LivePilot/_clip_helpers.py +86 -0
  62. package/remote_script/LivePilot/_drum_helpers.py +40 -0
  63. package/remote_script/LivePilot/_scale_helpers.py +87 -0
  64. package/remote_script/LivePilot/arrangement.py +44 -15
  65. package/remote_script/LivePilot/clips.py +182 -2
  66. package/remote_script/LivePilot/devices.py +82 -2
  67. package/remote_script/LivePilot/notes.py +17 -2
  68. package/remote_script/LivePilot/scales.py +31 -16
  69. package/remote_script/LivePilot/simpler_sample.py +105 -17
  70. package/server.json +3 -3
@@ -0,0 +1,38 @@
1
+ id: cv_lfo
2
+ name: CV LFO
3
+ sonic_description: >
4
+ M4L LFO generator from CV Tools. Originally designed to send CV to
5
+ modular systems via a DC-coupled audio interface, but equally useful as
6
+ an extra LFO inside Live — route its output audio to modulate any Live
7
+ parameter via a return-track sidechain or internal MIDI mapping. When
8
+ you want more LFOs than a synth natively provides, CV LFO is the
9
+ answer.
10
+ category: modulation_source
11
+ character_tags: [lfo, modulation, cv, internal_modulation]
12
+ use_cases: [extra_lfo, modular_cv, parameter_modulation]
13
+ genre_affinity:
14
+ primary: [modular, experimental, deep_minimal]
15
+ secondary: [all]
16
+ complexity: beginner
17
+ introduced_in: "10.0"
18
+ pack: CV Tools
19
+ creator: Ableton
20
+ class_name: PluginDevice
21
+ requires_modular_hardware: false # useful even without modular
22
+
23
+ key_parameters:
24
+ - name: "Rate"
25
+ description: "LFO frequency — Hz or tempo-synced."
26
+ - name: "Waveform"
27
+ description: "Sine / Triangle / Saw / Square / Random / custom shape."
28
+ - name: "Depth"
29
+ description: "Output amplitude — controls modulation depth at the destination."
30
+ - name: "Offset"
31
+ description: "DC offset — pre-bias the modulation range."
32
+ signature_techniques:
33
+ - name: "Multi-LFO stack on a patch"
34
+ description: "Drop 3x CV LFO on a return track, each at different rates (0.07Hz, 0.23Hz, 1.11Hz), route outputs to filter/amp/pitch → organic drift that doesn't repeat."
35
+ aesthetic: [ambient, deep_minimal]
36
+
37
+ learn_more:
38
+ official: "https://www.ableton.com/en/packs/cv-tools/"
@@ -0,0 +1,35 @@
1
+ id: cv_shaper
2
+ name: CV Shaper
3
+ sonic_description: >
4
+ Create flexible CV shapes inside Live, then send to modular OR use
5
+ internally. Draw custom envelopes/LFOs on a graphical canvas. Useful
6
+ WITHOUT modular hardware as a free-form envelope/LFO source for any
7
+ Live parameter.
8
+ category: modulation_source
9
+ character_tags: [cv, custom_shape, envelope, lfo]
10
+ use_cases: [custom_envelope, bespoke_lfo, parameter_modulation]
11
+ genre_affinity:
12
+ primary: [modular, experimental, deep_minimal]
13
+ secondary: [all]
14
+ complexity: intermediate
15
+ introduced_in: "10.0"
16
+ pack: CV Tools
17
+ creator: Ableton
18
+ class_name: PluginDevice
19
+ requires_modular_hardware: false # useful internally too
20
+
21
+ key_parameters:
22
+ - name: "Shape Canvas"
23
+ description: "Draw the CV curve graphically."
24
+ - name: "Rate"
25
+ description: "Cycle time — tempo-sync or free."
26
+ - name: "Scale / Offset"
27
+ description: "Output amplitude and DC offset."
28
+
29
+ signature_techniques:
30
+ - name: "Bespoke ADSR for any parameter"
31
+ description: "Need a parameter envelope shape that's not on the device? Draw it in CV Shaper, route to the parameter. Unlimited curve flexibility."
32
+ aesthetic: [all]
33
+
34
+ learn_more:
35
+ official: "https://www.ableton.com/en/packs/cv-tools/"
@@ -0,0 +1,26 @@
1
+ id: cv_triggers
2
+ name: CV Triggers
3
+ sonic_description: >
4
+ Sends per-pad trigger CV to modular drum modules. Each of 8 pads
5
+ outputs its own gate. Map MIDI notes to pads, sequence modular drums
6
+ from Live's clip view.
7
+ category: cv_out
8
+ character_tags: [cv, modular, drum_trigger, gate_out]
9
+ use_cases: [modular_drums_from_live]
10
+ genre_affinity:
11
+ primary: [modular, experimental, hybrid_techno]
12
+ complexity: intermediate
13
+ introduced_in: "10.0"
14
+ pack: CV Tools
15
+ creator: Ableton
16
+ class_name: PluginDevice
17
+ requires_modular_hardware: true
18
+
19
+ key_parameters:
20
+ - name: "Pad Count"
21
+ description: "Up to 8 independent gate outputs."
22
+ - name: "Per-pad MIDI note assignment"
23
+ description: "Which note triggers which pad."
24
+
25
+ learn_more:
26
+ official: "https://www.ableton.com/en/packs/cv-tools/"
@@ -0,0 +1,37 @@
1
+ id: cv_utility
2
+ name: CV Utility
3
+ sonic_description: >
4
+ Process control voltages via automation curves. Scale, offset, invert,
5
+ quantize CV signals. Works standalone even without modular gear — use
6
+ to shape Live's internal automation before it hits the destination
7
+ parameter. Acts as a curve-shaper between a source LFO/envelope and
8
+ the modulated parameter.
9
+ category: cv_processor
10
+ character_tags: [cv_processing, scale, offset, invert, quantize]
11
+ use_cases: [curve_shaping, modulation_scaling, parameter_processing]
12
+ genre_affinity:
13
+ primary: [modular, experimental]
14
+ secondary: [all]
15
+ complexity: beginner
16
+ introduced_in: "10.0"
17
+ pack: CV Tools
18
+ creator: Ableton
19
+ class_name: PluginDevice
20
+ requires_modular_hardware: false
21
+
22
+ key_parameters:
23
+ - name: "Scale"
24
+ description: "Multiply incoming CV by a factor."
25
+ - name: "Offset"
26
+ description: "Add a DC offset."
27
+ - name: "Invert"
28
+ description: "Flip the signal polarity."
29
+ - name: "Quantize"
30
+ description: "Snap CV to discrete steps — useful for pitched CV."
31
+ signature_techniques:
32
+ - name: "Soften aggressive modulation"
33
+ description: "Put CV Utility between an LFO and a filter → scale down to 0.3 → same LFO, subtler effect."
34
+ aesthetic: [all]
35
+
36
+ learn_more:
37
+ official: "https://www.ableton.com/en/packs/cv-tools/"
@@ -0,0 +1,36 @@
1
+ id: performer
2
+ name: Performer
3
+ sonic_description: >
4
+ Macro-control device from Performance Pack (Iftah). Multiple faders,
5
+ crossfaders, buttons, dials — fully user-configurable to mirror any
6
+ hardware controller. Integrated Macro Editor for curve shaping. Studio
7
+ use: unify disparate parameter automation into a single interface. Live
8
+ use: build a one-controller performance surface for Live + external gear.
9
+ category: macro_controller
10
+ character_tags: [macro, performance, curve_shaped, unifier]
11
+ use_cases: [live_control, parameter_unification, curve_automation]
12
+ genre_affinity:
13
+ primary: [all]
14
+ complexity: intermediate
15
+ introduced_in: "11.0"
16
+ pack: Performance Pack
17
+ creator: Iftah
18
+ class_name: PluginDevice
19
+
20
+ key_parameters:
21
+ - name: "Control Layout"
22
+ description: "Add/remove/rename faders, buttons, crossfaders freely."
23
+ - name: "Macro Mappings"
24
+ description: "Each control maps to any Live parameter (including M4L devices and plugin parameters)."
25
+ - name: "Macro Editor Curve"
26
+ description: "Shape the response — exponential, S-curve, stepped — per macro."
27
+ signature_techniques:
28
+ - name: "One-knob chord-chain morph"
29
+ description: "Map one fader to filter cutoff, send level, reverb decay, sat drive simultaneously → turn = whole chord chain morphs."
30
+ aesthetic: [live_performance, studio_sketching]
31
+ - name: "Crossfader-style A/B"
32
+ description: "Build a crossfader that switches between two device states via inverse macro curves."
33
+ aesthetic: [performance]
34
+
35
+ learn_more:
36
+ official: "https://www.ableton.com/en/packs/performance-pack/"
@@ -0,0 +1,36 @@
1
+ id: prearranger
2
+ name: Prearranger
3
+ sonic_description: >
4
+ Structural pre-planning device from Performance Pack (Iftah). Define clip
5
+ locations in Arrangement View as empty slots, then perform live and Live
6
+ auto-fills them with the performance. Transforms live recording into a
7
+ compositional scaffold. Ideal for sketching long hypnotic structures
8
+ (deep minimal) or entire sets without mid-performance arrangement
9
+ decisions.
10
+ category: recording_helper
11
+ character_tags: [performance, scaffold, live_recording, structure]
12
+ use_cases: [long_form_sketch, hypnotic_structure, set_recording]
13
+ genre_affinity:
14
+ primary: [deep_minimal, live_performance, ambient]
15
+ secondary: [electronic_all]
16
+ complexity: intermediate
17
+ introduced_in: "11.0"
18
+ pack: Performance Pack
19
+ creator: Iftah
20
+ class_name: PluginDevice
21
+
22
+ key_parameters:
23
+ - name: "Slot Layout"
24
+ description: "Pre-place empty arrangement clips where you want recorded content to land."
25
+ - name: "Auto-fill Toggle"
26
+ description: "Enable Prearranger — live content records into the pre-placed slots."
27
+ signature_techniques:
28
+ - name: "Hypnotic 60-minute structure sketch"
29
+ description: "Place empty slots every 16 bars across a 60-minute arrangement → press record → improvise → each section lands in its slot."
30
+ aesthetic: [deep_minimal, ambient]
31
+ - name: "Set recording with predetermined structure"
32
+ description: "Build the arrangement scaffold based on your setlist → perform → recording is auto-organized."
33
+ aesthetic: [live_sets]
34
+
35
+ learn_more:
36
+ official: "https://www.ableton.com/en/packs/performance-pack/"
@@ -0,0 +1,35 @@
1
+ id: rotating_rhythm_generator
2
+ name: Rotating Rhythm Generator
3
+ sonic_description: >
4
+ M4L polyrhythmic MIDI generator from CV Tools. Originally a modular
5
+ CV-triggers tool, but operates as a standalone MIDI generator inside
6
+ Live. Generates rotating polyrhythmic patterns across multiple tracks
7
+ or drum-rack pads. One of the most under-utilized M4L devices for
8
+ complex techno / IDM groove programming.
9
+ category: generator
10
+ character_tags: [polyrhythmic, rotating, generative, drum_programming]
11
+ use_cases: [polymetric_drums, techno_groove, idm_pattern]
12
+ genre_affinity:
13
+ primary: [techno, idm, deep_minimal]
14
+ secondary: [all_electronic]
15
+ complexity: intermediate
16
+ introduced_in: "10.0"
17
+ pack: CV Tools
18
+ creator: Ableton
19
+ class_name: PluginDevice
20
+ requires_modular_hardware: false
21
+
22
+ key_parameters:
23
+ - name: "Ring Size"
24
+ description: "Number of steps in the ring (e.g., 16, 12, 7)."
25
+ - name: "Pulse Count"
26
+ description: "Beats distributed around the ring. Classic Euclidean distribution."
27
+ - name: "Rotation"
28
+ description: "Shift the starting position of the pattern on the ring."
29
+ signature_techniques:
30
+ - name: "Multi-lane rotated Euclidean drums"
31
+ description: "Kick: ring 16 / pulses 4 / rotation 0. Snare: ring 16 / pulses 2 / rotation 8. Hat: ring 13 / pulses 7 / rotation 3. Asymmetric groove that sits together but never locks."
32
+ aesthetic: [techno, deep_minimal, idm]
33
+
34
+ learn_more:
35
+ official: "https://www.ableton.com/en/packs/cv-tools/"
@@ -0,0 +1,40 @@
1
+ id: surround_panner
2
+ name: Surround Panner
3
+ sonic_description: >
4
+ Multichannel spatial panner. 4/6/8-channel speaker setups, 8 presets.
5
+ Not Ambisonic — discrete-channel panning. Only relevant for multi-channel
6
+ output setups (installation, quad+ club, cinema). In stereo studio work,
7
+ offers minimal benefit.
8
+ category: spatial_fx
9
+ character_tags: [multichannel, spatial, quad, surround]
10
+ use_cases: [installation, quad_club, cinema, multichannel_studio]
11
+ genre_affinity:
12
+ primary: [ambient_installation, cinema]
13
+ secondary: [experimental]
14
+ complexity: intermediate
15
+ introduced_in: "11.0"
16
+ pack: Surround Panner
17
+ creator: Ableton
18
+ class_name: PluginDevice
19
+ requires_special_output: true # multichannel interface
20
+
21
+ key_parameters:
22
+ - name: "Channel Layout"
23
+ description: "4.0, 5.1, 7.1, 8.0 — select target format."
24
+ - name: "XY Pan"
25
+ description: "2D pan position."
26
+ - name: "Rotate"
27
+ description: "Auto-rotate the signal around the listening position."
28
+ - name: "Focus / Spread"
29
+ description: "Width of the source in the field."
30
+
31
+ signature_techniques:
32
+ - name: "Quad-club rotating hi-hat"
33
+ description: "Hi-hat bus → Surround Panner in quad → auto-Rotate at slow rate → hats circle the dance floor."
34
+ aesthetic: [live_techno]
35
+
36
+ gotchas:
37
+ - "Stereo monitoring shows only a downmix — impossible to audition properly without a multichannel setup"
38
+
39
+ learn_more:
40
+ official: "https://www.ableton.com/en/packs/surround-panner/"
@@ -0,0 +1,40 @@
1
+ id: variations
2
+ name: Variations
3
+ sonic_description: >
4
+ Snapshot management from Performance Pack (Iftah). Captures any device
5
+ chain state or clip state and morphs between snapshots, quantized to a
6
+ musical boundary. The studio weapon: save 5 variations of a chord stab's
7
+ effect chain, clip-trigger morphing between them = gradual evolution over
8
+ 8-16 bars without 50 automation lanes. This is how you get the
9
+ 'chord-is-different-every-time' Villalobos behavior programmatically.
10
+ category: state_management
11
+ character_tags: [snapshot, morph, quantized, state_recall]
12
+ use_cases: [chain_morph, live_recall, section_transition, effect_evolution]
13
+ genre_affinity:
14
+ primary: [deep_minimal, microhouse, electronic_live]
15
+ secondary: [all]
16
+ complexity: intermediate
17
+ introduced_in: "11.0"
18
+ pack: Performance Pack
19
+ creator: Iftah
20
+ class_name: PluginDevice
21
+
22
+ key_parameters:
23
+ - name: "Snapshot Slots"
24
+ description: "Store up to N states. Each slot captures every parameter's value."
25
+ - name: "Morph Time"
26
+ description: "How long the interpolation between snapshots takes."
27
+ - name: "Quantization"
28
+ description: "Snap morph to bar / beat / scene boundary."
29
+ - name: "Selective Inclusion"
30
+ description: "Mark which parameters participate in each snapshot — exclude the ones you don't want to morph."
31
+ signature_techniques:
32
+ - name: "Chord stab evolution"
33
+ description: "Save 5 effect-chain states on a chord stab (different reverbs, pitches, filters). Clip-trigger morph between them every 2 bars. Result: chord stab is subtly different every time it plays."
34
+ aesthetic: [deep_minimal, microhouse]
35
+ - name: "Live scene state recall"
36
+ description: "Bind scenes to Variation snapshots — firing a scene also morphs the whole device chain."
37
+ aesthetic: [electronic_live]
38
+
39
+ learn_more:
40
+ official: "https://www.ableton.com/en/packs/performance-pack/"
@@ -0,0 +1,36 @@
1
+ id: vector_map
2
+ name: Vector Map
3
+ sonic_description: >
4
+ Particle-physics modulation router (Inspired by Nature, Dillon Bastan).
5
+ One particle drives multiple parameter destinations simultaneously. Unlike
6
+ an LFO (one source → one destination), Vector Map lets a single particle's
7
+ position control filter cutoff AND send level AND reverb decay at once —
8
+ coupled modulation that LFOs cannot produce. Essential for organic,
9
+ physically-coherent sound design.
10
+ category: modulation_source
11
+ character_tags: [particle_physics, coupled_modulation, multi_destination, generative]
12
+ use_cases: [coupled_modulation, non_trivial_modulation, physical_motion]
13
+ genre_affinity:
14
+ primary: [experimental, ambient, deep_minimal]
15
+ secondary: [idm, sound_design]
16
+ complexity: advanced
17
+ introduced_in: "11.0"
18
+ pack: Inspired by Nature
19
+ creator: Dillon Bastan
20
+ class_name: PluginDevice
21
+
22
+ key_parameters:
23
+ - name: "Particle Behavior"
24
+ description: "Gravity, friction, forces — defines how the particle moves."
25
+ - name: "Destination Mappings"
26
+ description: "Route the particle's X/Y/velocity to multiple Live parameters."
27
+ - name: "Depth per destination"
28
+ description: "How much the particle influences each destination."
29
+
30
+ signature_techniques:
31
+ - name: "Coupled filter + reverb motion"
32
+ description: "Particle X → filter cutoff, particle Y → reverb wet, particle velocity → dry/wet balance. Single physical motion drives a 3-parameter sonic change."
33
+ aesthetic: [ambient, experimental]
34
+
35
+ learn_more:
36
+ pack: "Inspired by Nature"
@@ -150,7 +150,11 @@ def atlas_compare(ctx: Context, device_a: str, device_b: str, role: str = "") ->
150
150
 
151
151
 
152
152
  @mcp.tool()
153
- def scan_full_library(ctx: Context, force: bool = False) -> dict:
153
+ def scan_full_library(
154
+ ctx: Context,
155
+ force: bool = False,
156
+ max_per_category: int = 5000,
157
+ ) -> dict:
154
158
  """Scan the full Ableton browser and rebuild the device atlas.
155
159
 
156
160
  Walks every category (instruments, audio_effects, midi_effects, max_for_live,
@@ -158,6 +162,16 @@ def scan_full_library(ctx: Context, force: bool = False) -> dict:
158
162
  Results are merged with curated enrichments and saved to device_atlas.json.
159
163
 
160
164
  force: if True, rescan even if atlas already exists (default False)
165
+ max_per_category: ceiling per category (default 5000). The previous
166
+ hardcoded 1000 cap silently truncated large categories — for
167
+ example, the samples category alone has ~22,000 items per the
168
+ browser tree, so the reported count "1000 samples" was wrong by
169
+ a factor of 22 (BUG-2026-04-22 #12). Raise this if your library
170
+ is huge; lower it for fast smoke scans.
171
+
172
+ Returns a stats dict including `truncated_categories` listing any
173
+ category that hit the cap (so callers know the count is a lower
174
+ bound rather than the true total).
161
175
  """
162
176
  from .scanner import normalize_scan_results
163
177
  from .enrichments import load_enrichments, merge_enrichments
@@ -183,11 +197,23 @@ def scan_full_library(ctx: Context, force: bool = False) -> dict:
183
197
 
184
198
  # Scan browser
185
199
  ableton = _get_ableton(ctx)
186
- raw = ableton.send_command("scan_browser_deep", {"max_per_category": 1000})
200
+ raw = ableton.send_command("scan_browser_deep", {"max_per_category": max_per_category})
187
201
 
188
202
  # Normalize
189
203
  devices = normalize_scan_results(raw)
190
204
 
205
+ # Detect truncation: per-category count == cap means we likely hit it.
206
+ truncated_categories = []
207
+ if isinstance(raw, dict):
208
+ per_cat = raw.get("counts") or raw.get("stats") or {}
209
+ if isinstance(per_cat, dict):
210
+ for cat, count in per_cat.items():
211
+ try:
212
+ if int(count) >= max_per_category:
213
+ truncated_categories.append(cat)
214
+ except (TypeError, ValueError):
215
+ continue
216
+
191
217
  # Load and merge enrichments
192
218
  enrichments = load_enrichments(enrichments_dir)
193
219
  devices = merge_enrichments(devices, enrichments)
@@ -214,6 +240,8 @@ def scan_full_library(ctx: Context, force: bool = False) -> dict:
214
240
  "live_version": live_version,
215
241
  "scanned_at": time.strftime("%Y-%m-%dT%H:%M:%SZ"),
216
242
  "stats": stats,
243
+ "max_per_category": max_per_category,
244
+ "truncated_categories": truncated_categories,
217
245
  "devices": devices,
218
246
  "packs": [],
219
247
  }
@@ -48,6 +48,9 @@ REMOTE_COMMANDS: frozenset[str] = frozenset({
48
48
  "insert_device", # 12.3+ native device insertion
49
49
  "insert_rack_chain", # 12.3+ rack chain insertion
50
50
  "set_drum_chain_note", # 12.3+ drum chain note assignment
51
+ "set_chain_name", # Rack chain rename (any rack type)
52
+ "fire_test_note", # Temp-clip MIDI trigger for verify_device_health
53
+ "cleanup_test_note", # Scratch-clip teardown paired with fire_test_note
51
54
  # rack variations + macro CRUD (Live 11+)
52
55
  "get_rack_variations", "store_rack_variation",
53
56
  "recall_rack_variation", "delete_rack_variation",