@gentbajko/slopify 3.12.0 → 3.12.1

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.
@@ -0,0 +1,5 @@
1
+ # Slopify 3.12.1
2
+
3
+ Released 8 October 2026.
4
+
5
+ - **Finished narration no longer waits forever.** A project whose narration was already made could show Audio as waiting after an edit, so its run never read as done. Its finished narration is now recognised, so those projects show done; nothing is made again.
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "id": "3.12.1",
4
+ "title": "Slopify 3.12.1",
5
+ "version": "3.12.1",
6
+ "date": "2026-10-08"
7
+ },
2
8
  {
3
9
  "id": "3.12.0",
4
10
  "title": "Slopify 3.12.0",
@@ -151,7 +151,8 @@ export function executionStandings(deps, projectId, derived) {
151
151
  output.selected &&
152
152
  output.available &&
153
153
  output.piece.state === "done" &&
154
- output.fingerprint === piece.fingerprint));
154
+ (output.fingerprint === piece.fingerprint ||
155
+ madeFrom(deps, projectId, piece.key, output.fingerprint, piece.fingerprint))));
155
156
  // Save can bind an existing asset without granting its placeholder invocation.
156
157
  return retained ? { ...entry, state: "done" } : entry;
157
158
  });
@@ -174,6 +175,14 @@ export function executionStandings(deps, projectId, derived) {
174
175
  return state === "pending" && retryAt !== null ? { kind, state, retryAt } : { kind, state };
175
176
  });
176
177
  }
178
+ // A finished piece whose request was planned under this fingerprint: a placeholder is planned
179
+ // under the logical fingerprint, the finished piece carries the one its request resolved to.
180
+ function madeFrom(deps, projectId, key, done, planned) {
181
+ return (deps.db
182
+ .prepare(`SELECT 1 FROM revision_work_pieces p JOIN revision_work w ON w.id=p.work_id
183
+ WHERE w.project_id=? AND p.work_key=? AND p.state='done' AND p.fingerprint=? AND p.logical_fingerprint=? LIMIT 1`)
184
+ .get(projectId, key, done, planned) !== undefined);
185
+ }
177
186
  // The latest wait among a stage's steps that went back to wait after a failure time can fix.
178
187
  function latestRetry(deps, group) {
179
188
  let latest = null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gentbajko/slopify",
3
- "version": "3.12.0",
3
+ "version": "3.12.1",
4
4
  "description": "Turn a prompt into a finished video, locally, with your own provider keys",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Gent Bajko",