livepilot 1.9.14 → 1.9.16
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 +82 -0
- package/CONTRIBUTING.md +1 -1
- package/README.md +8 -8
- package/livepilot/.Codex-plugin/plugin.json +2 -2
- package/livepilot/.claude-plugin/plugin.json +2 -2
- package/livepilot/agents/livepilot-producer/AGENT.md +243 -49
- package/livepilot/skills/livepilot-core/SKILL.md +81 -6
- package/livepilot/skills/livepilot-core/references/m4l-devices.md +2 -2
- package/livepilot/skills/livepilot-core/references/overview.md +3 -3
- package/livepilot/skills/livepilot-core/references/sound-design.md +3 -2
- package/livepilot/skills/livepilot-release/SKILL.md +13 -13
- package/m4l_device/livepilot_bridge.js +32 -15
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/connection.py +24 -2
- package/mcp_server/curves.py +14 -6
- package/mcp_server/evaluation/__init__.py +1 -0
- package/mcp_server/evaluation/fabric.py +575 -0
- package/mcp_server/evaluation/feature_extractors.py +84 -0
- package/mcp_server/evaluation/policy.py +67 -0
- package/mcp_server/evaluation/tools.py +53 -0
- package/mcp_server/m4l_bridge.py +9 -1
- package/mcp_server/memory/__init__.py +11 -2
- package/mcp_server/memory/anti_memory.py +78 -0
- package/mcp_server/memory/promotion.py +94 -0
- package/mcp_server/memory/session_memory.py +108 -0
- package/mcp_server/memory/taste_memory.py +158 -0
- package/mcp_server/memory/technique_store.py +27 -18
- package/mcp_server/memory/tools.py +112 -0
- package/mcp_server/mix_engine/__init__.py +1 -0
- package/mcp_server/mix_engine/critics.py +299 -0
- package/mcp_server/mix_engine/models.py +152 -0
- package/mcp_server/mix_engine/planner.py +103 -0
- package/mcp_server/mix_engine/state_builder.py +316 -0
- package/mcp_server/mix_engine/tools.py +220 -0
- package/mcp_server/performance_engine/__init__.py +1 -0
- package/mcp_server/performance_engine/models.py +148 -0
- package/mcp_server/performance_engine/planner.py +267 -0
- package/mcp_server/performance_engine/safety.py +165 -0
- package/mcp_server/performance_engine/tools.py +183 -0
- package/mcp_server/project_brain/__init__.py +6 -0
- package/mcp_server/project_brain/arrangement_graph.py +64 -0
- package/mcp_server/project_brain/automation_graph.py +72 -0
- package/mcp_server/project_brain/builder.py +123 -0
- package/mcp_server/project_brain/capability_graph.py +64 -0
- package/mcp_server/project_brain/models.py +282 -0
- package/mcp_server/project_brain/refresh.py +86 -0
- package/mcp_server/project_brain/role_graph.py +103 -0
- package/mcp_server/project_brain/session_graph.py +51 -0
- package/mcp_server/project_brain/tools.py +144 -0
- package/mcp_server/reference_engine/__init__.py +1 -0
- package/mcp_server/reference_engine/gap_analyzer.py +239 -0
- package/mcp_server/reference_engine/models.py +105 -0
- package/mcp_server/reference_engine/profile_builder.py +149 -0
- package/mcp_server/reference_engine/tactic_router.py +117 -0
- package/mcp_server/reference_engine/tools.py +236 -0
- package/mcp_server/runtime/__init__.py +1 -0
- package/mcp_server/runtime/action_ledger.py +117 -0
- package/mcp_server/runtime/action_ledger_models.py +91 -0
- package/mcp_server/runtime/action_tools.py +57 -0
- package/mcp_server/runtime/capability_state.py +219 -0
- package/mcp_server/runtime/safety_kernel.py +339 -0
- package/mcp_server/runtime/safety_tools.py +42 -0
- package/mcp_server/runtime/tools.py +67 -0
- package/mcp_server/server.py +17 -0
- package/mcp_server/sound_design/__init__.py +1 -0
- package/mcp_server/sound_design/critics.py +297 -0
- package/mcp_server/sound_design/models.py +147 -0
- package/mcp_server/sound_design/planner.py +104 -0
- package/mcp_server/sound_design/tools.py +297 -0
- package/mcp_server/tools/_agent_os_engine.py +947 -0
- package/mcp_server/tools/_composition_engine.py +1530 -0
- package/mcp_server/tools/_conductor.py +199 -0
- package/mcp_server/tools/_conductor_budgets.py +222 -0
- package/mcp_server/tools/_evaluation_contracts.py +91 -0
- package/mcp_server/tools/_form_engine.py +416 -0
- package/mcp_server/tools/_motif_engine.py +351 -0
- package/mcp_server/tools/_planner_engine.py +516 -0
- package/mcp_server/tools/_research_engine.py +542 -0
- package/mcp_server/tools/_research_provider.py +185 -0
- package/mcp_server/tools/_snapshot_normalizer.py +49 -0
- package/mcp_server/tools/agent_os.py +448 -0
- package/mcp_server/tools/analyzer.py +18 -0
- package/mcp_server/tools/automation.py +25 -10
- package/mcp_server/tools/composition.py +645 -0
- package/mcp_server/tools/devices.py +15 -1
- package/mcp_server/tools/midi_io.py +3 -1
- package/mcp_server/tools/motif.py +104 -0
- package/mcp_server/tools/planner.py +144 -0
- package/mcp_server/tools/research.py +223 -0
- package/mcp_server/tools/tracks.py +21 -6
- package/mcp_server/tools/transport.py +10 -2
- package/mcp_server/transition_engine/__init__.py +6 -0
- package/mcp_server/transition_engine/archetypes.py +167 -0
- package/mcp_server/transition_engine/critics.py +340 -0
- package/mcp_server/transition_engine/models.py +90 -0
- package/mcp_server/transition_engine/tools.py +291 -0
- package/mcp_server/translation_engine/__init__.py +5 -0
- package/mcp_server/translation_engine/critics.py +297 -0
- package/mcp_server/translation_engine/models.py +27 -0
- package/mcp_server/translation_engine/tools.py +108 -0
- package/package.json +2 -2
- package/remote_script/LivePilot/__init__.py +1 -1
- package/remote_script/LivePilot/arrangement.py +21 -3
- package/remote_script/LivePilot/clips.py +22 -6
- package/remote_script/LivePilot/notes.py +9 -1
- package/remote_script/LivePilot/server.py +6 -6
|
@@ -609,6 +609,24 @@ async def capture_audio(
|
|
|
609
609
|
filename,
|
|
610
610
|
timeout=float(duration_seconds + 10),
|
|
611
611
|
)
|
|
612
|
+
|
|
613
|
+
# Move captured file from M4L device directory to CAPTURE_DIR
|
|
614
|
+
if result.get("ok") and result.get("file_path"):
|
|
615
|
+
src = result["file_path"]
|
|
616
|
+
# Try common extensions the bridge might produce
|
|
617
|
+
for ext in ("", ".aiff", ".wav", ".aif"):
|
|
618
|
+
src_path = src + ext if not src.endswith(ext) else src
|
|
619
|
+
if os.path.isfile(src_path):
|
|
620
|
+
dst_name = os.path.basename(src_path)
|
|
621
|
+
dst_path = os.path.join(CAPTURE_DIR, dst_name)
|
|
622
|
+
try:
|
|
623
|
+
import shutil
|
|
624
|
+
shutil.move(src_path, dst_path)
|
|
625
|
+
result["file_path"] = dst_path
|
|
626
|
+
except OSError:
|
|
627
|
+
pass # Leave in original location if move fails
|
|
628
|
+
break
|
|
629
|
+
|
|
612
630
|
return result
|
|
613
631
|
|
|
614
632
|
|
|
@@ -43,8 +43,11 @@ def get_clip_automation(
|
|
|
43
43
|
parameter name, and type (mixer/send/device). Use this to see
|
|
44
44
|
what's already automated before writing new curves.
|
|
45
45
|
"""
|
|
46
|
-
if track_index <
|
|
47
|
-
raise ValueError(
|
|
46
|
+
if track_index < -99:
|
|
47
|
+
raise ValueError(
|
|
48
|
+
"track_index must be >= 0 for regular tracks, "
|
|
49
|
+
"or -1..-99 for return tracks (-1=A, -2=B)"
|
|
50
|
+
)
|
|
48
51
|
if clip_index < 0:
|
|
49
52
|
raise ValueError("clip_index must be >= 0")
|
|
50
53
|
return _get_ableton(ctx).send_command("get_clip_automation", {
|
|
@@ -76,8 +79,11 @@ def set_clip_automation(
|
|
|
76
79
|
Tip: Use apply_automation_shape to generate points from curves/recipes
|
|
77
80
|
instead of calculating points manually.
|
|
78
81
|
"""
|
|
79
|
-
if track_index <
|
|
80
|
-
raise ValueError(
|
|
82
|
+
if track_index < -99:
|
|
83
|
+
raise ValueError(
|
|
84
|
+
"track_index must be >= 0 for regular tracks, "
|
|
85
|
+
"or -1..-99 for return tracks (-1=A, -2=B)"
|
|
86
|
+
)
|
|
81
87
|
if clip_index < 0:
|
|
82
88
|
raise ValueError("clip_index must be >= 0")
|
|
83
89
|
if parameter_type not in ("device", "volume", "panning", "send"):
|
|
@@ -117,8 +123,11 @@ def clear_clip_automation(
|
|
|
117
123
|
If parameter_type is omitted, clears ALL envelopes.
|
|
118
124
|
If provided, clears only that parameter's envelope.
|
|
119
125
|
"""
|
|
120
|
-
if track_index <
|
|
121
|
-
raise ValueError(
|
|
126
|
+
if track_index < -99:
|
|
127
|
+
raise ValueError(
|
|
128
|
+
"track_index must be >= 0 for regular tracks, "
|
|
129
|
+
"or -1..-99 for return tracks (-1=A, -2=B)"
|
|
130
|
+
)
|
|
122
131
|
if clip_index < 0:
|
|
123
132
|
raise ValueError("clip_index must be >= 0")
|
|
124
133
|
params: dict = {
|
|
@@ -217,8 +226,11 @@ def apply_automation_shape(
|
|
|
217
226
|
- Tremolo/pan: use sine with frequency in musical divisions
|
|
218
227
|
"""
|
|
219
228
|
# Validate indices and parameter_type (same rules as set_clip_automation)
|
|
220
|
-
if track_index <
|
|
221
|
-
raise ValueError(
|
|
229
|
+
if track_index < -99:
|
|
230
|
+
raise ValueError(
|
|
231
|
+
"track_index must be >= 0 for regular tracks, "
|
|
232
|
+
"or -1..-99 for return tracks (-1=A, -2=B)"
|
|
233
|
+
)
|
|
222
234
|
if clip_index < 0:
|
|
223
235
|
raise ValueError("clip_index must be >= 0")
|
|
224
236
|
if parameter_type not in ("device", "volume", "panning", "send"):
|
|
@@ -312,8 +324,11 @@ def apply_automation_recipe(
|
|
|
312
324
|
- stereo_narrow: collapse to mono before drop
|
|
313
325
|
"""
|
|
314
326
|
# Validate indices and parameter_type (same rules as set_clip_automation)
|
|
315
|
-
if track_index <
|
|
316
|
-
raise ValueError(
|
|
327
|
+
if track_index < -99:
|
|
328
|
+
raise ValueError(
|
|
329
|
+
"track_index must be >= 0 for regular tracks, "
|
|
330
|
+
"or -1..-99 for return tracks (-1=A, -2=B)"
|
|
331
|
+
)
|
|
317
332
|
if clip_index < 0:
|
|
318
333
|
raise ValueError("clip_index must be >= 0")
|
|
319
334
|
if parameter_type not in ("device", "volume", "panning", "send"):
|