gooseworks 0.5.8 → 0.5.9-dev.53.c1bd6be2
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/dist/kit/core/progress.d.ts +23 -3
- package/dist/kit/core/progress.d.ts.map +1 -1
- package/dist/kit/core/progress.js +62 -18
- package/dist/kit/core/progress.js.map +1 -1
- package/dist/kit/core/run.d.ts +5 -1
- package/dist/kit/core/run.d.ts.map +1 -1
- package/dist/kit/core/run.js +17 -4
- package/dist/kit/core/run.js.map +1 -1
- package/dist/kit/core/style.d.ts +1 -0
- package/dist/kit/core/style.d.ts.map +1 -1
- package/dist/kit/maker/cues.d.ts +67 -0
- package/dist/kit/maker/cues.d.ts.map +1 -0
- package/dist/kit/maker/cues.js +204 -0
- package/dist/kit/maker/cues.js.map +1 -0
- package/dist/kit/maker/encode.d.ts +5 -0
- package/dist/kit/maker/encode.d.ts.map +1 -1
- package/dist/kit/maker/encode.js +7 -1
- package/dist/kit/maker/encode.js.map +1 -1
- package/dist/kit/maker/facts.d.ts +46 -0
- package/dist/kit/maker/facts.d.ts.map +1 -0
- package/dist/kit/maker/facts.js +159 -0
- package/dist/kit/maker/facts.js.map +1 -0
- package/dist/kit/maker/inputs.d.ts +48 -3
- package/dist/kit/maker/inputs.d.ts.map +1 -1
- package/dist/kit/maker/inputs.js +151 -22
- package/dist/kit/maker/inputs.js.map +1 -1
- package/dist/kit/maker/make.d.ts +20 -1
- package/dist/kit/maker/make.d.ts.map +1 -1
- package/dist/kit/maker/make.js +125 -19
- package/dist/kit/maker/make.js.map +1 -1
- package/dist/kit/maker/page.d.ts.map +1 -1
- package/dist/kit/maker/page.js +49 -1
- package/dist/kit/maker/page.js.map +1 -1
- package/dist/kit/maker/parts/html-frames/1.2.0/part.json +1083 -0
- package/dist/kit/maker/parts/html-frames/src/part.d.ts.map +1 -1
- package/dist/kit/maker/parts/html-frames/src/part.js +4 -1
- package/dist/kit/maker/parts/html-frames/src/part.js.map +1 -1
- package/dist/kit/maker/runtime.d.ts.map +1 -1
- package/dist/kit/maker/runtime.js +54 -7
- package/dist/kit/maker/runtime.js.map +1 -1
- package/dist/kit/maker/timing.d.ts +74 -0
- package/dist/kit/maker/timing.d.ts.map +1 -0
- package/dist/kit/maker/timing.js +152 -0
- package/dist/kit/maker/timing.js.map +1 -0
- package/dist/kit/maker/under.d.ts +126 -0
- package/dist/kit/maker/under.d.ts.map +1 -0
- package/dist/kit/maker/under.js +299 -0
- package/dist/kit/maker/under.js.map +1 -0
- package/dist/skills/master-skill.d.ts +3 -3
- package/dist/skills/master-skill.d.ts.map +1 -1
- package/dist/skills/master-skill.js +20 -18
- package/dist/skills/master-skill.js.map +1 -1
- package/dist/skills/routes.js +2 -2
- package/dist/skills/routes.js.map +1 -1
- package/dist/skills/server-entry-skills.d.ts +6 -6
- package/dist/skills/server-entry-skills.d.ts.map +1 -1
- package/dist/skills/server-entry-skills.js +84 -55
- package/dist/skills/server-entry-skills.js.map +1 -1
- package/package.json +3 -3
- package/skills/goose-ads/SKILL.md +6 -6
- package/skills/goose-product-photos/SKILL.md +6 -6
- package/skills/goose-video/SKILL.md +29 -595
- package/skills/goose-video-local/SKILL.md +3 -1572
- package/skills/gooseworks/SKILL.md +6 -6
- package/skills/make-custom-video/SKILL.md +25 -672
- package/skills/manifest.json +7 -7
- package/skills/routes.json +1 -1
- package/dist/kit/maker/parts/html-frames/1.1.0/part.json +0 -199
- package/dist/skills/production-video-skills.json +0 -5
|
@@ -0,0 +1,299 @@
|
|
|
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.QUIET_SAFE = void 0;
|
|
37
|
+
exports.probeUnder = probeUnder;
|
|
38
|
+
exports.coverFit = coverFit;
|
|
39
|
+
exports.coverFilter = coverFilter;
|
|
40
|
+
exports.quietBandOf = quietBandOf;
|
|
41
|
+
exports.quietBands = quietBands;
|
|
42
|
+
exports.underIsShared = underIsShared;
|
|
43
|
+
exports.underSceneFrames = underSceneFrames;
|
|
44
|
+
exports.alphaSegmentArgs = alphaSegmentArgs;
|
|
45
|
+
exports.compositeArgs = compositeArgs;
|
|
46
|
+
exports.passThroughTimeline = passThroughTimeline;
|
|
47
|
+
// Drawing a frame page over another step's video (html-frames 1.2.0 `under`).
|
|
48
|
+
// The page is captured transparent, its frames are kept with their alpha in
|
|
49
|
+
// short PNG-in-MOV segments, and one last ffmpeg pass lays them over the video,
|
|
50
|
+
// keeping its sound. Before the page runs, each scene's quiet band (the
|
|
51
|
+
// emptiest horizontal band of its middle frame) is measured here in Node, since
|
|
52
|
+
// a file:// page may not read a video's pixels. Bundled into the part.
|
|
53
|
+
const promises_1 = require("node:fs/promises");
|
|
54
|
+
const path = __importStar(require("node:path"));
|
|
55
|
+
const encode_1 = require("./encode");
|
|
56
|
+
/** The band a quiet band is looked for in, and its height, as fractions of the height. */
|
|
57
|
+
exports.QUIET_SAFE = { top: 0.15, bottom: 0.85, height: 0.15 };
|
|
58
|
+
/** The size the middle frame is measured at: a few pixels a row is plenty for "busy or not". */
|
|
59
|
+
const MEASURE_WIDTH = 96;
|
|
60
|
+
function numberOf(value) {
|
|
61
|
+
const n = typeof value === 'string' ? Number(value) : value;
|
|
62
|
+
return typeof n === 'number' && Number.isFinite(n) ? n : undefined;
|
|
63
|
+
}
|
|
64
|
+
function rateOf(value) {
|
|
65
|
+
if (typeof value !== 'string')
|
|
66
|
+
return null;
|
|
67
|
+
const [a, b] = value.split('/').map(Number);
|
|
68
|
+
const rate = b ? a / b : a;
|
|
69
|
+
return Number.isFinite(rate) && rate > 0 ? rate : null;
|
|
70
|
+
}
|
|
71
|
+
/** Reads the video's picture length, size, frame rate and whether it has sound, with ffprobe. */
|
|
72
|
+
async function probeUnder(tools, file) {
|
|
73
|
+
let parsed;
|
|
74
|
+
try {
|
|
75
|
+
const { stdout } = await tools.exec('ffprobe', [
|
|
76
|
+
'-v', 'error',
|
|
77
|
+
'-show_entries', 'stream=codec_type,width,height,duration,avg_frame_rate,r_frame_rate:format=duration',
|
|
78
|
+
'-of', 'json', file,
|
|
79
|
+
]);
|
|
80
|
+
parsed = JSON.parse(stdout);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
const streams = parsed.streams ?? [];
|
|
86
|
+
const video = streams.find((s) => s.codec_type === 'video');
|
|
87
|
+
if (!video)
|
|
88
|
+
return null;
|
|
89
|
+
const width = numberOf(video.width);
|
|
90
|
+
const height = numberOf(video.height);
|
|
91
|
+
const seconds = numberOf(video.duration) ?? numberOf(parsed.format?.duration);
|
|
92
|
+
if (!width || !height || !seconds || seconds <= 0)
|
|
93
|
+
return null;
|
|
94
|
+
return {
|
|
95
|
+
seconds,
|
|
96
|
+
width,
|
|
97
|
+
height,
|
|
98
|
+
fps: rateOf(video.avg_frame_rate) ?? rateOf(video.r_frame_rate),
|
|
99
|
+
hasAudio: streams.some((s) => s.codec_type === 'audio'),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function coverFit(from, to) {
|
|
103
|
+
const scale = Math.max(to.width / from.width, to.height / from.height);
|
|
104
|
+
return { scale, offsetX: (from.width * scale - to.width) / 2, offsetY: (from.height * scale - to.height) / 2 };
|
|
105
|
+
}
|
|
106
|
+
/** The ffmpeg filter that fits the video to the page: cover, centre crop, square pixels. */
|
|
107
|
+
function coverFilter(size) {
|
|
108
|
+
return `scale=${size.width}:${size.height}:force_original_aspect_ratio=increase:flags=bicubic,crop=${size.width}:${size.height},setsar=1`;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The emptiest band of a grey picture: rows are scored by how much the picture
|
|
112
|
+
* changes along and down them (the per-row gradient), and the band of
|
|
113
|
+
* QUIET_SAFE.height whose rows change least, inside QUIET_SAFE, wins. Ties go
|
|
114
|
+
* to the band nearer the bottom, where captions usually sit.
|
|
115
|
+
*/
|
|
116
|
+
function quietBandOf(gray, width, height) {
|
|
117
|
+
const rows = new Float64Array(height);
|
|
118
|
+
for (let y = 0; y < height; y++) {
|
|
119
|
+
let sum = 0;
|
|
120
|
+
const row = y * width;
|
|
121
|
+
for (let x = 0; x < width; x++) {
|
|
122
|
+
const v = gray[row + x];
|
|
123
|
+
if (x + 1 < width)
|
|
124
|
+
sum += Math.abs(gray[row + x + 1] - v);
|
|
125
|
+
if (y + 1 < height)
|
|
126
|
+
sum += Math.abs(gray[row + width + x] - v);
|
|
127
|
+
}
|
|
128
|
+
rows[y] = sum / width;
|
|
129
|
+
}
|
|
130
|
+
const band = Math.max(1, Math.round(exports.QUIET_SAFE.height * height));
|
|
131
|
+
const first = Math.ceil(exports.QUIET_SAFE.top * height);
|
|
132
|
+
const last = Math.max(first, Math.floor(exports.QUIET_SAFE.bottom * height) - band);
|
|
133
|
+
let best = first;
|
|
134
|
+
let bestScore = Infinity;
|
|
135
|
+
for (let y0 = first; y0 <= last; y0++) {
|
|
136
|
+
let score = 0;
|
|
137
|
+
for (let y = y0; y < y0 + band && y < height; y++)
|
|
138
|
+
score += rows[y];
|
|
139
|
+
// A band must be clearly quieter to win over one further down.
|
|
140
|
+
if (score <= bestScore + 1e-9) {
|
|
141
|
+
best = y0;
|
|
142
|
+
bestScore = score;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const round = (n) => Math.round(n * 10000) / 10000;
|
|
146
|
+
return { y0: round(best / height), y1: round(Math.min(height, best + band) / height) };
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Each scene's quiet band, from the video's frame at the middle of the scene,
|
|
150
|
+
* fitted to the page the way the last pass fits it (cover, centre crop), so the
|
|
151
|
+
* band describes what shows. Frames are read one at a time as raw grey pixels into `dir`.
|
|
152
|
+
*/
|
|
153
|
+
async function quietBands(tools, file, info, times, dir, page) {
|
|
154
|
+
const width = MEASURE_WIDTH;
|
|
155
|
+
const height = Math.max(2, Math.round((page.height / page.width) * width));
|
|
156
|
+
const bands = [];
|
|
157
|
+
for (let i = 0; i < times.length; i++) {
|
|
158
|
+
const middle = Math.min(Math.max(0, (times[i].start_s + times[i].end_s) / 2), Math.max(0, info.seconds - 0.05));
|
|
159
|
+
const out = path.join(dir, `quiet-${i}.gray`);
|
|
160
|
+
await tools.exec('ffmpeg', [
|
|
161
|
+
'-hide_banner', '-nostdin', '-loglevel', 'error', '-y',
|
|
162
|
+
'-ss', middle.toFixed(3), '-i', file,
|
|
163
|
+
'-frames:v', '1', '-an',
|
|
164
|
+
'-vf', `${coverFilter({ width, height })},format=gray`,
|
|
165
|
+
'-f', 'rawvideo', '-pix_fmt', 'gray', out,
|
|
166
|
+
]);
|
|
167
|
+
const gray = await (0, promises_1.readFile)(out);
|
|
168
|
+
await (0, promises_1.rm)(out, { force: true });
|
|
169
|
+
bands.push(gray.length >= width * height ? quietBandOf(gray, width, height) : { y0: 0.7, y1: 0.85 });
|
|
170
|
+
}
|
|
171
|
+
return bands;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* True when the plan's scenes share the video drawn over evenly: that video is
|
|
175
|
+
* one scene (one clip, say) and the plan has several.
|
|
176
|
+
*/
|
|
177
|
+
function underIsShared(ids, timeline) {
|
|
178
|
+
return timeline.scenes.length === 1 && ids.length > 1;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Scene start frames from the timeline of the video drawn over. Each plan scene
|
|
182
|
+
* takes the time of the timeline scene with its id; when ids do not match and
|
|
183
|
+
* both list the same number of scenes, they pair in order. When that video is
|
|
184
|
+
* one scene and the plan has several, the plan's scenes share it evenly on
|
|
185
|
+
* whole frames, as they share a video of a given length. Returns null when the
|
|
186
|
+
* scenes cannot be paired.
|
|
187
|
+
*/
|
|
188
|
+
function underSceneFrames(ids, timeline, fps, frameCount) {
|
|
189
|
+
if (underIsShared(ids, timeline)) {
|
|
190
|
+
if (frameCount < ids.length)
|
|
191
|
+
return null;
|
|
192
|
+
const shared = ids.map((_, i) => Math.round((i * frameCount) / ids.length));
|
|
193
|
+
shared.push(frameCount);
|
|
194
|
+
return shared;
|
|
195
|
+
}
|
|
196
|
+
const byId = new Map(timeline.scenes.map((s) => [s.id, s]));
|
|
197
|
+
const matched = ids.map((id) => byId.get(id) ?? null);
|
|
198
|
+
let spans;
|
|
199
|
+
if (matched.every((s) => s))
|
|
200
|
+
spans = matched;
|
|
201
|
+
else if (timeline.scenes.length === ids.length)
|
|
202
|
+
spans = ids.map((id, i) => byId.get(id) ?? timeline.scenes[i]);
|
|
203
|
+
else
|
|
204
|
+
return null;
|
|
205
|
+
const frames = spans.map((s) => Math.min(frameCount, Math.max(0, Math.round(s.start_s * fps))));
|
|
206
|
+
for (let i = 1; i < frames.length; i++)
|
|
207
|
+
if (frames[i] < frames[i - 1])
|
|
208
|
+
return null;
|
|
209
|
+
frames.push(frameCount);
|
|
210
|
+
return frames;
|
|
211
|
+
}
|
|
212
|
+
/** One segment of transparent page frames, kept with their alpha (PNG in MOV), to be laid over the video later. */
|
|
213
|
+
function alphaSegmentArgs(opts) {
|
|
214
|
+
return [
|
|
215
|
+
'-hide_banner', '-nostdin', '-loglevel', 'error', '-y',
|
|
216
|
+
'-framerate', String(opts.fps),
|
|
217
|
+
'-start_number', String(opts.start),
|
|
218
|
+
'-i', `${opts.framesDir}/${opts.framePattern}`,
|
|
219
|
+
'-frames:v', String(opts.count),
|
|
220
|
+
'-c:v', 'png', '-pix_fmt', 'rgba',
|
|
221
|
+
'-fflags', '+bitexact', '-flags', '+bitexact', '-map_metadata', '-1',
|
|
222
|
+
'-an', '-r', String(opts.fps),
|
|
223
|
+
opts.out,
|
|
224
|
+
];
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* The last pass: the video fitted to the page, the page's frames laid over it,
|
|
228
|
+
* encoded like every html-frames video, with the video's sound kept as AAC.
|
|
229
|
+
*/
|
|
230
|
+
function compositeArgs(opts) {
|
|
231
|
+
const seconds = (opts.frames / opts.fps).toFixed(6);
|
|
232
|
+
const graph = [
|
|
233
|
+
`[0:v]setpts=PTS-STARTPTS,fps=${opts.fps},${coverFilter(opts.size)}[base]`,
|
|
234
|
+
`[1:v]setpts=PTS-STARTPTS,format=rgba[page]`,
|
|
235
|
+
`[base][page]overlay=0:0:format=auto:eof_action=pass:shortest=0,scale=out_color_matrix=bt709:out_range=tv,format=yuv420p[v]`,
|
|
236
|
+
].join(';');
|
|
237
|
+
return [
|
|
238
|
+
'-hide_banner', '-nostdin', '-loglevel', 'error', '-y',
|
|
239
|
+
'-i', opts.under,
|
|
240
|
+
'-f', 'concat', '-safe', '0', '-i', opts.list,
|
|
241
|
+
'-filter_complex', graph,
|
|
242
|
+
'-map', '[v]',
|
|
243
|
+
...(opts.hasAudio ? ['-map', '0:a:0'] : []),
|
|
244
|
+
'-frames:v', String(opts.frames),
|
|
245
|
+
...opts.tools.encodeArgs('h264-master'),
|
|
246
|
+
...encode_1.MASTER_RATE_CAP,
|
|
247
|
+
'-c:v', 'libx264',
|
|
248
|
+
'-pix_fmt', 'yuv420p',
|
|
249
|
+
'-colorspace', 'bt709', '-color_primaries', 'bt709', '-color_trc', 'bt709', '-color_range', 'tv',
|
|
250
|
+
...(opts.hasAudio ? [...opts.tools.encodeArgs('aac'), '-t', seconds] : ['-an']),
|
|
251
|
+
'-r', String(opts.fps),
|
|
252
|
+
opts.out,
|
|
253
|
+
];
|
|
254
|
+
}
|
|
255
|
+
/** A zone of the video drawn over, moved onto the page's picture (scaled to cover, cropped to the middle). */
|
|
256
|
+
function fitZone(zone, fit, size) {
|
|
257
|
+
const x0 = Math.max(0, zone.x * fit.scale - fit.offsetX);
|
|
258
|
+
const y0 = Math.max(0, zone.y * fit.scale - fit.offsetY);
|
|
259
|
+
const x1 = Math.min(size.width, (zone.x + zone.w) * fit.scale - fit.offsetX);
|
|
260
|
+
const y1 = Math.min(size.height, (zone.y + zone.h) * fit.scale - fit.offsetY);
|
|
261
|
+
if (x1 - x0 < 1 || y1 - y0 < 1)
|
|
262
|
+
return null;
|
|
263
|
+
return { ...zone, x: Math.round(x0), y: Math.round(y0), w: Math.round(x1 - x0), h: Math.round(y1 - y0) };
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* The timeline of a video drawn over: the video's own scenes, speech, end card
|
|
267
|
+
* and safe zones carried through (cut to the new length, zones moved to the
|
|
268
|
+
* new picture), with this video's length, size and frame rate. When the plan's
|
|
269
|
+
* scenes shared a one-scene video (`scenes` given), they are the scenes, and a
|
|
270
|
+
* speech entry that names a scene names the one it starts in.
|
|
271
|
+
*/
|
|
272
|
+
function passThroughTimeline(under, out, scenes) {
|
|
273
|
+
const end = out.duration_s;
|
|
274
|
+
const cut = (items) => items.filter((item) => item.start_s < end).map((item) => (item.end_s > end ? { ...item, end_s: end } : item));
|
|
275
|
+
let speech = cut(under.speech);
|
|
276
|
+
if (scenes?.length) {
|
|
277
|
+
const sceneAt = (t) => scenes.find((s) => t < s.end_s) ?? scenes[scenes.length - 1];
|
|
278
|
+
speech = speech.map((entry) => (typeof entry.scene_id === 'string' ? { ...entry, scene_id: sceneAt(entry.start_s).id } : entry));
|
|
279
|
+
}
|
|
280
|
+
const timeline = {
|
|
281
|
+
duration_s: out.duration_s,
|
|
282
|
+
width: out.width,
|
|
283
|
+
height: out.height,
|
|
284
|
+
fps: out.fps,
|
|
285
|
+
scenes: cut((scenes ?? under.scenes).map((s) => ({ id: s.id, start_s: s.start_s, end_s: s.end_s }))),
|
|
286
|
+
speech,
|
|
287
|
+
};
|
|
288
|
+
if (under.end_card && under.end_card.start_s < end)
|
|
289
|
+
timeline.end_card = { start_s: under.end_card.start_s, end_s: Math.min(end, under.end_card.end_s) };
|
|
290
|
+
const fit = coverFit({ width: under.width, height: under.height }, out);
|
|
291
|
+
const zones = (under.safe_zones ?? [])
|
|
292
|
+
.map((z) => fitZone(z, fit, out))
|
|
293
|
+
.filter((z) => !!z)
|
|
294
|
+
.slice(0, 8);
|
|
295
|
+
if (zones.length)
|
|
296
|
+
timeline.safe_zones = zones;
|
|
297
|
+
return timeline;
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=under.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"under.js","sourceRoot":"","sources":["../../../src/kit/maker/under.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,10 +21,10 @@ export declare function getMasterSkillContent(): string;
|
|
|
21
21
|
export declare function getGooseAdsSkillContent(): string;
|
|
22
22
|
/** Product photos of the brand's real, physical products. */
|
|
23
23
|
export declare function getGooseProductPhotosSkillContent(): string;
|
|
24
|
-
/**
|
|
24
|
+
/** Our server's goose-video entry skill, as built. */
|
|
25
25
|
export declare function getGooseVideoSkillContent(): string;
|
|
26
|
-
/**
|
|
26
|
+
/** Our server's make-custom-video entry skill, as built. */
|
|
27
27
|
export declare function getMakeCustomVideoSkillContent(): string;
|
|
28
|
-
/**
|
|
28
|
+
/** One line: the kit makes the video when the server says so. */
|
|
29
29
|
export declare function getGooseVideoLocalSkillContent(): string;
|
|
30
30
|
//# sourceMappingURL=master-skill.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"master-skill.d.ts","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"master-skill.d.ts","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,+BAA+B,CAAC;AAE7D;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,UAAU,EAAE,CAS7C;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED,sGAAsG;AACtG,wBAAgB,qBAAqB,IAAI,MAAM,CA+E9C;AAED,4CAA4C;AAC5C,wBAAgB,uBAAuB,IAAI,MAAM,CAiChD;AAED,6DAA6D;AAC7D,wBAAgB,iCAAiC,IAAI,MAAM,CA8B1D;AAED,sDAAsD;AACtD,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED,4DAA4D;AAC5D,wBAAgB,8BAA8B,IAAI,MAAM,CAEvD;AAED,iEAAiE;AACjE,wBAAgB,8BAA8B,IAAI,MAAM,CASvD"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.KIT_MAKE_COMMAND = void 0;
|
|
7
4
|
exports.getEntrySkills = getEntrySkills;
|
|
@@ -21,20 +18,18 @@ exports.getGooseVideoLocalSkillContent = getGooseVideoLocalSkillContent;
|
|
|
21
18
|
* - `goose-ads` image ads: make, edit and study them.
|
|
22
19
|
* - `goose-product-photos` product photos.
|
|
23
20
|
* - `goose-video`, `make-custom-video`
|
|
24
|
-
*
|
|
25
|
-
*
|
|
21
|
+
* our server's video entry skills, copied as built
|
|
22
|
+
* (server-entry-skills.ts). Every answer's next_step
|
|
23
|
+
* carries the step for the video's stage.
|
|
24
|
+
* - `goose-video-local` one line: run the kit when a next_step says so.
|
|
26
25
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* Non-video entries use the newer rulebook and action contract. Production
|
|
31
|
-
* video entries retain the tool names, approvals and execution instructions
|
|
32
|
-
* supported by the main backend (tests/skills/production-video-skills.test.ts).
|
|
26
|
+
* Each skill names only the actions in the action contract, states no price,
|
|
27
|
+
* asks for no install and stays within the rulebook's size limit; the rules
|
|
28
|
+
* block of every skill comes from the rulebook (tests/skills/skill-lint.test.ts).
|
|
33
29
|
* Recipe skills live in goose-skills and are fetched when needed.
|
|
34
30
|
*/
|
|
35
31
|
const routes_1 = require("./routes");
|
|
36
32
|
const server_entry_skills_1 = require("./server-entry-skills");
|
|
37
|
-
const production_video_skills_json_1 = __importDefault(require("./production-video-skills.json"));
|
|
38
33
|
/** The kit command, as the server's next_step gives it. */
|
|
39
34
|
exports.KIT_MAKE_COMMAND = 'gooseworks video make <id>';
|
|
40
35
|
/**
|
|
@@ -206,16 +201,23 @@ Then follow the next_step in every answer.
|
|
|
206
201
|
${server_entry_skills_1.SERVER_ENTRY_SKILL_RULES.photos}
|
|
207
202
|
`;
|
|
208
203
|
}
|
|
209
|
-
/**
|
|
204
|
+
/** Our server's goose-video entry skill, as built. */
|
|
210
205
|
function getGooseVideoSkillContent() {
|
|
211
|
-
return
|
|
206
|
+
return server_entry_skills_1.SERVER_VIDEO_ENTRY_SKILLS['goose-video'];
|
|
212
207
|
}
|
|
213
|
-
/**
|
|
208
|
+
/** Our server's make-custom-video entry skill, as built. */
|
|
214
209
|
function getMakeCustomVideoSkillContent() {
|
|
215
|
-
return
|
|
210
|
+
return server_entry_skills_1.SERVER_VIDEO_ENTRY_SKILLS['make-custom-video'];
|
|
216
211
|
}
|
|
217
|
-
/**
|
|
212
|
+
/** One line: the kit makes the video when the server says so. */
|
|
218
213
|
function getGooseVideoLocalSkillContent() {
|
|
219
|
-
return
|
|
214
|
+
return `---
|
|
215
|
+
name: goose-video-local
|
|
216
|
+
description: Make an approved GooseWorks video on this computer when the server's next_step says to.
|
|
217
|
+
version: 1.0.2
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
Run \`${exports.KIT_MAKE_COMMAND}\` when the server's next_step says so.
|
|
221
|
+
`;
|
|
220
222
|
}
|
|
221
223
|
//# sourceMappingURL=master-skill.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"master-skill.js","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"master-skill.js","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":";;;AAsCA,wCASC;AAGD,gDAEC;AAGD,sDA+EC;AAGD,0DAiCC;AAGD,8EA8BC;AAGD,8DAEC;AAGD,wEAEC;AAGD,wEASC;AAjOD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qCAA0E;AAC1E,+DAA4F;AAQ5F,2DAA2D;AAC9C,QAAA,gBAAgB,GAAG,4BAA4B,CAAC;AAE7D;;;;;;GAMG;AACH,SAAgB,cAAc;IAC5B,OAAO;QACL,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE;QACxD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE;QACzD,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE;QAC7D,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,8BAA8B,EAAE,EAAE;QACxE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,8BAA8B,EAAE,EAAE;QACxE,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,iCAAiC,EAAE,EAAE;KAC/E,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,SAAgB,kBAAkB;IAChC,OAAO,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,sGAAsG;AACtG,SAAgB,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCP,IAAA,+BAAsB,GAAE;;;2EAGiD,wBAAgB;;;;;;EAMzF,IAAA,+BAAsB,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCxB,8CAAwB,CAAC,GAAG;CAC7B,CAAC;AACF,CAAC;AAED,4CAA4C;AAC5C,SAAgB,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BP,8CAAwB,CAAC,GAAG;CAC7B,CAAC;AACF,CAAC;AAED,6DAA6D;AAC7D,SAAgB,iCAAiC;IAC/C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BP,8CAAwB,CAAC,MAAM;CAChC,CAAC;AACF,CAAC;AAED,sDAAsD;AACtD,SAAgB,yBAAyB;IACvC,OAAO,+CAAyB,CAAC,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,4DAA4D;AAC5D,SAAgB,8BAA8B;IAC5C,OAAO,+CAAyB,CAAC,mBAAmB,CAAC,CAAC;AACxD,CAAC;AAED,iEAAiE;AACjE,SAAgB,8BAA8B;IAC5C,OAAO;;;;;;QAMD,wBAAgB;CACvB,CAAC;AACF,CAAC"}
|
package/dist/skills/routes.js
CHANGED
|
@@ -45,7 +45,7 @@ exports.DOMAIN_ROUTES = [
|
|
|
45
45
|
{
|
|
46
46
|
skill: 'goose-video',
|
|
47
47
|
when: 'Any **video**: a video ad from a style, an original video from a brief or a reference video, or a video already started',
|
|
48
|
-
how: 'Use goose-video:
|
|
48
|
+
how: 'Use goose-video: explicit custom skips the picker; otherwise watch the reference, read the brand and compare style constraints.',
|
|
49
49
|
delivery: 'entry',
|
|
50
50
|
},
|
|
51
51
|
{
|
|
@@ -66,7 +66,7 @@ exports.DOMAIN_ROUTES = [
|
|
|
66
66
|
* by name, so the CLI keeps installing them.
|
|
67
67
|
*/
|
|
68
68
|
exports.UNROUTED_ENTRY_SKILLS = {
|
|
69
|
-
'make-custom-video': '
|
|
69
|
+
'make-custom-video': 'Keeps an explicit custom choice without a picker, studies its reference and checks custom support; fetching this entry alone does not enable production.',
|
|
70
70
|
'goose-video-local': 'One line: run the kit when a next_step says so.',
|
|
71
71
|
};
|
|
72
72
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/skills/routes.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AAkGH,kDAKC;AAGD,4DAIC;AAGD,4CAeC;AAGD,wDAIC;AAGD,wDAIC;AApHD;;;GAGG;AACU,QAAA,aAAa,GAAkB;IAC1C;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,sJAAsJ;QAC5J,GAAG,EAAE,mGAAmG;QACxG,QAAQ,EAAE,OAAO;KAClB;IACD;QACE,KAAK,EAAE,gBAAgB;QACvB,IAAI,EAAE,8FAA8F;QACpG,GAAG,EAAE,kFAAkF;QACvF,QAAQ,EAAE,OAAO;KAClB;IACD;QACE,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,yHAAyH;QAC/H,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/skills/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/** The rulebook version this text was built from. */
|
|
2
|
-
export declare const SERVER_RULEBOOK_VERSION = "1.
|
|
2
|
+
export declare const SERVER_RULEBOOK_VERSION = "1.3.1";
|
|
3
3
|
export declare const SERVER_VIDEO_ENTRY_SKILLS: {
|
|
4
|
-
readonly 'goose-video': "---\nname: goose-video\ndescription: \"Make a video ad
|
|
5
|
-
readonly 'make-custom-video': "---\nname: make-custom-video\ndescription: \"Make
|
|
4
|
+
readonly 'goose-video': "---\nname: goose-video\ndescription: \"Make a video ad in this chat. Study a supplied video reference before comparing styles; follow the next_step in every answer.\"\nversion: 4.4.3\n---\n\n# GooseWorks video\n\nFrom an installed entry, first catalog_fetch type skill goose-video on this same connection and follow that body. An entry already fetched in this run needs no repeat fetch.\n\nFor a video already started, call video_read and follow its next_step.\n\nExplicit custom: skip video_formats and steps 5–6. Keep their mechanics and assets; research the brand/product and study the reference for its custom plan. Check current custom support before any write.\n\nFor other new videos start with get_started (wants video, request). A card is not a style choice or proof of viewing. Follow the reference rule before style selection or a plan.\n\n1. The request. If they haven't said what the video is about, ask in one short question.\n2. The brand. Ask which brand only when brand_read lists several; with one, use it.\n3. The product. Named or none wanted: find its id with brand_read (sections: products), or use []. Otherwise the product card asks: say one line and wait. Without cards, ask which product by name; use the only one, or go on with none. Never ask again after a pick.\n4. Research. Read the brand kit, learnings and the chosen products with brand_read (sections kit and learnings, plus the products' ids), then knowledge_search for them. Note what to say and avoid.\n5. The styles. Call video_formats with the request and the products' ids ([] for none). The customer picks; never recommend one. A style they named that the answer lists as available is their pick. Otherwise, with the style card on screen, say one short line and wait; without one, print the style table from the answer as it is and ask nothing else.\n6. The plan. Call video_create with the picked style and the products; its next_step says what follows.\n\n## A supplied video reference comes first\n\nWatch the actual video before choosing a style or writing a custom plan. Play through it, or inspect timestamped frames spanning it plus its audio/transcript. A URL, title, caption or thumbnail is not a viewing. Record the hook, scene order, pacing, narration/dialogue, framing, product interactions, text and ending, with timestamps and gaps. If access or sampling cannot answer an essential detail, ask for an accessible video or their choice to continue from the brief; never claim it was watched.\nWhen they have not chosen custom, call video_formats after brand research. For plausible matches, catalog_fetch type template returns the style's plan_note, scenes, duration, cast, sound and assets. Compare these against the observed reference and their essential choices. A similar title or high brand ranking does not prove a match. Explain fit or mismatch before they choose. Keep an explicit style choice; do not quietly change constraints or over-adapt it. Reassess a later reference before creating or rewriting a plan.\nIf no available style fits, or they explicitly want custom, catalog_fetch type skill make-custom-video on this connection before a project write. Require its complete production-harness dependency and current custom schemas. Follow its separate authenticated script and ingredient approvals, cumulative budgets and verified execution capability. If anything is unavailable, say so and keep the brief; do not substitute a template, import the reference as a finished video, use retired actions or switch environments. Fetching a skill alone proves no execution capability.\n\n## Rules\n\n- Talk to marketers: what they get and decide, never how it's made.\n- Never mention tools, ids, JSON, commands, software, vendors, models, timings, retries or your checks.\n- Everything happens here: never ask the customer to install anything or use a CLI, slash command or other app, except npx -y gooseworks@0.5.7 video check and npx -y gooseworks@0.5.7 video make <id> when a next_step gives them.\n- Money is a credit number exactly as an answer gives it: never dollars or your own math.\n- Follow the next_step in every answer.\n- Card on screen (display_hint \"widget\"): one short line at most, then the wait in its next_step or end your turn; never re-list it or open a question box.\n- Paid work needs the customer's yes to the credit total first, on the card or in chat at the price shown; you never approve.\n- A yes counts only for the price the customer was shown: their press on the plan card, or their yes in chat sent with that price.\n- Where the app shows no card, print the plan and its price and ask for the customer's yes here; never send them to a website to approve.\n- Never invent an offer, a claim or proof.\n- GooseWorks holds every provider key and bills the work: never ask for a key, token, password or ad account id, and never call a vendor yourself.\n";
|
|
5
|
+
readonly 'make-custom-video': "---\nname: make-custom-video\ndescription: \"Make a custom video from its brief and studied reference, with authenticated script and ingredient reviews.\"\nversion: 3.5.0\nrequires_skills: [video-production-harness]\nharness_binding: gooseworks/video-actions/v1\n---\n\n# Human version\n\nThe owner approves the script, then actual storyboard/ingredients and budget. Both authenticated reviews must pass before production.\n\n---\n\n# Agent version\n\nInstalled entry: catalog_fetch type skill make-custom-video here once. Check live custom schemas before writes. Keep this environment; no retired actions, template fallback or reference-as-final import.\n\n## Load the production harness\n\nRequire complete video-production-harness content/scripts/files/version/contentHash. Read its orchestrator, phases and editorial/specialist guides. Save safe paths separately with hashes/dependencies. Incomplete/mixed packages block work. Resume recorded packages, inputs and jobs.\n\n## Keep the brief and study the reference\n\nExplicit custom skips video_formats and the picker. Keep requested mechanics/assets; animated text and product photos must not become a creator montage. Implicit references use goose-video to watch and compare template constraints; custom follows no match or their choice.\nRead brand_read (kit, products, rules), then knowledge_search. Use supported claims, real photos/logo. Watch playback, or timed frames spanning the video plus audio/transcript. Record hook, scene order, pace, framing, dialogue, text, product interactions and ending with times/gaps. URLs/thumbnails are not viewing. Missing access needs an accessible source or explicit brief-only choice.\n\n## Create or resume\n\nNew: video_create with brand_id, style custom, request and a required agent-generated UUID idempotency_key; retain products, name, reference_url and campaign. Reuse that key on retries. Resume with video_read the same project: retain plan_revision, custom_review, brand_context, production_manifest and execution; never create a replacement.\nReference resolve accepts direct files; social links cause no automatic paid lookup. If GooseWorks can't download it, upload the file you watched into this project (media_upload scope video_project, media_confirm), wait for media_analyze read to show its duration, then video_change custom reference attach with asset_id and its current_revision as analysis_revision; each refusal names the condition to fix. Skip needs explicit brief-only user_quote. Pending/failed reference blocks approval; a URL is not viewing.\nA resolved reference also needs draft.reference_observation: the project's reference source_url, real duration_s, evidence_mode playback or frames_and_audio, observed_through_s covering 95%, and summary: what happens with times and gaps, as text or a list of {t, what}. Its data binds the script token. Resolve/attach is not watching.\n\n## Save script and ingredients\n\nFollow the harness phases. Discover specialists for the actual scenes; check inputs, outputs, dependencies and managed execution. Reuse suitable product photos and deterministic text animation. Never substitute a template driver. Bind operations to this project and approved scene/script revisions.\nvideo_change needs expected_revision (plan_revision), custom draft and optional script. Bind brand_context_digest to the returned bundle; never author server context. Keep packages outside the review payload. Quote paid operations through the live managed estimate path with real inputs/project. Save preview_estimate/render_estimate for the work still to buy; the server adds committed_credits. Never edit a field the owner approved: the save sets their approval aside until the approved text is back. Missing price/unsupported inputs blocks production; no guessed rates/direct keys.\n\n## Two authenticated owner reviews\n\nShow the complete saved script and exact cumulative budget on the authenticated review card. Only the owner's actual signed button press approves. Chat yes, OAuth, user_quote, widget origin or a copied token is not proof; never manufacture a click or self-approve. Text-only/large reviews use returned authenticated Studio phase buttons and approval_surface URL.\nReread video_read after owner actions. Script approval permits quoted previews only. Save the actual storyboard, playable ingredients and render budget; ingredient approval permits clips. Require current script_approved/ingredients_approved, matching tokens/revision and budget. Changed reviews need renewed approval. A prior yes does not authorize changed work.\n\n## Execute, check and deliver\n\nRequire execution.local from a verified customer shell. No cloud, style-only kit, API host, worker or coworker sandbox. Otherwise report the gap.\nvideo_make needs expected_revision and custom render state. Resume the same render with approved tokens; report running/failed/complete honestly and honor Stop. Save actual prompts, settings, every scene and clip checks through video_change custom production. Watch the full output against the approved script, product and brand; save its full quality report. Completion needs a confirmed upload and rebuild recipe here; pin only the checked complete render. Read back manifest/final before delivery. Repairs need affected assets only and renewed approvals/budget.\n\nRebuild recipe: every input the build reads, uploaded here or a linked Library original, plus recipe/source.json; prove a clean-folder rebuild, then save it as custom production source. The next step gives the format.\n\nUse plain words and returned credits. No invented claims, approvals, assets or passing checks.\n";
|
|
6
6
|
};
|
|
7
7
|
export type ServerVideoEntrySlug = keyof typeof SERVER_VIDEO_ENTRY_SKILLS;
|
|
8
8
|
/** renderEntrySkillRules(product) for the products the CLI's own entry skills cover. */
|
|
9
9
|
export declare const SERVER_ENTRY_SKILL_RULES: {
|
|
10
|
-
readonly all: "- Talk to marketers: what they get and
|
|
11
|
-
readonly ads: "- Talk to marketers: what they get and
|
|
12
|
-
readonly photos: "- Talk to marketers: what they get and
|
|
10
|
+
readonly all: "- Talk to marketers: what they get and decide, never how it's made.\n- Never mention tools, ids, JSON, commands, software, vendors, models, timings, retries or your checks.\n- Everything happens here: never ask the customer to install anything or use a CLI, slash command or other app, except npx -y gooseworks@0.5.7 video check and npx -y gooseworks@0.5.7 video make <id> when a next_step gives them.\n- Money is a credit number exactly as an answer gives it: never dollars or your own math.\n- Follow the next_step in every answer.\n- Card on screen (display_hint \"widget\"): one short line at most, then the wait in its next_step or end your turn; never re-list it or open a question box.\n- Paid work needs the customer's yes to the credit total first, on the card or in chat at the price shown; you never approve.\n- Never invent an offer, a claim or proof.\n- GooseWorks holds every provider key and bills the work: never ask for a key, token, password or ad account id, and never call a vendor yourself.";
|
|
11
|
+
readonly ads: "- Talk to marketers: what they get and decide, never how it's made.\n- Never mention tools, ids, JSON, commands, software, vendors, models, timings, retries or your checks.\n- Everything happens here: never ask the customer to install anything or use a CLI, slash command or other app, except npx -y gooseworks@0.5.7 video check and npx -y gooseworks@0.5.7 video make <id> when a next_step gives them.\n- Money is a credit number exactly as an answer gives it: never dollars or your own math.\n- Follow the next_step in every answer.\n- Card on screen (display_hint \"widget\"): one short line at most, then the wait in its next_step or end your turn; never re-list it or open a question box.\n- Paid work needs the customer's yes to the credit total first, on the card or in chat at the price shown; you never approve.\n- Before choosing an angle, claim, product or source, or asking a brand fact, brand_read then knowledge_search for the task.\n- Never invent an offer, a claim or proof.\n- GooseWorks holds every provider key and bills the work: never ask for a key, token, password or ad account id, and never call a vendor yourself.";
|
|
12
|
+
readonly photos: "- Talk to marketers: what they get and decide, never how it's made.\n- Never mention tools, ids, JSON, commands, software, vendors, models, timings, retries or your checks.\n- Everything happens here: never ask the customer to install anything or use a CLI, slash command or other app, except npx -y gooseworks@0.5.7 video check and npx -y gooseworks@0.5.7 video make <id> when a next_step gives them.\n- Money is a credit number exactly as an answer gives it: never dollars or your own math.\n- Follow the next_step in every answer.\n- Card on screen (display_hint \"widget\"): one short line at most, then the wait in its next_step or end your turn; never re-list it or open a question box.\n- Paid work needs the customer's yes to the credit total first, on the card or in chat at the price shown; you never approve.\n- Before choosing an angle, claim, product or source, or asking a brand fact, brand_read then knowledge_search for the task.\n- Never invent an offer, a claim or proof.\n- GooseWorks holds every provider key and bills the work: never ask for a key, token, password or ad account id, and never call a vendor yourself.";
|
|
13
13
|
};
|
|
14
14
|
//# sourceMappingURL=server-entry-skills.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-entry-skills.d.ts","sourceRoot":"","sources":["../../src/skills/server-entry-skills.ts"],"names":[],"mappings":"AAcA,qDAAqD;AACrD,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAE/C,eAAO,MAAM,yBAAyB;;;
|
|
1
|
+
{"version":3,"file":"server-entry-skills.d.ts","sourceRoot":"","sources":["../../src/skills/server-entry-skills.ts"],"names":[],"mappings":"AAcA,qDAAqD;AACrD,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAE/C,eAAO,MAAM,yBAAyB;;;CAgG5B,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,yBAAyB,CAAC;AAE1E,wFAAwF;AACxF,eAAO,MAAM,wBAAwB;;;;CA8B3B,CAAC"}
|