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.
- package/bin/fluncle.mjs +104 -4
- 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.
|
|
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.
|
|
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
|
-
"--
|
|
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