fluncle 0.195.0 → 0.197.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 +36 -19
- 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.197.0".trim() ? "0.197.0".trim() : "0.1.0";
|
|
565
565
|
});
|
|
566
566
|
|
|
567
567
|
// src/update-notifier.ts
|
|
@@ -2443,7 +2443,7 @@ function parseVersion2(version) {
|
|
|
2443
2443
|
var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
|
|
2444
2444
|
var init_version2 = __esm(() => {
|
|
2445
2445
|
init_output();
|
|
2446
|
-
currentVersion2 = "0.
|
|
2446
|
+
currentVersion2 = "0.197.0".trim() ? "0.197.0".trim() : "0.1.0";
|
|
2447
2447
|
});
|
|
2448
2448
|
|
|
2449
2449
|
// ../../packages/registry/src/index.ts
|
|
@@ -3160,7 +3160,7 @@ var init_src = __esm(() => {
|
|
|
3160
3160
|
apiFormat: "application/json",
|
|
3161
3161
|
discoveryUrl: `${SITE}/.well-known/mcp/server-card.json`,
|
|
3162
3162
|
exposedContent: [
|
|
3163
|
-
"the archive as MCP tools (Streamable HTTP, no auth): list_findings, list_tracks, list_fresh, get_track, get_random_track, get_status, search_archive, get_artist, get_label, build_set, list_similar_artists, list_album_catalogue, list_artist_catalogue, list_label_catalogue,
|
|
3163
|
+
"the archive as MCP tools (Streamable HTTP, no auth): list_findings, list_tracks, list_fresh, get_track, get_random_track, get_status, search_archive, get_artist, get_label, build_set, list_similar_artists, list_album_catalogue, list_artist_catalogue, list_label_catalogue, list_artists, list_albums, list_labels, submit_track, subscribe_newsletter, plus the MCP-only search_tracks (Spotify candidate search, not an archive read)",
|
|
3164
3164
|
"the archive as MCP resources: each finding/mixtape at fluncle://finding/<logId> or fluncle://mixtape/<logId> (its public record)",
|
|
3165
3165
|
"Fluncle-voiced MCP prompts: recommend_finding, walk_recent_night, decode_coordinate"
|
|
3166
3166
|
],
|
|
@@ -3307,7 +3307,7 @@ var init_src = __esm(() => {
|
|
|
3307
3307
|
{
|
|
3308
3308
|
command: "fluncle admin",
|
|
3309
3309
|
exposedContent: [
|
|
3310
|
-
"the operator/agent command group (hidden): tracks publish|update|enrich|video|draft|social|preview|observe|context|note, recordings
|
|
3310
|
+
"the operator/agent command group (hidden): a bare `queue` read plus ~22 plural groups — tracks (publish|update|enrich|embed|capture|video|draft|social|preview|observe|context|note|work|get|list|queue|mixable-order|requeue-analysis|vehicles), catalogue (the crawler + The Ear), frontier, labels, artists, albums, galaxies, notes, observations, clips, recordings, publish, capture, mixtapes, newsletter, logbook, prompts, submissions, reach, backfills, migrations, auth"
|
|
3311
3311
|
],
|
|
3312
3312
|
kind: "cli",
|
|
3313
3313
|
name: "cli.admin",
|
|
@@ -3685,27 +3685,26 @@ var init_src = __esm(() => {
|
|
|
3685
3685
|
},
|
|
3686
3686
|
{
|
|
3687
3687
|
exposedContent: [
|
|
3688
|
-
"
|
|
3688
|
+
"poll Twitch for the live set → POST the live state that lights the cross-surface callout (--no-agent)"
|
|
3689
3689
|
],
|
|
3690
3690
|
kind: "cron",
|
|
3691
|
-
name: "cron.
|
|
3692
|
-
operatorNotes: "every
|
|
3693
|
-
probeConfig: { cadenceMs:
|
|
3694
|
-
statusDescription: "
|
|
3695
|
-
title: "
|
|
3691
|
+
name: "cron.live",
|
|
3692
|
+
operatorNotes: "every 1m, run by a rave-02 host systemd timer (docs/agents/hermes/live-timer/). Pure polling, zero LLM tokens. Mints/reuses a cached Twitch client-credentials app token, asks Helix whether the channel is streaming, and POSTs the raw state to the agent-tier record_live_state op — the Worker owns the transition detection and the crew callout. The poller is deliberately dumb and idempotent; auto-clear is READ-side (every surface treats a flag older than ~5m as offline), so a dead poller can never strand a permanent LIVE banner. Source: docs/agents/hermes/scripts/fluncle-live.sh. Probed on /status as cron.live.",
|
|
3693
|
+
probeConfig: { cadenceMs: MINUTE_MS, cronName: "fluncle-live", kind: "cron" },
|
|
3694
|
+
statusDescription: "watches for the live set",
|
|
3695
|
+
title: "Live poller",
|
|
3696
3696
|
weights: { status: "hidden" }
|
|
3697
3697
|
},
|
|
3698
3698
|
{
|
|
3699
|
-
command: "fluncle admin clips drip-pause",
|
|
3700
3699
|
exposedContent: [
|
|
3701
|
-
"
|
|
3700
|
+
"cut each pending operator-framed 9:16 clip out of its set video → ship to R2 (--no-agent, ffmpeg)"
|
|
3702
3701
|
],
|
|
3703
3702
|
kind: "cron",
|
|
3704
|
-
name: "cron.clip
|
|
3705
|
-
operatorNotes: "every
|
|
3706
|
-
probeConfig: { cadenceMs:
|
|
3707
|
-
statusDescription: "
|
|
3708
|
-
title: "
|
|
3703
|
+
name: "cron.studio-clip",
|
|
3704
|
+
operatorNotes: "every 15m. Pure-trigger, zero LLM tokens: a deterministic ffmpeg cut driven by the fluncle CLI (`admin clips list` → `admin clips cut`), agent-scoped (list_clips + the agent-tier presign_clip_upload / finalize_clip_cut). Cuts the operator-framed 9:16 clips from the /admin/studio editor (keyed by Log ID) out of the set video → ships `<clipId>/footage.mp4` to R2 for the /admin/clips library + the clip drip-feed. The box runs the standalone bun BINARY (the npm thin client can't spawn ffmpeg). Source: docs/agents/hermes/scripts/clip-sweep.sh. Probed on /status as cron.studio-clip.",
|
|
3705
|
+
probeConfig: { cadenceMs: 15 * MINUTE_MS, cronName: "fluncle-studio-clip", kind: "cron" },
|
|
3706
|
+
statusDescription: "cuts set videos into 9:16 clips",
|
|
3707
|
+
title: "Studio clips",
|
|
3709
3708
|
weights: { status: "hidden" }
|
|
3710
3709
|
},
|
|
3711
3710
|
{
|
|
@@ -3781,6 +3780,23 @@ var init_src = __esm(() => {
|
|
|
3781
3780
|
title: "Database backup",
|
|
3782
3781
|
weights: { status: "secondary" }
|
|
3783
3782
|
},
|
|
3783
|
+
{
|
|
3784
|
+
exposedContent: [
|
|
3785
|
+
"nightly hub-counts reconciliation — re-derives renderable_track_count / certified_finding_count for every label/album/artist and corrects only the rows that drifted (--no-agent)"
|
|
3786
|
+
],
|
|
3787
|
+
kind: "cron",
|
|
3788
|
+
name: "cron.reconcile-hub-counts",
|
|
3789
|
+
operatorNotes: "04:10 Amsterdam (after the 04:00 reach snapshot, before the 04:40 demand tick), a rave-02 host systemd timer (docs/agents/hermes/reconcile-hub-counts-timer/). The SELF-HEALING BACKSTOP under keystone 2's maintained hub counts: they are moved as DELTAS by every edge-writing path (recompute-from-truth measured 27,400 ms at 150k hosted vs ~200 ms for the delta form), and a maintained counter drifts silently — a missed write path, a non-atomic bulk op, or an out-of-band write (the catalogue-prune skill deletes tracks straight out of the database). Keystone 2's own rollout proved it on day one: the deploy-window skew left 44 artists / 3 albums / 1 label wrong until a manual reconcile. A bare trigger (the funnel-snapshot shape): fires the AGENT-tier reconcile_hub_counts op once and the Worker runs two statements per table — a grouped `UPDATE … FROM (… GROUP BY fk)` guarded by a counts-DIFFER predicate (so rowsAffected IS the corrected-row count) plus a zero-truth pass for an entity whose last track vanished. The artists source is PINNED to `track_artists JOIN tracks` so orphaned edges never count. Idempotent; zero LLM tokens; no new secret. The corrected-row numbers are the operator's DRIFT AUDIT — journalctl -u fluncle-reconcile-hub-counts.service | grep AUDIT. Source: docs/agents/hermes/scripts/reconcile-hub-counts.*.",
|
|
3790
|
+
probeConfig: {
|
|
3791
|
+
cadenceMs: 24 * 60 * MINUTE_MS,
|
|
3792
|
+
cronName: "fluncle-reconcile-hub-counts",
|
|
3793
|
+
kind: "cron",
|
|
3794
|
+
schedule: { time: "04:10", tz: "Europe/Amsterdam" }
|
|
3795
|
+
},
|
|
3796
|
+
statusDescription: "keeps the archive's counts adding up",
|
|
3797
|
+
title: "Count check",
|
|
3798
|
+
weights: { status: "hidden" }
|
|
3799
|
+
},
|
|
3784
3800
|
{
|
|
3785
3801
|
command: "fluncle admin reach collect",
|
|
3786
3802
|
exposedContent: [
|
|
@@ -3823,7 +3839,7 @@ var init_src = __esm(() => {
|
|
|
3823
3839
|
],
|
|
3824
3840
|
kind: "cron",
|
|
3825
3841
|
name: "cron.funnel-snapshot",
|
|
3826
|
-
operatorNotes: "23:45 UTC daily (end of the UTC day the snapshot is keyed on). A bare trigger (the reach/anchor shape): fires the AGENT-tier record_catalogue_snapshot op once — the Worker computes every stage total + queue depth + frontier count through the SAME predicates the sweeps run (lib/server/funnel.ts) and UPSERTS one idempotent row per UTC day (a same-day re-run overwrites, never doubles a bar). Zero LLM tokens; the box's agent token drives it and calls the oRPC HTTP endpoint directly (no new CLI command the pinned box CLI would lack), so no new secret. Source: docs/agents/hermes/scripts/funnel-snapshot-sweep.*. See docs/
|
|
3842
|
+
operatorNotes: "23:45 UTC daily (end of the UTC day the snapshot is keyed on). A bare trigger (the reach/anchor shape): fires the AGENT-tier record_catalogue_snapshot op once — the Worker computes every stage total + queue depth + frontier count through the SAME predicates the sweeps run (lib/server/funnel.ts) and UPSERTS one idempotent row per UTC day (a same-day re-run overwrites, never doubles a bar). Zero LLM tokens; the box's agent token drives it and calls the oRPC HTTP endpoint directly (no new CLI command the pinned box CLI would lack), so no new secret. Source: docs/agents/hermes/scripts/funnel-snapshot-sweep.*. See docs/admin-shell.md.",
|
|
3827
3843
|
probeConfig: {
|
|
3828
3844
|
cadenceMs: 24 * 60 * MINUTE_MS,
|
|
3829
3845
|
cronName: "fluncle-funnel-snapshot",
|
|
@@ -4301,6 +4317,7 @@ var SOURCE_LABELS;
|
|
|
4301
4317
|
var init_admin_attention = __esm(() => {
|
|
4302
4318
|
init_api();
|
|
4303
4319
|
SOURCE_LABELS = {
|
|
4320
|
+
"anchor-review": "version check",
|
|
4304
4321
|
"artist-review": "artist links",
|
|
4305
4322
|
"attach-cues": "cues",
|
|
4306
4323
|
"capture-suspect": "capture check",
|
|
@@ -6445,7 +6462,7 @@ ${response2.sessionKey}
|
|
|
6445
6462
|
|
|
6446
6463
|
bun run --cwd apps/web wrangler secret put LASTFM_SESSION_KEY
|
|
6447
6464
|
|
|
6448
|
-
Also store it in
|
|
6465
|
+
Also store it in your password manager alongside the API key + shared secret.`);
|
|
6449
6466
|
return;
|
|
6450
6467
|
}
|
|
6451
6468
|
const response = await adminApiGet("/api/v1/admin/lastfm/auth/start");
|
package/package.json
CHANGED