-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmanifest.json
More file actions
105 lines (105 loc) · 4.19 KB
/
Copy pathmanifest.json
File metadata and controls
105 lines (105 loc) · 4.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
{
"id": "@ryu/clips",
"name": "Clips",
"version": "0.1.15",
"stability": "experimental",
"category": "Media & Voice",
"description": "Clips: capture and browse screen/timeline clips. A Core→Shadow proxy that depends on the Shadow capture app for its recordings. Runs the out-of-process ryu-clips sidecar; Core proxies /api/clips/* to it. The Shadow record/browse surface is fully served out-of-process (the sidecar reads RYU_SHADOW_URL itself); URL/yt-dlp ingest and auto-file into the Clips Space require Core's kernel machinery and degrade cleanly in the standalone sidecar.",
"tagline": "Capture and browse screen clips",
"keywords": ["clips", "screen", "capture", "video"],
"icon": "film-01",
"iconDither": { "from": 327, "to": "transparent", "direction": "down" },
"surfaces": {
"gateway": { "support": "none" },
"core": { "support": "full" },
"desktop": { "support": "full" },
"island": { "support": "full" },
"mobile": { "support": "full" },
"extension": { "support": "full" },
"web": { "support": "full" },
"cli": { "support": "full" }
},
"engines": {
"ryu": ">=0.1.0"
},
"runnables": [],
"requires": {
"apps": [
{
"id": "shadow",
"min_version": "0.1.15"
}
]
},
"sidecars": [
{
"name": "ryu-clips",
"process": {
"kind": "local",
"command": "ryu-clips",
"command_env": "RYU_CLIPS_BIN",
"port_env": "RYU_CLIPS_PORT"
},
"port": 7992,
"health_path": "/health",
"http": {
"mount": "/api/clips",
"public_mount": "/api/clips",
"routes": [
{ "path": "/" },
{ "path": "/ingest" },
{ "path": "/sources" },
{ "path": "/recent-activity" },
{ "path": "/start" },
{ "path": "/:id/stop" },
{ "path": "/:id/pause" },
{ "path": "/:id/resume" },
{ "path": "/:id/context" },
{ "path": "/:id/frame" },
{ "path": "/:id/file" },
{ "path": "/:id/diagnostics" }
]
}
}
],
"permission_grants": [],
"permission_levels": [
{
"id": "clips.view",
"label": "Can view",
"description": "Browse and play back recorded clips, including whatever was on screen when they were captured."
},
{
"id": "clips.capture",
"label": "Can capture",
"description": "Record new clips and ingest external ones, which starts screen capture on this machine.",
"implies": ["clips.view"]
}
],
"contributes": {
"hook_events": [
{
"id": "@ryu/clips#clip.started",
"title": "Clip recording started",
"description": "Fires when POST /api/clips/start has actually begun a capture on Shadow and a clip id exists. A start Shadow refused, or one that never reached it (the fail-soft `{ available: false }` body), does not fire. The clip has no video and no duration yet — those arrive with `clip.ready`; this is the moment to react to recording having begun (announce it, arm a timer, dim a surface).",
"payload_example": {
"id": "clip_9f2c41a8c1f04e2f9d1e6b0a7c3d5e11",
"title": "Untitled clip",
"createdAt": "2026-08-01T10:04:11.512Z"
}
},
{
"id": "@ryu/clips#clip.ready",
"title": "Clip ready",
"description": "Fires once a finished clip bundle exists — from BOTH paths that produce one: stopping a recording (POST /api/clips/{id}/stop) and completing an ingest of a watched URL or a local video file (POST /api/clips/ingest). `source` is how a consumer tells them apart; the bundle itself does not record which. Fires once per clip, alongside (not after) the auto-file into the Clips Space, so it still fires if that filing fails. `framesEndpoint` is the Core-served path, already rewritten off Shadow's internal one, so a consumer can fetch frames from it directly; the mp4 is at /api/clips/{id}/file.",
"payload_example": {
"id": "clip_9f2c41a8c1f04e2f9d1e6b0a7c3d5e11",
"title": "Demo walkthrough",
"durationMs": 65000,
"source": "recording",
"framesEndpoint": "/api/clips/clip_9f2c41a8c1f04e2f9d1e6b0a7c3d5e11/frame"
}
}
]
}
}