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.
- package/bin/fluncle.mjs +55 -101
- 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.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.
|
|
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,
|
|
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",
|
|
@@ -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/
|
|
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
|
|
12318
|
+
async function runQueueView({
|
|
12319
|
+
emptyMessage,
|
|
12320
|
+
fetch: fetch2,
|
|
12321
|
+
heading,
|
|
12322
|
+
options
|
|
12323
|
+
}) {
|
|
12318
12324
|
const limit = parseListLimit(options.limit);
|
|
12319
|
-
const
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
12341
|
-
|
|
12342
|
-
|
|
12343
|
-
|
|
12344
|
-
|
|
12345
|
-
|
|
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
|
-
|
|
12361
|
-
|
|
12362
|
-
|
|
12363
|
-
|
|
12364
|
-
|
|
12365
|
-
|
|
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
|
-
|
|
12381
|
-
|
|
12382
|
-
|
|
12383
|
-
|
|
12384
|
-
|
|
12385
|
-
|
|
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
|
-
|
|
12401
|
-
|
|
12402
|
-
|
|
12403
|
-
|
|
12404
|
-
|
|
12405
|
-
|
|
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
|
-
|
|
12421
|
-
|
|
12422
|
-
|
|
12423
|
-
|
|
12424
|
-
|
|
12425
|
-
|
|
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