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
|
@@ -7,19 +7,23 @@
|
|
|
7
7
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
|
+
import logging
|
|
11
|
+
|
|
10
12
|
from fastmcp import Context
|
|
11
13
|
|
|
12
14
|
from ..server import mcp
|
|
13
15
|
from . import engine
|
|
14
16
|
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
15
19
|
|
|
16
20
|
def _get_song_brain_dict() -> dict:
|
|
17
21
|
try:
|
|
18
22
|
from ..song_brain.tools import _current_brain
|
|
19
23
|
if _current_brain is not None:
|
|
20
24
|
return _current_brain.to_dict()
|
|
21
|
-
except Exception:
|
|
22
|
-
|
|
25
|
+
except Exception as exc:
|
|
26
|
+
logger.warning("song_brain lookup failed: %s", exc)
|
|
23
27
|
return {}
|
|
24
28
|
|
|
25
29
|
|
|
@@ -37,8 +41,8 @@ def _get_taste_graph(ctx: Context):
|
|
|
37
41
|
taste_store=taste_store, anti_store=anti_store,
|
|
38
42
|
persistent_store=persistent,
|
|
39
43
|
)
|
|
40
|
-
except Exception:
|
|
41
|
-
|
|
44
|
+
except Exception as exc:
|
|
45
|
+
logger.warning("taste_graph build failed: %s", exc)
|
|
42
46
|
return None
|
|
43
47
|
|
|
44
48
|
|
|
@@ -47,7 +51,8 @@ def _get_active_constraints():
|
|
|
47
51
|
try:
|
|
48
52
|
from ..creative_constraints.tools import _active_constraints
|
|
49
53
|
return _active_constraints
|
|
50
|
-
except Exception:
|
|
54
|
+
except Exception as exc:
|
|
55
|
+
logger.debug("creative_constraints not importable: %s", exc)
|
|
51
56
|
return None
|
|
52
57
|
|
|
53
58
|
|
|
@@ -60,7 +65,8 @@ def _get_ledger_entries(ctx: Context) -> list[dict]:
|
|
|
60
65
|
)
|
|
61
66
|
entries = ledger.get_recent_moves(limit=20)
|
|
62
67
|
return [e.to_dict() for e in entries]
|
|
63
|
-
except Exception:
|
|
68
|
+
except Exception as exc:
|
|
69
|
+
logger.warning("action_ledger recent_moves failed: %s", exc)
|
|
64
70
|
return []
|
|
65
71
|
|
|
66
72
|
|
|
@@ -77,15 +83,16 @@ def _get_stuckness_report(ctx: Context, song_brain: dict) -> dict | None:
|
|
|
77
83
|
ableton = ctx.lifespan_context.get("ableton")
|
|
78
84
|
if ableton:
|
|
79
85
|
session_info = ableton.send_command("get_session_info", {})
|
|
80
|
-
except Exception:
|
|
81
|
-
|
|
86
|
+
except Exception as exc:
|
|
87
|
+
logger.warning("session_info fetch for stuckness failed: %s", exc)
|
|
82
88
|
report = detect_stuckness(
|
|
83
89
|
action_history=action_ledger,
|
|
84
90
|
session_info=session_info,
|
|
85
91
|
song_brain=song_brain,
|
|
86
92
|
)
|
|
87
93
|
return report.to_dict()
|
|
88
|
-
except Exception:
|
|
94
|
+
except Exception as exc:
|
|
95
|
+
logger.warning("stuckness detection failed: %s", exc)
|
|
89
96
|
return None
|
|
90
97
|
|
|
91
98
|
|
|
@@ -144,8 +151,9 @@ def enter_wonder_mode(
|
|
|
144
151
|
sample_context["sample_file_path"] = best.get("file_path", "")
|
|
145
152
|
sample_context["sample_name"] = best.get("name", "")
|
|
146
153
|
sample_context["material_type"] = best.get("material_type", "")
|
|
147
|
-
except Exception:
|
|
148
|
-
|
|
154
|
+
except Exception as exc:
|
|
155
|
+
# Graceful degradation — analytical variants still work
|
|
156
|
+
logger.warning("sample opportunity search failed: %s", exc)
|
|
149
157
|
|
|
150
158
|
# 1c. Get session info for kernel
|
|
151
159
|
session_info = {}
|
|
@@ -153,8 +161,8 @@ def enter_wonder_mode(
|
|
|
153
161
|
ableton = ctx.lifespan_context.get("ableton")
|
|
154
162
|
if ableton:
|
|
155
163
|
session_info = ableton.send_command("get_session_info", {})
|
|
156
|
-
except Exception:
|
|
157
|
-
|
|
164
|
+
except Exception as exc:
|
|
165
|
+
logger.warning("session_info fetch for kernel failed: %s", exc)
|
|
158
166
|
|
|
159
167
|
# 2. Generate variants
|
|
160
168
|
result = engine.generate_wonder_variants(
|
|
@@ -194,8 +202,8 @@ def enter_wonder_mode(
|
|
|
194
202
|
domain=thread_domain,
|
|
195
203
|
)
|
|
196
204
|
ws.creative_thread_id = thread.thread_id
|
|
197
|
-
except Exception:
|
|
198
|
-
|
|
205
|
+
except Exception as exc:
|
|
206
|
+
logger.warning("open creative thread failed: %s", exc)
|
|
199
207
|
|
|
200
208
|
# 5. Store session
|
|
201
209
|
store_wonder_session(ws)
|
|
@@ -290,8 +298,8 @@ def discard_wonder_session(
|
|
|
290
298
|
identity_effect="",
|
|
291
299
|
user_sentiment="disliked",
|
|
292
300
|
)
|
|
293
|
-
except Exception:
|
|
294
|
-
|
|
301
|
+
except Exception as exc:
|
|
302
|
+
logger.warning("record_turn_resolution(rejected) failed: %s", exc)
|
|
295
303
|
|
|
296
304
|
# Update taste graph — rejection is a negative signal for all executable variants
|
|
297
305
|
try:
|
|
@@ -304,16 +312,16 @@ def discard_wonder_session(
|
|
|
304
312
|
family=v["family"],
|
|
305
313
|
kept=False,
|
|
306
314
|
)
|
|
307
|
-
except Exception:
|
|
308
|
-
|
|
315
|
+
except Exception as exc:
|
|
316
|
+
logger.warning("taste_graph negative-signal update failed: %s", exc)
|
|
309
317
|
|
|
310
318
|
# Discard linked preview set
|
|
311
319
|
if ws.preview_set_id:
|
|
312
320
|
try:
|
|
313
321
|
from ..preview_studio.engine import discard_set
|
|
314
322
|
discard_set(ws.preview_set_id)
|
|
315
|
-
except Exception:
|
|
316
|
-
|
|
323
|
+
except Exception as exc:
|
|
324
|
+
logger.warning("discard_set(%s) failed: %s", ws.preview_set_id, exc)
|
|
317
325
|
|
|
318
326
|
return {
|
|
319
327
|
"discarded": True,
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.10.
|
|
3
|
+
"version": "1.10.6",
|
|
4
4
|
"mcpName": "io.github.dreamrec/livepilot",
|
|
5
|
-
"description": "Agentic production system for Ableton Live 12 —
|
|
5
|
+
"description": "Agentic production system for Ableton Live 12 — 320 tools, 43 domains. Device atlas (1305 devices), sample engine (Splice + browser + filesystem), auto-composition, spectral perception, technique memory, creative intelligence (12 engines)",
|
|
6
6
|
"author": "Pilot Studio",
|
|
7
7
|
"license": "BSL-1.1",
|
|
8
8
|
"type": "commonjs",
|
|
@@ -5,7 +5,7 @@ Entry point for the ControlSurface. Ableton calls create_instance(c_instance)
|
|
|
5
5
|
when this script is selected in Preferences > Link, Tempo & MIDI.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
__version__ = "1.10.
|
|
8
|
+
__version__ = "1.10.6"
|
|
9
9
|
|
|
10
10
|
from _Framework.ControlSurface import ControlSurface
|
|
11
11
|
from .server import LivePilotServer
|
package/requirements.txt
CHANGED
|
@@ -8,6 +8,12 @@ pyloudnorm>=0.1.0
|
|
|
8
8
|
soundfile>=0.12.0
|
|
9
9
|
scipy>=1.11.0
|
|
10
10
|
mutagen>=1.47.0
|
|
11
|
+
# v1.10.5 Splice online catalog integration — required, not optional.
|
|
12
|
+
# Without these, SpliceGRPCClient silently disables itself and search_samples
|
|
13
|
+
# falls back to the SQLite sounds.db which only returns locally downloaded
|
|
14
|
+
# samples (see docs/2026-04-14-bugs-discovered.md — P0-2).
|
|
15
|
+
grpcio>=1.60.0
|
|
16
|
+
protobuf>=4.25.0
|
|
11
17
|
|
|
12
18
|
# Development / testing (not required for runtime)
|
|
13
19
|
# pip install pytest pytest-asyncio
|
package/livepilot.mcpb
DELETED
|
Binary file
|