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.
Files changed (108) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/AGENTS.md +3 -3
  3. package/CHANGELOG.md +82 -0
  4. package/CONTRIBUTING.md +1 -1
  5. package/README.md +8 -8
  6. package/livepilot/.Codex-plugin/plugin.json +2 -2
  7. package/livepilot/.claude-plugin/plugin.json +2 -2
  8. package/livepilot/agents/livepilot-producer/AGENT.md +243 -49
  9. package/livepilot/skills/livepilot-core/SKILL.md +81 -6
  10. package/livepilot/skills/livepilot-core/references/m4l-devices.md +2 -2
  11. package/livepilot/skills/livepilot-core/references/overview.md +3 -3
  12. package/livepilot/skills/livepilot-core/references/sound-design.md +3 -2
  13. package/livepilot/skills/livepilot-release/SKILL.md +13 -13
  14. package/m4l_device/livepilot_bridge.js +32 -15
  15. package/mcp_server/__init__.py +1 -1
  16. package/mcp_server/connection.py +24 -2
  17. package/mcp_server/curves.py +14 -6
  18. package/mcp_server/evaluation/__init__.py +1 -0
  19. package/mcp_server/evaluation/fabric.py +575 -0
  20. package/mcp_server/evaluation/feature_extractors.py +84 -0
  21. package/mcp_server/evaluation/policy.py +67 -0
  22. package/mcp_server/evaluation/tools.py +53 -0
  23. package/mcp_server/m4l_bridge.py +9 -1
  24. package/mcp_server/memory/__init__.py +11 -2
  25. package/mcp_server/memory/anti_memory.py +78 -0
  26. package/mcp_server/memory/promotion.py +94 -0
  27. package/mcp_server/memory/session_memory.py +108 -0
  28. package/mcp_server/memory/taste_memory.py +158 -0
  29. package/mcp_server/memory/technique_store.py +27 -18
  30. package/mcp_server/memory/tools.py +112 -0
  31. package/mcp_server/mix_engine/__init__.py +1 -0
  32. package/mcp_server/mix_engine/critics.py +299 -0
  33. package/mcp_server/mix_engine/models.py +152 -0
  34. package/mcp_server/mix_engine/planner.py +103 -0
  35. package/mcp_server/mix_engine/state_builder.py +316 -0
  36. package/mcp_server/mix_engine/tools.py +220 -0
  37. package/mcp_server/performance_engine/__init__.py +1 -0
  38. package/mcp_server/performance_engine/models.py +148 -0
  39. package/mcp_server/performance_engine/planner.py +267 -0
  40. package/mcp_server/performance_engine/safety.py +165 -0
  41. package/mcp_server/performance_engine/tools.py +183 -0
  42. package/mcp_server/project_brain/__init__.py +6 -0
  43. package/mcp_server/project_brain/arrangement_graph.py +64 -0
  44. package/mcp_server/project_brain/automation_graph.py +72 -0
  45. package/mcp_server/project_brain/builder.py +123 -0
  46. package/mcp_server/project_brain/capability_graph.py +64 -0
  47. package/mcp_server/project_brain/models.py +282 -0
  48. package/mcp_server/project_brain/refresh.py +86 -0
  49. package/mcp_server/project_brain/role_graph.py +103 -0
  50. package/mcp_server/project_brain/session_graph.py +51 -0
  51. package/mcp_server/project_brain/tools.py +144 -0
  52. package/mcp_server/reference_engine/__init__.py +1 -0
  53. package/mcp_server/reference_engine/gap_analyzer.py +239 -0
  54. package/mcp_server/reference_engine/models.py +105 -0
  55. package/mcp_server/reference_engine/profile_builder.py +149 -0
  56. package/mcp_server/reference_engine/tactic_router.py +117 -0
  57. package/mcp_server/reference_engine/tools.py +236 -0
  58. package/mcp_server/runtime/__init__.py +1 -0
  59. package/mcp_server/runtime/action_ledger.py +117 -0
  60. package/mcp_server/runtime/action_ledger_models.py +91 -0
  61. package/mcp_server/runtime/action_tools.py +57 -0
  62. package/mcp_server/runtime/capability_state.py +219 -0
  63. package/mcp_server/runtime/safety_kernel.py +339 -0
  64. package/mcp_server/runtime/safety_tools.py +42 -0
  65. package/mcp_server/runtime/tools.py +67 -0
  66. package/mcp_server/server.py +17 -0
  67. package/mcp_server/sound_design/__init__.py +1 -0
  68. package/mcp_server/sound_design/critics.py +297 -0
  69. package/mcp_server/sound_design/models.py +147 -0
  70. package/mcp_server/sound_design/planner.py +104 -0
  71. package/mcp_server/sound_design/tools.py +297 -0
  72. package/mcp_server/tools/_agent_os_engine.py +947 -0
  73. package/mcp_server/tools/_composition_engine.py +1530 -0
  74. package/mcp_server/tools/_conductor.py +199 -0
  75. package/mcp_server/tools/_conductor_budgets.py +222 -0
  76. package/mcp_server/tools/_evaluation_contracts.py +91 -0
  77. package/mcp_server/tools/_form_engine.py +416 -0
  78. package/mcp_server/tools/_motif_engine.py +351 -0
  79. package/mcp_server/tools/_planner_engine.py +516 -0
  80. package/mcp_server/tools/_research_engine.py +542 -0
  81. package/mcp_server/tools/_research_provider.py +185 -0
  82. package/mcp_server/tools/_snapshot_normalizer.py +49 -0
  83. package/mcp_server/tools/agent_os.py +448 -0
  84. package/mcp_server/tools/analyzer.py +18 -0
  85. package/mcp_server/tools/automation.py +25 -10
  86. package/mcp_server/tools/composition.py +645 -0
  87. package/mcp_server/tools/devices.py +15 -1
  88. package/mcp_server/tools/midi_io.py +3 -1
  89. package/mcp_server/tools/motif.py +104 -0
  90. package/mcp_server/tools/planner.py +144 -0
  91. package/mcp_server/tools/research.py +223 -0
  92. package/mcp_server/tools/tracks.py +21 -6
  93. package/mcp_server/tools/transport.py +10 -2
  94. package/mcp_server/transition_engine/__init__.py +6 -0
  95. package/mcp_server/transition_engine/archetypes.py +167 -0
  96. package/mcp_server/transition_engine/critics.py +340 -0
  97. package/mcp_server/transition_engine/models.py +90 -0
  98. package/mcp_server/transition_engine/tools.py +291 -0
  99. package/mcp_server/translation_engine/__init__.py +5 -0
  100. package/mcp_server/translation_engine/critics.py +297 -0
  101. package/mcp_server/translation_engine/models.py +27 -0
  102. package/mcp_server/translation_engine/tools.py +108 -0
  103. package/package.json +2 -2
  104. package/remote_script/LivePilot/__init__.py +1 -1
  105. package/remote_script/LivePilot/arrangement.py +21 -3
  106. package/remote_script/LivePilot/clips.py +22 -6
  107. package/remote_script/LivePilot/notes.py +9 -1
  108. 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 < 0:
47
- raise ValueError("track_index must be >= 0")
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 < 0:
80
- raise ValueError("track_index must be >= 0")
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 < 0:
121
- raise ValueError("track_index must be >= 0")
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 < 0:
221
- raise ValueError("track_index must be >= 0")
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 < 0:
316
- raise ValueError("track_index must be >= 0")
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"):