fluncle 0.63.0 → 0.65.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 +121 -69
- package/package.json +1 -1
package/bin/fluncle.mjs
CHANGED
|
@@ -423,7 +423,7 @@ function parseVersion(version) {
|
|
|
423
423
|
var currentVersion;
|
|
424
424
|
var init_version = __esm(() => {
|
|
425
425
|
init_output();
|
|
426
|
-
currentVersion = "0.
|
|
426
|
+
currentVersion = "0.65.0".trim() ? "0.65.0".trim() : "0.1.0";
|
|
427
427
|
});
|
|
428
428
|
|
|
429
429
|
// src/update-notifier.ts
|
|
@@ -1914,7 +1914,7 @@ function parseVersion2(version) {
|
|
|
1914
1914
|
var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
|
|
1915
1915
|
var init_version2 = __esm(() => {
|
|
1916
1916
|
init_output();
|
|
1917
|
-
currentVersion2 = "0.
|
|
1917
|
+
currentVersion2 = "0.65.0".trim() ? "0.65.0".trim() : "0.1.0";
|
|
1918
1918
|
});
|
|
1919
1919
|
|
|
1920
1920
|
// ../../packages/registry/src/index.ts
|
|
@@ -1932,7 +1932,7 @@ var init_src = __esm(() => {
|
|
|
1932
1932
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
1933
1933
|
route: "/",
|
|
1934
1934
|
url: `${SITE}/`,
|
|
1935
|
-
|
|
1935
|
+
weights: { web: "primary" }
|
|
1936
1936
|
},
|
|
1937
1937
|
{
|
|
1938
1938
|
exposedContent: [
|
|
@@ -1944,7 +1944,7 @@ var init_src = __esm(() => {
|
|
|
1944
1944
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
1945
1945
|
route: "/log",
|
|
1946
1946
|
url: `${SITE}/log`,
|
|
1947
|
-
|
|
1947
|
+
weights: { ssh: "secondary", web: "primary" }
|
|
1948
1948
|
},
|
|
1949
1949
|
{
|
|
1950
1950
|
exposedContent: ["Fluncle's own DJ mixtapes — each a checkpoint set with an F-marked Log ID"],
|
|
@@ -1953,7 +1953,7 @@ var init_src = __esm(() => {
|
|
|
1953
1953
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
1954
1954
|
route: "/mixtapes",
|
|
1955
1955
|
url: `${SITE}/mixtapes`,
|
|
1956
|
-
|
|
1956
|
+
weights: { ssh: "secondary", web: "primary" }
|
|
1957
1957
|
},
|
|
1958
1958
|
{
|
|
1959
1959
|
exposedContent: [
|
|
@@ -1965,7 +1965,7 @@ var init_src = __esm(() => {
|
|
|
1965
1965
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
1966
1966
|
route: "/stories",
|
|
1967
1967
|
url: `${SITE}/stories`,
|
|
1968
|
-
|
|
1968
|
+
weights: { web: "secondary" }
|
|
1969
1969
|
},
|
|
1970
1970
|
{
|
|
1971
1971
|
exposedContent: ["who Fluncle is, what the Galaxy is, how to read a Log ID"],
|
|
@@ -1974,7 +1974,7 @@ var init_src = __esm(() => {
|
|
|
1974
1974
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
1975
1975
|
route: "/about",
|
|
1976
1976
|
url: `${SITE}/about`,
|
|
1977
|
-
|
|
1977
|
+
weights: { ssh: "tertiary", web: "secondary" }
|
|
1978
1978
|
},
|
|
1979
1979
|
{
|
|
1980
1980
|
exposedContent: [
|
|
@@ -1986,7 +1986,7 @@ var init_src = __esm(() => {
|
|
|
1986
1986
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
1987
1987
|
route: "/newsletter",
|
|
1988
1988
|
url: `${SITE}/newsletter`,
|
|
1989
|
-
|
|
1989
|
+
weights: { web: "secondary" }
|
|
1990
1990
|
},
|
|
1991
1991
|
{
|
|
1992
1992
|
exposedContent: [
|
|
@@ -1998,17 +1998,17 @@ var init_src = __esm(() => {
|
|
|
1998
1998
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
1999
1999
|
route: "/docs",
|
|
2000
2000
|
url: `${SITE}/docs`,
|
|
2001
|
-
|
|
2001
|
+
weights: { web: "secondary" }
|
|
2002
2002
|
},
|
|
2003
2003
|
{
|
|
2004
2004
|
exposedContent: ["the public service-health dashboard — uptime per service, recent events"],
|
|
2005
2005
|
kind: "web_route",
|
|
2006
2006
|
name: "web.status",
|
|
2007
|
-
operatorNotes: "
|
|
2007
|
+
operatorNotes: "status.fluncle.com rewrites its root here (see the router rewrite + the subdomain.status surface). The fluncle-healthcheck cron POSTs its snapshots to the agent-tier record_health op that this page reads.",
|
|
2008
2008
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2009
2009
|
route: "/status",
|
|
2010
2010
|
url: `${SITE}/status`,
|
|
2011
|
-
|
|
2011
|
+
weights: { status: "primary", web: "secondary" }
|
|
2012
2012
|
},
|
|
2013
2013
|
{
|
|
2014
2014
|
exposedContent: ["the Galaxy game — the 8-bit fly-to-every-banger arcade front door"],
|
|
@@ -2018,7 +2018,7 @@ var init_src = __esm(() => {
|
|
|
2018
2018
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2019
2019
|
route: "/galaxy",
|
|
2020
2020
|
url: `${SITE}/galaxy`,
|
|
2021
|
-
|
|
2021
|
+
weights: { ssh: "secondary", web: "primary" }
|
|
2022
2022
|
},
|
|
2023
2023
|
{
|
|
2024
2024
|
exposedContent: [
|
|
@@ -2030,7 +2030,7 @@ var init_src = __esm(() => {
|
|
|
2030
2030
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2031
2031
|
route: "/radio",
|
|
2032
2032
|
url: `${SITE}/radio`,
|
|
2033
|
-
|
|
2033
|
+
weights: { web: "secondary" }
|
|
2034
2034
|
},
|
|
2035
2035
|
{
|
|
2036
2036
|
exposedContent: ["the privacy policy"],
|
|
@@ -2038,7 +2038,7 @@ var init_src = __esm(() => {
|
|
|
2038
2038
|
name: "web.privacy",
|
|
2039
2039
|
route: "/privacy",
|
|
2040
2040
|
url: `${SITE}/privacy`,
|
|
2041
|
-
|
|
2041
|
+
weights: { web: "tertiary" }
|
|
2042
2042
|
},
|
|
2043
2043
|
{
|
|
2044
2044
|
exposedContent: ["the Galaxy game's front door (root rewrites to /galaxy)"],
|
|
@@ -2048,7 +2048,7 @@ var init_src = __esm(() => {
|
|
|
2048
2048
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2049
2049
|
subdomain: "galaxy.fluncle.com",
|
|
2050
2050
|
url: "https://galaxy.fluncle.com",
|
|
2051
|
-
|
|
2051
|
+
weights: { ssh: "secondary", web: "primary" }
|
|
2052
2052
|
},
|
|
2053
2053
|
{
|
|
2054
2054
|
exposedContent: ["the observation station (root rewrites to /radio)"],
|
|
@@ -2058,7 +2058,7 @@ var init_src = __esm(() => {
|
|
|
2058
2058
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2059
2059
|
subdomain: "radio.fluncle.com",
|
|
2060
2060
|
url: "https://radio.fluncle.com",
|
|
2061
|
-
|
|
2061
|
+
weights: { web: "secondary" }
|
|
2062
2062
|
},
|
|
2063
2063
|
{
|
|
2064
2064
|
exposedContent: [
|
|
@@ -2071,7 +2071,7 @@ var init_src = __esm(() => {
|
|
|
2071
2071
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2072
2072
|
subdomain: "found.fluncle.com",
|
|
2073
2073
|
url: "https://found.fluncle.com",
|
|
2074
|
-
|
|
2074
|
+
weights: { status: "tertiary", web: "tertiary" }
|
|
2075
2075
|
},
|
|
2076
2076
|
{
|
|
2077
2077
|
exposedContent: ["the delegated DNS zone's host label (see the dns surface for the resolver)"],
|
|
@@ -2080,16 +2080,16 @@ var init_src = __esm(() => {
|
|
|
2080
2080
|
operatorNotes: "The zone is served by apps/dns; see the `dns.zone` surface.",
|
|
2081
2081
|
subdomain: "dig.fluncle.com",
|
|
2082
2082
|
url: "https://dig.fluncle.com",
|
|
2083
|
-
|
|
2083
|
+
weights: { web: "tertiary" }
|
|
2084
2084
|
},
|
|
2085
2085
|
{
|
|
2086
|
-
exposedContent: ["the
|
|
2086
|
+
exposedContent: ["the status host — its root rewrites to /status"],
|
|
2087
2087
|
kind: "subdomain",
|
|
2088
2088
|
name: "subdomain.status",
|
|
2089
|
-
operatorNotes: "
|
|
2089
|
+
operatorNotes: "Isomorphic host-rewrite in apps/web router (input/output) so SSR + hydration agree. The DNS record (status.fluncle.com → the Worker) is the remaining operator step.",
|
|
2090
2090
|
subdomain: "status.fluncle.com",
|
|
2091
2091
|
url: "https://status.fluncle.com",
|
|
2092
|
-
|
|
2092
|
+
weights: { status: "tertiary", web: "tertiary" }
|
|
2093
2093
|
},
|
|
2094
2094
|
{
|
|
2095
2095
|
exposedContent: [
|
|
@@ -2101,7 +2101,7 @@ var init_src = __esm(() => {
|
|
|
2101
2101
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2102
2102
|
subdomain: "p53pc2uzfu2tnih4cd6wd42ok6zup2uttj6xdmjdccy5kqo33fyppkqd.onion",
|
|
2103
2103
|
url: "http://p53pc2uzfu2tnih4cd6wd42ok6zup2uttj6xdmjdccy5kqo33fyppkqd.onion",
|
|
2104
|
-
|
|
2104
|
+
weights: { status: "tertiary", web: "tertiary" }
|
|
2105
2105
|
},
|
|
2106
2106
|
{
|
|
2107
2107
|
apiFormat: "application/json",
|
|
@@ -2112,7 +2112,7 @@ var init_src = __esm(() => {
|
|
|
2112
2112
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2113
2113
|
route: "/api/v1/tracks",
|
|
2114
2114
|
url: `${SITE}/api/v1/tracks`,
|
|
2115
|
-
|
|
2115
|
+
weights: { status: "secondary", web: "primary" }
|
|
2116
2116
|
},
|
|
2117
2117
|
{
|
|
2118
2118
|
apiFormat: "application/json",
|
|
@@ -2122,7 +2122,7 @@ var init_src = __esm(() => {
|
|
|
2122
2122
|
name: "api.track",
|
|
2123
2123
|
route: "/api/v1/tracks/:idOrLogId",
|
|
2124
2124
|
url: `${SITE}/api/v1/tracks/:idOrLogId`,
|
|
2125
|
-
|
|
2125
|
+
weights: { web: "secondary" }
|
|
2126
2126
|
},
|
|
2127
2127
|
{
|
|
2128
2128
|
apiFormat: "application/json",
|
|
@@ -2132,7 +2132,7 @@ var init_src = __esm(() => {
|
|
|
2132
2132
|
name: "api.tracks.random",
|
|
2133
2133
|
route: "/api/v1/tracks/random",
|
|
2134
2134
|
url: `${SITE}/api/v1/tracks/random`,
|
|
2135
|
-
|
|
2135
|
+
weights: { web: "secondary" }
|
|
2136
2136
|
},
|
|
2137
2137
|
{
|
|
2138
2138
|
apiFormat: "application/json",
|
|
@@ -2142,7 +2142,7 @@ var init_src = __esm(() => {
|
|
|
2142
2142
|
name: "api.mixtapes",
|
|
2143
2143
|
route: "/api/v1/mixtapes",
|
|
2144
2144
|
url: `${SITE}/api/v1/mixtapes`,
|
|
2145
|
-
|
|
2145
|
+
weights: { web: "secondary" }
|
|
2146
2146
|
},
|
|
2147
2147
|
{
|
|
2148
2148
|
apiFormat: "application/json",
|
|
@@ -2152,7 +2152,7 @@ var init_src = __esm(() => {
|
|
|
2152
2152
|
name: "api.search",
|
|
2153
2153
|
route: "/api/v1/search",
|
|
2154
2154
|
url: `${SITE}/api/v1/search`,
|
|
2155
|
-
|
|
2155
|
+
weights: { web: "secondary" }
|
|
2156
2156
|
},
|
|
2157
2157
|
{
|
|
2158
2158
|
apiFormat: "application/json",
|
|
@@ -2162,7 +2162,7 @@ var init_src = __esm(() => {
|
|
|
2162
2162
|
name: "api.submissions",
|
|
2163
2163
|
route: "/api/v1/submissions",
|
|
2164
2164
|
url: `${SITE}/api/v1/submissions`,
|
|
2165
|
-
|
|
2165
|
+
weights: { web: "secondary" }
|
|
2166
2166
|
},
|
|
2167
2167
|
{
|
|
2168
2168
|
apiFormat: "application/json",
|
|
@@ -2172,7 +2172,7 @@ var init_src = __esm(() => {
|
|
|
2172
2172
|
name: "api.newsletter",
|
|
2173
2173
|
route: "/api/v1/newsletter",
|
|
2174
2174
|
url: `${SITE}/api/v1/newsletter`,
|
|
2175
|
-
|
|
2175
|
+
weights: { web: "secondary" }
|
|
2176
2176
|
},
|
|
2177
2177
|
{
|
|
2178
2178
|
apiFormat: "application/json",
|
|
@@ -2182,7 +2182,7 @@ var init_src = __esm(() => {
|
|
|
2182
2182
|
name: "api.stories",
|
|
2183
2183
|
route: "/api/v1/stories",
|
|
2184
2184
|
url: `${SITE}/api/v1/stories`,
|
|
2185
|
-
|
|
2185
|
+
weights: { web: "tertiary" }
|
|
2186
2186
|
},
|
|
2187
2187
|
{
|
|
2188
2188
|
apiFormat: "application/json",
|
|
@@ -2192,7 +2192,7 @@ var init_src = __esm(() => {
|
|
|
2192
2192
|
name: "api.radio.now-playing",
|
|
2193
2193
|
route: "/api/v1/radio/now-playing",
|
|
2194
2194
|
url: `${SITE}/api/v1/radio/now-playing`,
|
|
2195
|
-
|
|
2195
|
+
weights: { web: "tertiary" }
|
|
2196
2196
|
},
|
|
2197
2197
|
{
|
|
2198
2198
|
apiFormat: "application/json",
|
|
@@ -2203,7 +2203,7 @@ var init_src = __esm(() => {
|
|
|
2203
2203
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2204
2204
|
route: "/api/health",
|
|
2205
2205
|
url: `${SITE}/api/health`,
|
|
2206
|
-
|
|
2206
|
+
weights: { status: "tertiary", web: "tertiary" }
|
|
2207
2207
|
},
|
|
2208
2208
|
{
|
|
2209
2209
|
apiFormat: "application/rss+xml",
|
|
@@ -2213,7 +2213,7 @@ var init_src = __esm(() => {
|
|
|
2213
2213
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2214
2214
|
route: "/rss.xml",
|
|
2215
2215
|
url: `${SITE}/rss.xml`,
|
|
2216
|
-
|
|
2216
|
+
weights: { web: "primary" }
|
|
2217
2217
|
},
|
|
2218
2218
|
{
|
|
2219
2219
|
apiFormat: "application/atom+xml",
|
|
@@ -2222,7 +2222,7 @@ var init_src = __esm(() => {
|
|
|
2222
2222
|
name: "feed.atom",
|
|
2223
2223
|
route: "/atom.xml",
|
|
2224
2224
|
url: `${SITE}/atom.xml`,
|
|
2225
|
-
|
|
2225
|
+
weights: { web: "secondary" }
|
|
2226
2226
|
},
|
|
2227
2227
|
{
|
|
2228
2228
|
apiFormat: "application/feed+json",
|
|
@@ -2231,7 +2231,7 @@ var init_src = __esm(() => {
|
|
|
2231
2231
|
name: "feed.json",
|
|
2232
2232
|
route: "/feed.json",
|
|
2233
2233
|
url: `${SITE}/feed.json`,
|
|
2234
|
-
|
|
2234
|
+
weights: { web: "secondary" }
|
|
2235
2235
|
},
|
|
2236
2236
|
{
|
|
2237
2237
|
apiFormat: "application/rss+xml",
|
|
@@ -2240,7 +2240,7 @@ var init_src = __esm(() => {
|
|
|
2240
2240
|
name: "feed.podcast",
|
|
2241
2241
|
route: "/podcast.xml",
|
|
2242
2242
|
url: `${SITE}/podcast.xml`,
|
|
2243
|
-
|
|
2243
|
+
weights: { web: "secondary" }
|
|
2244
2244
|
},
|
|
2245
2245
|
{
|
|
2246
2246
|
apiFormat: "text/calendar",
|
|
@@ -2249,7 +2249,7 @@ var init_src = __esm(() => {
|
|
|
2249
2249
|
name: "feed.calendar",
|
|
2250
2250
|
route: "/calendar.ics",
|
|
2251
2251
|
url: `${SITE}/calendar.ics`,
|
|
2252
|
-
|
|
2252
|
+
weights: { web: "tertiary" }
|
|
2253
2253
|
},
|
|
2254
2254
|
{
|
|
2255
2255
|
apiFormat: "application/xml",
|
|
@@ -2259,7 +2259,7 @@ var init_src = __esm(() => {
|
|
|
2259
2259
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2260
2260
|
route: "/sitemap.xml",
|
|
2261
2261
|
url: `${SITE}/sitemap.xml`,
|
|
2262
|
-
|
|
2262
|
+
weights: { web: "secondary" }
|
|
2263
2263
|
},
|
|
2264
2264
|
{
|
|
2265
2265
|
apiFormat: "text/plain",
|
|
@@ -2271,7 +2271,7 @@ var init_src = __esm(() => {
|
|
|
2271
2271
|
operatorNotes: "Cloudflare's managed robots.txt can prepend directives; this file is the origin's intent.",
|
|
2272
2272
|
route: "/robots.txt",
|
|
2273
2273
|
url: `${SITE}/robots.txt`,
|
|
2274
|
-
|
|
2274
|
+
weights: { web: "tertiary" }
|
|
2275
2275
|
},
|
|
2276
2276
|
{
|
|
2277
2277
|
apiFormat: "text/markdown",
|
|
@@ -2281,7 +2281,7 @@ var init_src = __esm(() => {
|
|
|
2281
2281
|
name: "discovery.llms",
|
|
2282
2282
|
route: "/llms.txt",
|
|
2283
2283
|
url: `${SITE}/llms.txt`,
|
|
2284
|
-
|
|
2284
|
+
weights: { web: "primary" }
|
|
2285
2285
|
},
|
|
2286
2286
|
{
|
|
2287
2287
|
apiFormat: "text/markdown",
|
|
@@ -2290,7 +2290,7 @@ var init_src = __esm(() => {
|
|
|
2290
2290
|
name: "discovery.llms-full",
|
|
2291
2291
|
route: "/llms-full.txt",
|
|
2292
2292
|
url: `${SITE}/llms-full.txt`,
|
|
2293
|
-
|
|
2293
|
+
weights: { web: "secondary" }
|
|
2294
2294
|
},
|
|
2295
2295
|
{
|
|
2296
2296
|
apiFormat: "application/openapi+json",
|
|
@@ -2299,7 +2299,7 @@ var init_src = __esm(() => {
|
|
|
2299
2299
|
name: "discovery.openapi",
|
|
2300
2300
|
route: "/api/v1/openapi.json",
|
|
2301
2301
|
url: `${SITE}/api/v1/openapi.json`,
|
|
2302
|
-
|
|
2302
|
+
weights: { web: "secondary" }
|
|
2303
2303
|
},
|
|
2304
2304
|
{
|
|
2305
2305
|
apiFormat: "application/json",
|
|
@@ -2308,7 +2308,7 @@ var init_src = __esm(() => {
|
|
|
2308
2308
|
name: "discovery.mcp-server-card",
|
|
2309
2309
|
route: "/.well-known/mcp/server-card.json",
|
|
2310
2310
|
url: `${SITE}/.well-known/mcp/server-card.json`,
|
|
2311
|
-
|
|
2311
|
+
weights: { web: "tertiary" }
|
|
2312
2312
|
},
|
|
2313
2313
|
{
|
|
2314
2314
|
apiFormat: "application/linkset+json",
|
|
@@ -2317,7 +2317,7 @@ var init_src = __esm(() => {
|
|
|
2317
2317
|
name: "discovery.api-catalog",
|
|
2318
2318
|
route: "/.well-known/api-catalog",
|
|
2319
2319
|
url: `${SITE}/.well-known/api-catalog`,
|
|
2320
|
-
|
|
2320
|
+
weights: { web: "tertiary" }
|
|
2321
2321
|
},
|
|
2322
2322
|
{
|
|
2323
2323
|
apiFormat: "application/json",
|
|
@@ -2326,20 +2326,20 @@ var init_src = __esm(() => {
|
|
|
2326
2326
|
name: "discovery.agent-skills",
|
|
2327
2327
|
route: "/.well-known/agent-skills/index.json",
|
|
2328
2328
|
url: `${SITE}/.well-known/agent-skills/index.json`,
|
|
2329
|
-
|
|
2329
|
+
weights: { web: "tertiary" }
|
|
2330
2330
|
},
|
|
2331
2331
|
{
|
|
2332
2332
|
apiFormat: "application/json",
|
|
2333
2333
|
discoveryUrl: `${SITE}/.well-known/mcp/server-card.json`,
|
|
2334
2334
|
exposedContent: [
|
|
2335
|
-
"the archive as MCP tools (Streamable HTTP, no auth): list_tracks, get_random_track, search_tracks, submit_track, subscribe_newsletter"
|
|
2335
|
+
"the archive as MCP tools (Streamable HTTP, no auth): list_tracks, get_random_track, get_status, search_tracks, submit_track, subscribe_newsletter"
|
|
2336
2336
|
],
|
|
2337
2337
|
kind: "mcp",
|
|
2338
2338
|
name: "mcp.server",
|
|
2339
2339
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2340
2340
|
route: "/mcp",
|
|
2341
2341
|
url: `${SITE}/mcp`,
|
|
2342
|
-
|
|
2342
|
+
weights: { web: "primary" }
|
|
2343
2343
|
},
|
|
2344
2344
|
{
|
|
2345
2345
|
command: "dig TXT 004.7.2I.dig.fluncle.com",
|
|
@@ -2352,7 +2352,7 @@ var init_src = __esm(() => {
|
|
|
2352
2352
|
operatorNotes: "apps/dns — a tiny authoritative server for dig.fluncle.com, reads the public API and renders a finding as TXT. Not recursive (out-of-zone is REFUSED). Probed on /status as service `dns`.",
|
|
2353
2353
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2354
2354
|
subdomain: "dig.fluncle.com",
|
|
2355
|
-
|
|
2355
|
+
weights: { status: "tertiary", web: "tertiary" }
|
|
2356
2356
|
},
|
|
2357
2357
|
{
|
|
2358
2358
|
command: "ssh rave.fluncle.com",
|
|
@@ -2365,70 +2365,70 @@ var init_src = __esm(() => {
|
|
|
2365
2365
|
operatorNotes: "apps/ssh (Go Wish/Bubble Tea). Probed on /status as service `ssh`.",
|
|
2366
2366
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2367
2367
|
subdomain: "rave.fluncle.com",
|
|
2368
|
-
|
|
2368
|
+
weights: { ssh: "primary", status: "secondary", web: "primary" }
|
|
2369
2369
|
},
|
|
2370
2370
|
{
|
|
2371
2371
|
command: "fluncle recent",
|
|
2372
2372
|
exposedContent: ["the latest bangers, newest first (alias `list`)"],
|
|
2373
2373
|
kind: "cli",
|
|
2374
2374
|
name: "cli.recent",
|
|
2375
|
-
|
|
2375
|
+
weights: { cli: "primary", web: "tertiary" }
|
|
2376
2376
|
},
|
|
2377
2377
|
{
|
|
2378
2378
|
command: "fluncle mixtapes",
|
|
2379
2379
|
exposedContent: ["Fluncle's checkpoint sets"],
|
|
2380
2380
|
kind: "cli",
|
|
2381
2381
|
name: "cli.mixtapes",
|
|
2382
|
-
|
|
2382
|
+
weights: { cli: "secondary" }
|
|
2383
2383
|
},
|
|
2384
2384
|
{
|
|
2385
2385
|
command: "fluncle open",
|
|
2386
2386
|
exposedContent: ["pick a track, open it in Spotify"],
|
|
2387
2387
|
kind: "cli",
|
|
2388
2388
|
name: "cli.open",
|
|
2389
|
-
|
|
2389
|
+
weights: { cli: "secondary" }
|
|
2390
2390
|
},
|
|
2391
2391
|
{
|
|
2392
2392
|
command: "fluncle random",
|
|
2393
2393
|
exposedContent: ["the archive throws one back"],
|
|
2394
2394
|
kind: "cli",
|
|
2395
2395
|
name: "cli.random",
|
|
2396
|
-
|
|
2396
|
+
weights: { cli: "secondary" }
|
|
2397
2397
|
},
|
|
2398
2398
|
{
|
|
2399
2399
|
command: "fluncle subscribe",
|
|
2400
2400
|
exposedContent: ["subscribe to the Friday newsletter"],
|
|
2401
2401
|
kind: "cli",
|
|
2402
2402
|
name: "cli.subscribe",
|
|
2403
|
-
|
|
2403
|
+
weights: { cli: "secondary" }
|
|
2404
2404
|
},
|
|
2405
2405
|
{
|
|
2406
2406
|
command: "fluncle submit",
|
|
2407
2407
|
exposedContent: ["send a track for review"],
|
|
2408
2408
|
kind: "cli",
|
|
2409
2409
|
name: "cli.submit",
|
|
2410
|
-
|
|
2410
|
+
weights: { cli: "secondary" }
|
|
2411
2411
|
},
|
|
2412
2412
|
{
|
|
2413
2413
|
command: "fluncle tracks get",
|
|
2414
2414
|
exposedContent: ["look up one finding by id or Log ID (group alias `track`)"],
|
|
2415
2415
|
kind: "cli",
|
|
2416
2416
|
name: "cli.tracks-get",
|
|
2417
|
-
|
|
2417
|
+
weights: { cli: "tertiary" }
|
|
2418
2418
|
},
|
|
2419
2419
|
{
|
|
2420
2420
|
command: "fluncle about",
|
|
2421
2421
|
exposedContent: ["Fluncle, and where to find him"],
|
|
2422
2422
|
kind: "cli",
|
|
2423
2423
|
name: "cli.about",
|
|
2424
|
-
|
|
2424
|
+
weights: { cli: "tertiary" }
|
|
2425
2425
|
},
|
|
2426
2426
|
{
|
|
2427
2427
|
command: "fluncle version",
|
|
2428
2428
|
exposedContent: ["print or check the version (--check hits the latest GitHub release)"],
|
|
2429
2429
|
kind: "cli",
|
|
2430
2430
|
name: "cli.version",
|
|
2431
|
-
|
|
2431
|
+
weights: { cli: "tertiary" }
|
|
2432
2432
|
},
|
|
2433
2433
|
{
|
|
2434
2434
|
command: "fluncle admin",
|
|
@@ -2438,7 +2438,7 @@ var init_src = __esm(() => {
|
|
|
2438
2438
|
kind: "cli",
|
|
2439
2439
|
name: "cli.admin",
|
|
2440
2440
|
operatorNotes: "Authenticated admin/agent tier. The enrichment crons drive a subset of these.",
|
|
2441
|
-
|
|
2441
|
+
weights: { cli: "hidden" }
|
|
2442
2442
|
},
|
|
2443
2443
|
{
|
|
2444
2444
|
command: "fluncle admin tracks enrich --queue",
|
|
@@ -2449,7 +2449,7 @@ var init_src = __esm(() => {
|
|
|
2449
2449
|
name: "cron.enrich",
|
|
2450
2450
|
operatorNotes: "every 5m. Pure compute, zero LLM tokens. Source: docs/agents/hermes/scripts/enrich-sweep.*",
|
|
2451
2451
|
probeConfig: { cadenceMs: 5 * MINUTE_MS, cronName: "fluncle-enrich", kind: "cron" },
|
|
2452
|
-
|
|
2452
|
+
weights: { status: "hidden" }
|
|
2453
2453
|
},
|
|
2454
2454
|
{
|
|
2455
2455
|
command: "fluncle admin tracks context --queue",
|
|
@@ -2460,7 +2460,7 @@ var init_src = __esm(() => {
|
|
|
2460
2460
|
name: "cron.context-note",
|
|
2461
2461
|
operatorNotes: "every 5m. --no-agent trigger; the Worker does the Firecrawl + Haiku distill. Zero on-box tokens.",
|
|
2462
2462
|
probeConfig: { cadenceMs: 5 * MINUTE_MS, cronName: "fluncle-context-note", kind: "cron" },
|
|
2463
|
-
|
|
2463
|
+
weights: { status: "hidden" }
|
|
2464
2464
|
},
|
|
2465
2465
|
{
|
|
2466
2466
|
command: "fluncle admin tracks note --queue",
|
|
@@ -2471,7 +2471,7 @@ var init_src = __esm(() => {
|
|
|
2471
2471
|
name: "cron.note",
|
|
2472
2472
|
operatorNotes: "every 10m. Hybrid --no-agent; one claude -p authors the line. Never clobbers an operator note.",
|
|
2473
2473
|
probeConfig: { cadenceMs: 10 * MINUTE_MS, cronName: "fluncle-note", kind: "cron" },
|
|
2474
|
-
|
|
2474
|
+
weights: { status: "hidden" }
|
|
2475
2475
|
},
|
|
2476
2476
|
{
|
|
2477
2477
|
command: "fluncle admin tracks observe --queue",
|
|
@@ -2482,7 +2482,7 @@ var init_src = __esm(() => {
|
|
|
2482
2482
|
name: "cron.observation",
|
|
2483
2483
|
operatorNotes: "every 60m. Hybrid --no-agent; one claude -p authors the script, the Worker voice-gates + renders.",
|
|
2484
2484
|
probeConfig: { cadenceMs: 60 * MINUTE_MS, cronName: "fluncle-observation", kind: "cron" },
|
|
2485
|
-
|
|
2485
|
+
weights: { status: "hidden" }
|
|
2486
2486
|
},
|
|
2487
2487
|
{
|
|
2488
2488
|
command: "fluncle admin backfills discogs && fluncle admin backfills lastfm",
|
|
@@ -2491,7 +2491,18 @@ var init_src = __esm(() => {
|
|
|
2491
2491
|
name: "cron.backfill",
|
|
2492
2492
|
operatorNotes: "every 30m. Pure HTTP driving, zero LLM tokens. Agent tier.",
|
|
2493
2493
|
probeConfig: { cadenceMs: 30 * MINUTE_MS, cronName: "fluncle-backfill", kind: "cron" },
|
|
2494
|
-
|
|
2494
|
+
weights: { status: "hidden" }
|
|
2495
|
+
},
|
|
2496
|
+
{
|
|
2497
|
+
command: "fluncle admin tracks social --capture",
|
|
2498
|
+
exposedContent: [
|
|
2499
|
+
"capture the YouTube/TikTok post URLs Postiz withholds on create → write back (--no-agent, Worker HTTP)"
|
|
2500
|
+
],
|
|
2501
|
+
kind: "cron",
|
|
2502
|
+
name: "cron.social-capture",
|
|
2503
|
+
operatorNotes: "every 10m. Pure HTTP trigger, zero LLM tokens. Agent tier (fills the public URL only — publishes nothing). The box's baked CLI predates the `--capture` verb, so the cron curls POST /api/admin/social/posts/capture directly; the Worker polls Postiz and writes back. Source: docs/agents/hermes/scripts/social-capture-sweep.sh. Probed on /status as cron.social-capture.",
|
|
2504
|
+
probeConfig: { cadenceMs: 10 * MINUTE_MS, cronName: "fluncle-social-capture", kind: "cron" },
|
|
2505
|
+
weights: { status: "hidden" }
|
|
2495
2506
|
},
|
|
2496
2507
|
{
|
|
2497
2508
|
command: "fluncle admin tracks queue",
|
|
@@ -2500,9 +2511,9 @@ var init_src = __esm(() => {
|
|
|
2500
2511
|
],
|
|
2501
2512
|
kind: "cron",
|
|
2502
2513
|
name: "cron.render",
|
|
2503
|
-
operatorNotes: "every 60m. A conductor: triggers a detached @fluncle-video render on a scale-to-zero box.ascii box (rave-03). Never posts to social (operator-tier 403). Probed on /status as service `render-box
|
|
2514
|
+
operatorNotes: "every 60m. A conductor: triggers a detached @fluncle-video render on a scale-to-zero box.ascii box (rave-03). Never posts to social (operator-tier 403). Probed on /status as service `cron.render` (its own last-run freshness); the box's reachability is the SEPARATE `render-box` probe (the conductor state file).",
|
|
2504
2515
|
probeConfig: { cadenceMs: 60 * MINUTE_MS, cronName: "fluncle-render", kind: "cron" },
|
|
2505
|
-
|
|
2516
|
+
weights: { status: "hidden" }
|
|
2506
2517
|
},
|
|
2507
2518
|
{
|
|
2508
2519
|
exposedContent: [
|
|
@@ -2512,7 +2523,7 @@ var init_src = __esm(() => {
|
|
|
2512
2523
|
name: "cron.healthcheck",
|
|
2513
2524
|
operatorNotes: "every 10m. Pure probing, zero LLM tokens. POSTs to the agent-tier record_health op that /status reads.",
|
|
2514
2525
|
probeConfig: { cadenceMs: 10 * MINUTE_MS, cronName: "fluncle-healthcheck", kind: "cron" },
|
|
2515
|
-
|
|
2526
|
+
weights: { status: "hidden" }
|
|
2516
2527
|
},
|
|
2517
2528
|
{
|
|
2518
2529
|
command: "fluncle admin newsletter draft",
|
|
@@ -2527,7 +2538,7 @@ var init_src = __esm(() => {
|
|
|
2527
2538
|
cronName: "fluncle-newsletter",
|
|
2528
2539
|
kind: "cron"
|
|
2529
2540
|
},
|
|
2530
|
-
|
|
2541
|
+
weights: { status: "secondary" }
|
|
2531
2542
|
}
|
|
2532
2543
|
];
|
|
2533
2544
|
});
|
|
@@ -2609,6 +2620,7 @@ __export(exports_track, {
|
|
|
2609
2620
|
trackUpdateCommand: () => trackUpdateCommand,
|
|
2610
2621
|
trackSocialUpdateCommand: () => trackSocialUpdateCommand,
|
|
2611
2622
|
trackSocialShowCommand: () => trackSocialShowCommand,
|
|
2623
|
+
trackSocialCaptureCommand: () => trackSocialCaptureCommand,
|
|
2612
2624
|
trackRequeueVideoCommand: () => trackRequeueVideoCommand,
|
|
2613
2625
|
trackPurgeVideoCommand: () => trackPurgeVideoCommand,
|
|
2614
2626
|
trackObserveCommand: () => trackObserveCommand,
|
|
@@ -2688,6 +2700,10 @@ async function trackSocialUpdateCommand(idOrLogId, platform2, options) {
|
|
|
2688
2700
|
async function trackSocialShowCommand(idOrLogId) {
|
|
2689
2701
|
return adminApiGet(`/api/admin/tracks/${encodeURIComponent(idOrLogId)}/social`);
|
|
2690
2702
|
}
|
|
2703
|
+
async function trackSocialCaptureCommand(limit) {
|
|
2704
|
+
const body = limit === undefined ? {} : { limit: String(limit) };
|
|
2705
|
+
return adminApiPost(`/api/admin/social/posts/capture`, body);
|
|
2706
|
+
}
|
|
2691
2707
|
async function trackUpdateCommand(trackId, options) {
|
|
2692
2708
|
const body = {};
|
|
2693
2709
|
if (options.bpm !== undefined) {
|
|
@@ -6194,7 +6210,12 @@ function addAdminCommands(program2) {
|
|
|
6194
6210
|
const { trackDraftCommand: trackDraftCommand2 } = await Promise.resolve().then(() => (init_track(), exports_track));
|
|
6195
6211
|
await runTrackDraft(idOrLogId, options, trackDraftCommand2);
|
|
6196
6212
|
});
|
|
6197
|
-
adminTrack.command("social").description("Show or update a track's per-platform publication status").argument("[idOrLogId]").option("--json", "Print JSON", false).option("--platform <platform>", "Publishing platform").option("--scheduled-for <date>", "Scheduled publication date").option("--status <status>", "scheduled, published, or failed").option("--url <url>", "Published post URL").allowExcessArguments().action(async (idOrLogId, options) => {
|
|
6213
|
+
adminTrack.command("social").description("Show or update a track's per-platform publication status").argument("[idOrLogId]").option("--capture", "Sweep: capture missing YouTube/TikTok post URLs from Postiz (no id needed)", false).option("--limit <limit>", "Max pending posts to poll with --capture", "25").option("--json", "Print JSON", false).option("--platform <platform>", "Publishing platform").option("--scheduled-for <date>", "Scheduled publication date").option("--status <status>", "scheduled, published, or failed").option("--url <url>", "Published post URL").allowExcessArguments().action(async (idOrLogId, options) => {
|
|
6214
|
+
if (options.capture) {
|
|
6215
|
+
const { trackSocialCaptureCommand: trackSocialCaptureCommand2 } = await Promise.resolve().then(() => (init_track(), exports_track));
|
|
6216
|
+
await runTrackSocialCapture(options, trackSocialCaptureCommand2);
|
|
6217
|
+
return;
|
|
6218
|
+
}
|
|
6198
6219
|
const { trackSocialShowCommand: trackSocialShowCommand2, trackSocialUpdateCommand: trackSocialUpdateCommand2 } = await Promise.resolve().then(() => (init_track(), exports_track));
|
|
6199
6220
|
await runTrackSocial(idOrLogId, options, trackSocialShowCommand2, trackSocialUpdateCommand2);
|
|
6200
6221
|
});
|
|
@@ -6467,6 +6488,7 @@ async function runBackfillLastfm(options, backfillLastfmCommand2) {
|
|
|
6467
6488
|
const skipped = [];
|
|
6468
6489
|
let cursor;
|
|
6469
6490
|
let dryRun = options.dryRun;
|
|
6491
|
+
let throttled = false;
|
|
6470
6492
|
while (loved.length + failed.length < limit) {
|
|
6471
6493
|
const remaining = limit - (loved.length + failed.length);
|
|
6472
6494
|
const result = await backfillLastfmCommand2(remaining, options.dryRun, cursor);
|
|
@@ -6478,6 +6500,10 @@ async function runBackfillLastfm(options, backfillLastfmCommand2) {
|
|
|
6478
6500
|
const verb2 = result.dryRun ? "Would love" : "Loved";
|
|
6479
6501
|
console.log(` \u2026${verb2.toLowerCase()} ${result.lovedCount}; ${result.failedCount} failed; ${result.skippedCount} skipped`);
|
|
6480
6502
|
}
|
|
6503
|
+
if (result.rateLimited) {
|
|
6504
|
+
throttled = true;
|
|
6505
|
+
break;
|
|
6506
|
+
}
|
|
6481
6507
|
if (result.nextCursor === null) {
|
|
6482
6508
|
break;
|
|
6483
6509
|
}
|
|
@@ -6491,6 +6517,7 @@ async function runBackfillLastfm(options, backfillLastfmCommand2) {
|
|
|
6491
6517
|
loved,
|
|
6492
6518
|
lovedCount: loved.length,
|
|
6493
6519
|
ok: true,
|
|
6520
|
+
rateLimited: throttled,
|
|
6494
6521
|
skipped,
|
|
6495
6522
|
skippedCount: skipped.length
|
|
6496
6523
|
});
|
|
@@ -6512,6 +6539,7 @@ async function runBackfillDiscogs(options, backfillDiscogsCommand2) {
|
|
|
6512
6539
|
const skipped = [];
|
|
6513
6540
|
let cursor;
|
|
6514
6541
|
let dryRun = options.dryRun;
|
|
6542
|
+
let throttled = false;
|
|
6515
6543
|
while (resolved.length + unresolved.length < limit) {
|
|
6516
6544
|
const remaining = limit - (resolved.length + unresolved.length);
|
|
6517
6545
|
const result = await backfillDiscogsCommand2(remaining, options.dryRun, cursor);
|
|
@@ -6523,6 +6551,10 @@ async function runBackfillDiscogs(options, backfillDiscogsCommand2) {
|
|
|
6523
6551
|
const verb2 = result.dryRun ? "would resolve" : "resolved";
|
|
6524
6552
|
console.log(` \u2026${verb2} ${result.resolvedCount}; ${result.unresolvedCount} unresolved; ${result.skippedCount} skipped`);
|
|
6525
6553
|
}
|
|
6554
|
+
if (result.rateLimited) {
|
|
6555
|
+
throttled = true;
|
|
6556
|
+
break;
|
|
6557
|
+
}
|
|
6526
6558
|
if (result.nextCursor === null) {
|
|
6527
6559
|
break;
|
|
6528
6560
|
}
|
|
@@ -6532,6 +6564,7 @@ async function runBackfillDiscogs(options, backfillDiscogsCommand2) {
|
|
|
6532
6564
|
printJson({
|
|
6533
6565
|
dryRun,
|
|
6534
6566
|
ok: true,
|
|
6567
|
+
rateLimited: throttled,
|
|
6535
6568
|
resolved,
|
|
6536
6569
|
resolvedCount: resolved.length,
|
|
6537
6570
|
skipped,
|
|
@@ -6641,6 +6674,25 @@ async function runTrackSocial(idOrLogId, options, trackSocialShowCommand2, track
|
|
|
6641
6674
|
}
|
|
6642
6675
|
console.log(`${platform2} \u2192 ${options.status} for ${result.trackId}`);
|
|
6643
6676
|
}
|
|
6677
|
+
async function runTrackSocialCapture(options, trackSocialCaptureCommand2) {
|
|
6678
|
+
const limit = options.limit === undefined ? undefined : Number.parseInt(options.limit, 10);
|
|
6679
|
+
if (limit !== undefined && (!Number.isInteger(limit) || limit < 1)) {
|
|
6680
|
+
throw new Error("--limit must be a positive integer");
|
|
6681
|
+
}
|
|
6682
|
+
const result = await trackSocialCaptureCommand2(limit);
|
|
6683
|
+
if (options.json) {
|
|
6684
|
+
printJson(result);
|
|
6685
|
+
return;
|
|
6686
|
+
}
|
|
6687
|
+
if (result.captured.length === 0) {
|
|
6688
|
+
console.log(`Polled ${result.polled} pending post(s); nothing new to capture.`);
|
|
6689
|
+
return;
|
|
6690
|
+
}
|
|
6691
|
+
console.log(`Captured ${result.captured.length} post URL(s) from ${result.polled} polled:`);
|
|
6692
|
+
for (const post of result.captured) {
|
|
6693
|
+
console.log(` ${post.platform}: ${post.url}`);
|
|
6694
|
+
}
|
|
6695
|
+
}
|
|
6644
6696
|
async function runTrackGet(idOrLogId, options, trackGetCommand2) {
|
|
6645
6697
|
if (!idOrLogId) {
|
|
6646
6698
|
throw new Error("Missing id. Usage: fluncle tracks get <track_id|log_id> [--json]");
|
package/package.json
CHANGED