fluncle 0.115.0 → 0.117.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 +104 -4
  2. package/package.json +1 -1
package/bin/fluncle.mjs CHANGED
@@ -557,7 +557,7 @@ function parseVersion(version) {
557
557
  var currentVersion;
558
558
  var init_version = __esm(() => {
559
559
  init_output();
560
- currentVersion = "0.115.0".trim() ? "0.115.0".trim() : "0.1.0";
560
+ currentVersion = "0.117.0".trim() ? "0.117.0".trim() : "0.1.0";
561
561
  });
562
562
 
563
563
  // src/update-notifier.ts
@@ -2251,7 +2251,7 @@ function parseVersion2(version) {
2251
2251
  var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
2252
2252
  var init_version2 = __esm(() => {
2253
2253
  init_output();
2254
- currentVersion2 = "0.115.0".trim() ? "0.115.0".trim() : "0.1.0";
2254
+ currentVersion2 = "0.117.0".trim() ? "0.117.0".trim() : "0.1.0";
2255
2255
  });
2256
2256
 
2257
2257
  // ../../packages/registry/src/index.ts
@@ -2917,6 +2917,17 @@ var init_src = __esm(() => {
2917
2917
  probeConfig: { cadenceMs: 10 * MINUTE_MS, cronName: "fluncle-note", kind: "cron" },
2918
2918
  weights: { status: "hidden" }
2919
2919
  },
2920
+ {
2921
+ command: "fluncle admin submissions triage",
2922
+ exposedContent: [
2923
+ "pre-chew a pending crew submission → an advisory queue verdict, fill-first (hybrid: one claude -p call)"
2924
+ ],
2925
+ kind: "cron",
2926
+ name: "cron.triage",
2927
+ operatorNotes: "every 15m. Hybrid --no-agent; a deterministic archive dedupe + DnB-plausibility heuristic feeds one claude -p phrasing, length-gated. Writes the verdict onto a PENDING submission so it lands in the /admin attention queue already assessed; approve/reject stays operator tier. Source: docs/agents/hermes/scripts/triage-sweep.{sh,ts}.",
2928
+ probeConfig: { cadenceMs: 15 * MINUTE_MS, cronName: "fluncle-triage", kind: "cron" },
2929
+ weights: { status: "hidden" }
2930
+ },
2920
2931
  {
2921
2932
  command: "fluncle admin logbook gaps",
2922
2933
  exposedContent: [
@@ -5307,7 +5318,8 @@ var exports_admin_artists = {};
5307
5318
  __export(exports_admin_artists, {
5308
5319
  resolveArtistCommand: () => resolveArtistCommand,
5309
5320
  listArtistsCommand: () => listArtistsCommand,
5310
- backfillArtistsCommand: () => backfillArtistsCommand
5321
+ backfillArtistsCommand: () => backfillArtistsCommand,
5322
+ backfillArtistImagesCommand: () => backfillArtistImagesCommand
5311
5323
  });
5312
5324
  async function listArtistsCommand(limit, cursor) {
5313
5325
  const params = new URLSearchParams({ limit: String(limit) });
@@ -5319,6 +5331,13 @@ async function listArtistsCommand(limit, cursor) {
5319
5331
  async function resolveArtistCommand(artistId) {
5320
5332
  return adminApiPost(`/api/admin/artists/${encodeURIComponent(artistId)}/resolve`);
5321
5333
  }
5334
+ async function backfillArtistImagesCommand(limit, dryRun, cursor) {
5335
+ const params = new URLSearchParams({ dryRun: String(dryRun), limit: String(limit) });
5336
+ if (cursor) {
5337
+ params.set("cursor", cursor);
5338
+ }
5339
+ return adminApiPost(`/api/admin/backfill/artist-images?${params.toString()}`);
5340
+ }
5322
5341
  async function backfillArtistsCommand(limit, dryRun, cursor) {
5323
5342
  const params = new URLSearchParams({ dryRun: String(dryRun), limit: String(limit) });
5324
5343
  if (cursor) {
@@ -8231,6 +8250,10 @@ function addAdminCommands(program2) {
8231
8250
  const { backfillArtistsCommand: backfillArtistsCommand2 } = await Promise.resolve().then(() => (init_admin_artists(), exports_admin_artists));
8232
8251
  await runBackfillArtists(options, backfillArtistsCommand2);
8233
8252
  });
8253
+ backfill.command("artist-images").description("Back-fill artist Spotify avatars (image_url) for existing artists").option("--dry-run", "Report which artists would be filled without touching the DB", false).option("--limit <limit>", "Max artists to process", "50").option("--json", "Print JSON", false).action(async (options) => {
8254
+ const { backfillArtistImagesCommand: backfillArtistImagesCommand2 } = await Promise.resolve().then(() => (init_admin_artists(), exports_admin_artists));
8255
+ await runBackfillArtistImages(options, backfillArtistImagesCommand2);
8256
+ });
8234
8257
  artists.command("resolve").description("Resolve an artist's social identity (MB url-rels + Firecrawl gap-fill)").argument("[artistId]").option("--queue", "Show the resolve worklist (artists awaiting resolution), oldest first", false).option("--limit <limit>", "Number of artists to show with --queue", "50").option("--json", "Print JSON", false).allowExcessArguments().action(async (artistId, options) => {
8235
8258
  if (options.queue) {
8236
8259
  const { listArtistsCommand: listArtistsCommand2 } = await Promise.resolve().then(() => (init_admin_artists(), exports_admin_artists));
@@ -8587,6 +8610,51 @@ async function runBackfillArtists(options, backfillArtistsCommand2) {
8587
8610
  console.log(` ${item.logId}: ${item.error}`);
8588
8611
  }
8589
8612
  }
8613
+ async function runBackfillArtistImages(options, backfillArtistImagesCommand2) {
8614
+ const limit = parseListLimit(options.limit);
8615
+ const filled = [];
8616
+ const failed = [];
8617
+ const skipped = [];
8618
+ let cursor;
8619
+ let dryRun = options.dryRun;
8620
+ while (filled.length + failed.length + skipped.length < limit) {
8621
+ const remaining = limit - (filled.length + failed.length + skipped.length);
8622
+ const result = await backfillArtistImagesCommand2(remaining, options.dryRun, cursor);
8623
+ dryRun = result.dryRun;
8624
+ filled.push(...result.filled);
8625
+ failed.push(...result.failed);
8626
+ skipped.push(...result.skipped);
8627
+ if (!options.json) {
8628
+ const verb2 = result.dryRun ? "would fill" : "filled";
8629
+ console.log(` \u2026${verb2} ${result.filledCount}; ${result.failedCount} failed; ${result.skippedCount} without an image`);
8630
+ }
8631
+ if (result.nextCursor === null) {
8632
+ break;
8633
+ }
8634
+ cursor = result.nextCursor;
8635
+ }
8636
+ if (options.json) {
8637
+ printJson({
8638
+ dryRun,
8639
+ failed,
8640
+ failedCount: failed.length,
8641
+ filled,
8642
+ filledCount: filled.length,
8643
+ ok: true,
8644
+ skipped,
8645
+ skippedCount: skipped.length
8646
+ });
8647
+ return;
8648
+ }
8649
+ const verb = dryRun ? "Would fill" : "Filled";
8650
+ console.log(`${verb} ${filled.length} artist avatar(s); ${failed.length} failed; ${skipped.length} without a Spotify image.`);
8651
+ for (const artistId of filled) {
8652
+ console.log(` ${artistId}`);
8653
+ }
8654
+ for (const item of failed) {
8655
+ console.log(` ${item.artistId}: ${item.error}`);
8656
+ }
8657
+ }
8590
8658
  async function runArtistResolveQueue(options, listArtistsCommand2) {
8591
8659
  const limit = parseListLimit(options.limit);
8592
8660
  const result = await listArtistsCommand2(limit ?? 50);
@@ -9783,13 +9851,24 @@ function normalizeCommanderError(error) {
9783
9851
  var stringOptions = new Set([
9784
9852
  "--analyzed-at",
9785
9853
  "--analyzed-from",
9854
+ "--at",
9855
+ "--audio",
9856
+ "--body",
9857
+ "--body-file",
9786
9858
  "--bpm",
9787
9859
  "--bpm-confidence",
9788
9860
  "--bpm-source",
9789
9861
  "--composition",
9862
+ "--content-file",
9863
+ "--context-note",
9790
9864
  "--cover",
9865
+ "--cues-file",
9866
+ "--cursor",
9791
9867
  "--dir",
9792
9868
  "--duration-ms",
9869
+ "--duration-target-sec",
9870
+ "--embedding",
9871
+ "--embedding-file",
9793
9872
  "--features",
9794
9873
  "--file",
9795
9874
  "--footage",
@@ -9798,29 +9877,50 @@ var stringOptions = new Set([
9798
9877
  "--footage-notext",
9799
9878
  "--footage-social",
9800
9879
  "--from",
9880
+ "--galaxy-id",
9881
+ "--has-key",
9801
9882
  "--intent",
9802
9883
  "--key",
9803
9884
  "--key-confidence",
9804
9885
  "--key-source",
9886
+ "--kind",
9805
9887
  "--limit",
9806
9888
  "--metrics",
9807
9889
  "--mime",
9890
+ "--model",
9808
9891
  "--note",
9892
+ "--order",
9893
+ "--parent-id",
9809
9894
  "--plate",
9810
9895
  "--plate-background",
9811
9896
  "--platform",
9812
9897
  "--poster",
9813
9898
  "--props",
9814
9899
  "--query",
9900
+ "--reasoning",
9815
9901
  "--recorded-at",
9902
+ "--recording",
9816
9903
  "--render",
9817
9904
  "--scene",
9818
9905
  "--scheduled-for",
9906
+ "--script",
9907
+ "--script-file",
9908
+ "--seed",
9819
9909
  "--soundcloud-url",
9820
9910
  "--source",
9821
9911
  "--status",
9912
+ "--subject",
9913
+ "--title",
9914
+ "--token",
9915
+ "--tracklist-file",
9822
9916
  "--url",
9823
- "--video-url"
9917
+ "--verdict",
9918
+ "--verdict-file",
9919
+ "--video",
9920
+ "--video-url",
9921
+ "--voice-id",
9922
+ "--window-since",
9923
+ "--window-until"
9824
9924
  ]);
9825
9925
  var rootHelpSections = `
9826
9926
 
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.115.0"
34
+ "version": "0.117.0"
35
35
  }