@sylphx/cue 0.1.7 → 0.2.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/README.md +15 -11
- package/bin/{video-reader-mcp → cue} +11 -11
- package/package.json +15 -15
- package/src/types/composeIris.ts +29 -0
package/README.md
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
# Cue
|
|
4
4
|
|
|
5
|
-
### Timeline proof for agents
|
|
5
|
+
### Timeline proof for agents
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Canonical package: **`@sylphx/cue`** · bin **`cue`** · public tools: `read_video`, `video_evidence` only.
|
|
8
|
+
|
|
9
|
+
**Cue** (canonical package `@sylphx/cue`) — local video timeline evidence, not frame-by-frame VLM.
|
|
8
10
|
|
|
9
11
|
<p align="center">
|
|
10
12
|
<img src="https://mark.sylphx.com/api/v1/banner?type=mesh&theme=tokyonight&text=video+reader+mcp&desc=Evidence-first+video+reading+for+AI+agents+%E2%80%94+ffprobe%2C+subtitles%2C+scenes%2C+transcr&height=200&animation=rise&credit=0" alt="video-reader-mcp — Sylphx Mark banner" width="100%" />
|
|
@@ -16,7 +18,7 @@ Evidence-first video reading for AI agents. One call turns any local video into
|
|
|
16
18
|
**timeline document** — ffprobe streams, chapters, embedded subtitles, scene
|
|
17
19
|
boundaries, and warnings you can cite without frame-by-frame vision LLM calls.
|
|
18
20
|
|
|
19
|
-
[](https://www.npmjs.com/package/@sylphx/cue)
|
|
20
22
|
[](https://opensource.org/licenses/MIT)
|
|
21
23
|
[](https://github.com/SylphxAI/video-reader-mcp/actions/workflows/ci.yml)
|
|
22
24
|
[](https://www.typescriptlang.org/)
|
|
@@ -45,6 +47,8 @@ Spec: [docs/specs/agent-video-read-contract.md](docs/specs/agent-video-read-cont
|
|
|
45
47
|
|
|
46
48
|
**Local-first frontier:** ffmpeg/ffprobe + structural keyframes, optional local whisper ASR. No cloud required.
|
|
47
49
|
|
|
50
|
+
Docs: [Cue→Iris semantic timeline](docs/compose-iris.md) — structural keyframes become timestamped objects via Iris L2.
|
|
51
|
+
|
|
48
52
|
## Product docs
|
|
49
53
|
|
|
50
54
|
| Doc | Purpose |
|
|
@@ -86,15 +90,15 @@ not a slideshow summary.**
|
|
|
86
90
|
### Install (30 seconds)
|
|
87
91
|
|
|
88
92
|
```bash
|
|
89
|
-
npm install -g @sylphx/
|
|
93
|
+
npm install -g @sylphx/cue
|
|
90
94
|
cue doctor
|
|
91
|
-
claude mcp add cue -- npx @sylphx/
|
|
95
|
+
claude mcp add cue -- npx @sylphx/cue
|
|
92
96
|
```
|
|
93
97
|
|
|
94
98
|
**Install once. Call once.**
|
|
95
99
|
|
|
96
100
|
```bash
|
|
97
|
-
claude mcp add video-reader -- npx @sylphx/
|
|
101
|
+
claude mcp add video-reader -- npx @sylphx/cue
|
|
98
102
|
```
|
|
99
103
|
|
|
100
104
|
```json
|
|
@@ -172,7 +176,7 @@ Supported formats: MP4, M4V, MKV, MOV, WebM, and other formats ffprobe can inspe
|
|
|
172
176
|
### Claude Code
|
|
173
177
|
|
|
174
178
|
```bash
|
|
175
|
-
claude mcp add video-reader -- npx @sylphx/
|
|
179
|
+
claude mcp add video-reader -- npx @sylphx/cue
|
|
176
180
|
```
|
|
177
181
|
|
|
178
182
|
### Claude Desktop
|
|
@@ -184,7 +188,7 @@ Add this to `claude_desktop_config.json`:
|
|
|
184
188
|
"mcpServers": {
|
|
185
189
|
"video-reader": {
|
|
186
190
|
"command": "npx",
|
|
187
|
-
"args": ["@sylphx/
|
|
191
|
+
"args": ["@sylphx/cue"]
|
|
188
192
|
}
|
|
189
193
|
}
|
|
190
194
|
}
|
|
@@ -193,13 +197,13 @@ Add this to `claude_desktop_config.json`:
|
|
|
193
197
|
### Any MCP Client
|
|
194
198
|
|
|
195
199
|
```bash
|
|
196
|
-
npx @sylphx/
|
|
200
|
+
npx @sylphx/cue
|
|
197
201
|
```
|
|
198
202
|
|
|
199
203
|
### HTTP transport (optional)
|
|
200
204
|
|
|
201
205
|
```bash
|
|
202
|
-
MCP_TRANSPORT=http MCP_HTTP_PORT=8080 npx @sylphx/
|
|
206
|
+
MCP_TRANSPORT=http MCP_HTTP_PORT=8080 npx @sylphx/cue
|
|
203
207
|
```
|
|
204
208
|
|
|
205
209
|
## Security model
|
|
@@ -246,7 +250,7 @@ when available on the runner.
|
|
|
246
250
|
## Support
|
|
247
251
|
|
|
248
252
|
- [Issues](https://github.com/SylphxAI/video-reader-mcp/issues)
|
|
249
|
-
- [npm package](https://www.npmjs.com/package/@sylphx/
|
|
253
|
+
- [npm package](https://www.npmjs.com/package/@sylphx/cue)
|
|
250
254
|
- Portfolio orchestration: [smart-reader-mcp](https://github.com/SylphxAI/smart-reader-mcp)
|
|
251
255
|
|
|
252
256
|
## Help this reach more builders
|
|
@@ -23,10 +23,10 @@ host_platform_key() {
|
|
|
23
23
|
|
|
24
24
|
platform_package_name() {
|
|
25
25
|
case "$(host_platform_key)" in
|
|
26
|
-
darwin-arm64) printf '%s\n' '@sylphx/
|
|
27
|
-
darwin-x64) printf '%s\n' '@sylphx/
|
|
28
|
-
linux-x64) printf '%s\n' '@sylphx/
|
|
29
|
-
linux-arm64) printf '%s\n' '@sylphx/
|
|
26
|
+
darwin-arm64) printf '%s\n' '@sylphx/cue-darwin-arm64' ;;
|
|
27
|
+
darwin-x64) printf '%s\n' '@sylphx/cue-darwin-x64' ;;
|
|
28
|
+
linux-x64) printf '%s\n' '@sylphx/cue-linux-x64-gnu' ;;
|
|
29
|
+
linux-arm64) printf '%s\n' '@sylphx/cue-linux-arm64-gnu' ;;
|
|
30
30
|
*) return 1 ;;
|
|
31
31
|
esac
|
|
32
32
|
}
|
|
@@ -47,7 +47,7 @@ resolve_from_optional_dep() {
|
|
|
47
47
|
"$PACKAGE_ROOT/../../node_modules"
|
|
48
48
|
)
|
|
49
49
|
for root in "${search_roots[@]}"; do
|
|
50
|
-
candidate="$root/$pkg_name/
|
|
50
|
+
candidate="$root/$pkg_name/cue-mcp-server"
|
|
51
51
|
if is_runnable_native "$candidate"; then
|
|
52
52
|
printf '%s\n' "$candidate"
|
|
53
53
|
return 0
|
|
@@ -61,7 +61,7 @@ resolve_from_optional_dep() {
|
|
|
61
61
|
const { createRequire } = require('node:module');
|
|
62
62
|
const r = createRequire(p.join(process.argv[1], 'package.json'));
|
|
63
63
|
const pkg = r.resolve(process.argv[2] + '/package.json');
|
|
64
|
-
process.stdout.write(p.join(p.dirname(pkg), '
|
|
64
|
+
process.stdout.write(p.join(p.dirname(pkg), 'cue-mcp-server'));
|
|
65
65
|
} catch { process.exit(1); }
|
|
66
66
|
" "$PACKAGE_ROOT" "$pkg_name" 2>/dev/null || true
|
|
67
67
|
)"
|
|
@@ -74,8 +74,8 @@ resolve_from_optional_dep() {
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
resolve_rust_bin() {
|
|
77
|
-
if [[ -n "${
|
|
78
|
-
printf '%s\n' "${
|
|
77
|
+
if [[ -n "${CUE_RUST_BIN:-}" && -x "${CUE_RUST_BIN}" ]]; then
|
|
78
|
+
printf '%s\n' "${CUE_RUST_BIN}"
|
|
79
79
|
return 0
|
|
80
80
|
fi
|
|
81
81
|
if bin="$(resolve_from_optional_dep)"; then
|
|
@@ -83,9 +83,9 @@ resolve_rust_bin() {
|
|
|
83
83
|
return 0
|
|
84
84
|
fi
|
|
85
85
|
for candidate in \
|
|
86
|
-
"$PACKAGE_ROOT/bin/native/
|
|
87
|
-
"$PACKAGE_ROOT/target/release/
|
|
88
|
-
"$PACKAGE_ROOT/target/debug/
|
|
86
|
+
"$PACKAGE_ROOT/bin/native/cue-mcp-server" \
|
|
87
|
+
"$PACKAGE_ROOT/target/release/cue-mcp-server" \
|
|
88
|
+
"$PACKAGE_ROOT/target/debug/cue-mcp-server"; do
|
|
89
89
|
if is_runnable_native "$candidate"; then
|
|
90
90
|
printf '%s\n' "$candidate"
|
|
91
91
|
return 0
|
package/package.json
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sylphx/cue",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"mcpName": "io.github.SylphxAI/
|
|
5
|
-
"description": "Cue
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"mcpName": "io.github.SylphxAI/cue",
|
|
5
|
+
"description": "Cue \u2014 timeline proof for agents. Local video evidence (ffprobe, subtitles, scenes) via MCP/CLI/SDK. Not frame-by-frame VLM.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"publishConfig": {
|
|
8
8
|
"access": "public"
|
|
9
9
|
},
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"bin": {
|
|
12
|
-
"
|
|
13
|
-
"cue": "./bin/video-reader-mcp"
|
|
12
|
+
"cue": "./bin/cue"
|
|
14
13
|
},
|
|
15
14
|
"files": [
|
|
16
|
-
"bin/
|
|
15
|
+
"bin/cue",
|
|
17
16
|
"dist/",
|
|
18
17
|
"README.md",
|
|
19
18
|
"LICENSE",
|
|
@@ -21,8 +20,7 @@
|
|
|
21
20
|
],
|
|
22
21
|
"exports": {
|
|
23
22
|
".": "./dist/doctor-cli.js",
|
|
24
|
-
"./sdk": "./src/sdk.ts"
|
|
25
|
-
"./cue": "./src/sdk.ts"
|
|
23
|
+
"./sdk": "./src/sdk.ts"
|
|
26
24
|
},
|
|
27
25
|
"repository": {
|
|
28
26
|
"type": "git",
|
|
@@ -54,13 +52,15 @@
|
|
|
54
52
|
"check:fix": "biome check --write .",
|
|
55
53
|
"sync:server-json": "bun scripts/sync-server-json.ts",
|
|
56
54
|
"version-packages": "changeset version && bun run sync:server-json",
|
|
57
|
-
"start": "./bin/
|
|
55
|
+
"start": "./bin/cue",
|
|
58
56
|
"clean": "rm -rf dist coverage",
|
|
57
|
+
"prepublishOnly": "bun run clean && bun run build && bun run build:rust",
|
|
59
58
|
"release": "bun run typecheck && bun run check && bun run build && bun test && changeset publish",
|
|
60
59
|
"doctor": "bun run src/doctor-cli.ts",
|
|
61
60
|
"benchmark:release-gate": "bun scripts/release-gate.ts",
|
|
62
61
|
"benchmark:public-proof": "bun scripts/public-proof.ts",
|
|
63
|
-
"brand:pack-plan": "bun scripts/brand-pack-plan.ts"
|
|
62
|
+
"brand:pack-plan": "bun scripts/brand-pack-plan.ts",
|
|
63
|
+
"compose:iris": "bun scripts/compose-iris.ts"
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
66
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
@@ -77,9 +77,9 @@
|
|
|
77
77
|
"packageManager": "bun@1.3.12",
|
|
78
78
|
"private": false,
|
|
79
79
|
"optionalDependencies": {
|
|
80
|
-
"@sylphx/
|
|
81
|
-
"@sylphx/
|
|
82
|
-
"@sylphx/
|
|
83
|
-
"@sylphx/
|
|
80
|
+
"@sylphx/cue-darwin-arm64": "0.2.0",
|
|
81
|
+
"@sylphx/cue-darwin-x64": "0.2.0",
|
|
82
|
+
"@sylphx/cue-linux-x64-gnu": "0.2.0",
|
|
83
|
+
"@sylphx/cue-linux-arm64-gnu": "0.2.0"
|
|
84
84
|
}
|
|
85
|
-
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ComposedKeyframeObject {
|
|
2
|
+
id: string;
|
|
3
|
+
label: string;
|
|
4
|
+
category?: string | undefined;
|
|
5
|
+
bbox?: { x: number; y: number; width: number; height: number } | undefined;
|
|
6
|
+
score?: number | undefined;
|
|
7
|
+
mask_ref?: string | null | undefined;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface ComposedKeyframe {
|
|
11
|
+
time_ms: number;
|
|
12
|
+
frame: string;
|
|
13
|
+
semantics_available: boolean;
|
|
14
|
+
skipped_reason?: string | undefined;
|
|
15
|
+
objects: ComposedKeyframeObject[];
|
|
16
|
+
caption?: string | undefined;
|
|
17
|
+
model?: string | undefined;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface ComposedIrisResult {
|
|
21
|
+
policy: 'cue_compose_iris_v1';
|
|
22
|
+
video: string;
|
|
23
|
+
keyframe_policy: string;
|
|
24
|
+
generated_at: string;
|
|
25
|
+
keyframe_count: number;
|
|
26
|
+
total_objects: number;
|
|
27
|
+
keyframes: ComposedKeyframe[];
|
|
28
|
+
warnings: string[];
|
|
29
|
+
}
|