fluncle 0.63.0 → 0.64.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 +98 -69
  2. 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.63.0".trim() ? "0.63.0".trim() : "0.1.0";
426
+ currentVersion = "0.64.0".trim() ? "0.64.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.63.0".trim() ? "0.63.0".trim() : "0.1.0";
1917
+ currentVersion2 = "0.64.0".trim() ? "0.64.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
- weight: "primary"
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
- weight: "primary"
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
- weight: "primary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "secondary"
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: "The future status.fluncle.com host points here. The fluncle-healthcheck cron POSTs its snapshots to the agent-tier record_health op that this page reads.",
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
- weight: "secondary"
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
- weight: "primary"
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
- weight: "secondary"
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
- weight: "tertiary"
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
- weight: "primary"
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
- weight: "secondary"
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
- weight: "tertiary"
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
- weight: "tertiary"
2083
+ weights: { web: "tertiary" }
2084
2084
  },
2085
2085
  {
2086
- exposedContent: ["the planned status host — points at /status"],
2086
+ exposedContent: ["the status host — its root rewrites to /status"],
2087
2087
  kind: "subdomain",
2088
2088
  name: "subdomain.status",
2089
- operatorNotes: "PLANNED. Not yet wired; the page already lives at www.fluncle.com/status.",
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
- weight: "tertiary"
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
- weight: "tertiary"
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
- weight: "primary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "tertiary"
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
- weight: "tertiary"
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
- weight: "tertiary"
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
- weight: "primary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "tertiary"
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
- weight: "secondary"
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
- weight: "tertiary"
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
- weight: "primary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "tertiary"
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
- weight: "tertiary"
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
- weight: "tertiary"
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
- weight: "primary"
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
- weight: "tertiary"
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
- weight: "primary"
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
- weight: "primary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "secondary"
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
- weight: "tertiary"
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
- weight: "tertiary"
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
- weight: "tertiary"
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
- weight: "hidden"
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
- weight: "hidden"
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
- weight: "hidden"
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
- weight: "hidden"
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
- weight: "hidden"
2485
+ weights: { status: "hidden" }
2486
2486
  },
2487
2487
  {
2488
2488
  command: "fluncle admin backfills discogs && fluncle admin backfills lastfm",
@@ -2491,7 +2491,7 @@ 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
- weight: "hidden"
2494
+ weights: { status: "hidden" }
2495
2495
  },
2496
2496
  {
2497
2497
  command: "fluncle admin tracks queue",
@@ -2500,9 +2500,9 @@ var init_src = __esm(() => {
2500
2500
  ],
2501
2501
  kind: "cron",
2502
2502
  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`.",
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 `cron.render` (its own last-run freshness); the box's reachability is the SEPARATE `render-box` probe (the conductor state file).",
2504
2504
  probeConfig: { cadenceMs: 60 * MINUTE_MS, cronName: "fluncle-render", kind: "cron" },
2505
- weight: "hidden"
2505
+ weights: { status: "hidden" }
2506
2506
  },
2507
2507
  {
2508
2508
  exposedContent: [
@@ -2512,7 +2512,7 @@ var init_src = __esm(() => {
2512
2512
  name: "cron.healthcheck",
2513
2513
  operatorNotes: "every 10m. Pure probing, zero LLM tokens. POSTs to the agent-tier record_health op that /status reads.",
2514
2514
  probeConfig: { cadenceMs: 10 * MINUTE_MS, cronName: "fluncle-healthcheck", kind: "cron" },
2515
- weight: "hidden"
2515
+ weights: { status: "hidden" }
2516
2516
  },
2517
2517
  {
2518
2518
  command: "fluncle admin newsletter draft",
@@ -2527,7 +2527,7 @@ var init_src = __esm(() => {
2527
2527
  cronName: "fluncle-newsletter",
2528
2528
  kind: "cron"
2529
2529
  },
2530
- weight: "secondary"
2530
+ weights: { status: "secondary" }
2531
2531
  }
2532
2532
  ];
2533
2533
  });
@@ -2609,6 +2609,7 @@ __export(exports_track, {
2609
2609
  trackUpdateCommand: () => trackUpdateCommand,
2610
2610
  trackSocialUpdateCommand: () => trackSocialUpdateCommand,
2611
2611
  trackSocialShowCommand: () => trackSocialShowCommand,
2612
+ trackSocialCaptureCommand: () => trackSocialCaptureCommand,
2612
2613
  trackRequeueVideoCommand: () => trackRequeueVideoCommand,
2613
2614
  trackPurgeVideoCommand: () => trackPurgeVideoCommand,
2614
2615
  trackObserveCommand: () => trackObserveCommand,
@@ -2688,6 +2689,10 @@ async function trackSocialUpdateCommand(idOrLogId, platform2, options) {
2688
2689
  async function trackSocialShowCommand(idOrLogId) {
2689
2690
  return adminApiGet(`/api/admin/tracks/${encodeURIComponent(idOrLogId)}/social`);
2690
2691
  }
2692
+ async function trackSocialCaptureCommand(limit) {
2693
+ const body = limit === undefined ? {} : { limit: String(limit) };
2694
+ return adminApiPost(`/api/admin/social/posts/capture`, body);
2695
+ }
2691
2696
  async function trackUpdateCommand(trackId, options) {
2692
2697
  const body = {};
2693
2698
  if (options.bpm !== undefined) {
@@ -6194,7 +6199,12 @@ function addAdminCommands(program2) {
6194
6199
  const { trackDraftCommand: trackDraftCommand2 } = await Promise.resolve().then(() => (init_track(), exports_track));
6195
6200
  await runTrackDraft(idOrLogId, options, trackDraftCommand2);
6196
6201
  });
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) => {
6202
+ 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) => {
6203
+ if (options.capture) {
6204
+ const { trackSocialCaptureCommand: trackSocialCaptureCommand2 } = await Promise.resolve().then(() => (init_track(), exports_track));
6205
+ await runTrackSocialCapture(options, trackSocialCaptureCommand2);
6206
+ return;
6207
+ }
6198
6208
  const { trackSocialShowCommand: trackSocialShowCommand2, trackSocialUpdateCommand: trackSocialUpdateCommand2 } = await Promise.resolve().then(() => (init_track(), exports_track));
6199
6209
  await runTrackSocial(idOrLogId, options, trackSocialShowCommand2, trackSocialUpdateCommand2);
6200
6210
  });
@@ -6641,6 +6651,25 @@ async function runTrackSocial(idOrLogId, options, trackSocialShowCommand2, track
6641
6651
  }
6642
6652
  console.log(`${platform2} \u2192 ${options.status} for ${result.trackId}`);
6643
6653
  }
6654
+ async function runTrackSocialCapture(options, trackSocialCaptureCommand2) {
6655
+ const limit = options.limit === undefined ? undefined : Number.parseInt(options.limit, 10);
6656
+ if (limit !== undefined && (!Number.isInteger(limit) || limit < 1)) {
6657
+ throw new Error("--limit must be a positive integer");
6658
+ }
6659
+ const result = await trackSocialCaptureCommand2(limit);
6660
+ if (options.json) {
6661
+ printJson(result);
6662
+ return;
6663
+ }
6664
+ if (result.captured.length === 0) {
6665
+ console.log(`Polled ${result.polled} pending post(s); nothing new to capture.`);
6666
+ return;
6667
+ }
6668
+ console.log(`Captured ${result.captured.length} post URL(s) from ${result.polled} polled:`);
6669
+ for (const post of result.captured) {
6670
+ console.log(` ${post.platform}: ${post.url}`);
6671
+ }
6672
+ }
6644
6673
  async function runTrackGet(idOrLogId, options, trackGetCommand2) {
6645
6674
  if (!idOrLogId) {
6646
6675
  throw new Error("Missing id. Usage: fluncle tracks get <track_id|log_id> [--json]");
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.63.0"
34
+ "version": "0.64.0"
35
35
  }