livepilot 1.1.0
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/settings.local.json +10 -0
- package/.mcpregistry_github_token +1 -0
- package/.mcpregistry_registry_token +1 -0
- package/.playwright-mcp/console-2026-03-17T15-47-29-021Z.log +10 -0
- package/.playwright-mcp/console-2026-03-17T15-51-09-247Z.log +10 -0
- package/.playwright-mcp/console-2026-03-17T15-52-22-831Z.log +12 -0
- package/.playwright-mcp/console-2026-03-17T15-52-29-709Z.log +10 -0
- package/.playwright-mcp/console-2026-03-17T15-53-20-147Z.log +1 -0
- package/.playwright-mcp/glama-snapshot.md +2140 -0
- package/.playwright-mcp/page-2026-03-17T15-49-02-625Z.png +0 -0
- package/.playwright-mcp/page-2026-03-17T15-52-15-149Z.png +0 -0
- package/.playwright-mcp/page-2026-03-17T15-52-57-333Z.png +0 -0
- package/CHANGELOG.md +33 -0
- package/LICENSE +21 -0
- package/README.md +296 -0
- package/bin/livepilot.js +376 -0
- package/installer/install.js +95 -0
- package/installer/paths.js +79 -0
- package/mcp_server/__init__.py +2 -0
- package/mcp_server/__main__.py +5 -0
- package/mcp_server/connection.py +207 -0
- package/mcp_server/server.py +40 -0
- package/mcp_server/tools/__init__.py +1 -0
- package/mcp_server/tools/arrangement.py +399 -0
- package/mcp_server/tools/browser.py +78 -0
- package/mcp_server/tools/clips.py +187 -0
- package/mcp_server/tools/devices.py +238 -0
- package/mcp_server/tools/mixing.py +113 -0
- package/mcp_server/tools/notes.py +266 -0
- package/mcp_server/tools/scenes.py +63 -0
- package/mcp_server/tools/tracks.py +148 -0
- package/mcp_server/tools/transport.py +113 -0
- package/package.json +38 -0
- package/plugin/.mcp.json +8 -0
- package/plugin/agents/livepilot-producer/AGENT.md +61 -0
- package/plugin/commands/beat.md +18 -0
- package/plugin/commands/mix.md +15 -0
- package/plugin/commands/session.md +13 -0
- package/plugin/commands/sounddesign.md +16 -0
- package/plugin/plugin.json +18 -0
- package/plugin/skills/livepilot-core/SKILL.md +160 -0
- package/plugin/skills/livepilot-core/references/ableton-workflow-patterns.md +831 -0
- package/plugin/skills/livepilot-core/references/m4l-devices.md +352 -0
- package/plugin/skills/livepilot-core/references/midi-recipes.md +402 -0
- package/plugin/skills/livepilot-core/references/mixing-patterns.md +578 -0
- package/plugin/skills/livepilot-core/references/overview.md +191 -0
- package/plugin/skills/livepilot-core/references/sound-design.md +392 -0
- package/remote_script/LivePilot/__init__.py +42 -0
- package/remote_script/LivePilot/arrangement.py +678 -0
- package/remote_script/LivePilot/browser.py +325 -0
- package/remote_script/LivePilot/clips.py +172 -0
- package/remote_script/LivePilot/devices.py +466 -0
- package/remote_script/LivePilot/diagnostics.py +198 -0
- package/remote_script/LivePilot/mixing.py +194 -0
- package/remote_script/LivePilot/notes.py +339 -0
- package/remote_script/LivePilot/router.py +74 -0
- package/remote_script/LivePilot/scenes.py +75 -0
- package/remote_script/LivePilot/server.py +286 -0
- package/remote_script/LivePilot/tracks.py +229 -0
- package/remote_script/LivePilot/transport.py +147 -0
- package/remote_script/LivePilot/utils.py +112 -0
- package/requirements.txt +2 -0
- package/server.json +20 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"""
|
|
2
|
+
LivePilot - Error formatting, validation helpers, and JSON serialization.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# ── Error codes ──────────────────────────────────────────────────────────────
|
|
9
|
+
|
|
10
|
+
INDEX_ERROR = "INDEX_ERROR"
|
|
11
|
+
NOT_FOUND = "NOT_FOUND"
|
|
12
|
+
INVALID_PARAM = "INVALID_PARAM"
|
|
13
|
+
STATE_ERROR = "STATE_ERROR"
|
|
14
|
+
TIMEOUT = "TIMEOUT"
|
|
15
|
+
INTERNAL = "INTERNAL"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ── Response builders ────────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
def success_response(request_id, result=None):
|
|
21
|
+
"""Build a success JSON-RPC-style response."""
|
|
22
|
+
resp = {"id": request_id, "ok": True}
|
|
23
|
+
if result is not None:
|
|
24
|
+
resp["result"] = result
|
|
25
|
+
return resp
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def error_response(request_id, message, code=INTERNAL):
|
|
29
|
+
"""Build an error JSON-RPC-style response."""
|
|
30
|
+
return {
|
|
31
|
+
"id": request_id,
|
|
32
|
+
"ok": False,
|
|
33
|
+
"error": {
|
|
34
|
+
"code": code,
|
|
35
|
+
"message": str(message),
|
|
36
|
+
},
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# ── Validation helpers ───────────────────────────────────────────────────────
|
|
41
|
+
|
|
42
|
+
def get_track(song, track_index):
|
|
43
|
+
"""Return a track by index (0-based). Supports negative indices for
|
|
44
|
+
return tracks: -1 = first return, -2 = second return, etc."""
|
|
45
|
+
tracks = list(song.tracks)
|
|
46
|
+
if track_index < 0:
|
|
47
|
+
return_tracks = list(song.return_tracks)
|
|
48
|
+
ri = abs(track_index) - 1
|
|
49
|
+
if ri >= len(return_tracks):
|
|
50
|
+
raise IndexError(
|
|
51
|
+
"Return track index %d out of range (0..%d)"
|
|
52
|
+
% (ri, len(return_tracks) - 1)
|
|
53
|
+
)
|
|
54
|
+
return return_tracks[ri]
|
|
55
|
+
if track_index >= len(tracks):
|
|
56
|
+
raise IndexError(
|
|
57
|
+
"Track index %d out of range (0..%d)"
|
|
58
|
+
% (track_index, len(tracks) - 1)
|
|
59
|
+
)
|
|
60
|
+
return tracks[track_index]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def get_clip_slot(song, track_index, clip_index):
|
|
64
|
+
"""Return a clip slot by track + slot index."""
|
|
65
|
+
track = get_track(song, track_index)
|
|
66
|
+
slots = list(track.clip_slots)
|
|
67
|
+
if clip_index < 0 or clip_index >= len(slots):
|
|
68
|
+
raise IndexError(
|
|
69
|
+
"Clip slot index %d out of range (0..%d)"
|
|
70
|
+
% (clip_index, len(slots) - 1)
|
|
71
|
+
)
|
|
72
|
+
return slots[clip_index]
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def get_clip(song, track_index, clip_index):
|
|
76
|
+
"""Return a clip (must exist in the slot)."""
|
|
77
|
+
slot = get_clip_slot(song, track_index, clip_index)
|
|
78
|
+
clip = slot.clip
|
|
79
|
+
if clip is None:
|
|
80
|
+
raise ValueError(
|
|
81
|
+
"No clip in track %d, slot %d" % (track_index, clip_index)
|
|
82
|
+
)
|
|
83
|
+
return clip
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def get_device(track, device_index):
|
|
87
|
+
"""Return a device from a track by index."""
|
|
88
|
+
devices = list(track.devices)
|
|
89
|
+
if device_index < 0 or device_index >= len(devices):
|
|
90
|
+
raise IndexError(
|
|
91
|
+
"Device index %d out of range (0..%d)"
|
|
92
|
+
% (device_index, len(devices) - 1)
|
|
93
|
+
)
|
|
94
|
+
return devices[device_index]
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def get_scene(song, scene_index):
|
|
98
|
+
"""Return a scene by index."""
|
|
99
|
+
scenes = list(song.scenes)
|
|
100
|
+
if scene_index < 0 or scene_index >= len(scenes):
|
|
101
|
+
raise IndexError(
|
|
102
|
+
"Scene index %d out of range (0..%d)"
|
|
103
|
+
% (scene_index, len(scenes) - 1)
|
|
104
|
+
)
|
|
105
|
+
return scenes[scene_index]
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# ── JSON serialization ───────────────────────────────────────────────────────
|
|
109
|
+
|
|
110
|
+
def serialize_json(data):
|
|
111
|
+
"""Serialize *data* to a compact JSON string with a trailing newline."""
|
|
112
|
+
return json.dumps(data, separators=(",", ":"), ensure_ascii=True) + "\n"
|
package/requirements.txt
ADDED
package/server.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
+
"name": "io.github.dreamrec/livepilot",
|
|
4
|
+
"description": "AI copilot for Ableton Live 12 — 91 MCP tools for music production and mixing",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/dreamrec/LivePilot",
|
|
7
|
+
"source": "github"
|
|
8
|
+
},
|
|
9
|
+
"version": "1.1.0",
|
|
10
|
+
"packages": [
|
|
11
|
+
{
|
|
12
|
+
"registryType": "npm",
|
|
13
|
+
"identifier": "livepilot",
|
|
14
|
+
"version": "1.1.0",
|
|
15
|
+
"transport": {
|
|
16
|
+
"type": "stdio"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|