fluncle 0.198.0 → 0.200.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 +146 -5
- 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.200.0".trim() ? "0.200.0".trim() : "0.1.0";
|
|
565
565
|
});
|
|
566
566
|
|
|
567
567
|
// src/update-notifier.ts
|
|
@@ -797,7 +797,7 @@ var init_env = __esm(() => {
|
|
|
797
797
|
});
|
|
798
798
|
|
|
799
799
|
// src/user-token.ts
|
|
800
|
-
import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
800
|
+
import { chmodSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
801
801
|
import { homedir as homedir3 } from "node:os";
|
|
802
802
|
import { dirname as dirname2, join as join3 } from "node:path";
|
|
803
803
|
function activeProfile() {
|
|
@@ -824,9 +824,14 @@ function readUserToken() {
|
|
|
824
824
|
}
|
|
825
825
|
function writeUserToken(value) {
|
|
826
826
|
const path2 = userTokenPath();
|
|
827
|
-
|
|
827
|
+
const dir = dirname2(path2);
|
|
828
|
+
mkdirSync(dir, { mode: 448, recursive: true });
|
|
829
|
+
try {
|
|
830
|
+
chmodSync(dir, 448);
|
|
831
|
+
} catch {}
|
|
828
832
|
writeFileSync(path2, `${JSON.stringify(value, null, 2)}
|
|
829
833
|
`, { mode: 384 });
|
|
834
|
+
chmodSync(path2, 384);
|
|
830
835
|
}
|
|
831
836
|
function clearUserToken() {
|
|
832
837
|
const path2 = userTokenPath();
|
|
@@ -2443,7 +2448,7 @@ function parseVersion2(version) {
|
|
|
2443
2448
|
var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
|
|
2444
2449
|
var init_version2 = __esm(() => {
|
|
2445
2450
|
init_output();
|
|
2446
|
-
currentVersion2 = "0.
|
|
2451
|
+
currentVersion2 = "0.200.0".trim() ? "0.200.0".trim() : "0.1.0";
|
|
2447
2452
|
});
|
|
2448
2453
|
|
|
2449
2454
|
// ../../packages/registry/src/index.ts
|
|
@@ -2489,7 +2494,7 @@ var init_src = __esm(() => {
|
|
|
2489
2494
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2490
2495
|
route: "/logbook",
|
|
2491
2496
|
url: `${SITE}/logbook`,
|
|
2492
|
-
weights: {
|
|
2497
|
+
weights: { web: "primary" }
|
|
2493
2498
|
},
|
|
2494
2499
|
{
|
|
2495
2500
|
exposedContent: ["Fluncle's own DJ mixtapes — each a checkpoint set with an F-marked Log ID"],
|
|
@@ -2680,6 +2685,56 @@ var init_src = __esm(() => {
|
|
|
2680
2685
|
url: `${SITE}/galaxies`,
|
|
2681
2686
|
weights: { ssh: "secondary", web: "secondary" }
|
|
2682
2687
|
},
|
|
2688
|
+
{
|
|
2689
|
+
exposedContent: [
|
|
2690
|
+
"the signed-in account door: a listener's Galaxy progress, the findings and sets they saved, the tracks they submitted, and their account settings"
|
|
2691
|
+
],
|
|
2692
|
+
kind: "web_route",
|
|
2693
|
+
name: "web.account",
|
|
2694
|
+
operatorNotes: "A WORKSTATION, not a lore page (VOICE.md §5 The Three Areas): chrome register throughout. PUBLIC and always 200 — signed out it serves the sign-in / join door, so it is honestly HTTP-probeable; every door's data is session-scoped and read on the server. `noindex` (a private per-user surface, self-canonical), so it stays out of the sitemap and llms.txt while remaining a registered, advertised surface: the nav's `Your account` CTA points here. Source: apps/web/src/routes/account.tsx + components/account.",
|
|
2695
|
+
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2696
|
+
route: "/account",
|
|
2697
|
+
url: `${SITE}/account`,
|
|
2698
|
+
weights: { web: "secondary" }
|
|
2699
|
+
},
|
|
2700
|
+
{
|
|
2701
|
+
exposedContent: [
|
|
2702
|
+
"ChatDnB — a chat with Fluncle over his own archive; he answers from his certified findings"
|
|
2703
|
+
],
|
|
2704
|
+
kind: "web_route",
|
|
2705
|
+
name: "web.chat",
|
|
2706
|
+
operatorNotes: "The public face of ChatDnB. Gated to verified-email accounts (the rollout cohort); the server route re-checks the session, the verification, the origin/CSRF, and the rate dials on every turn. PENDING = registered but dark until the rollout opens to everyone.",
|
|
2707
|
+
pending: true,
|
|
2708
|
+
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2709
|
+
route: "/chat",
|
|
2710
|
+
url: `${SITE}/chat`,
|
|
2711
|
+
weights: { web: "secondary" }
|
|
2712
|
+
},
|
|
2713
|
+
{
|
|
2714
|
+
exposedContent: [
|
|
2715
|
+
"the per-listener recommendations door: a signed-in listener names the tracks they love, the Ear lines the catalogue up against those seeds, and the result lands as a playlist on Fluncle's own Spotify, refreshed weekly"
|
|
2716
|
+
],
|
|
2717
|
+
kind: "web_route",
|
|
2718
|
+
name: "web.recommendations",
|
|
2719
|
+
operatorNotes: "E1/E2, the recommendation machine's public door. Three states off the session (anonymous pitch, unverified pointer, verified surface); the DRAFT read is the one place the live vector scan sits on a read path, rate-limited per user and degrading to empty rather than blocking the door. PENDING = registered but dark until the rollout opens.",
|
|
2720
|
+
pending: true,
|
|
2721
|
+
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2722
|
+
route: "/recommendations",
|
|
2723
|
+
url: `${SITE}/recommendations`,
|
|
2724
|
+
weights: { web: "secondary" }
|
|
2725
|
+
},
|
|
2726
|
+
{
|
|
2727
|
+
exposedContent: [
|
|
2728
|
+
"the galaxy factory — a draggable map of a finding's whole life, from the first CMD+F through the enrichment sweeps to the launch into the Galaxy"
|
|
2729
|
+
],
|
|
2730
|
+
kind: "web_route",
|
|
2731
|
+
name: "web.pipeline",
|
|
2732
|
+
operatorNotes: "A public console page (VOICE.md §5 The Three Areas), written in the builder's-tour register. Client-only DOM/SVG/canvas — the whole map is a chunk loaded in useEffect, so it costs the archive's bundle nothing — over an SSR shell that answers 200, so it is HTTP-probeable. `noindex` (a for-the-nerds machinery view, not a search surface), so it stays out of the sitemap; the nav's Crew section links it. Source: apps/web/src/routes/pipeline.tsx + src/pipeline.",
|
|
2733
|
+
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2734
|
+
route: "/pipeline",
|
|
2735
|
+
url: `${SITE}/pipeline`,
|
|
2736
|
+
weights: { web: "tertiary" }
|
|
2737
|
+
},
|
|
2683
2738
|
{
|
|
2684
2739
|
exposedContent: ["the privacy policy"],
|
|
2685
2740
|
kind: "web_route",
|
|
@@ -3156,6 +3211,20 @@ var init_src = __esm(() => {
|
|
|
3156
3211
|
url: `${SITE}/oembed`,
|
|
3157
3212
|
weights: { web: "tertiary" }
|
|
3158
3213
|
},
|
|
3214
|
+
{
|
|
3215
|
+
apiFormat: "text/x-shellscript",
|
|
3216
|
+
discoveryUrl: `${SITE}/llms.txt`,
|
|
3217
|
+
exposedContent: [
|
|
3218
|
+
"the one-line CLI installer: picks the right `fluncle` binary for the machine off the latest GitHub release and drops it in place"
|
|
3219
|
+
],
|
|
3220
|
+
kind: "discovery",
|
|
3221
|
+
name: "discovery.cli-installer",
|
|
3222
|
+
operatorNotes: "`curl -fsSL https://www.fluncle.com/cli/latest.sh | sh`, the install path the /docs/cli page, the rave terminal's Install CLI screen, the CLI's own update hint, and llms.txt (§Tools) all point at. A machine-FETCHED document rather than a page, which is why it is catalogued as `discovery` next to robots.txt and llms.txt: nothing about it is browsable, and its only reader is a shell. Always 200 (it is generated in the route, no upstream call), so the post-deploy probe asserts a non-empty body on it. Source: apps/web/src/routes/cli/latest[.]sh.ts.",
|
|
3223
|
+
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
3224
|
+
route: "/cli/latest.sh",
|
|
3225
|
+
url: `${SITE}/cli/latest.sh`,
|
|
3226
|
+
weights: { web: "tertiary" }
|
|
3227
|
+
},
|
|
3159
3228
|
{
|
|
3160
3229
|
apiFormat: "application/json",
|
|
3161
3230
|
discoveryUrl: `${SITE}/.well-known/mcp/server-card.json`,
|
|
@@ -3239,6 +3308,15 @@ var init_src = __esm(() => {
|
|
|
3239
3308
|
name: "cli.labels",
|
|
3240
3309
|
weights: { cli: "secondary" }
|
|
3241
3310
|
},
|
|
3311
|
+
{
|
|
3312
|
+
command: "fluncle galaxies",
|
|
3313
|
+
exposedContent: [
|
|
3314
|
+
"wander Fluncle's sonic galaxies, the browse-by-feel lens (bare `slug` opens one)"
|
|
3315
|
+
],
|
|
3316
|
+
kind: "cli",
|
|
3317
|
+
name: "cli.galaxies",
|
|
3318
|
+
weights: { cli: "secondary" }
|
|
3319
|
+
},
|
|
3242
3320
|
{
|
|
3243
3321
|
command: "fluncle search",
|
|
3244
3322
|
exposedContent: ["search the archive by coordinate, track, artist, label, or album"],
|
|
@@ -3274,6 +3352,27 @@ var init_src = __esm(() => {
|
|
|
3274
3352
|
name: "cli.submit",
|
|
3275
3353
|
weights: { cli: "secondary" }
|
|
3276
3354
|
},
|
|
3355
|
+
{
|
|
3356
|
+
command: "fluncle login",
|
|
3357
|
+
exposedContent: ["link this device to your Fluncle account, so your Galaxy progress syncs"],
|
|
3358
|
+
kind: "cli",
|
|
3359
|
+
name: "cli.login",
|
|
3360
|
+
weights: { cli: "secondary" }
|
|
3361
|
+
},
|
|
3362
|
+
{
|
|
3363
|
+
command: "fluncle me",
|
|
3364
|
+
exposedContent: ["your account and Galaxy progress (sign in with `fluncle login`)"],
|
|
3365
|
+
kind: "cli",
|
|
3366
|
+
name: "cli.me",
|
|
3367
|
+
weights: { cli: "secondary" }
|
|
3368
|
+
},
|
|
3369
|
+
{
|
|
3370
|
+
command: "fluncle logout",
|
|
3371
|
+
exposedContent: ["unlink this device from your account"],
|
|
3372
|
+
kind: "cli",
|
|
3373
|
+
name: "cli.logout",
|
|
3374
|
+
weights: { cli: "tertiary" }
|
|
3375
|
+
},
|
|
3277
3376
|
{
|
|
3278
3377
|
command: "fluncle tracks get",
|
|
3279
3378
|
exposedContent: ["look up one finding by id or Log ID (group alias `track`)"],
|
|
@@ -3304,6 +3403,14 @@ var init_src = __esm(() => {
|
|
|
3304
3403
|
name: "cli.version",
|
|
3305
3404
|
weights: { cli: "tertiary" }
|
|
3306
3405
|
},
|
|
3406
|
+
{
|
|
3407
|
+
command: "fluncle status",
|
|
3408
|
+
exposedContent: ["how Fluncle's services are holding up (the /status board, in the terminal)"],
|
|
3409
|
+
kind: "cli",
|
|
3410
|
+
name: "cli.status",
|
|
3411
|
+
operatorNotes: "Reads the public status snapshot and labels each service off `liveSurfaces()` — a registry CONSUMER as well as a registry entry. Source: apps/cli/src/commands/status.ts.",
|
|
3412
|
+
weights: { cli: "tertiary" }
|
|
3413
|
+
},
|
|
3307
3414
|
{
|
|
3308
3415
|
command: "fluncle admin",
|
|
3309
3416
|
exposedContent: [
|
|
@@ -3324,6 +3431,17 @@ var init_src = __esm(() => {
|
|
|
3324
3431
|
url: "https://chromewebstore.google.com/detail/efkkceaofendabikblfjhoepgejfpakk",
|
|
3325
3432
|
weights: { web: "secondary" }
|
|
3326
3433
|
},
|
|
3434
|
+
{
|
|
3435
|
+
exposedContent: [
|
|
3436
|
+
"Fluncle for iOS — the archive as a native app: the Feed, the Archive, the Decks, the Radio, and the Mixtapes, each finding opening its own /log screen, plus a submit door and push when a new banger lands"
|
|
3437
|
+
],
|
|
3438
|
+
kind: "app",
|
|
3439
|
+
name: "app.ios",
|
|
3440
|
+
operatorNotes: "Fluncle for iOS (apps/mobile). PENDING App Store review — DARK until approval, then flip `pending` + set the assigned listing URL. No probeConfig: a vendor store listing is not one of our own health-probeable endpoints (the box prober walks web/r2/dns/ssh + the crons, never an external GET), and Apple would bot-block or redirect a bare GET and read back as a false 'down' — the extension.lens ruling, which dropped its probeConfig on going live for the same reason.",
|
|
3441
|
+
pending: true,
|
|
3442
|
+
url: "https://apps.apple.com/search?term=fluncle",
|
|
3443
|
+
weights: { web: "secondary" }
|
|
3444
|
+
},
|
|
3327
3445
|
{
|
|
3328
3446
|
command: "fluncle admin tracks enrich --queue",
|
|
3329
3447
|
exposedContent: [
|
|
@@ -6446,6 +6564,25 @@ var init_auth_tiktok = __esm(() => {
|
|
|
6446
6564
|
init_api();
|
|
6447
6565
|
});
|
|
6448
6566
|
|
|
6567
|
+
// src/commands/auth-revoke-grants.ts
|
|
6568
|
+
var exports_auth_revoke_grants = {};
|
|
6569
|
+
__export(exports_auth_revoke_grants, {
|
|
6570
|
+
authRevokeGrantsCommand: () => authRevokeGrantsCommand
|
|
6571
|
+
});
|
|
6572
|
+
async function authRevokeGrantsCommand(options = {}) {
|
|
6573
|
+
const response = await adminApiPost("/api/v1/admin/auth/revoke-grants");
|
|
6574
|
+
if (options.json) {
|
|
6575
|
+
console.log(JSON.stringify(response, null, 2));
|
|
6576
|
+
return;
|
|
6577
|
+
}
|
|
6578
|
+
console.log(`Every admin browser session is out. Grant epoch is now ${response.epoch}.
|
|
6579
|
+
|
|
6580
|
+
Sign back in at /admin/login. Your CLI and the agent box are unaffected.`);
|
|
6581
|
+
}
|
|
6582
|
+
var init_auth_revoke_grants = __esm(() => {
|
|
6583
|
+
init_api();
|
|
6584
|
+
});
|
|
6585
|
+
|
|
6449
6586
|
// src/commands/auth-lastfm.ts
|
|
6450
6587
|
var exports_auth_lastfm = {};
|
|
6451
6588
|
__export(exports_auth_lastfm, {
|
|
@@ -9804,6 +9941,10 @@ function addAdminCommands(program2) {
|
|
|
9804
9941
|
const { authTikTokCommand: authTikTokCommand2 } = await Promise.resolve().then(() => (init_auth_tiktok(), exports_auth_tiktok));
|
|
9805
9942
|
await authTikTokCommand2();
|
|
9806
9943
|
});
|
|
9944
|
+
auth.command("revoke-grants").description("Sign every admin browser session out (bump the grant epoch)").option("--json", "Output raw JSON").action(async (options) => {
|
|
9945
|
+
const { authRevokeGrantsCommand: authRevokeGrantsCommand2 } = await Promise.resolve().then(() => (init_auth_revoke_grants(), exports_auth_revoke_grants));
|
|
9946
|
+
await authRevokeGrantsCommand2(options);
|
|
9947
|
+
});
|
|
9807
9948
|
auth.command("lastfm").description("Authorize Last.fm access (love-on-add). Run once for the URL, then again with --token").option("--token <token>", "The approved request token, to mint the session key").action(async (options) => {
|
|
9808
9949
|
const { authLastfmCommand: authLastfmCommand2 } = await Promise.resolve().then(() => (init_auth_lastfm(), exports_auth_lastfm));
|
|
9809
9950
|
await authLastfmCommand2(options);
|
package/package.json
CHANGED