scenri 0.6.3 → 0.6.5

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 (39) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/serve.js +52 -6
  3. package/package.json +1 -1
  4. package/studio-dist/assets/{index-DCNiIIP7.js → index-D__G1gHp.js} +25 -25
  5. package/studio-dist/index.html +1 -1
  6. package/templates/chrome-bubble-warp.json +1 -1
  7. package/templates/cold-table-clinic.json +1 -1
  8. package/templates/confetti-burst-freeze.json +1 -1
  9. package/templates/editorial-fisheye-flash-studio.json +1 -1
  10. package/templates/heliconia-bloom-field.json +2 -2
  11. package/templates/indigo-fold.json +1 -1
  12. package/templates/interiors-bathroom-vanity.json +2 -2
  13. package/templates/interiors-marble-kitchen-counter.json +1 -1
  14. package/templates/interiors-wood-table-flatlay.json +2 -2
  15. package/templates/liquid-marble-pour.json +1 -1
  16. package/templates/plain-light-portrait.json +2 -2
  17. package/templates/precision-bench-anodised.json +1 -1
  18. package/templates/screen-print-duotone.json +1 -1
  19. package/templates/showcase/holloway-rings-loupe-surface-plate.json +1 -1
  20. package/templates/showcase/tanner-fielding-cocoa-crown.json +1 -1
  21. package/templates/showcase/voss-rowe-dune-slip-face.json +1 -1
  22. package/templates/social-amber-flare-motion.json +1 -1
  23. package/templates/social-fashion-campaign-billboard.json +1 -1
  24. package/templates/social-vertical-story-motion.json +2 -2
  25. package/templates/stitched-construction-detail.json +2 -2
  26. package/templates/studio-aloe-flesh-macro.json +1 -1
  27. package/templates/studio-amber-resin-suspension.json +1 -1
  28. package/templates/studio-basalt-crust-glow.json +1 -1
  29. package/templates/studio-blue-ice-melt-channel.json +1 -1
  30. package/templates/studio-boulder-gap.json +1 -1
  31. package/templates/studio-dune-slip-face.json +1 -1
  32. package/templates/studio-molten-sugar-pull.json +1 -1
  33. package/templates/studio-rainforest-canopy.json +1 -1
  34. package/templates/studio-reef-shelf-caustics.json +1 -1
  35. package/templates/studio-sea-stack-horizon.json +1 -1
  36. package/templates/studio-volcanic-ash-field.json +2 -2
  37. package/templates/succulent-dew-bed.json +1 -1
  38. package/templates/suspended-color-field.json +1 -1
  39. package/templates/terracotta-ledge-glow.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.6.5](https://github.com/tonygorb/Scenri/compare/v0.6.4...v0.6.5) (2026-08-29)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * a scene stages a subject slot, never its own demo object ([471981a](https://github.com/tonygorb/Scenri/commit/471981a89f7b3bb62cd4e5f7aec795b468e0aa15))
9
+ * a scene stages a subject slot, never its own demo object ([04e2afe](https://github.com/tonygorb/Scenri/commit/04e2afe7da67af13df32d854d2fd861597e6025e))
10
+
11
+ ## [0.6.4](https://github.com/tonygorb/Scenri/compare/v0.6.3...v0.6.4) (2026-08-28)
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * a create draft lives no longer than the attempt that made it ([5bace21](https://github.com/tonygorb/Scenri/commit/5bace21d251159371c4ded381e44b1824aed08b3))
17
+ * a create draft lives no longer than the attempt that made it ([8e4bc62](https://github.com/tonygorb/Scenri/commit/8e4bc62ff98e053d851681ec1e64fb8be259a0f6))
18
+
3
19
  ## [0.6.3](https://github.com/tonygorb/Scenri/compare/v0.6.2...v0.6.3) (2026-08-28)
4
20
 
5
21
 
package/dist/serve.js CHANGED
@@ -1291,8 +1291,11 @@ var REFERENCE_ROLE_DIRECTIVE = {
1291
1291
  // subject or person from it", which handed the model a photograph of a face
1292
1292
  // treatment and told it to ignore the treatment. A hand-attached reference
1293
1293
  // says "match ... treatment" and works; this now says the same thing, with the
1294
- // identity carve-out a scene needs and a lone reference does not.
1295
- scene: "a reference for this world and for the treatment applied to the figure in it \u2014 match the environment, the light, and the material, density, scale, finish and spread of that treatment, including which parts of the form it covers and how far it reaches; take no identity from the person in it, and no product or brand",
1294
+ // identity carve-out a scene needs and a lone reference does not. The tail
1295
+ // names staged objects as stand-ins rather than just "no product": a bare
1296
+ // prohibition still left the demo object in the frame, because the model had
1297
+ // nowhere to put what the photograph so vividly showed.
1298
+ scene: "a reference for this world and for the treatment applied to the figure in it \u2014 match the environment, the light, and the material, density, scale, finish and spread of that treatment, including which parts of the form it covers and how far it reaches; take no identity from the person in it, and treat any product, garment or prop staged in it as a stand-in whose place the attached subject takes \u2014 never an object to reproduce",
1296
1299
  composition: "a reference for framing, camera angle and pose only \u2014 take no subject, color, material or branding from it",
1297
1300
  style: "a reference for overall treatment and mood only \u2014 take no composition, subject or product detail from it",
1298
1301
  reference: "a reference to match in composition, lighting and treatment"
@@ -3129,6 +3132,21 @@ function sceneGuardDirectives(opts) {
3129
3132
  "The scene direction above describes the set, not the cast. If it says the space is empty or that no people appear, disregard that: the attached person stands in this set, clearly visible. A ban on props or extra objects in the scene direction is about set dressing only \u2014 it never applies to the presenter or to the product in their hands."
3130
3133
  );
3131
3134
  }
3135
+ if (opts.hasScenePhoto && (opts.hasProduct || opts.hasPerson)) {
3136
+ out.push(
3137
+ "One attached reference is the scene's own photograph. It shows this world \u2014 the set, the light, and any treatment this world applies \u2014 never a cast: any product, garment, prop or person visible in it is a stand-in, demonstrating where the subject sits, how large it stands in the frame, and what has been done to it."
3138
+ );
3139
+ if (opts.hasProduct) {
3140
+ out.push(
3141
+ "The product in the scene photograph is not in this shot. The attached product photo is the only source of product identity: that exact product takes the stand-in's position, at the placement and scale the scene photograph demonstrates, keeping its own shape, label and colours."
3142
+ );
3143
+ }
3144
+ if (opts.hasPerson) {
3145
+ out.push(
3146
+ "Any person in the scene photograph lends their role, never their face: the attached presenter takes their place, wearing whatever treatment this world applies, with their identity drawn from their own photographs alone."
3147
+ );
3148
+ }
3149
+ }
3132
3150
  return out;
3133
3151
  }
3134
3152
  function brandRuleDirectives(brand) {
@@ -3388,7 +3406,13 @@ function compileBrief(brief, ctx) {
3388
3406
  }
3389
3407
  const sceneCamera = inlineTemplates[0]?.camera?.trim() || ctx.template?.camera?.trim() || "";
3390
3408
  const cameraDirectives = sceneCamera && !shotSpecifiesCamera(sentence) ? [`Camera for this shot: ${sceneCamera}`] : [];
3391
- const guard = scene ? sceneGuardDirectives({ hasProduct: !!productId, hasPerson }) : [];
3409
+ const max = ctx.engineCaps.maxReferenceImages;
3410
+ const { kept, dropped } = allocateAttachments(attachments, max);
3411
+ const guard = scene ? sceneGuardDirectives({
3412
+ hasProduct: !!productId,
3413
+ hasPerson,
3414
+ hasScenePhoto: kept.some((a) => a.role === "scene")
3415
+ }) : [];
3392
3416
  const pairDirectives = productId && hasPerson ? [
3393
3417
  "If the attached product is something a person wears, the presenter wears that exact product, with the rest of the outfit styled around it; otherwise the presenter presents or uses the product naturally.",
3394
3418
  // A product's own notes are written for solo packshots, and several
@@ -3434,8 +3458,6 @@ function compileBrief(brief, ctx) {
3434
3458
  ...preservation
3435
3459
  ];
3436
3460
  if (allDirectives.length) prompt = `${prompt}${prompt.endsWith(".") ? "" : "."} ${dedupe(allDirectives).join(" ")}`;
3437
- const max = ctx.engineCaps.maxReferenceImages;
3438
- const { kept, dropped } = allocateAttachments(attachments, max);
3439
3461
  if (dropped.some((d) => d.role !== "scene")) {
3440
3462
  const names = [...new Set(dropped.filter((d) => d.role !== "scene").map((d) => d.label))];
3441
3463
  const reads = max === 0 ? "reads no reference images" : `reads ${max} reference image${max === 1 ? "" : "s"}`;
@@ -7513,7 +7535,11 @@ function registerAssetBuildRoutes(app, deps) {
7513
7535
  kind: "scene",
7514
7536
  sceneId: id,
7515
7537
  name: scene.name,
7516
- instruction: body.correction == null ? void 0 : String(body.correction),
7538
+ // A plain re-read used to drop the Direction on the floor: body.correction
7539
+ // was the only source, so the analyzer's deciding-word preamble never
7540
+ // fired and whatever the Direction excluded came straight back. No new
7541
+ // word means the stored word.
7542
+ instruction: String(body.correction ?? "").trim() || scene.instruction || void 0,
7517
7543
  imageHashes: []
7518
7544
  });
7519
7545
  } catch (err) {
@@ -7973,6 +7999,26 @@ function registerImageRoutes(app, deps) {
7973
7999
 
7974
8000
  // src/release/notes.data.ts
7975
8001
  var RELEASES = [
8002
+ {
8003
+ version: "0.6.5",
8004
+ date: "2026-08-29",
8005
+ sections: [
8006
+ {
8007
+ heading: "Scenes",
8008
+ body: "A Scene no longer brings its own demo object into your shots. The product and presenter you select take the place of whatever its reference or preview happened to stage, while the environment, the light and any figure treatment carry over as before. Editing the Direction and pressing Read again now applies the Direction you wrote instead of quietly ignoring it."
8009
+ }
8010
+ ]
8011
+ },
8012
+ {
8013
+ version: "0.6.4",
8014
+ date: "2026-08-29",
8015
+ sections: [
8016
+ {
8017
+ heading: "Create",
8018
+ body: "Adding a product, presenter or scene starts from an empty form. Photos and words belonging to something you already made no longer turn up in a new one, in a second tab, or after a restart. Closing the dialog still keeps what you were working on until you leave, and a build that fails still hands it all back so you can pick up where you were."
8019
+ }
8020
+ ]
8021
+ },
7976
8022
  {
7977
8023
  version: "0.6.3",
7978
8024
  date: "2026-08-28",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scenri",
3
- "version": "0.6.3",
3
+ "version": "0.6.5",
4
4
  "author": "Tony Gorb <hello@scenri.co>",
5
5
  "license": "AGPL-3.0-only",
6
6
  "type": "module",