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.
Files changed (2) hide show
  1. package/bin/fluncle.mjs +36 -19
  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.195.0".trim() ? "0.195.0".trim() : "0.1.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.195.0".trim() ? "0.195.0".trim() : "0.1.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, search_tracks, submit_track, subscribe_newsletter",
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 create|promote, mixtapes update|distribute|resync, newsletter draft|update|send|list, backfills, auth"
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
- "cut each pending operator-framed 9:16 clip out of its set video ship to R2 (--no-agent, ffmpeg)"
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.studio-clip",
3692
- 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.",
3693
- probeConfig: { cadenceMs: 15 * MINUTE_MS, cronName: "fluncle-studio-clip", kind: "cron" },
3694
- statusDescription: "cuts set videos into 9:16 clips",
3695
- title: "Studio clips",
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
- "post the due, cut clips to Instagram on a jittered ~daily cadence via Postiz (--no-agent, Worker HTTP)"
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-drip",
3705
- operatorNotes: "every 20m. Pure HTTP trigger, zero LLM tokens. Admin tier (needs the Worker's Postiz key, which the box never sees the box only triggers; the `finalize_clip_cut` / `record_health` precedent). The Worker checks the global kill switch FIRST (paused no-op), then posts due clips bounded by a per-tick cap AND a rolling-24h IG cap. Every clip auto-enters the schedule at a jittered ~23-25h after the queue tail. The operator pauses/resumes with `fluncle admin clips drip-pause` / `drip-resume`. Source: docs/agents/hermes/scripts/clip-drip-sweep.sh. Probed on /status as cron.clip-drip.",
3706
- probeConfig: { cadenceMs: 20 * MINUTE_MS, cronName: "fluncle-clip-drip", kind: "cron" },
3707
- statusDescription: "drip-feeds set clips to Instagram",
3708
- title: "Clip drip-feed",
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/rfcs/catalogue-funnel-rfc.md.",
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 1Password (Fluncle vault) alongside the API key + shared secret.`);
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
@@ -31,5 +31,5 @@
31
31
  "url": "git+https://github.com/mauricekleine/fluncle.git"
32
32
  },
33
33
  "type": "module",
34
- "version": "0.195.0"
34
+ "version": "0.197.0"
35
35
  }