fluncle 0.138.0 → 0.139.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 (2) hide show
  1. package/bin/fluncle.mjs +17 -4
  2. package/package.json +1 -1
package/bin/fluncle.mjs CHANGED
@@ -561,7 +561,7 @@ function parseVersion(version) {
561
561
  var currentVersion;
562
562
  var init_version = __esm(() => {
563
563
  init_output();
564
- currentVersion = "0.138.0".trim() ? "0.138.0".trim() : "0.1.0";
564
+ currentVersion = "0.139.0".trim() ? "0.139.0".trim() : "0.1.0";
565
565
  });
566
566
 
567
567
  // src/update-notifier.ts
@@ -2189,7 +2189,7 @@ function parseVersion2(version) {
2189
2189
  var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
2190
2190
  var init_version2 = __esm(() => {
2191
2191
  init_output();
2192
- currentVersion2 = "0.138.0".trim() ? "0.138.0".trim() : "0.1.0";
2192
+ currentVersion2 = "0.139.0".trim() ? "0.139.0".trim() : "0.1.0";
2193
2193
  });
2194
2194
 
2195
2195
  // ../../packages/registry/src/index.ts
@@ -2945,6 +2945,17 @@ var init_src = __esm(() => {
2945
2945
  probeConfig: { cadenceMs: 30 * MINUTE_MS, cronName: "fluncle-rank", kind: "cron" },
2946
2946
  weights: { status: "hidden" }
2947
2947
  },
2948
+ {
2949
+ command: "fluncle admin backfills label-images",
2950
+ exposedContent: [
2951
+ "resolve each pending label's own logo (Discogs → Wikidata → cover floor) → its own R2 image"
2952
+ ],
2953
+ kind: "cron",
2954
+ name: "cron.label-images",
2955
+ operatorNotes: "every 60m, run by a rave-02 HOST systemd timer (docs/agents/hermes/label-images-timer/). The DURABLE other half of the label entity: the crawler MINTS new labels every few minutes (each `image_state='pending'`) and the one-shot operator backfill only seeded the labels that already existed, so this cron is what gives every freshly-minted label its OWN logo instead of a borrowed album cover. METADATA ONLY — a label logo is internal, reversible, nominative-use trademark (the album-art posture); it certifies nothing and publishes nothing (agent tier, the `backfill_discogs` precedent). Worker-paced (the box holds no Discogs key / MusicBrainz budget): one bounded batch per tick walks each label's MB identity → its curated Discogs/Wikidata url-rels → downloads the logo once into R2, up the ladder Discogs → Wikidata → none (the freshest-cover floor). The `labels` row carries the durable reliability state (image_state/image_attempted_at/image_failures), so a resolved/none label is terminal and a vendor throttle just circuit-breaks and resumes next tick. Zero LLM tokens. Source: docs/agents/hermes/scripts/label-images-sweep.*. See docs/label-entity.md.",
2956
+ probeConfig: { cadenceMs: 60 * MINUTE_MS, cronName: "fluncle-label-images", kind: "cron" },
2957
+ weights: { status: "hidden" }
2958
+ },
2948
2959
  {
2949
2960
  command: "fluncle admin tracks capture-audio --queue",
2950
2961
  exposedContent: [
@@ -10286,15 +10297,17 @@ async function runCatalogueList(options, catalogueListCommand2) {
10286
10297
  }
10287
10298
  for (const track of tracks) {
10288
10299
  const identity = `${track.artists.join(", ")} \u2014 ${track.title}`;
10300
+ const dup = track.duplicateOf;
10301
+ const dupWhy = dup ? `already in the archive \u2014 ${dup.logId ? `${dup.logId} ` : ""}${dup.artists.join(", ")} \u2014 ${dup.title}` : null;
10289
10302
  if (options.lens === "capture") {
10290
10303
  const reason = track.captureReason;
10291
- const why2 = reason?.kind === "artist" ? `${reason.name} is already in the archive` : reason?.kind === "label" ? `${reason.name} already carries a finding` : reason?.kind === "seed-label" ? `${reason.name} is a label the crawler digs from` : reason?.kind === "skipped-label" ? `${reason.name} is not your lane \u2014 ranked last, kept anyway` : "nothing ties it to the archive yet";
10304
+ const why2 = dupWhy ?? (reason?.kind === "artist" ? `${reason.name} is already in the archive` : reason?.kind === "label" ? `${reason.name} already carries a finding` : reason?.kind === "seed-label" ? `${reason.name} is a label the crawler digs from` : reason?.kind === "skipped-label" ? `${reason.name} is not your lane \u2014 ranked last, kept anyway` : "nothing ties it to the archive yet");
10292
10305
  console.log(`${String(track.capturePriority ?? 0)} ${identity.padEnd(52)} ${why2}`);
10293
10306
  continue;
10294
10307
  }
10295
10308
  const match = track.nearestFinding;
10296
10309
  const score = track.nearestFindingScore?.toFixed(2) ?? "\u2014";
10297
- const why = match ? `closest to ${match.logId ? `${match.logId} ` : ""}${match.artists.join(", ")} \u2014 ${match.title}` : "nothing to compare it to yet";
10310
+ const why = dupWhy ?? (match ? `closest to ${match.logId ? `${match.logId} ` : ""}${match.artists.join(", ")} \u2014 ${match.title}` : "nothing to compare it to yet");
10298
10311
  console.log(`${score} ${identity.padEnd(52)} ${why}`);
10299
10312
  }
10300
10313
  }
package/package.json CHANGED
@@ -31,5 +31,5 @@
31
31
  "url": "git+https://github.com/mauricekleine/fluncle.git"
32
32
  },
33
33
  "type": "module",
34
- "version": "0.138.0"
34
+ "version": "0.139.0"
35
35
  }