gooseworks 0.4.2 → 0.4.5-dev.15.facf60fb
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 +84 -22
- package/dist/agents/staging.d.ts +38 -0
- package/dist/agents/staging.d.ts.map +1 -0
- package/dist/agents/staging.js +309 -0
- package/dist/agents/staging.js.map +1 -0
- package/dist/auth/credentials.d.ts +1 -0
- package/dist/auth/credentials.d.ts.map +1 -1
- package/dist/auth/credentials.js +26 -8
- package/dist/auth/credentials.js.map +1 -1
- package/dist/auth/device-flow.d.ts +79 -0
- package/dist/auth/device-flow.d.ts.map +1 -0
- package/dist/auth/device-flow.js +411 -0
- package/dist/auth/device-flow.js.map +1 -0
- package/dist/auth/login-mode.d.ts +25 -0
- package/dist/auth/login-mode.d.ts.map +1 -0
- package/dist/auth/login-mode.js +87 -0
- package/dist/auth/login-mode.js.map +1 -0
- package/dist/auth/oauth-server.d.ts +2 -2
- package/dist/auth/oauth-server.d.ts.map +1 -1
- package/dist/auth/oauth-server.js +28 -5
- package/dist/auth/oauth-server.js.map +1 -1
- package/dist/auth/paste-login.d.ts +27 -0
- package/dist/auth/paste-login.d.ts.map +1 -0
- package/dist/auth/paste-login.js +203 -0
- package/dist/auth/paste-login.js.map +1 -0
- package/dist/commands/doctor.d.ts +29 -5
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +116 -63
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/fetch.d.ts +1 -0
- package/dist/commands/fetch.d.ts.map +1 -1
- package/dist/commands/fetch.js +64 -29
- package/dist/commands/fetch.js.map +1 -1
- package/dist/commands/formats.js +2 -2
- package/dist/commands/formats.js.map +1 -1
- package/dist/commands/graphics/publish-flow.js +1 -1
- package/dist/commands/graphics/publish-flow.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +126 -26
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/launch.d.ts +3 -0
- package/dist/commands/launch.d.ts.map +1 -0
- package/dist/commands/launch.js +35 -0
- package/dist/commands/launch.js.map +1 -0
- package/dist/commands/login.d.ts +21 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +112 -30
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +7 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/skills.d.ts +50 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +160 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/styles.js +2 -2
- package/dist/commands/styles.js.map +1 -1
- package/dist/commands/tool.d.ts +17 -0
- package/dist/commands/tool.d.ts.map +1 -0
- package/dist/commands/tool.js +239 -0
- package/dist/commands/tool.js.map +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +37 -6
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/video-local.d.ts +9 -0
- package/dist/commands/video-local.d.ts.map +1 -0
- package/dist/commands/video-local.js +83 -0
- package/dist/commands/video-local.js.map +1 -0
- package/dist/commands/video-save.d.ts +3 -0
- package/dist/commands/video-save.d.ts.map +1 -0
- package/dist/commands/video-save.js +83 -0
- package/dist/commands/video-save.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -3
- package/dist/config.js.map +1 -1
- package/dist/environment.d.ts +9 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +105 -0
- package/dist/environment.js.map +1 -0
- package/dist/index.js +12 -38
- package/dist/index.js.map +1 -1
- package/dist/lib/graphics-cache.d.ts.map +1 -1
- package/dist/lib/graphics-cache.js +2 -2
- package/dist/lib/graphics-cache.js.map +1 -1
- package/dist/lib/mcp-client.d.ts +53 -0
- package/dist/lib/mcp-client.d.ts.map +1 -0
- package/dist/lib/mcp-client.js +196 -0
- package/dist/lib/mcp-client.js.map +1 -0
- package/dist/lib/video-local-captions.d.ts +83 -0
- package/dist/lib/video-local-captions.d.ts.map +1 -0
- package/dist/lib/video-local-captions.js +261 -0
- package/dist/lib/video-local-captions.js.map +1 -0
- package/dist/lib/video-local-runtime.d.ts +8 -0
- package/dist/lib/video-local-runtime.d.ts.map +1 -0
- package/dist/lib/video-local-runtime.js +201 -0
- package/dist/lib/video-local-runtime.js.map +1 -0
- package/dist/lib/video-save-mcp.d.ts +9 -0
- package/dist/lib/video-save-mcp.d.ts.map +1 -0
- package/dist/lib/video-save-mcp.js +162 -0
- package/dist/lib/video-save-mcp.js.map +1 -0
- package/dist/lib/video-save.d.ts +77 -0
- package/dist/lib/video-save.d.ts.map +1 -0
- package/dist/lib/video-save.js +440 -0
- package/dist/lib/video-save.js.map +1 -0
- package/dist/program.d.ts +2 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +56 -0
- package/dist/program.js.map +1 -0
- package/dist/skills/custom-video-skill.d.ts +3 -0
- package/dist/skills/custom-video-skill.d.ts.map +1 -0
- package/dist/skills/custom-video-skill.js +6 -0
- package/dist/skills/custom-video-skill.js.map +1 -0
- package/dist/skills/installer.d.ts +12 -6
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +82 -38
- package/dist/skills/installer.js.map +1 -1
- package/dist/skills/master-skill.d.ts +34 -28
- package/dist/skills/master-skill.d.ts.map +1 -1
- package/dist/skills/master-skill.js +2264 -858
- package/dist/skills/master-skill.js.map +1 -1
- package/dist/skills/package-freshness.d.ts +16 -0
- package/dist/skills/package-freshness.d.ts.map +1 -0
- package/dist/skills/package-freshness.js +36 -0
- package/dist/skills/package-freshness.js.map +1 -0
- package/dist/skills/releases.d.ts +12 -0
- package/dist/skills/releases.d.ts.map +1 -0
- package/dist/skills/releases.js +155 -0
- package/dist/skills/releases.js.map +1 -0
- package/dist/skills/routes.d.ts.map +1 -1
- package/dist/skills/routes.js +12 -6
- package/dist/skills/routes.js.map +1 -1
- package/dist/skills/staging-content.d.ts +3 -0
- package/dist/skills/staging-content.d.ts.map +1 -0
- package/dist/skills/staging-content.js +12 -0
- package/dist/skills/staging-content.js.map +1 -0
- package/dist/utils/browser-preflight.d.ts +29 -0
- package/dist/utils/browser-preflight.d.ts.map +1 -0
- package/dist/utils/browser-preflight.js +338 -0
- package/dist/utils/browser-preflight.js.map +1 -0
- package/dist/utils/http.d.ts +7 -1
- package/dist/utils/http.d.ts.map +1 -1
- package/dist/utils/http.js +5 -1
- package/dist/utils/http.js.map +1 -1
- package/package.json +11 -3
- package/skills/goose-ads/SKILL.md +509 -239
- package/skills/goose-product-photos/SKILL.md +161 -60
- package/skills/goose-video/SKILL.md +592 -259
- package/skills/goose-video-local/SKILL.md +1409 -236
- package/skills/gooseworks/SKILL.md +327 -34
- package/skills/make-custom-video/SKILL.md +735 -0
- package/skills/manifest.json +12 -0
- package/skills/routes.json +13 -6
- package/dist/skills/fetcher.d.ts +0 -18
- package/dist/skills/fetcher.d.ts.map +0 -1
- package/dist/skills/fetcher.js +0 -118
- package/dist/skills/fetcher.js.map +0 -1
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ffmpegCaptionArgs = exports.LOCAL_UPLOAD_TIMEOUT_MS = void 0;
|
|
37
|
+
exports.createCaptionTransport = createCaptionTransport;
|
|
38
|
+
exports.createCaptionRuntime = createCaptionRuntime;
|
|
39
|
+
const crypto_1 = require("crypto");
|
|
40
|
+
const child_process_1 = require("child_process");
|
|
41
|
+
const fs_1 = require("fs");
|
|
42
|
+
const promises_1 = require("fs/promises");
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const stream_1 = require("stream");
|
|
45
|
+
const video_local_captions_1 = require("./video-local-captions");
|
|
46
|
+
const MAX_OUTPUT_BYTES = 150 * 1024 * 1024;
|
|
47
|
+
function run(bin, args, cwd, timeoutMs = 10 * 60_000) {
|
|
48
|
+
return new Promise((resolve, reject) => {
|
|
49
|
+
const child = (0, child_process_1.spawn)(bin, args, { cwd, shell: false, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
50
|
+
let output = '';
|
|
51
|
+
const timeout = setTimeout(() => child.kill('SIGKILL'), timeoutMs);
|
|
52
|
+
const append = (chunk) => {
|
|
53
|
+
output = (output + chunk.toString('utf8')).slice(-1024 * 1024);
|
|
54
|
+
};
|
|
55
|
+
child.stdout.on('data', append);
|
|
56
|
+
child.stderr.on('data', append);
|
|
57
|
+
child.on('error', (error) => { clearTimeout(timeout); reject(error); });
|
|
58
|
+
child.on('close', (code) => {
|
|
59
|
+
clearTimeout(timeout);
|
|
60
|
+
if (code === 0)
|
|
61
|
+
resolve(output);
|
|
62
|
+
else
|
|
63
|
+
reject(new Error(`${bin} failed (${code ?? 'timeout'}): ${output.slice(-500)}`));
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
exports.LOCAL_UPLOAD_TIMEOUT_MS = 10 * 60_000;
|
|
68
|
+
async function fetchJson(url, apiKey, init, timeoutMs = 30_000) {
|
|
69
|
+
const response = await fetch(url, {
|
|
70
|
+
...init,
|
|
71
|
+
headers: { Authorization: `Bearer ${apiKey}`, Accept: 'application/json', ...init.headers },
|
|
72
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
73
|
+
});
|
|
74
|
+
if (!response.ok)
|
|
75
|
+
throw new Error(`Video-local API returned HTTP ${response.status}`);
|
|
76
|
+
const parsed = await response.json();
|
|
77
|
+
if (parsed.status !== 'success')
|
|
78
|
+
throw new Error('Video-local API returned an unsuccessful response');
|
|
79
|
+
return parsed.data;
|
|
80
|
+
}
|
|
81
|
+
/** HTTP transport uses only the scoped, authenticated local-node route. */
|
|
82
|
+
function createCaptionTransport(apiBase, apiKey) {
|
|
83
|
+
if (!apiKey.startsWith('cal_'))
|
|
84
|
+
throw new Error('A cal_ GooseWorks token is required for local video claims');
|
|
85
|
+
const base = `${apiBase.replace(/\/$/, '')}/api/ads/video-local`;
|
|
86
|
+
return {
|
|
87
|
+
async next(projectId, workerId) {
|
|
88
|
+
const query = new URLSearchParams({ project_id: projectId, worker_id: workerId });
|
|
89
|
+
return fetchJson(`${base}/claims/next?${query}`, apiKey, { method: 'GET' });
|
|
90
|
+
},
|
|
91
|
+
async status(claimId, leaseToken) {
|
|
92
|
+
return fetchJson(`${base}/claims/${encodeURIComponent(claimId)}`, apiKey, {
|
|
93
|
+
method: 'GET', headers: { 'X-Video-Local-Lease': leaseToken },
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
async heartbeat(claimId, leaseToken) {
|
|
97
|
+
await fetchJson(`${base}/claims/${encodeURIComponent(claimId)}/heartbeat`, apiKey, {
|
|
98
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
99
|
+
body: JSON.stringify({ lease_token: leaseToken }),
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
async complete(claimId, leaseToken, outputPath, sha256) {
|
|
103
|
+
const info = await (0, promises_1.stat)(outputPath);
|
|
104
|
+
if (!info.isFile() || info.size < 1024 || info.size > MAX_OUTPUT_BYTES) {
|
|
105
|
+
throw new Error('Caption output exceeds the allowed upload size');
|
|
106
|
+
}
|
|
107
|
+
const boundary = `goose-local-${(0, crypto_1.randomBytes)(16).toString('hex')}`;
|
|
108
|
+
const head = Buffer.from(`--${boundary}\r\nContent-Disposition: form-data; name="lease_token"\r\n\r\n${leaseToken}\r\n` +
|
|
109
|
+
`--${boundary}\r\nContent-Disposition: form-data; name="sha256"\r\n\r\n${sha256}\r\n` +
|
|
110
|
+
`--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="captioned.mp4"\r\n` +
|
|
111
|
+
'Content-Type: video/mp4\r\n\r\n');
|
|
112
|
+
const tail = Buffer.from(`\r\n--${boundary}--\r\n`);
|
|
113
|
+
const body = stream_1.Readable.from((async function* () {
|
|
114
|
+
yield head;
|
|
115
|
+
for await (const chunk of (0, fs_1.createReadStream)(outputPath))
|
|
116
|
+
yield chunk;
|
|
117
|
+
yield tail;
|
|
118
|
+
})());
|
|
119
|
+
await fetchJson(`${base}/claims/${encodeURIComponent(claimId)}/complete`, apiKey, {
|
|
120
|
+
method: 'POST', body: body,
|
|
121
|
+
headers: { 'Content-Type': `multipart/form-data; boundary=${boundary}`,
|
|
122
|
+
'Content-Length': String(head.length + info.size + tail.length) },
|
|
123
|
+
duplex: 'half',
|
|
124
|
+
}, exports.LOCAL_UPLOAD_TIMEOUT_MS);
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/** Reviewed, fixed ffmpeg flags. Neither the server package nor the user supplies flags. */
|
|
129
|
+
const ffmpegCaptionArgs = (sourceName = 'source.mp4') => [
|
|
130
|
+
'-hide_banner', '-nostdin', '-loglevel', 'error', '-y', '-i', sourceName,
|
|
131
|
+
'-map', '0:v:0', '-map', '0:a?', '-vf', 'ass=captions.ass',
|
|
132
|
+
'-c:v', 'libx264', '-preset', 'medium', '-crf', '18', '-pix_fmt', 'yuv420p',
|
|
133
|
+
'-c:a', 'copy', '-sn', '-dn', '-movflags', '+faststart', 'captioned.mp4',
|
|
134
|
+
];
|
|
135
|
+
exports.ffmpegCaptionArgs = ffmpegCaptionArgs;
|
|
136
|
+
function createCaptionRuntime(ffmpeg = 'ffmpeg', ffprobe = 'ffprobe') {
|
|
137
|
+
return {
|
|
138
|
+
async preflight() {
|
|
139
|
+
const version = (await run(ffmpeg, ['-version'])).split('\n')[0];
|
|
140
|
+
const encoders = await run(ffmpeg, ['-hide_banner', '-encoders']);
|
|
141
|
+
const filters = await run(ffmpeg, ['-hide_banner', '-filters']);
|
|
142
|
+
if (!/\blibx264\b/.test(encoders) || !/\bass\b/.test(filters)) {
|
|
143
|
+
throw new Error('ffmpeg requires libx264 and the libass ass filter');
|
|
144
|
+
}
|
|
145
|
+
await run(ffprobe, ['-version']);
|
|
146
|
+
return version;
|
|
147
|
+
},
|
|
148
|
+
async download(url, target, expectedSha256) {
|
|
149
|
+
const response = await fetch(url, {
|
|
150
|
+
redirect: 'error', signal: AbortSignal.timeout(180_000),
|
|
151
|
+
});
|
|
152
|
+
if (!response.ok || !response.body)
|
|
153
|
+
throw new Error(`Caption source download failed (HTTP ${response.status})`);
|
|
154
|
+
const length = Number(response.headers.get('content-length'));
|
|
155
|
+
if (Number.isFinite(length) && length > video_local_captions_1.MAX_CAPTION_SOURCE_BYTES)
|
|
156
|
+
throw new Error('Caption source exceeds size cap');
|
|
157
|
+
const file = await (0, promises_1.open)(target, 'w', 0o600);
|
|
158
|
+
const hash = (0, crypto_1.createHash)('sha256');
|
|
159
|
+
let size = 0;
|
|
160
|
+
try {
|
|
161
|
+
const reader = response.body.getReader();
|
|
162
|
+
for (;;) {
|
|
163
|
+
const { done, value } = await reader.read();
|
|
164
|
+
if (done)
|
|
165
|
+
break;
|
|
166
|
+
size += value.byteLength;
|
|
167
|
+
if (size > video_local_captions_1.MAX_CAPTION_SOURCE_BYTES)
|
|
168
|
+
throw new Error('Caption source exceeds size cap');
|
|
169
|
+
hash.update(value);
|
|
170
|
+
await file.write(value);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
await file.close();
|
|
175
|
+
}
|
|
176
|
+
if (size < 1024)
|
|
177
|
+
throw new Error('Caption source is too small');
|
|
178
|
+
const actual = hash.digest('hex');
|
|
179
|
+
if (expectedSha256 && actual !== expectedSha256.toLowerCase())
|
|
180
|
+
throw new Error('Caption source checksum mismatch');
|
|
181
|
+
return actual;
|
|
182
|
+
},
|
|
183
|
+
async render(source, ass, output) {
|
|
184
|
+
const dir = path.dirname(output);
|
|
185
|
+
if (path.dirname(source) !== dir || path.dirname(ass) !== dir ||
|
|
186
|
+
path.basename(source) !== 'source.mp4' || path.basename(ass) !== 'captions.ass' ||
|
|
187
|
+
path.basename(output) !== 'captioned.mp4') {
|
|
188
|
+
throw new Error('Caption renderer requires its private claim directory');
|
|
189
|
+
}
|
|
190
|
+
await run(ffmpeg, (0, exports.ffmpegCaptionArgs)(), dir);
|
|
191
|
+
},
|
|
192
|
+
async probe(output) {
|
|
193
|
+
const raw = await run(ffprobe, ['-v', 'error', '-select_streams', 'v:0',
|
|
194
|
+
'-show_entries', 'stream=width,height:format=duration', '-of', 'json', output]);
|
|
195
|
+
const data = JSON.parse(raw);
|
|
196
|
+
return { width: Number(data.streams?.[0]?.width), height: Number(data.streams?.[0]?.height),
|
|
197
|
+
duration_s: Number(data.format?.duration) };
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=video-local-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-local-runtime.js","sourceRoot":"","sources":["../../src/lib/video-local-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Uses the normal saved CLI login and canonical MCP tools, never raw Ads REST. */
|
|
2
|
+
import type { Credentials } from '../auth/credentials';
|
|
3
|
+
import type { SaveTransport } from './video-save';
|
|
4
|
+
export declare class SaveToolError extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
constructor(code: string);
|
|
7
|
+
}
|
|
8
|
+
export declare function createSaveTransport(creds: Credentials): Promise<SaveTransport>;
|
|
9
|
+
//# sourceMappingURL=video-save-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-save-mcp.d.ts","sourceRoot":"","sources":["../../src/lib/video-save-mcp.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,qBAAa,aAAc,SAAQ,KAAK;aACV,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CACzC;AAyBD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAmFpF"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SaveToolError = void 0;
|
|
4
|
+
exports.createSaveTransport = createSaveTransport;
|
|
5
|
+
class SaveToolError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
constructor(code) {
|
|
8
|
+
super(`GooseWorks save tool failed (${code}); reconnect or diagnose on the original connection`);
|
|
9
|
+
this.code = code;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.SaveToolError = SaveToolError;
|
|
13
|
+
const ALLOWED = new Set(['account_whoami', 'video_project_read', 'media_list', 'media_upload',
|
|
14
|
+
'media_confirm', 'video_render_run', 'video_project_upsert']);
|
|
15
|
+
function safeUrl(value) {
|
|
16
|
+
const url = new URL(value);
|
|
17
|
+
if (url.username || url.password || url.hash ||
|
|
18
|
+
(url.protocol !== 'https:' && !(url.protocol === 'http:' && ['127.0.0.1', 'localhost', '[::1]'].includes(url.hostname)))) {
|
|
19
|
+
throw new Error('Save connection and storage must use HTTPS (or local fixture HTTP)');
|
|
20
|
+
}
|
|
21
|
+
return url;
|
|
22
|
+
}
|
|
23
|
+
async function bounded(response, max) {
|
|
24
|
+
if (!response.ok || !response.body)
|
|
25
|
+
throw new Error(`Save storage returned HTTP ${response.status}`);
|
|
26
|
+
const length = Number(response.headers.get('content-length'));
|
|
27
|
+
if (length > max)
|
|
28
|
+
throw new Error('Save response is too large');
|
|
29
|
+
const reader = response.body.getReader();
|
|
30
|
+
const chunks = [];
|
|
31
|
+
let size = 0;
|
|
32
|
+
try {
|
|
33
|
+
for (;;) {
|
|
34
|
+
const { value, done } = await reader.read();
|
|
35
|
+
if (done)
|
|
36
|
+
break;
|
|
37
|
+
size += value.length;
|
|
38
|
+
if (size > max)
|
|
39
|
+
throw new Error('Save response is too large');
|
|
40
|
+
chunks.push(Buffer.from(value));
|
|
41
|
+
}
|
|
42
|
+
return Buffer.concat(chunks);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await reader.cancel().catch(() => undefined);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function createSaveTransport(creds) {
|
|
49
|
+
if (!creds.mcp_server_url)
|
|
50
|
+
throw new Error('Connect GooseWorks MCP with the normal login/install flow before saving');
|
|
51
|
+
const endpoint = safeUrl(creds.mcp_server_url);
|
|
52
|
+
if (endpoint.search)
|
|
53
|
+
throw new Error('MCP credentials belong in the normal Authorization header');
|
|
54
|
+
const endpointPath = endpoint.pathname.replace(/\/$/, '');
|
|
55
|
+
endpoint.pathname = endpointPath.endsWith('/mcp') ? endpointPath : `${endpointPath}/mcp`;
|
|
56
|
+
const apiOrigin = safeUrl(creds.api_base).origin;
|
|
57
|
+
let session;
|
|
58
|
+
let sequence = 0;
|
|
59
|
+
let protocol = '2025-03-26';
|
|
60
|
+
const rpc = async (method, params, notification = false) => {
|
|
61
|
+
const id = ++sequence;
|
|
62
|
+
let response;
|
|
63
|
+
try {
|
|
64
|
+
response = await fetch(endpoint, { method: 'POST', redirect: 'error', signal: AbortSignal.timeout(60_000),
|
|
65
|
+
headers: { Authorization: `Bearer ${creds.api_key}`, 'Content-Type': 'application/json',
|
|
66
|
+
Accept: 'application/json, text/event-stream', 'MCP-Protocol-Version': protocol,
|
|
67
|
+
...(session ? { 'Mcp-Session-Id': session } : {}) },
|
|
68
|
+
body: JSON.stringify({ jsonrpc: '2.0', ...(notification ? {} : { id }), method, params }) });
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
throw new Error('GooseWorks connection interrupted; retain the checkpoint and reconnect normally before resuming');
|
|
72
|
+
}
|
|
73
|
+
if (response.status === 401 || response.status === 403)
|
|
74
|
+
throw new Error('GooseWorks authorization needs the normal login/reconnect flow; finished files remain local');
|
|
75
|
+
if (response.status === 404)
|
|
76
|
+
throw new Error('GooseWorks session/tools unavailable; reconnect normally and resume this checkpoint');
|
|
77
|
+
if (notification && response.ok) {
|
|
78
|
+
await response.body?.cancel();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const body = (await bounded(response, 8 * 1024 * 1024)).toString('utf8');
|
|
82
|
+
session = response.headers.get('mcp-session-id') ?? session;
|
|
83
|
+
let message;
|
|
84
|
+
if (response.headers.get('content-type')?.includes('text/event-stream')) {
|
|
85
|
+
for (const event of body.split(/\r?\n\r?\n/)) {
|
|
86
|
+
const data = event.split(/\r?\n/).filter(line => line.startsWith('data:')).map(line => line.slice(5).trimStart()).join('\n');
|
|
87
|
+
if (!data)
|
|
88
|
+
continue;
|
|
89
|
+
const parsed = JSON.parse(data);
|
|
90
|
+
if (parsed.id === id)
|
|
91
|
+
message = parsed;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else
|
|
95
|
+
message = JSON.parse(body);
|
|
96
|
+
if (!message || message.id !== id || message.error || !message.result)
|
|
97
|
+
throw new Error('Uncertain MCP reply; read remote state on the next resume');
|
|
98
|
+
return message.result;
|
|
99
|
+
};
|
|
100
|
+
const initialized = await rpc('initialize', { protocolVersion: protocol, capabilities: {},
|
|
101
|
+
clientInfo: { name: 'gooseworks-video-save', version: '1' } });
|
|
102
|
+
if (typeof initialized.protocolVersion === 'string')
|
|
103
|
+
protocol = initialized.protocolVersion;
|
|
104
|
+
await rpc('notifications/initialized', {}, true);
|
|
105
|
+
// Old servers can strip unknown optional patch fields. Never send a guarded
|
|
106
|
+
// write until the selected server advertises the atomic contract itself.
|
|
107
|
+
let cursor;
|
|
108
|
+
let guardedSelection = false;
|
|
109
|
+
const seen = new Set();
|
|
110
|
+
do {
|
|
111
|
+
const listed = await rpc('tools/list', cursor ? { cursor } : {});
|
|
112
|
+
const tool = listed.tools?.find((tool) => tool.name === 'video_project_upsert');
|
|
113
|
+
const guard = tool?.inputSchema?.properties?.patch?.properties?.final_selection_guard;
|
|
114
|
+
if (guard?.properties?.expected_final_render_id && guard?.properties?.expected_review_digest &&
|
|
115
|
+
['expected_final_render_id', 'expected_review_digest'].every(key => guard.required?.includes(key)))
|
|
116
|
+
guardedSelection = true;
|
|
117
|
+
const next = listed.nextCursor;
|
|
118
|
+
if (next !== undefined && (typeof next !== 'string' || seen.has(next) || seen.size >= 100))
|
|
119
|
+
throw new Error('Uncertain save tool contracts; reconnect normally');
|
|
120
|
+
if (next)
|
|
121
|
+
seen.add(next);
|
|
122
|
+
cursor = next;
|
|
123
|
+
} while (cursor && !guardedSelection);
|
|
124
|
+
if (!guardedSelection)
|
|
125
|
+
throw new Error('This GooseWorks connection does not advertise atomic final selection. Update/reconnect the server before saving; retain finished files and the checkpoint.');
|
|
126
|
+
return {
|
|
127
|
+
async call(name, args) {
|
|
128
|
+
if (!ALLOWED.has(name) || (name === 'video_render_run' &&
|
|
129
|
+
(!args.render?.render_id || args.render.status !== 'complete' || Object.keys(args).some(k => !['brand_id', 'project_id', 'render'].includes(k)))) ||
|
|
130
|
+
(name === 'video_project_upsert' && (Object.keys(args).some(k => !['brand_id', 'project_id', 'patch'].includes(k)) ||
|
|
131
|
+
Object.keys(args.patch ?? {}).some(k => !['final_render_id', 'final_selection_guard'].includes(k)) ||
|
|
132
|
+
!args.patch.final_render_id || !args.patch.final_selection_guard ||
|
|
133
|
+
Object.keys(args.patch.final_selection_guard).sort().join(',') !== 'expected_final_render_id,expected_review_digest' ||
|
|
134
|
+
!(args.patch.final_selection_guard.expected_final_render_id === null ||
|
|
135
|
+
typeof args.patch.final_selection_guard.expected_final_render_id === 'string') ||
|
|
136
|
+
!/^[a-f0-9]{64}$/.test(args.patch.final_selection_guard.expected_review_digest))))
|
|
137
|
+
throw new Error('Save-only transport refused a generation or unrelated write');
|
|
138
|
+
const result = await rpc('tools/call', { name, arguments: args });
|
|
139
|
+
const text = result.content?.find((block) => block.type === 'text')?.text;
|
|
140
|
+
if (typeof text !== 'string')
|
|
141
|
+
throw new Error('Incomplete MCP save reply');
|
|
142
|
+
const data = JSON.parse(text);
|
|
143
|
+
if (result.isError || data.error)
|
|
144
|
+
throw new SaveToolError(typeof data.error?.code === 'string' ? data.error.code : 'unknown');
|
|
145
|
+
if (name === 'account_whoami' && data.environment?.api_origin !== apiOrigin)
|
|
146
|
+
throw new Error('CLI and project environment origins differ; use the selected host MCP connection without switching credentials');
|
|
147
|
+
return data;
|
|
148
|
+
},
|
|
149
|
+
async put(url, headers, bytes) {
|
|
150
|
+
if (Object.entries(headers).some(([key, value]) => key.toLowerCase() !== 'content-type' || typeof value !== 'string'))
|
|
151
|
+
throw new Error('Unexpected upload headers');
|
|
152
|
+
const response = await fetch(safeUrl(url), { method: 'PUT', headers, body: bytes, redirect: 'error', signal: AbortSignal.timeout(10 * 60_000) });
|
|
153
|
+
await response.body?.cancel();
|
|
154
|
+
if (!response.ok)
|
|
155
|
+
throw new Error(`Upload was interrupted (HTTP ${response.status}); resume the same checkpoint`);
|
|
156
|
+
},
|
|
157
|
+
async download(url, maxBytes) {
|
|
158
|
+
return bounded(await fetch(safeUrl(url), { redirect: 'error', signal: AbortSignal.timeout(180_000) }), maxBytes);
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=video-save-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-save-mcp.js","sourceRoot":"","sources":["../../src/lib/video-save-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
type Obj = Record<string, any>;
|
|
2
|
+
export interface SaveTransport {
|
|
3
|
+
call(name: 'account_whoami' | 'video_project_read' | 'media_list' | 'media_upload' | 'media_confirm' | 'video_render_run' | 'video_project_upsert', args: Obj): Promise<Obj>;
|
|
4
|
+
put(url: string, headers: Record<string, string>, bytes: Buffer): Promise<void>;
|
|
5
|
+
download(url: string, maxBytes: number): Promise<Buffer>;
|
|
6
|
+
}
|
|
7
|
+
export interface SaveManifest {
|
|
8
|
+
brand_id: string;
|
|
9
|
+
project_id: string;
|
|
10
|
+
render_id: string;
|
|
11
|
+
input_digest: string;
|
|
12
|
+
final_path: string;
|
|
13
|
+
poster_path: string;
|
|
14
|
+
qc: {
|
|
15
|
+
final_sha256: string;
|
|
16
|
+
poster_sha256: string;
|
|
17
|
+
report_path: string;
|
|
18
|
+
evidence_paths: string[];
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
interface Fingerprint {
|
|
22
|
+
path: string;
|
|
23
|
+
sha256: string;
|
|
24
|
+
bytes: number;
|
|
25
|
+
}
|
|
26
|
+
interface Identity {
|
|
27
|
+
environment: {
|
|
28
|
+
name: string;
|
|
29
|
+
api_origin: string;
|
|
30
|
+
};
|
|
31
|
+
user_id: string;
|
|
32
|
+
organization_id: string;
|
|
33
|
+
}
|
|
34
|
+
interface SavedFile extends Fingerprint {
|
|
35
|
+
upload_path: string;
|
|
36
|
+
ingredient_key: string;
|
|
37
|
+
kind: string;
|
|
38
|
+
mime: string;
|
|
39
|
+
}
|
|
40
|
+
export interface SaveCheckpoint {
|
|
41
|
+
version: 1;
|
|
42
|
+
binding: Identity & {
|
|
43
|
+
brand_id: string;
|
|
44
|
+
project_id: string;
|
|
45
|
+
project_organization_id: string;
|
|
46
|
+
render_id: string;
|
|
47
|
+
input_digest: string;
|
|
48
|
+
final: SavedFile;
|
|
49
|
+
poster: SavedFile;
|
|
50
|
+
report: Fingerprint;
|
|
51
|
+
evidence: Fingerprint[];
|
|
52
|
+
quality_report: Obj;
|
|
53
|
+
review_digest: string;
|
|
54
|
+
initial_final_render_id: string | null;
|
|
55
|
+
};
|
|
56
|
+
binding_sha256: string;
|
|
57
|
+
progress: {
|
|
58
|
+
final?: {
|
|
59
|
+
media_id: string;
|
|
60
|
+
stage: 'requested' | 'put' | 'confirmed';
|
|
61
|
+
};
|
|
62
|
+
poster?: {
|
|
63
|
+
media_id: string;
|
|
64
|
+
stage: 'requested' | 'put' | 'confirmed';
|
|
65
|
+
};
|
|
66
|
+
completion: 'pending' | 'unknown' | 'complete';
|
|
67
|
+
selection: 'pending' | 'unknown' | 'selected';
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export declare function digest(value: unknown): string;
|
|
71
|
+
/** Same-directory rename + fsync: a process interruption leaves either full old or full new JSON. */
|
|
72
|
+
export declare function writeCheckpoint(target: string, checkpoint: SaveCheckpoint): Promise<void>;
|
|
73
|
+
export declare function loadCheckpoint(target: string): Promise<SaveCheckpoint>;
|
|
74
|
+
export declare function prepareSave(target: string, manifest: SaveManifest, transport: SaveTransport): Promise<SaveCheckpoint>;
|
|
75
|
+
export declare function resumeSave(target: string, transport: SaveTransport): Promise<SaveCheckpoint>;
|
|
76
|
+
export {};
|
|
77
|
+
//# sourceMappingURL=video-save.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-save.d.ts","sourceRoot":"","sources":["../../src/lib/video-save.ts"],"names":[],"mappings":"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"}
|