fluncle 0.176.0 → 0.178.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 +30 -8
- 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.
|
|
564
|
+
currentVersion = "0.178.0".trim() ? "0.178.0".trim() : "0.1.0";
|
|
565
565
|
});
|
|
566
566
|
|
|
567
567
|
// src/update-notifier.ts
|
|
@@ -776,8 +776,9 @@ function loadConfig() {
|
|
|
776
776
|
if (loadedProfile === profile) {
|
|
777
777
|
return;
|
|
778
778
|
}
|
|
779
|
-
import_dotenv2.config({ path: join2(homedir2(), `.config/fluncle/.env.${profile}`), quiet: true });
|
|
780
779
|
loadedProfile = profile;
|
|
780
|
+
if (false) {}
|
|
781
|
+
import_dotenv2.config({ path: join2(homedir2(), `.config/fluncle/.env.${profile}`), quiet: true });
|
|
781
782
|
}
|
|
782
783
|
function getEnvProfile() {
|
|
783
784
|
const profile = process.env.FLUNCLE_ENV ?? defaultEnvProfile;
|
|
@@ -2259,7 +2260,7 @@ function parseVersion2(version) {
|
|
|
2259
2260
|
var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
|
|
2260
2261
|
var init_version2 = __esm(() => {
|
|
2261
2262
|
init_output();
|
|
2262
|
-
currentVersion2 = "0.
|
|
2263
|
+
currentVersion2 = "0.178.0".trim() ? "0.178.0".trim() : "0.1.0";
|
|
2263
2264
|
});
|
|
2264
2265
|
|
|
2265
2266
|
// ../../packages/registry/src/index.ts
|
|
@@ -2285,7 +2286,8 @@ var init_src = __esm(() => {
|
|
|
2285
2286
|
{
|
|
2286
2287
|
exposedContent: [
|
|
2287
2288
|
"the log index — every finding's coordinate page",
|
|
2288
|
-
"/log/:logId — one finding's permanent home (the Log ID resolves here)"
|
|
2289
|
+
"/log/:logId — one finding's permanent home (the Log ID resolves here)",
|
|
2290
|
+
"/:coordinate — a bare coordinate typed at the root (the form on a video frame) 301s here"
|
|
2289
2291
|
],
|
|
2290
2292
|
kind: "web_route",
|
|
2291
2293
|
name: "web.log",
|
|
@@ -3125,7 +3127,7 @@ var init_src = __esm(() => {
|
|
|
3125
3127
|
],
|
|
3126
3128
|
kind: "cron",
|
|
3127
3129
|
name: "cron.label-releases",
|
|
3128
|
-
operatorNotes: "every 24h, run by a rave-02 HOST systemd timer (docs/agents/hermes/label-releases-timer/). The FRESHNESS TAP (D8): MusicBrainz WALKS the graph (cron.crawl) but lags a release ~2 weeks; Spotify has it day one, so this searches each ENABLED seed label's fresh releases (`label:\"<name>\" tag:new
|
|
3130
|
+
operatorNotes: "every 24h, run by a rave-02 HOST systemd timer (docs/agents/hermes/label-releases-timer/). The FRESHNESS TAP (D8): MusicBrainz WALKS the graph (cron.crawl) but lags a release ~2 weeks; Spotify has it day one, so this searches each ENABLED seed label's fresh releases (`label:\"<name>\" tag:new`) and mints METADATA-ONLY catalogue rows (a `tracks` row with no `findings` row) with their real release dates — closing the /fresh lag cliff. The fuzzy `label:` search is gated on TWO signals before an album mints onto public /fresh: an album's Spotify artist must already be in our archive (`artists.spotify_artist_id` — the primary identity/genre anchor that stops cross-genre homonym junk) AND the album's ℗/© copyright must EXACTLY match the seed label (a brand-new artist's debut is skipped until the MB crawl backfills them). It certifies nothing, publishes nothing, and never widens the graph (no new labels, no artist hops). Deduped against the MB crawl from both directions (Spotify id/uri/ISRC + same-album title fold). Worker-paced, reusing the publish path's Spotify OAuth (no new secret; Apple was a measured 2/99 seed-label dead end). Zero LLM tokens. Source: docs/agents/hermes/scripts/label-releases-sweep.*. See docs/catalogue-crawler.md.",
|
|
3129
3131
|
probeConfig: {
|
|
3130
3132
|
cadenceMs: 24 * 60 * MINUTE_MS,
|
|
3131
3133
|
cronName: "fluncle-label-releases",
|
|
@@ -3551,6 +3553,23 @@ var init_src = __esm(() => {
|
|
|
3551
3553
|
title: "Funnel snapshot",
|
|
3552
3554
|
weights: { status: "hidden" }
|
|
3553
3555
|
},
|
|
3556
|
+
{
|
|
3557
|
+
exposedContent: [
|
|
3558
|
+
"daily per-post social-metrics snapshot — appends each published post's Postiz reach (views/likes/comments/…) into an append-only ledger, one row per post per day (--no-agent)"
|
|
3559
|
+
],
|
|
3560
|
+
kind: "cron",
|
|
3561
|
+
name: "cron.social-metrics",
|
|
3562
|
+
operatorNotes: "22:15 UTC daily (clear of the 23:45 funnel snapshot). A bare trigger (the funnel-snapshot/reach shape): fires the AGENT-tier record_social_metrics op once — the Worker selects a deterministic ≤25-post budget (every post published in the last 14 days, then a rolling least-recently-snapshotted tail; the Postiz 30/hour cap), reads each one's Postiz per-post analytics, and APPENDS one social_metrics row per (post, source, UTC day) — append-only (velocity), idempotent per day. Also reads the Simple-Analytics social→site referrer arrivals for observability. Zero LLM tokens; the box's agent token drives it and the Postiz + SA keys live Worker-side (no new secret). Source: docs/agents/hermes/scripts/social-metrics-sweep.*.",
|
|
3563
|
+
probeConfig: {
|
|
3564
|
+
cadenceMs: 24 * 60 * MINUTE_MS,
|
|
3565
|
+
cronName: "fluncle-social-metrics",
|
|
3566
|
+
kind: "cron",
|
|
3567
|
+
schedule: { time: "22:15", tz: "UTC" }
|
|
3568
|
+
},
|
|
3569
|
+
statusDescription: "records how far each posted video reached",
|
|
3570
|
+
title: "Social metrics",
|
|
3571
|
+
weights: { status: "hidden" }
|
|
3572
|
+
},
|
|
3554
3573
|
{
|
|
3555
3574
|
exposedContent: [
|
|
3556
3575
|
"nightly codebase audit — one domain/night on a 7-day rotation; opens a PR the reviewer merges (claude -p, subscription auth)"
|
|
@@ -10389,6 +10408,7 @@ async function runBackfillLabelReleases(options, backfillLabelReleasesCommand2)
|
|
|
10389
10408
|
let albumsMatched = 0;
|
|
10390
10409
|
let newRows = 0;
|
|
10391
10410
|
let skippedKnown = 0;
|
|
10411
|
+
let skippedUngrounded = 0;
|
|
10392
10412
|
let failedFetches = 0;
|
|
10393
10413
|
let fetchCeilingHit = false;
|
|
10394
10414
|
const MAX_PASSES = 100;
|
|
@@ -10401,6 +10421,7 @@ async function runBackfillLabelReleases(options, backfillLabelReleasesCommand2)
|
|
|
10401
10421
|
albumsMatched += result.albumsMatched;
|
|
10402
10422
|
newRows += result.newRows;
|
|
10403
10423
|
skippedKnown += result.skippedKnown;
|
|
10424
|
+
skippedUngrounded += result.skippedUngrounded;
|
|
10404
10425
|
failedFetches += result.failedFetches;
|
|
10405
10426
|
fetchCeilingHit = fetchCeilingHit || result.fetchCeilingHit;
|
|
10406
10427
|
newTrackIds.push(...result.newTrackIds);
|
|
@@ -10408,7 +10429,7 @@ async function runBackfillLabelReleases(options, backfillLabelReleasesCommand2)
|
|
|
10408
10429
|
failedLabels.push(...result.failedLabels);
|
|
10409
10430
|
if (!options.json) {
|
|
10410
10431
|
const verb2 = result.dryRun ? "would probe" : "probed";
|
|
10411
|
-
console.log(` \u2026${verb2} ${result.labelSlugs.length} label(s); ${result.albumsMatched} matched album(s); ${result.newRows} new; ${result.skippedKnown} known; ${result.failedFetches} fetch-fail; ${result.failedLabels.length} search-fail`);
|
|
10432
|
+
console.log(` \u2026${verb2} ${result.labelSlugs.length} label(s); ${result.albumsMatched} matched album(s); ${result.newRows} new; ${result.skippedKnown} known; ${result.skippedUngrounded} ungrounded; ${result.failedFetches} fetch-fail; ${result.failedLabels.length} search-fail`);
|
|
10412
10433
|
}
|
|
10413
10434
|
if (!result.configured) {
|
|
10414
10435
|
break;
|
|
@@ -10438,7 +10459,8 @@ async function runBackfillLabelReleases(options, backfillLabelReleasesCommand2)
|
|
|
10438
10459
|
newRows,
|
|
10439
10460
|
newTrackIds,
|
|
10440
10461
|
rateLimited: throttled,
|
|
10441
|
-
skippedKnown
|
|
10462
|
+
skippedKnown,
|
|
10463
|
+
skippedUngrounded
|
|
10442
10464
|
}, 0);
|
|
10443
10465
|
return;
|
|
10444
10466
|
}
|
|
@@ -10448,7 +10470,7 @@ async function runBackfillLabelReleases(options, backfillLabelReleasesCommand2)
|
|
|
10448
10470
|
}
|
|
10449
10471
|
const verb = dryRun ? "Would probe" : "Probed";
|
|
10450
10472
|
const probedCount = dryRun ? labelSlugs.length : labelsProbed;
|
|
10451
|
-
console.log(`${verb} ${probedCount} enabled seed label(s); ${albumsMatched} matched album(s); ${newRows} new catalogue row(s); ${skippedKnown} already known; ${failedFetches} fetch-fail; ${failedLabels.length} search-fail.`);
|
|
10473
|
+
console.log(`${verb} ${probedCount} enabled seed label(s); ${albumsMatched} matched album(s); ${newRows} new catalogue row(s); ${skippedKnown} already known; ${skippedUngrounded} dropped for no known artist; ${failedFetches} fetch-fail; ${failedLabels.length} search-fail.`);
|
|
10452
10474
|
if (fetchCeilingHit) {
|
|
10453
10475
|
console.log(" (a pass ended early on the single-fetch ceiling \u2014 resumes next tick)");
|
|
10454
10476
|
}
|
package/package.json
CHANGED