scenri 0.16.0 → 0.17.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,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.17.0](https://github.com/tonygorb/Scenri/compare/v0.16.0...v0.17.0) (2026-09-24)
4
+
5
+
6
+ ### Features
7
+
8
+ * **studio:** one filter row for every wall and catalog picking ([cfcbd81](https://github.com/tonygorb/Scenri/commit/cfcbd8143f1d20b98d2d796e29127aa545ba7871))
9
+
3
10
  ## [0.16.0](https://github.com/tonygorb/Scenri/compare/v0.15.1...v0.16.0) (2026-09-23)
4
11
 
5
12
 
@@ -1010,9 +1010,12 @@ function createStore(db) {
1010
1010
  db.prepare("UPDATE sets SET updated_at=datetime('now') WHERE id=?").run(setId);
1011
1011
  })();
1012
1012
  },
1013
- removeFromSet(setId, nodeId) {
1013
+ removeFromSet(setId, nodeIds) {
1014
+ const ids = nodeIds.filter(Boolean);
1015
+ if (ids.length === 0) return;
1014
1016
  db.transaction(() => {
1015
- db.prepare("DELETE FROM set_nodes WHERE set_id=? AND node_id=?").run(setId, nodeId);
1017
+ const del = db.prepare("DELETE FROM set_nodes WHERE set_id=? AND node_id=?");
1018
+ for (const nodeId of ids) del.run(setId, nodeId);
1016
1019
  db.prepare("UPDATE sets SET updated_at=datetime('now') WHERE id=?").run(setId);
1017
1020
  })();
1018
1021
  },
@@ -2254,5 +2257,5 @@ function createCore(homeDir = defaultHome()) {
2254
2257
  }
2255
2258
 
2256
2259
  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 };
2257
- //# sourceMappingURL=chunk-LMXHCXUC.js.map
2258
- //# sourceMappingURL=chunk-LMXHCXUC.js.map
2260
+ //# sourceMappingURL=chunk-HI7CG4TK.js.map
2261
+ //# sourceMappingURL=chunk-HI7CG4TK.js.map
@@ -463,7 +463,7 @@ async function addOrRepair(ownEntry, say, over) {
463
463
  }
464
464
  async function rememberDecline(home) {
465
465
  try {
466
- const { createCore } = await import('./src-XRZP3ZB5.js');
466
+ const { createCore } = await import('./src-VQCTLFGX.js');
467
467
  const core = createCore(home);
468
468
  try {
469
469
  core.store.setSetting("desktop.prompt", "declined");
@@ -530,5 +530,5 @@ function tail(path, bytes = 4096) {
530
530
  }
531
531
 
532
532
  export { addToDesktop, assetsDirFor, installDeps, runDesktopCommand, runExecFile, runOpenCommand };
533
- //# sourceMappingURL=cli-NXOTZTBT.js.map
534
- //# sourceMappingURL=cli-NXOTZTBT.js.map
533
+ //# sourceMappingURL=cli-Y5X5XXFA.js.map
534
+ //# sourceMappingURL=cli-Y5X5XXFA.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-NXOTZTBT.js');
89
+ const { runDesktopCommand } = await import('./cli-Y5X5XXFA.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-NXOTZTBT.js');
94
+ const { runOpenCommand } = await import('./cli-Y5X5XXFA.js');
95
95
  process.exit(await runOpenCommand(fileURLToPath(import.meta.url)));
96
96
  break;
97
97
  }
package/dist/serve.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { createUpdateChecker, classify, findNpm, isReleaseTriplet, stageVersion } from './chunk-YK37H6DM.js';
2
2
  import { shouldAdoptRunning, anotherScenriLines, portBusyLines } from './chunk-CMLJGPYC.js';
3
- import { SchemaTooNewError, createCore, BUDGET_EXHAUSTED, SpendCapError, EDIT_REFERENCE_ROLE_DIRECTIVE, REFERENCE_ROLE_DIRECTIVE, ratioLabel, searchTerms, nameMatches, budgetSize, SCHEMA_VERSION, ASPECT_TOLERANCE } from './chunk-LMXHCXUC.js';
3
+ import { SchemaTooNewError, createCore, BUDGET_EXHAUSTED, SpendCapError, EDIT_REFERENCE_ROLE_DIRECTIVE, REFERENCE_ROLE_DIRECTIVE, ratioLabel, searchTerms, nameMatches, budgetSize, SCHEMA_VERSION, ASPECT_TOLERANCE } from './chunk-HI7CG4TK.js';
4
4
  import { detectInstallKind } from './chunk-PAIAXRAC.js';
5
5
  export { detectInstallKind } from './chunk-PAIAXRAC.js';
6
6
  import { readMeta, repoSlug } from './chunk-Y3ZPBPLP.js';
@@ -13663,10 +13663,19 @@ function registerProjectRoutes(app, deps) {
13663
13663
  core.store.addToSet(set.id, nodeIds);
13664
13664
  return { ok: true, added: nodeIds.length, nodeIds: core.store.membersOf(set.id) };
13665
13665
  });
13666
+ app.post("/api/sets/:id/nodes/remove", async (req, reply) => {
13667
+ const set = core.store.getSet(req.params.id);
13668
+ if (!set) return reply.status(404).send({ error: "set not found" });
13669
+ const raw = req.body?.nodeIds;
13670
+ const nodeIds = (Array.isArray(raw) ? raw : []).map(String).filter(Boolean);
13671
+ if (nodeIds.length === 0) return reply.status(400).send({ error: "nodeIds must name at least one shot" });
13672
+ core.store.removeFromSet(set.id, nodeIds);
13673
+ return { ok: true, nodeIds: core.store.membersOf(set.id) };
13674
+ });
13666
13675
  app.delete("/api/sets/:id/nodes/:nodeId", async (req, reply) => {
13667
13676
  const { id, nodeId } = req.params;
13668
13677
  if (!core.store.getSet(id)) return reply.status(404).send({ error: "set not found" });
13669
- core.store.removeFromSet(id, nodeId);
13678
+ core.store.removeFromSet(id, [nodeId]);
13670
13679
  return { ok: true, nodeIds: core.store.membersOf(id) };
13671
13680
  });
13672
13681
  }
@@ -13933,6 +13942,24 @@ function registerImageRoutes(app, deps) {
13933
13942
 
13934
13943
  // src/release/notes.data.ts
13935
13944
  var RELEASES = [
13945
+ {
13946
+ version: "0.17.0",
13947
+ date: "2026-09-24",
13948
+ sections: [
13949
+ {
13950
+ heading: "Library",
13951
+ body: "Products, presenters and scenes of your own can be selected and then kept or deleted together from a bar at the bottom of the page, and renamed from their menu. Bookmarks are now Keepers, on every page and in every menu."
13952
+ },
13953
+ {
13954
+ heading: "Create",
13955
+ body: "Home, Create and the libraries share one tab row, with search and size at its end. On a phone, Create keeps its tabs readable and puts the set and the sort in one button beside search. Choosing a tab while scrolled down starts the list from the top."
13956
+ },
13957
+ {
13958
+ heading: "Fixes",
13959
+ body: "Tab counts on Create no longer jump while the page loads. Closing and opening the assets panel keeps the shot you were looking at in place, and alerts no longer cover the composer's buttons."
13960
+ }
13961
+ ]
13962
+ },
13936
13963
  {
13937
13964
  version: "0.16.0",
13938
13965
  date: "2026-09-24",
@@ -15420,7 +15447,7 @@ function registerDesktopRoutes(app, deps) {
15420
15447
  record: null
15421
15448
  };
15422
15449
  }
15423
- const { installDeps } = await import('./cli-NXOTZTBT.js');
15450
+ const { installDeps } = await import('./cli-Y5X5XXFA.js');
15424
15451
  const { desktopStatus } = await import('./install-VXJPLYWM.js');
15425
15452
  return desktopStatus(installDeps(runtime.entry));
15426
15453
  });
@@ -15428,7 +15455,7 @@ function registerDesktopRoutes(app, deps) {
15428
15455
  if (!runtime.entry) {
15429
15456
  return { ok: false, reason: "unsupported", message: "Desktop shortcuts are not available on this system yet." };
15430
15457
  }
15431
- const { addToDesktop } = await import('./cli-NXOTZTBT.js');
15458
+ const { addToDesktop } = await import('./cli-Y5X5XXFA.js');
15432
15459
  return addToDesktop(runtime.entry);
15433
15460
  });
15434
15461
  app.get("/api/desktop", async () => {
@@ -17284,7 +17311,7 @@ async function run3() {
17284
17311
  }
17285
17312
  }
17286
17313
  const ownEntry = fileURLToPath(import.meta.url);
17287
- const { addToDesktop, installDeps } = await import('./cli-NXOTZTBT.js');
17314
+ const { addToDesktop, installDeps } = await import('./cli-Y5X5XXFA.js');
17288
17315
  const { refreshLauncher } = await import('./refresh-5HBDLLLB.js');
17289
17316
  const { askOnTerminal, offerDesktop, shouldOfferDesktop } = await import('./offer-W6NJXMWT.js');
17290
17317
  const { launcherInstalled } = await import('./paths-6ZXRZUHY.js');
@@ -1,3 +1,3 @@
1
- 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 } from './chunk-LMXHCXUC.js';
2
- //# sourceMappingURL=src-XRZP3ZB5.js.map
3
- //# sourceMappingURL=src-XRZP3ZB5.js.map
1
+ 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 } from './chunk-HI7CG4TK.js';
2
+ //# sourceMappingURL=src-VQCTLFGX.js.map
3
+ //# sourceMappingURL=src-VQCTLFGX.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scenri",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "author": "Tony Gorb <hello@scenri.co>",
5
5
  "license": "AGPL-3.0-only",
6
6
  "type": "module",