fluncle 0.196.0 → 0.198.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 +55 -101
  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.196.0".trim() ? "0.196.0".trim() : "0.1.0";
564
+ currentVersion = "0.198.0".trim() ? "0.198.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.196.0".trim() ? "0.196.0".trim() : "0.1.0";
2446
+ currentVersion2 = "0.198.0".trim() ? "0.198.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",
@@ -3839,7 +3839,7 @@ var init_src = __esm(() => {
3839
3839
  ],
3840
3840
  kind: "cron",
3841
3841
  name: "cron.funnel-snapshot",
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/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.",
3843
3843
  probeConfig: {
3844
3844
  cadenceMs: 24 * 60 * MINUTE_MS,
3845
3845
  cronName: "fluncle-funnel-snapshot",
@@ -4317,6 +4317,7 @@ var SOURCE_LABELS;
4317
4317
  var init_admin_attention = __esm(() => {
4318
4318
  init_api();
4319
4319
  SOURCE_LABELS = {
4320
+ "anchor-review": "version check",
4320
4321
  "artist-review": "artist links",
4321
4322
  "attach-cues": "cues",
4322
4323
  "capture-suspect": "capture check",
@@ -12314,10 +12315,14 @@ async function runAdminQueue(options, queueCommand2) {
12314
12315
  console.log(trackRows2(tracks).join(`
12315
12316
  `));
12316
12317
  }
12317
- async function runAdminContextQueue(options, contextQueueCommand2) {
12318
+ async function runQueueView({
12319
+ emptyMessage,
12320
+ fetch: fetch2,
12321
+ heading,
12322
+ options
12323
+ }) {
12318
12324
  const limit = parseListLimit(options.limit);
12319
- const retryEmpty = options.retryEmpty === true;
12320
- const tracks = await contextQueueCommand2(limit, retryEmpty);
12325
+ const tracks = await fetch2(limit);
12321
12326
  if (options.json) {
12322
12327
  printJson({
12323
12328
  ok: true,
@@ -12326,115 +12331,64 @@ async function runAdminContextQueue(options, contextQueueCommand2) {
12326
12331
  return;
12327
12332
  }
12328
12333
  if (tracks.length === 0) {
12329
- console.log("Every finding has its field notes. Nothing waiting on context.");
12334
+ console.log(emptyMessage);
12330
12335
  return;
12331
12336
  }
12332
12337
  const { trackRows: trackRows2 } = await Promise.resolve().then(() => (init_format2(), exports_format));
12333
12338
  const noun = tracks.length === 1 ? "finding" : "findings";
12334
- const scope = retryEmpty ? " (incl. empty retries)" : "";
12335
- console.log(`${tracks.length} ${noun} missing field notes${scope}, oldest first:`);
12339
+ console.log(heading(tracks.length, noun));
12336
12340
  console.log(trackRows2(tracks).join(`
12337
12341
  `));
12338
12342
  }
12343
+ async function runAdminContextQueue(options, contextQueueCommand2) {
12344
+ const retryEmpty = options.retryEmpty === true;
12345
+ const scope = retryEmpty ? " (incl. empty retries)" : "";
12346
+ await runQueueView({
12347
+ emptyMessage: "Every finding has its field notes. Nothing waiting on context.",
12348
+ fetch: (limit) => contextQueueCommand2(limit, retryEmpty),
12349
+ heading: (count, noun) => `${count} ${noun} missing field notes${scope}, oldest first:`,
12350
+ options
12351
+ });
12352
+ }
12339
12353
  async function runAdminObserveQueue(options, observeQueueCommand2) {
12340
- const limit = parseListLimit(options.limit);
12341
- const tracks = await observeQueueCommand2(limit);
12342
- if (options.json) {
12343
- printJson({
12344
- ok: true,
12345
- tracks
12346
- });
12347
- return;
12348
- }
12349
- if (tracks.length === 0) {
12350
- console.log("Every finding with notes has its observation. Nothing waiting on a voice.");
12351
- return;
12352
- }
12353
- const { trackRows: trackRows2 } = await Promise.resolve().then(() => (init_format2(), exports_format));
12354
- const noun = tracks.length === 1 ? "finding" : "findings";
12355
- console.log(`${tracks.length} ${noun} awaiting an observation, oldest first:`);
12356
- console.log(trackRows2(tracks).join(`
12357
- `));
12354
+ await runQueueView({
12355
+ emptyMessage: "Every finding with notes has its observation. Nothing waiting on a voice.",
12356
+ fetch: observeQueueCommand2,
12357
+ heading: (count, noun) => `${count} ${noun} awaiting an observation, oldest first:`,
12358
+ options
12359
+ });
12358
12360
  }
12359
12361
  async function runAdminNoteQueue(options, noteQueueCommand2) {
12360
- const limit = parseListLimit(options.limit);
12361
- const tracks = await noteQueueCommand2(limit);
12362
- if (options.json) {
12363
- printJson({
12364
- ok: true,
12365
- tracks
12366
- });
12367
- return;
12368
- }
12369
- if (tracks.length === 0) {
12370
- console.log("Every context'd finding has a note. Nothing waiting on the uncle's words.");
12371
- return;
12372
- }
12373
- const { trackRows: trackRows2 } = await Promise.resolve().then(() => (init_format2(), exports_format));
12374
- const noun = tracks.length === 1 ? "finding" : "findings";
12375
- console.log(`${tracks.length} ${noun} awaiting a note, oldest first:`);
12376
- console.log(trackRows2(tracks).join(`
12377
- `));
12362
+ await runQueueView({
12363
+ emptyMessage: "Every context'd finding has a note. Nothing waiting on the uncle's words.",
12364
+ fetch: noteQueueCommand2,
12365
+ heading: (count, noun) => `${count} ${noun} awaiting a note, oldest first:`,
12366
+ options
12367
+ });
12378
12368
  }
12379
12369
  async function runAdminEnrichQueue(options, enrichQueueCommand2) {
12380
- const limit = parseListLimit(options.limit);
12381
- const tracks = await enrichQueueCommand2(limit);
12382
- if (options.json) {
12383
- printJson({
12384
- ok: true,
12385
- tracks
12386
- });
12387
- return;
12388
- }
12389
- if (tracks.length === 0) {
12390
- console.log("Nothing awaiting enrichment. Every finding is enriched.");
12391
- return;
12392
- }
12393
- const { trackRows: trackRows2 } = await Promise.resolve().then(() => (init_format2(), exports_format));
12394
- const noun = tracks.length === 1 ? "finding" : "findings";
12395
- console.log(`${tracks.length} ${noun} needing (re-)enrichment, oldest first:`);
12396
- console.log(trackRows2(tracks).join(`
12397
- `));
12370
+ await runQueueView({
12371
+ emptyMessage: "Nothing awaiting enrichment. Every finding is enriched.",
12372
+ fetch: enrichQueueCommand2,
12373
+ heading: (count, noun) => `${count} ${noun} needing (re-)enrichment, oldest first:`,
12374
+ options
12375
+ });
12398
12376
  }
12399
12377
  async function runAdminEmbedQueue(options, embedQueueCommand2) {
12400
- const limit = parseListLimit(options.limit);
12401
- const tracks = await embedQueueCommand2(limit);
12402
- if (options.json) {
12403
- printJson({
12404
- ok: true,
12405
- tracks
12406
- });
12407
- return;
12408
- }
12409
- if (tracks.length === 0) {
12410
- console.log("Nothing awaiting an embedding. Every finding is embedded.");
12411
- return;
12412
- }
12413
- const { trackRows: trackRows2 } = await Promise.resolve().then(() => (init_format2(), exports_format));
12414
- const noun = tracks.length === 1 ? "finding" : "findings";
12415
- console.log(`${tracks.length} ${noun} needing an audio embedding, oldest first:`);
12416
- console.log(trackRows2(tracks).join(`
12417
- `));
12378
+ await runQueueView({
12379
+ emptyMessage: "Nothing awaiting an embedding. Every finding is embedded.",
12380
+ fetch: embedQueueCommand2,
12381
+ heading: (count, noun) => `${count} ${noun} needing an audio embedding, oldest first:`,
12382
+ options
12383
+ });
12418
12384
  }
12419
12385
  async function runAdminCaptureQueue(options, captureQueueCommand2) {
12420
- const limit = parseListLimit(options.limit);
12421
- const tracks = await captureQueueCommand2(limit);
12422
- if (options.json) {
12423
- printJson({
12424
- ok: true,
12425
- tracks
12426
- });
12427
- return;
12428
- }
12429
- if (tracks.length === 0) {
12430
- console.log("Nothing awaiting a capture. Every finding has its full song.");
12431
- return;
12432
- }
12433
- const { trackRows: trackRows2 } = await Promise.resolve().then(() => (init_format2(), exports_format));
12434
- const noun = tracks.length === 1 ? "finding" : "findings";
12435
- console.log(`${tracks.length} ${noun} needing a full-song capture, newest first:`);
12436
- console.log(trackRows2(tracks).join(`
12437
- `));
12386
+ await runQueueView({
12387
+ emptyMessage: "Nothing awaiting a capture. Every finding has its full song.",
12388
+ fetch: captureQueueCommand2,
12389
+ heading: (count, noun) => `${count} ${noun} needing a full-song capture, newest first:`,
12390
+ options
12391
+ });
12438
12392
  }
12439
12393
  var TRACK_WORK_KINDS = new Set(["analyze", "capture", "embed"]);
12440
12394
  var TRACK_WORK_SCOPES = new Set(["all", "catalogue", "findings"]);
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.196.0"
34
+ "version": "0.198.0"
35
35
  }