scenri 0.19.1 → 0.20.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,75 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.20.0](https://github.com/tonygorb/Scenri/compare/v0.19.1...v0.20.0) (2026-09-27)
4
+
5
+
6
+ ### Features
7
+
8
+ * a few new features say New where they live ([0c2f3c1](https://github.com/tonygorb/Scenri/commit/0c2f3c131c7cfe71efeaf1abc644edab44da71c2))
9
+ * **capture:** What's New pictures as whole windows or isolated components ([25f9d79](https://github.com/tonygorb/Scenri/commit/25f9d7979d8c23a5419a97504abaff7b2986897f))
10
+ * mark a few new features New where they live ([d9e9d94](https://github.com/tonygorb/Scenri/commit/d9e9d94d98237b3be348ff0ded79e30e5c6c3bcc))
11
+ * **release:** a short history, headline updates and pictures in the release record ([6a11b1d](https://github.com/tonygorb/Scenri/commit/6a11b1d1a3e958ebd28391b78dde3c21e56e5258))
12
+ * **release:** every update has a title, announce is the tier, and one picture per update ([2da932c](https://github.com/tonygorb/Scenri/commit/2da932c2cda1f1fde142d922ef608bf3b8da8b22))
13
+ * **studio:** a What's New page, and a dialog that introduces one update ([8c6ff5b](https://github.com/tonygorb/Scenri/commit/8c6ff5bf4a8bcebc2ee3f53f69ea2f304dcb803c))
14
+ * **studio:** New wears an accessible info blue ([6860470](https://github.com/tonygorb/Scenri/commit/68604706b896c32ea1dca896b1ecdf4b214416f3))
15
+ * **studio:** shoot What's New pictures from the real app ([67a6909](https://github.com/tonygorb/Scenri/commit/67a6909e4c159cc2d6394b4fbc1e33e6083e5c68))
16
+ * **studio:** What's New excerpt dialog, fallback artwork, version tags and a clearer page ([0a326cd](https://github.com/tonygorb/Scenri/commit/0a326cdec08adb41cdc1f39f80555b31a6c9451e))
17
+ * What's New introduces the newest update with a real picture, and a page for every release ([3deec1c](https://github.com/tonygorb/Scenri/commit/3deec1c8c4951f58741e1470c2729b0a4b1154be))
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * a brand write that waits on an upload or a website keeps edits made meanwhile ([d23eb79](https://github.com/tonygorb/Scenri/commit/d23eb799a1141f708493c61e7c777762d0afa3ae))
23
+ * a failed size read no longer skips the scale step for a day ([39ba37d](https://github.com/tonygorb/Scenri/commit/39ba37d3dfab60e084da298f411167db02a192cc))
24
+ * a monthly cap typed as "$20" is set, and one that is not an amount says so ([c44726f](https://github.com/tonygorb/Scenri/commit/c44726f682eafd1195428faecf87667f645613b3))
25
+ * a second start leaves the running Scenri's work alone ([7e43c32](https://github.com/tonygorb/Scenri/commit/7e43c324662d475ea92b72adf6f3f0280714cb2a))
26
+ * a size read that failed for a moment no longer skips the scale step for a day ([f263916](https://github.com/tonygorb/Scenri/commit/f263916cf095ff3a4bcb7fec95ab2e3ecd3cf794))
27
+ * a store address that never answers says so, not "no shop" ([1771cc4](https://github.com/tonygorb/Scenri/commit/1771cc4928738364bbb0eec4bd5bac8bfbf6dcc7))
28
+ * Add product waits for photos that are still uploading ([ee8bc91](https://github.com/tonygorb/Scenri/commit/ee8bc917c26056539d0ffd95f41963124d3b3fcb))
29
+ * an upload stays a source when nothing can draw (presenter and scene) ([f92247a](https://github.com/tonygorb/Scenri/commit/f92247ad8c866509db459c3b4ed89ea5e7ef9d68))
30
+ * **brief:** keep the stand-in's outfit and strangers out of the shot ([71326d7](https://github.com/tonygorb/Scenri/commit/71326d761c63c63a142ecc5318dd8fbd7878005c))
31
+ * **brief:** keep the stand-in's outfit and strangers out of the shot ([0caa641](https://github.com/tonygorb/Scenri/commit/0caa641b7e34adbfb403632a489a53c53e65002c))
32
+ * clean stop on terminal close, 404 for a deleted shot, no orphan setup brand, menu focus ring ([cd3a86c](https://github.com/tonygorb/Scenri/commit/cd3a86c62733ed7f43dba354edbfb9742ea581c3))
33
+ * **cli:** send each picture once, readable, and stop repeating paid reads ([b7139a8](https://github.com/tonygorb/Scenri/commit/b7139a84080a8906cbf7a9fa05f043a046ebcbfa))
34
+ * closing the terminal stops Scenri as cleanly as Ctrl-C ([e938cdf](https://github.com/tonygorb/Scenri/commit/e938cdfb519f47c00500fde9bb3b168cf3bae91c))
35
+ * Cmd+Enter in a dialog no longer sends the brief behind it ([abaffe1](https://github.com/tonygorb/Scenri/commit/abaffe1021665357c14c82f403ed10191742857d))
36
+ * Cmd+Enter never sends the dock's brief while a shot is open ([266b159](https://github.com/tonygorb/Scenri/commit/266b159903e28a99c7f08854d49a3d5577475304))
37
+ * deleting a brand or every shot stops what is still rendering ([739dfb3](https://github.com/tonygorb/Scenri/commit/739dfb3cec5204aeb2ecc3287987604e2cbfeeae))
38
+ * **engines:** stop paying for pictures the adapters threw away ([a6ada79](https://github.com/tonygorb/Scenri/commit/a6ada798bb21214c933d0fd0c5ccaef1b518a58c))
39
+ * Escape in the brand kit takes the edit back instead of saving it ([6df9b3a](https://github.com/tonygorb/Scenri/commit/6df9b3adee2c4ca4deda199fcffc4d800aaa804e))
40
+ * harden startup, deletions, brand edits and the composer ([34047cd](https://github.com/tonygorb/Scenri/commit/34047cdbc534dc8da597dac7436abe669703a5c9))
41
+ * honest spend caps, brand-kit Escape and unreachable stores ([087ad75](https://github.com/tonygorb/Scenri/commit/087ad755faeb39128bde0d5898fd5923ea7ca26e))
42
+ * leaving setup while a kit is being read leaves no brand behind ([dd0ecd5](https://github.com/tonygorb/Scenri/commit/dd0ecd5c4f5c93e2281c12ed101b858371b9ca98))
43
+ * let a person describe at length in the presenter and scene chats ([aee9339](https://github.com/tonygorb/Scenri/commit/aee9339d67f3adcdf6d6d63b61e86d31ff97c757))
44
+ * let a person describe at length in the presenter and scene chats ([10f53ad](https://github.com/tonygorb/Scenri/commit/10f53ad255ac8cc780fdb5f97ac8746231b573d4))
45
+ * one quiet waiting language, and the swirl for a picture being made ([c90551f](https://github.com/tonygorb/Scenri/commit/c90551f72555b316b559e8370fbdddfd00d0799e))
46
+ * **presenter:** an upload never becomes the face when nothing can draw ([e125dbb](https://github.com/tonygorb/Scenri/commit/e125dbb97787ada36d30bc60e96c9d131c9d5a43))
47
+ * put Home's shelves on the wall's grid and end them on Show all ([19c77e0](https://github.com/tonygorb/Scenri/commit/19c77e075d699e9d20ec14e7769c2a57baa1660d))
48
+ * refining a shot deleted elsewhere says so instead of failing with 500 ([ba658e1](https://github.com/tonygorb/Scenri/commit/ba658e1171ff6f325e7bc3de559b7f3f0b6cfa63))
49
+ * **release:** no area opens by repeating its heading, however old the release ([b424623](https://github.com/tonygorb/Scenri/commit/b42462310e163ae6606439f47e1306c697141a19))
50
+ * Reveal with no file manager no longer takes Scenri down ([e0d239c](https://github.com/tonygorb/Scenri/commit/e0d239ca160458c41a776b116178bd203b9c5e76))
51
+ * **scene:** pictures wait for a reader, and an upload is never the card ([1ff90a6](https://github.com/tonygorb/Scenri/commit/1ff90a621b49668362adebf059f944d31ba2146a))
52
+ * Scenri started from the Mac icon finds Codex like a terminal does ([96ea39b](https://github.com/tonygorb/Scenri/commit/96ea39b4e320d54b4aa1c689da1cb6c988ce6b24))
53
+ * stop paying for generations that are thrown away ([8c71238](https://github.com/tonygorb/Scenri/commit/8c71238ba53e89861f656dd72b9a6a61d6dd052e))
54
+ * **studio:** a detail taken away in the questionnaire leaves again ([be9eca6](https://github.com/tonygorb/Scenri/commit/be9eca639ace1a77a86a348c0895b2794f2fe493))
55
+ * **studio:** a detail taken away in the questionnaire leaves again ([ec2dc5f](https://github.com/tonygorb/Scenri/commit/ec2dc5f912dea7d4a9d64025552fc8a6c9622c9d))
56
+ * **studio:** end each Home shelf on the library's Show all ([817401b](https://github.com/tonygorb/Scenri/commit/817401b689b4d44b3493deeb3f4727aa782cd38a))
57
+ * **studio:** every release on the What's New page is open, in one style ([92677cc](https://github.com/tonygorb/Scenri/commit/92677cc861b425d073387fdfec155503f086156e))
58
+ * **studio:** make the swirl the look of a picture being made ([f707c59](https://github.com/tonygorb/Scenri/commit/f707c59bcc112fc3b875538c387b092e97bfab62))
59
+ * **studio:** one quiet waiting language, and a refinement renders beside its shot ([622c2d1](https://github.com/tonygorb/Scenri/commit/622c2d1fb4d8d601a11dae74d610ba89c0dd66da))
60
+ * **studio:** one take per Try again, one shot per example, 4:5 on Replicate ([7355e1f](https://github.com/tonygorb/Scenri/commit/7355e1ff8dd8b0e0e49e0a91d063f83969f44fcb))
61
+ * **studio:** space Home's shelves and put them on the wall's grid ([1232faf](https://github.com/tonygorb/Scenri/commit/1232faf5e69f20e075d12744370f974dd6ff3f27))
62
+ * **studio:** tell the bell at once when a presenter draw starts or changes ([12f9be8](https://github.com/tonygorb/Scenri/commit/12f9be8326aad8bb6b09e856d6f9418051d4f74b))
63
+ * **studio:** the bell keeps one poll loop when a look is still out ([ed3791d](https://github.com/tonygorb/Scenri/commit/ed3791d5749a6913b43c98e1fc833556205bea74))
64
+ * **studio:** the new step stays in view, and the band passes then rests ([0295b86](https://github.com/tonygorb/Scenri/commit/0295b862e89c7285a48d1e232bde0b940e925d50))
65
+ * **studio:** What's New asks for its picture before a page's wall ([2576716](https://github.com/tonygorb/Scenri/commit/2576716a3ad51906935679362dbaa43bc0670755))
66
+ * **studio:** What's New names one version and is built from the app's own parts ([aec7dd8](https://github.com/tonygorb/Scenri/commit/aec7dd8eeb4e1d5175b71497bef6f3c32cf3a3bb))
67
+ * switching brand leaves the brief with the brand it was written for ([6a836d0](https://github.com/tonygorb/Scenri/commit/6a836d03111f0719ce5ecfb7a1dcd14a79afff36))
68
+ * the bell keeps one poll loop, and hears presenter work at once ([0358ee6](https://github.com/tonygorb/Scenri/commit/0358ee6394a261399c1682e230c857371bf8e687))
69
+ * the top bar menus show the keyboard focus ring again ([1f88dcb](https://github.com/tonygorb/Scenri/commit/1f88dcbcadc835aedcc71f7766d35537b49eef1d))
70
+ * Try again refuses a shot whose run is still drawing ([837cac8](https://github.com/tonygorb/Scenri/commit/837cac87212d35bf7e28c0221a9a13bcdd8e6402))
71
+ * Usage counts this week, on this computer's own days ([3a23192](https://github.com/tonygorb/Scenri/commit/3a231929b5d42bc7075519e98f5cd128988c0f3e))
72
+
3
73
  ## [0.19.1](https://github.com/tonygorb/Scenri/compare/v0.19.0...v0.19.1) (2026-09-26)
4
74
 
5
75
 
package/README.md CHANGED
@@ -105,7 +105,7 @@ pnpm dev # starts the server on 127.0.0.1:4747
105
105
 
106
106
  | Engine | What it costs you | Needs | Carries a Product or Presenter |
107
107
  |---|---|---|---|
108
- | **Codex CLI** | your ChatGPT plan | a ChatGPT account; the app installs and signs in for you | yes, up to 6 references |
108
+ | **Codex CLI** | your ChatGPT plan | a ChatGPT account; the app installs and signs in for you | yes, up to 5 references |
109
109
  | OpenRouter | about $0.04 a generation | API key | yes, up to 4 references |
110
110
  | Replicate | about $0.003 a generation | API token | no |
111
111
  | fal | about $0.003 a generation | API key | no |
@@ -1340,10 +1340,15 @@ function createStore(db) {
1340
1340
  ORDER BY n.created_at DESC, n.id DESC LIMIT ?`
1341
1341
  ).all(projectId, Math.max(1, Math.min(FEED_PAGE_MAX, limit))).map(rowToFeedNode);
1342
1342
  },
1343
- /** A year of runs by day, counted where the rows are. */
1343
+ /**
1344
+ * A year of runs by day, counted where the rows are. Days are this
1345
+ * computer's own calendar days: the rows are stamped in UTC, and a UTC day
1346
+ * put an evening's work in New York, or a night's in Tel Aviv, on the next
1347
+ * or the previous square of the person's grid.
1348
+ */
1344
1349
  usageByDay(brandId) {
1345
1350
  return db.prepare(
1346
- `SELECT substr(n.created_at, 1, 10) AS day,
1351
+ `SELECT date(n.created_at, 'localtime') AS day,
1347
1352
  coalesce(sum(n.kind = 'generation'), 0) AS generations,
1348
1353
  coalesce(sum(n.kind = 'edit'), 0) AS edits
1349
1354
  FROM nodes n JOIN projects p ON p.id = n.project_id
@@ -2303,5 +2308,5 @@ function createCore(homeDir = defaultHome()) {
2303
2308
  }
2304
2309
 
2305
2310
  export { ASPECT_TOLERANCE, BUDGET_EXHAUSTED, EDIT_REFERENCE_ROLE_DIRECTIVE, REFERENCE_ROLE_DIRECTIVE, SCHEMA_VERSION, STEM_MIN, SchemaTooNewError, SpendCapError, TRIGRAM_MIN, budgetSize, createCatalogStore, createCore, createStore, defaultHome, fold, ftsMatch, matchesQuery, nameMatches, ratioLabel, searchTerms, shortTermSql, termMatches, uniqueProjectSlug, uniqueSetSlug, uniqueSlug };
2306
- //# sourceMappingURL=chunk-4PJPJGGP.js.map
2307
- //# sourceMappingURL=chunk-4PJPJGGP.js.map
2311
+ //# sourceMappingURL=chunk-YNL3WQOL.js.map
2312
+ //# sourceMappingURL=chunk-YNL3WQOL.js.map
@@ -5,7 +5,7 @@ import { defaultHome, newestStaged, listStaged, compareSemver, entryOf } from '.
5
5
  import { removeDesktop, failureDetail, installDesktop, POWERSHELL_ARGS } from './chunk-3BGDI4HI.js';
6
6
  import { launcherDir, logsDir, powershellPath } from './chunk-2IGINCPU.js';
7
7
  import { execFile, spawn } from 'child_process';
8
- import { closeSync, existsSync, readFileSync, writeFileSync, mkdirSync, openSync, rmSync, chmodSync, statSync, renameSync, appendFileSync } from 'fs';
8
+ import { existsSync, closeSync, readFileSync, writeFileSync, mkdirSync, openSync, rmSync, chmodSync, statSync, renameSync, appendFileSync } from 'fs';
9
9
  import { homedir } from 'os';
10
10
  import { join, dirname, delimiter, win32 } from 'path';
11
11
  import { createServer } from 'http';
@@ -221,10 +221,7 @@ async function openScenri(deps) {
221
221
  ...deps.env,
222
222
  SCENRI_NO_OPEN: "1",
223
223
  SCENRI_HEADLESS: "1",
224
- // npm sits beside node for nvm, fnm, Volta, Homebrew and the installer,
225
- // and a Finder or Explorer PATH has none of them: without this the
226
- // server boots but one-click updates report no npm.
227
- PATH: [dirname(deps.execPath), deps.env.PATH].filter(Boolean).join(delimiter)
224
+ PATH: serverPath(deps.execPath, deps.env, process.platform, existsSync)
228
225
  }
229
226
  });
230
227
  } catch (err) {
@@ -363,6 +360,15 @@ function releaseLock(path) {
363
360
  } catch {
364
361
  }
365
362
  }
363
+ function serverPath(execPath, env, platform, exists) {
364
+ const base = [dirname(execPath), env.PATH].filter(Boolean).join(delimiter);
365
+ if (platform !== "darwin") return base;
366
+ const named = new Set(base.split(delimiter));
367
+ const home = env.HOME;
368
+ const terminal = ["/opt/homebrew/bin", "/usr/local/bin"];
369
+ if (home) terminal.push(join(home, ".local", "bin"), join(home, ".volta", "bin"));
370
+ return [base, ...terminal.filter((dir) => !named.has(dir) && exists(dir))].join(delimiter);
371
+ }
366
372
  function serveStartingPage(html) {
367
373
  let fetched = false;
368
374
  let agent = null;
@@ -474,7 +480,7 @@ async function addOrRepair(ownEntry, say, over) {
474
480
  }
475
481
  async function rememberDecline(home) {
476
482
  try {
477
- const { createCore } = await import('./src-7RKZJC7Y.js');
483
+ const { createCore } = await import('./src-URYJIC5Y.js');
478
484
  const core = createCore(home);
479
485
  try {
480
486
  core.store.setSetting("desktop.prompt", "declined");
@@ -541,5 +547,5 @@ function tail(path, bytes = 4096) {
541
547
  }
542
548
 
543
549
  export { addToDesktop, assetsDirFor, installDeps, runDesktopCommand, runExecFile, runOpenCommand };
544
- //# sourceMappingURL=cli-6LLQ5INA.js.map
545
- //# sourceMappingURL=cli-6LLQ5INA.js.map
550
+ //# sourceMappingURL=cli-WRNWT6P7.js.map
551
+ //# sourceMappingURL=cli-WRNWT6P7.js.map
package/dist/index.js CHANGED
@@ -86,12 +86,12 @@ try {
86
86
  break;
87
87
  }
88
88
  case "desktop": {
89
- const { runDesktopCommand } = await import('./cli-6LLQ5INA.js');
89
+ const { runDesktopCommand } = await import('./cli-WRNWT6P7.js');
90
90
  process.exit(await runDesktopCommand(command, fileURLToPath(import.meta.url)));
91
91
  break;
92
92
  }
93
93
  case "open": {
94
- const { runOpenCommand } = await import('./cli-6LLQ5INA.js');
94
+ const { runOpenCommand } = await import('./cli-WRNWT6P7.js');
95
95
  process.exit(await runOpenCommand(fileURLToPath(import.meta.url)));
96
96
  break;
97
97
  }