gooseworks 0.5.0-dev.9.d3e7757f → 0.5.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.
Files changed (220) hide show
  1. package/README.md +17 -26
  2. package/dist/auth/device-flow.d.ts +10 -0
  3. package/dist/auth/device-flow.d.ts.map +1 -1
  4. package/dist/auth/device-flow.js +39 -1
  5. package/dist/auth/device-flow.js.map +1 -1
  6. package/dist/commands/doctor.d.ts.map +1 -1
  7. package/dist/commands/doctor.js +3 -1
  8. package/dist/commands/doctor.js.map +1 -1
  9. package/dist/commands/video.d.ts +5 -0
  10. package/dist/commands/video.d.ts.map +1 -0
  11. package/dist/commands/video.js +117 -0
  12. package/dist/commands/video.js.map +1 -0
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +5 -2
  15. package/dist/config.js.map +1 -1
  16. package/dist/environment.d.ts.map +1 -1
  17. package/dist/environment.js +4 -2
  18. package/dist/environment.js.map +1 -1
  19. package/dist/kit/core/bind.d.ts +12 -0
  20. package/dist/kit/core/bind.d.ts.map +1 -0
  21. package/dist/kit/core/bind.js +77 -0
  22. package/dist/kit/core/bind.js.map +1 -0
  23. package/dist/kit/core/canonical.d.ts +30 -0
  24. package/dist/kit/core/canonical.d.ts.map +1 -0
  25. package/dist/kit/core/canonical.js +67 -0
  26. package/dist/kit/core/canonical.js.map +1 -0
  27. package/dist/kit/core/check.d.ts +22 -0
  28. package/dist/kit/core/check.d.ts.map +1 -0
  29. package/dist/kit/core/check.js +53 -0
  30. package/dist/kit/core/check.js.map +1 -0
  31. package/dist/kit/core/device.d.ts +17 -0
  32. package/dist/kit/core/device.d.ts.map +1 -0
  33. package/dist/kit/core/device.js +153 -0
  34. package/dist/kit/core/device.js.map +1 -0
  35. package/dist/kit/core/errors.d.ts +22 -0
  36. package/dist/kit/core/errors.d.ts.map +1 -0
  37. package/dist/kit/core/errors.js +49 -0
  38. package/dist/kit/core/errors.js.map +1 -0
  39. package/dist/kit/core/files.d.ts +49 -0
  40. package/dist/kit/core/files.d.ts.map +1 -0
  41. package/dist/kit/core/files.js +213 -0
  42. package/dist/kit/core/files.js.map +1 -0
  43. package/dist/kit/core/host.d.ts +26 -0
  44. package/dist/kit/core/host.d.ts.map +1 -0
  45. package/dist/kit/core/host.js +10 -0
  46. package/dist/kit/core/host.js.map +1 -0
  47. package/dist/kit/core/log.d.ts +17 -0
  48. package/dist/kit/core/log.d.ts.map +1 -0
  49. package/dist/kit/core/log.js +82 -0
  50. package/dist/kit/core/log.js.map +1 -0
  51. package/dist/kit/core/paths.d.ts +27 -0
  52. package/dist/kit/core/paths.d.ts.map +1 -0
  53. package/dist/kit/core/paths.js +103 -0
  54. package/dist/kit/core/paths.js.map +1 -0
  55. package/dist/kit/core/pieces.d.ts +84 -0
  56. package/dist/kit/core/pieces.d.ts.map +1 -0
  57. package/dist/kit/core/pieces.js +374 -0
  58. package/dist/kit/core/pieces.js.map +1 -0
  59. package/dist/kit/core/progress-reporter.d.ts +30 -0
  60. package/dist/kit/core/progress-reporter.d.ts.map +1 -0
  61. package/dist/kit/core/progress-reporter.js +106 -0
  62. package/dist/kit/core/progress-reporter.js.map +1 -0
  63. package/dist/kit/core/progress.d.ts +22 -0
  64. package/dist/kit/core/progress.d.ts.map +1 -0
  65. package/dist/kit/core/progress.js +90 -0
  66. package/dist/kit/core/progress.js.map +1 -0
  67. package/dist/kit/core/run.d.ts +35 -0
  68. package/dist/kit/core/run.d.ts.map +1 -0
  69. package/dist/kit/core/run.js +850 -0
  70. package/dist/kit/core/run.js.map +1 -0
  71. package/dist/kit/core/save.d.ts +43 -0
  72. package/dist/kit/core/save.d.ts.map +1 -0
  73. package/dist/kit/core/save.js +265 -0
  74. package/dist/kit/core/save.js.map +1 -0
  75. package/dist/kit/core/schema.d.ts +5 -0
  76. package/dist/kit/core/schema.d.ts.map +1 -0
  77. package/dist/kit/core/schema.js +183 -0
  78. package/dist/kit/core/schema.js.map +1 -0
  79. package/dist/kit/core/secrets.d.ts +9 -0
  80. package/dist/kit/core/secrets.d.ts.map +1 -0
  81. package/dist/kit/core/secrets.js +60 -0
  82. package/dist/kit/core/secrets.js.map +1 -0
  83. package/dist/kit/core/style.d.ts +59 -0
  84. package/dist/kit/core/style.d.ts.map +1 -0
  85. package/dist/kit/core/style.js +179 -0
  86. package/dist/kit/core/style.js.map +1 -0
  87. package/dist/kit/core/toolchain.d.ts +52 -0
  88. package/dist/kit/core/toolchain.d.ts.map +1 -0
  89. package/dist/kit/core/toolchain.js +321 -0
  90. package/dist/kit/core/toolchain.js.map +1 -0
  91. package/dist/kit/core/version.d.ts +18 -0
  92. package/dist/kit/core/version.d.ts.map +1 -0
  93. package/dist/kit/core/version.js +33 -0
  94. package/dist/kit/core/version.js.map +1 -0
  95. package/dist/kit/env.d.ts +42 -0
  96. package/dist/kit/env.d.ts.map +1 -0
  97. package/dist/kit/env.js +76 -0
  98. package/dist/kit/env.js.map +1 -0
  99. package/dist/kit/line/client.d.ts +82 -0
  100. package/dist/kit/line/client.d.ts.map +1 -0
  101. package/dist/kit/line/client.js +325 -0
  102. package/dist/kit/line/client.js.map +1 -0
  103. package/dist/kit/line/types.d.ts +178 -0
  104. package/dist/kit/line/types.d.ts.map +1 -0
  105. package/dist/kit/line/types.js +18 -0
  106. package/dist/kit/line/types.js.map +1 -0
  107. package/dist/kit/maker/browser.d.ts +114 -0
  108. package/dist/kit/maker/browser.d.ts.map +1 -0
  109. package/dist/kit/maker/browser.js +547 -0
  110. package/dist/kit/maker/browser.js.map +1 -0
  111. package/dist/kit/maker/encode.d.ts +27 -0
  112. package/dist/kit/maker/encode.d.ts.map +1 -0
  113. package/dist/kit/maker/encode.js +58 -0
  114. package/dist/kit/maker/encode.js.map +1 -0
  115. package/dist/kit/maker/images.d.ts +14 -0
  116. package/dist/kit/maker/images.d.ts.map +1 -0
  117. package/dist/kit/maker/images.js +174 -0
  118. package/dist/kit/maker/images.js.map +1 -0
  119. package/dist/kit/maker/inputs.d.ts +81 -0
  120. package/dist/kit/maker/inputs.d.ts.map +1 -0
  121. package/dist/kit/maker/inputs.js +235 -0
  122. package/dist/kit/maker/inputs.js.map +1 -0
  123. package/dist/kit/maker/make.d.ts +19 -0
  124. package/dist/kit/maker/make.d.ts.map +1 -0
  125. package/dist/kit/maker/make.js +272 -0
  126. package/dist/kit/maker/make.js.map +1 -0
  127. package/dist/kit/maker/page.d.ts +19 -0
  128. package/dist/kit/maker/page.d.ts.map +1 -0
  129. package/dist/kit/maker/page.js +276 -0
  130. package/dist/kit/maker/page.js.map +1 -0
  131. package/dist/kit/maker/parts/html-frames/1.0.0/part.json +183 -0
  132. package/dist/kit/maker/parts/html-frames/src/part.d.ts +3 -0
  133. package/dist/kit/maker/parts/html-frames/src/part.d.ts.map +1 -0
  134. package/dist/kit/maker/parts/html-frames/src/part.js +10 -0
  135. package/dist/kit/maker/parts/html-frames/src/part.js.map +1 -0
  136. package/dist/kit/maker/runtime.d.ts +7 -0
  137. package/dist/kit/maker/runtime.d.ts.map +1 -0
  138. package/dist/kit/maker/runtime.js +571 -0
  139. package/dist/kit/maker/runtime.js.map +1 -0
  140. package/dist/kit/maker/unzip.d.ts +3 -0
  141. package/dist/kit/maker/unzip.d.ts.map +1 -0
  142. package/dist/kit/maker/unzip.js +133 -0
  143. package/dist/kit/maker/unzip.js.map +1 -0
  144. package/dist/kit/parts/catalog.d.ts +47 -0
  145. package/dist/kit/parts/catalog.d.ts.map +1 -0
  146. package/dist/kit/parts/catalog.js +198 -0
  147. package/dist/kit/parts/catalog.js.map +1 -0
  148. package/dist/kit/parts/fs-safe.d.ts +32 -0
  149. package/dist/kit/parts/fs-safe.d.ts.map +1 -0
  150. package/dist/kit/parts/fs-safe.js +185 -0
  151. package/dist/kit/parts/fs-safe.js.map +1 -0
  152. package/dist/kit/parts/loader.d.ts +50 -0
  153. package/dist/kit/parts/loader.d.ts.map +1 -0
  154. package/dist/kit/parts/loader.js +395 -0
  155. package/dist/kit/parts/loader.js.map +1 -0
  156. package/dist/kit/parts/semver.d.ts +6 -0
  157. package/dist/kit/parts/semver.d.ts.map +1 -0
  158. package/dist/kit/parts/semver.js +44 -0
  159. package/dist/kit/parts/semver.js.map +1 -0
  160. package/dist/program.d.ts.map +1 -1
  161. package/dist/program.js +6 -6
  162. package/dist/program.js.map +1 -1
  163. package/dist/skills/installer.d.ts +22 -0
  164. package/dist/skills/installer.d.ts.map +1 -1
  165. package/dist/skills/installer.js +56 -8
  166. package/dist/skills/installer.js.map +1 -1
  167. package/dist/skills/master-skill.d.ts +11 -70
  168. package/dist/skills/master-skill.d.ts.map +1 -1
  169. package/dist/skills/master-skill.js +120 -2900
  170. package/dist/skills/master-skill.js.map +1 -1
  171. package/dist/skills/package-freshness.d.ts +19 -0
  172. package/dist/skills/package-freshness.d.ts.map +1 -1
  173. package/dist/skills/package-freshness.js +37 -2
  174. package/dist/skills/package-freshness.js.map +1 -1
  175. package/dist/skills/routes.d.ts +7 -2
  176. package/dist/skills/routes.d.ts.map +1 -1
  177. package/dist/skills/routes.js +21 -25
  178. package/dist/skills/routes.js.map +1 -1
  179. package/dist/skills/server-entry-skills.d.ts +14 -0
  180. package/dist/skills/server-entry-skills.d.ts.map +1 -0
  181. package/dist/skills/server-entry-skills.js +119 -0
  182. package/dist/skills/server-entry-skills.js.map +1 -0
  183. package/dist/skills/staging-content.js +1 -1
  184. package/package.json +10 -6
  185. package/skills/goose-ads/SKILL.md +27 -605
  186. package/skills/goose-product-photos/SKILL.md +24 -217
  187. package/skills/goose-video/SKILL.md +23 -610
  188. package/skills/goose-video-local/SKILL.md +3 -1609
  189. package/skills/gooseworks/SKILL.md +58 -529
  190. package/skills/make-custom-video/SKILL.md +23 -725
  191. package/skills/manifest.json +7 -7
  192. package/skills/routes.json +10 -24
  193. package/dist/commands/video-local.d.ts +0 -9
  194. package/dist/commands/video-local.d.ts.map +0 -1
  195. package/dist/commands/video-local.js +0 -83
  196. package/dist/commands/video-local.js.map +0 -1
  197. package/dist/commands/video-save.d.ts +0 -3
  198. package/dist/commands/video-save.d.ts.map +0 -1
  199. package/dist/commands/video-save.js +0 -83
  200. package/dist/commands/video-save.js.map +0 -1
  201. package/dist/lib/video-local-captions.d.ts +0 -83
  202. package/dist/lib/video-local-captions.d.ts.map +0 -1
  203. package/dist/lib/video-local-captions.js +0 -261
  204. package/dist/lib/video-local-captions.js.map +0 -1
  205. package/dist/lib/video-local-runtime.d.ts +0 -8
  206. package/dist/lib/video-local-runtime.d.ts.map +0 -1
  207. package/dist/lib/video-local-runtime.js +0 -201
  208. package/dist/lib/video-local-runtime.js.map +0 -1
  209. package/dist/lib/video-save-mcp.d.ts +0 -9
  210. package/dist/lib/video-save-mcp.d.ts.map +0 -1
  211. package/dist/lib/video-save-mcp.js +0 -162
  212. package/dist/lib/video-save-mcp.js.map +0 -1
  213. package/dist/lib/video-save.d.ts +0 -77
  214. package/dist/lib/video-save.d.ts.map +0 -1
  215. package/dist/lib/video-save.js +0 -440
  216. package/dist/lib/video-save.js.map +0 -1
  217. package/dist/skills/custom-video-skill.d.ts +0 -3
  218. package/dist/skills/custom-video-skill.d.ts.map +0 -1
  219. package/dist/skills/custom-video-skill.js +0 -6
  220. package/dist/skills/custom-video-skill.js.map +0 -1
@@ -0,0 +1,374 @@
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.PieceCache = exports.PieceFailure = void 0;
37
+ exports.pieceOrderer = pieceOrderer;
38
+ // Paid pieces: the only paid path (ctx.line.order). The core names the piece,
39
+ // hashes it before hosting any file, keys it as the line requires, serves a
40
+ // piece it already has from pieces/<inputs_hash>/, hosts the payload's files,
41
+ // asks again while the line says running, and downloads the results.
42
+ const promises_1 = require("fs/promises");
43
+ const path = __importStar(require("path"));
44
+ const client_1 = require("../line/client");
45
+ const types_1 = require("../line/types");
46
+ const canonical_1 = require("./canonical");
47
+ const errors_1 = require("./errors");
48
+ const files_1 = require("./files");
49
+ const paths_1 = require("./paths");
50
+ const save_1 = require("./save");
51
+ const secrets_1 = require("./secrets");
52
+ const PIECE = /^[a-z0-9][a-z0-9_-]{0,47}$/;
53
+ const RESULT_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,119}$/;
54
+ const MAX_RESULT_BYTES = 500 * 1024 * 1024;
55
+ /** A piece the line refused or failed: final, or worth one new attempt. The line's words travel with it. */
56
+ class PieceFailure extends errors_1.PartError {
57
+ line;
58
+ constructor(code, line) {
59
+ super(code, line.error);
60
+ this.line = line;
61
+ }
62
+ }
63
+ exports.PieceFailure = PieceFailure;
64
+ /** pieces/<inputs_hash>/: downloaded paid results, reused by any re-run. */
65
+ class PieceCache {
66
+ root;
67
+ constructor(root) {
68
+ this.root = root;
69
+ }
70
+ dir(hash) {
71
+ if (!/^[a-f0-9]{64}$/.test(hash))
72
+ throw new Error('bad piece hash');
73
+ return path.join(this.root, hash);
74
+ }
75
+ /** The saved piece when it holds every result asked for, intact. */
76
+ async lookup(hash, results) {
77
+ const saved = await (0, save_1.readJson)(path.join(this.dir(hash), 'piece.json'));
78
+ if (!saved || saved.inputs_hash !== hash)
79
+ return null;
80
+ for (const r of results) {
81
+ const f = saved.files[r.pointer];
82
+ if (!f)
83
+ return null;
84
+ const file = path.join(this.dir(hash), f.sha256);
85
+ if (!(await (0, files_1.intact)({ kind: 'file', path: file, sha256: f.sha256, bytes: f.bytes, media: f.media, mime: f.mime })))
86
+ return null;
87
+ }
88
+ return saved;
89
+ }
90
+ fileOf(hash, sha256) {
91
+ return path.join(this.dir(hash), sha256);
92
+ }
93
+ async saveFile(hash, data) {
94
+ const sha = (0, canonical_1.sha256Hex)(data);
95
+ await (0, save_1.atomicWrite)(this.fileOf(hash, sha), data);
96
+ return sha;
97
+ }
98
+ async saveRecord(record) {
99
+ await (0, save_1.writeJson)(path.join(this.dir(record.inputs_hash), 'piece.json'), record);
100
+ }
101
+ async readOrder(hash) {
102
+ const saved = await (0, save_1.readJson)(path.join(this.dir(hash), 'order.json'));
103
+ return saved && saved.inputs_hash === hash && Array.isArray(saved.attempts) ? saved : null;
104
+ }
105
+ async saveOrder(state) {
106
+ await (0, save_1.writeJson)(path.join(this.dir(state.inputs_hash), 'order.json'), state);
107
+ }
108
+ }
109
+ exports.PieceCache = PieceCache;
110
+ function pointerValue(root, pointer) {
111
+ if (!pointer.startsWith('/'))
112
+ return undefined;
113
+ let node = root;
114
+ for (const raw of pointer.slice(1).split('/')) {
115
+ const key = raw.replace(/~1/g, '/').replace(/~0/g, '~');
116
+ if (node === null || typeof node !== 'object')
117
+ return undefined;
118
+ node = Array.isArray(node) ? node[Number(key)] : node[key];
119
+ }
120
+ return node;
121
+ }
122
+ /**
123
+ * A model id or provider path as the lock and the line compare it: no leading
124
+ * slash, the first segment (the model's owner) in lower case. Everything else
125
+ * must match exactly.
126
+ */
127
+ function modelKey(value) {
128
+ const trimmed = value.trim().replace(/^\/+/, '');
129
+ const slash = trimmed.indexOf('/');
130
+ return slash < 0 ? trimmed.toLowerCase() : `${trimmed.slice(0, slash).toLowerCase()}${trimmed.slice(slash)}`;
131
+ }
132
+ function topStrings(body) {
133
+ if (!body || typeof body !== 'object' || Array.isArray(body) || (0, canonical_1.isFileRef)(body))
134
+ return [];
135
+ return Object.values(body).filter((v) => typeof v === 'string');
136
+ }
137
+ function stopFor(body) {
138
+ const message = [body.error, body.fix].filter(Boolean).join(' ');
139
+ if (body.next === 'update_kit')
140
+ return new errors_1.KitStop(message, 'update_kit', body.code);
141
+ if (body.next === 'change_request')
142
+ return new errors_1.KitStop(message, 'change_request', body.code);
143
+ return new errors_1.KitStop(message, 'stop', body.code);
144
+ }
145
+ function lineStop(error) {
146
+ return stopFor({ code: error.code, error: error.message, fix: error.fix, next: error.next });
147
+ }
148
+ /** A failed piece, by the line's next step: only a provider failure the line says to retry is retried. */
149
+ function failureFor(failure) {
150
+ if (failure.next === 'retry' && failure.code !== 'provider_rejected')
151
+ return new PieceFailure('provider_failed', failure);
152
+ if (failure.next === 'stop' && failure.code === 'provider_rejected')
153
+ return new PieceFailure('provider_rejected', failure);
154
+ return stopFor(failure);
155
+ }
156
+ const waitSeconds = (s, fallback) => Math.min(Math.max(s ?? fallback, 1), 60) * 1000;
157
+ async function hostPayload(value, ctx) {
158
+ if ((0, canonical_1.isFileRef)(value)) {
159
+ const known = ctx.hosted.get(value.sha256);
160
+ if (known)
161
+ return known;
162
+ if (!types_1.HOSTABLE_TYPES.includes(value.mime))
163
+ throw new errors_1.PartError('bad_input', `a ${value.mime} file can't be sent to a provider`);
164
+ if (!(0, paths_1.isInside)(ctx.runRoot, value.path))
165
+ throw new errors_1.PartError('bad_input', 'a file outside this video was named in a payload');
166
+ const data = await (0, promises_1.readFile)(value.path);
167
+ if ((0, canonical_1.sha256Hex)(data) !== value.sha256 || data.length !== value.bytes)
168
+ throw new errors_1.PartError('bad_input', 'a file changed after it was made');
169
+ const base = path.basename(value.path).replace(/[^A-Za-z0-9._-]/g, '_').slice(-120) || `${value.sha256.slice(0, 16)}.bin`;
170
+ try {
171
+ const ref = await ctx.line.hostFile(ctx.videoId, { sha256: value.sha256, bytes: value.bytes, content_type: value.mime, filename: base }, data, ctx.signal);
172
+ ctx.hosted.set(value.sha256, ref);
173
+ return ref;
174
+ }
175
+ catch (error) {
176
+ if (error instanceof client_1.LineError)
177
+ throw lineStop(error);
178
+ throw error;
179
+ }
180
+ }
181
+ if (Array.isArray(value)) {
182
+ const out = [];
183
+ for (const item of value)
184
+ out.push(await hostPayload(item, ctx));
185
+ return out;
186
+ }
187
+ if (value && typeof value === 'object') {
188
+ const out = {};
189
+ for (const [k, v] of Object.entries(value))
190
+ out[k] = await hostPayload(v, ctx);
191
+ return out;
192
+ }
193
+ return value;
194
+ }
195
+ async function placeResult(ctx, hash, sha, name, media) {
196
+ const target = path.join(ctx.workDir, name);
197
+ await (0, promises_1.mkdir)(ctx.workDir, { recursive: true, mode: 0o700 });
198
+ await (0, promises_1.copyFile)(ctx.cache.fileOf(hash, sha), target);
199
+ const ref = await (0, files_1.fileRef)(target, media, ctx.probe);
200
+ if (ref.sha256 !== sha)
201
+ throw new errors_1.PartError('tool_failed', 'a saved piece changed on disk');
202
+ return ref;
203
+ }
204
+ /** Runs `work` alone for this key: calls with the same key wait their turn. */
205
+ async function alone(locks, key, work) {
206
+ const before = locks.get(key) ?? Promise.resolve();
207
+ let done;
208
+ const mine = new Promise((resolve) => (done = resolve));
209
+ const tail = before.then(() => mine);
210
+ locks.set(key, tail);
211
+ await before;
212
+ try {
213
+ return await work();
214
+ }
215
+ finally {
216
+ done();
217
+ if (locks.get(key) === tail)
218
+ locks.delete(key);
219
+ }
220
+ }
221
+ /** ctx.line.order for one step run. */
222
+ function pieceOrderer(ctx) {
223
+ return async (order) => {
224
+ if (ctx.signal.aborted)
225
+ throw new errors_1.PartError('stopped');
226
+ if (!order || typeof order.piece !== 'string' || !PIECE.test(order.piece))
227
+ throw new errors_1.PartError('bad_input', 'a piece needs a short lowercase name');
228
+ if (typeof order.path !== 'string' || !order.path || order.path.length > 300)
229
+ throw new errors_1.PartError('bad_input', 'a piece needs a provider path');
230
+ const allowed = ctx.models.filter((m) => m.provider === order.provider);
231
+ if (!allowed.length)
232
+ throw new errors_1.PartError('bad_input', `this part may not order from ${String(order.provider)}`);
233
+ const named = [order.path, ...topStrings(order.body)].map(modelKey);
234
+ if (!allowed.some((m) => named.includes(modelKey(m.model)))) {
235
+ throw new errors_1.PartError('bad_input', 'a piece must name one of its part’s models, as its path or in its payload');
236
+ }
237
+ if (!order.body || typeof order.body !== 'object' || Array.isArray(order.body) || (0, canonical_1.isFileRef)(order.body))
238
+ throw new errors_1.PartError('bad_input', 'a piece payload must be an object');
239
+ if (!Array.isArray(order.results) || order.results.some((r) => !r || !RESULT_NAME.test(r.name) || typeof r.pointer !== 'string' || !r.pointer.startsWith('/'))) {
240
+ throw new errors_1.PartError('bad_input', 'a piece names its result files badly');
241
+ }
242
+ const inputs_hash = (0, canonical_1.pieceHash)({ part: ctx.part, provider: order.provider, path: order.path, body: order.body });
243
+ // Two calls for the same piece (even under two names) take turns, so the
244
+ // second finds the first's result instead of ordering it again.
245
+ return alone(ctx.locks, inputs_hash, async () => {
246
+ // The journal names the paid piece by the first name it was ordered under.
247
+ const state = (await ctx.cache.readOrder(inputs_hash)) ?? { inputs_hash, piece_key: `${ctx.stepId}.${order.piece}`, attempts: [] };
248
+ const piece_key = state.piece_key;
249
+ const keyFor = (attempt) => `${piece_key}:${inputs_hash}:${attempt}`;
250
+ const last = state.attempts[state.attempts.length - 1];
251
+ // A piece this video already has is never ordered again.
252
+ const cached = await ctx.cache.lookup(inputs_hash, order.results);
253
+ if (cached) {
254
+ const files = {};
255
+ for (const r of order.results)
256
+ files[r.name] = await placeResult(ctx, inputs_hash, cached.files[r.pointer].sha256, r.name, r.media);
257
+ const attempt = (last?.attempt ?? 1);
258
+ await ctx.onPiece({ piece: order.piece, piece_key, inputs_hash, idempotency_key: last?.key ?? keyFor(1), attempt, reused: true });
259
+ return { json: (cached.json ?? null), files, reused: true };
260
+ }
261
+ // The key: the last one again while its piece may be running or is done.
262
+ // A saved failure is acted on as the line said, before anything is sent:
263
+ // only a failure the line said to retry earns a new attempt, and only one.
264
+ let current;
265
+ if (last?.outcome === 'failed') {
266
+ const saved = last.failure ?? { code: 'provider_failed', error: 'This piece failed.', fix: '', next: 'retry' };
267
+ if (saved.next !== 'retry' || saved.code === 'provider_rejected')
268
+ throw failureFor(saved);
269
+ if (last.attempt >= 2)
270
+ throw new errors_1.KitStop([saved.error, saved.fix].filter(Boolean).join(' ') || 'This part of the video failed twice.', 'failed', saved.code);
271
+ current = { attempt: last.attempt + 1, key: keyFor(last.attempt + 1), outcome: 'sent' };
272
+ state.attempts.push(current);
273
+ }
274
+ else if (last) {
275
+ current = last;
276
+ }
277
+ else {
278
+ current = { attempt: 1, key: keyFor(1), outcome: 'sent' };
279
+ state.attempts.push(current);
280
+ }
281
+ if (ctx.signal.aborted)
282
+ throw new errors_1.PartError('stopped');
283
+ const body = (await hostPayload(order.body, ctx));
284
+ const ask = async () => {
285
+ await ctx.cache.saveOrder(state);
286
+ let busy = 0;
287
+ for (;;) {
288
+ let answer;
289
+ const request = { idempotency_key: current.key, piece_key, part: { id: ctx.part.id, version: ctx.part.version }, inputs_hash, call: { provider: order.provider, path: order.path, body } };
290
+ try {
291
+ answer = await ctx.line.orderPiece(ctx.videoId, request, ctx.signal);
292
+ }
293
+ catch (error) {
294
+ if (ctx.signal.aborted)
295
+ throw new errors_1.PartError('stopped');
296
+ if (!(error instanceof client_1.LineError))
297
+ throw error;
298
+ if (error.code !== 'piece_busy' || error.next !== 'retry' || ++busy > 30)
299
+ throw lineStop(error);
300
+ // Join the running attempt only when it is this same piece with these same inputs.
301
+ const running = error.details?.idempotency_key;
302
+ const prefix = `${piece_key}:${inputs_hash}:`;
303
+ const runningAttempt = typeof running === 'string' && running.startsWith(prefix) ? running.slice(prefix.length) : null;
304
+ const match = runningAttempt === '1' || runningAttempt === '2';
305
+ if (match && running !== current.key) {
306
+ current = { attempt: Number(runningAttempt), key: running, outcome: 'sent' };
307
+ state.attempts.push(current);
308
+ await ctx.cache.saveOrder(state);
309
+ }
310
+ await ctx.sleep(waitSeconds(error.retryAfterSeconds, 10), ctx.signal);
311
+ continue;
312
+ }
313
+ if (answer.status !== 'running')
314
+ return answer;
315
+ ctx.onWait();
316
+ await ctx.sleep(waitSeconds(answer.retry_after_seconds, 10), ctx.signal);
317
+ }
318
+ };
319
+ let answer = await ask();
320
+ if (answer.status === 'failed') {
321
+ const failure = answer.failure ?? { code: 'provider_failed', error: 'This piece failed.', fix: '', next: 'retry' };
322
+ current.outcome = 'failed';
323
+ current.failure = { code: failure.code, error: failure.error, fix: failure.fix, next: failure.next };
324
+ await ctx.cache.saveOrder(state);
325
+ throw failureFor(failure);
326
+ }
327
+ current.outcome = 'done';
328
+ await ctx.cache.saveOrder(state);
329
+ // The piece is made and paid for. A failed download asks the line again
330
+ // under the same key (a replay, free) for fresh links; it never orders anew.
331
+ let record = { inputs_hash, json: null, files: {} };
332
+ const files = {};
333
+ for (let round = 0;; round++) {
334
+ const result = { json: answer.result?.json, file_url: answer.result?.file_url };
335
+ record = { inputs_hash, json: (0, secrets_1.withoutSignedLinks)(result.json ?? null), files: {} };
336
+ try {
337
+ for (const r of order.results) {
338
+ const url = pointerValue(result, r.pointer);
339
+ if (typeof url !== 'string' || !/^https?:\/\//i.test(url))
340
+ throw new errors_1.PartError('output_invalid', `the piece's answer has no file at ${r.pointer}`);
341
+ const data = await ctx.line.download(url, MAX_RESULT_BYTES, ctx.signal);
342
+ const sha = await ctx.cache.saveFile(inputs_hash, data);
343
+ record.files[r.pointer] = { sha256: sha, bytes: data.length, mime: (0, files_1.mimeOf)(r.name), media: r.media };
344
+ files[r.name] = await placeResult(ctx, inputs_hash, sha, r.name, r.media);
345
+ }
346
+ break;
347
+ }
348
+ catch (error) {
349
+ if (ctx.signal.aborted)
350
+ throw new errors_1.PartError('stopped');
351
+ if (error instanceof errors_1.PartError && error.code === 'output_invalid')
352
+ throw error;
353
+ if (round >= 1)
354
+ throw new errors_1.PartError('tool_failed', `a made piece could not be downloaded: ${error instanceof Error ? error.message : String(error)}`);
355
+ answer = await ask();
356
+ if (answer.status !== 'done')
357
+ throw new errors_1.PartError('tool_failed', 'a made piece is no longer available to download');
358
+ }
359
+ }
360
+ await ctx.cache.saveRecord(record);
361
+ await ctx.onPiece({
362
+ piece: order.piece,
363
+ piece_key,
364
+ inputs_hash,
365
+ idempotency_key: current.key,
366
+ attempt: current.attempt,
367
+ reused: answer.replayed,
368
+ credits: answer.piece_credits,
369
+ });
370
+ return { json: record.json, files, reused: answer.replayed };
371
+ });
372
+ };
373
+ }
374
+ //# sourceMappingURL=pieces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pieces.js","sourceRoot":"","sources":["../../../src/kit/core/pieces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type VideoLine } from '../line/client';
2
+ import type { KitLog } from './log';
3
+ import type { ProgressBook } from './progress';
4
+ export declare class ProgressReporter {
5
+ private readonly line;
6
+ private readonly videoId;
7
+ private readonly book;
8
+ private readonly log;
9
+ private readonly onStop;
10
+ private readonly heartbeatMs;
11
+ private readonly signal?;
12
+ private timer;
13
+ private inFlight;
14
+ private again;
15
+ private last;
16
+ private soon;
17
+ private paused;
18
+ constructor(line: VideoLine, videoId: string, book: ProgressBook, log: KitLog, onStop: (message: string, reason: 'stop' | 'update_kit' | 'change_request', code?: string) => void, heartbeatMs?: number, signal?: AbortSignal | undefined);
19
+ start(): void;
20
+ stopTimer(): void;
21
+ /** While our server checks the upload, the check call is the sign of life: no progress goes out. */
22
+ pause(): void;
23
+ resume(): void;
24
+ /** Sends now (or right after the call in flight, or within 1.5 s when one just went). Never throws. */
25
+ send(force?: boolean): Promise<void>;
26
+ /** Waits for the call in flight, so the last word reaches the card before the kit exits. */
27
+ flush(): Promise<void>;
28
+ private post;
29
+ }
30
+ //# sourceMappingURL=progress-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-reporter.d.ts","sourceRoot":"","sources":["../../../src/kit/core/progress-reporter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,qBAAa,gBAAgB;IASzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAd1B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAA+B;IAC3C,OAAO,CAAC,MAAM,CAAS;gBAGJ,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,YAAY,EAClB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,gBAAgB,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,EAClG,WAAW,SAAS,EACpB,MAAM,CAAC,EAAE,WAAW,YAAA;IAGvC,KAAK,IAAI,IAAI;IAMb,SAAS,IAAI,IAAI;IAOjB,oGAAoG;IACpG,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,uGAAuG;IACvG,IAAI,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BlC,4FAA4F;IACtF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAId,IAAI;CAcnB"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProgressReporter = void 0;
4
+ // Sends progress to the line after every piece and step, and at least once a
5
+ // minute while anything runs (a slow piece must never look quiet). A progress
6
+ // answer that says the video stopped stops the run.
7
+ const client_1 = require("../line/client");
8
+ class ProgressReporter {
9
+ line;
10
+ videoId;
11
+ book;
12
+ log;
13
+ onStop;
14
+ heartbeatMs;
15
+ signal;
16
+ timer = null;
17
+ inFlight = null;
18
+ again = false;
19
+ last = 0;
20
+ soon = null;
21
+ paused = false;
22
+ constructor(line, videoId, book, log, onStop, heartbeatMs = 45_000, signal) {
23
+ this.line = line;
24
+ this.videoId = videoId;
25
+ this.book = book;
26
+ this.log = log;
27
+ this.onStop = onStop;
28
+ this.heartbeatMs = heartbeatMs;
29
+ this.signal = signal;
30
+ }
31
+ start() {
32
+ if (this.timer)
33
+ return;
34
+ this.timer = setInterval(() => void this.send(true), this.heartbeatMs);
35
+ this.timer.unref?.();
36
+ }
37
+ stopTimer() {
38
+ if (this.timer)
39
+ clearInterval(this.timer);
40
+ if (this.soon)
41
+ clearTimeout(this.soon);
42
+ this.timer = null;
43
+ this.soon = null;
44
+ }
45
+ /** While our server checks the upload, the check call is the sign of life: no progress goes out. */
46
+ pause() {
47
+ this.paused = true;
48
+ }
49
+ resume() {
50
+ this.paused = false;
51
+ }
52
+ /** Sends now (or right after the call in flight, or within 1.5 s when one just went). Never throws. */
53
+ send(force = false) {
54
+ if (this.paused)
55
+ return Promise.resolve();
56
+ const wait = 1500 - (Date.now() - this.last);
57
+ if (!force && wait > 0) {
58
+ if (!this.soon && !this.inFlight) {
59
+ this.soon = setTimeout(() => {
60
+ this.soon = null;
61
+ void this.send(true);
62
+ }, wait);
63
+ this.soon.unref?.();
64
+ }
65
+ else
66
+ this.again = true;
67
+ return this.inFlight ?? Promise.resolve();
68
+ }
69
+ if (this.inFlight) {
70
+ this.again = true;
71
+ return this.inFlight;
72
+ }
73
+ this.inFlight = this.post().finally(() => {
74
+ this.inFlight = null;
75
+ if (this.again) {
76
+ this.again = false;
77
+ void this.send(true);
78
+ }
79
+ });
80
+ return this.inFlight;
81
+ }
82
+ /** Waits for the call in flight, so the last word reaches the card before the kit exits. */
83
+ async flush() {
84
+ while (this.inFlight)
85
+ await this.inFlight;
86
+ }
87
+ async post() {
88
+ if (this.paused)
89
+ return;
90
+ this.last = Date.now();
91
+ try {
92
+ const answer = await this.line.progress(this.videoId, this.book.request(), this.signal);
93
+ if (answer.stop === true || answer.stage === 'stopped')
94
+ this.onStop('This video was stopped.', 'stop');
95
+ }
96
+ catch (error) {
97
+ if (error instanceof client_1.LineError && error.next !== 'retry') {
98
+ this.onStop([error.message, error.fix].filter(Boolean).join(' '), error.next, error.code);
99
+ return;
100
+ }
101
+ this.log.write('warn', 'progress could not be sent', { error: error instanceof Error ? error.message : String(error) });
102
+ }
103
+ }
104
+ }
105
+ exports.ProgressReporter = ProgressReporter;
106
+ //# sourceMappingURL=progress-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-reporter.js","sourceRoot":"","sources":["../../../src/kit/core/progress-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { PartKind } from '../part-interface';
2
+ import type { ProgressRequest } from '../line/types';
3
+ export declare function rowOf(kind: PartKind): string;
4
+ /** What has been made so far, as the card shows it. */
5
+ export declare class ProgressBook {
6
+ private readonly steps;
7
+ note: string;
8
+ plan(steps: Array<{
9
+ id: string;
10
+ kind: PartKind;
11
+ typical_s: number;
12
+ }>): void;
13
+ start(id: string): void;
14
+ count(id: string, update: {
15
+ done?: number;
16
+ total?: number;
17
+ fraction?: number;
18
+ }): void;
19
+ finish(id: string, state?: 'done' | 'failed'): void;
20
+ request(): ProgressRequest;
21
+ }
22
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../src/kit/core/progress.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,eAAe,CAAC;AAYnE,wBAAgB,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAE5C;AAYD,uDAAuD;AACvD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,IAAI,SAA8B;IAElC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAM3E,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IASvB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQrF,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,GAAG,QAAiB,GAAG,IAAI;IAO3D,OAAO,IAAI,eAAe;CAgC3B"}