Remove dead defaultPollIntervalMinutes global setting

Confirmed dead: every source's pollIntervalMinutes is NOT NULL DEFAULT 15 and
the admin form only ever submits 5/15/60, so sourcesDueForPoll()'s fallback to
the global default could never actually trigger. Removes the setting end to
end (schema, settings.ts, scheduler/poller/sources signatures, admin types,
mock backend fixture) and drops the now-single-item "Poll interval" panel from
the Sources & Merge tab.
This commit is contained in:
Claude
2026-07-26 17:31:52 +00:00
parent e7367bbb86
commit 20f9267594
9 changed files with 15 additions and 39 deletions
+2 -2
View File
@@ -22,8 +22,8 @@ const adapters: Record<Source['type'], SourceAdapter> = {
// as opposed to Telegram where the message itself *is* the content.
const FOLLOWS_LINK_FOR_FULL_ARTICLE: Source['type'][] = ['rss', 'api'];
export async function pollDueSources(defaultIntervalMinutes: number): Promise<number> {
const due = sourcesDb.sourcesDueForPoll(defaultIntervalMinutes);
export async function pollDueSources(): Promise<number> {
const due = sourcesDb.sourcesDueForPoll();
let ingested = 0;
for (const source of due) {
ingested += await pollOne(source);
+1 -2
View File
@@ -24,8 +24,7 @@ export function startScheduler() {
setInterval(async () => {
try {
const settings = settingsDb.getSettings();
const ingested = await pollDueSources(settings.defaultPollIntervalMinutes);
const ingested = await pollDueSources();
if (ingested > 0) logger.info('scheduler', `Poll tick: ingested ${ingested} new item(s)`);
} catch (err) {
logger.error('scheduler', `Poll tick failed: ${(err as Error).message}`);
-1
View File
@@ -168,7 +168,6 @@ export function migrate() {
CREATE TABLE IF NOT EXISTS global_settings (
id INTEGER PRIMARY KEY CHECK (id = 1), -- singleton row
merge_strictness INTEGER NOT NULL DEFAULT 3,
default_poll_interval_minutes INTEGER NOT NULL DEFAULT 15,
hold_before_publish_minutes INTEGER NOT NULL DEFAULT 30,
tag_dedup_threshold REAL NOT NULL DEFAULT 0.82,
tag_expiry_days INTEGER NOT NULL DEFAULT 21,
+1 -3
View File
@@ -4,7 +4,6 @@ import type { GlobalSettings } from './types.js';
function rowToSettings(row: any): GlobalSettings {
return {
mergeStrictness: row.merge_strictness,
defaultPollIntervalMinutes: row.default_poll_interval_minutes,
holdBeforePublishMinutes: row.hold_before_publish_minutes,
tagDedupThreshold: row.tag_dedup_threshold,
tagExpiryDays: row.tag_expiry_days,
@@ -72,7 +71,7 @@ export function updateSettings(patch: Partial<GlobalSettings>): GlobalSettings {
// out of sync — node:sqlite binds each by its `$name` key, not position.
db.prepare(
`UPDATE global_settings SET
merge_strictness=$merge_strictness, default_poll_interval_minutes=$default_poll_interval_minutes,
merge_strictness=$merge_strictness,
hold_before_publish_minutes=$hold_before_publish_minutes,
tag_dedup_threshold=$tag_dedup_threshold, tag_expiry_days=$tag_expiry_days,
follow_up_min_hours_since_last=$follow_up_min_hours_since_last, follow_up_min_new_sources=$follow_up_min_new_sources,
@@ -90,7 +89,6 @@ export function updateSettings(patch: Partial<GlobalSettings>): GlobalSettings {
WHERE id = 1`
).run({
$merge_strictness: merged.mergeStrictness,
$default_poll_interval_minutes: merged.defaultPollIntervalMinutes,
$hold_before_publish_minutes: merged.holdBeforePublishMinutes,
$tag_dedup_threshold: merged.tagDedupThreshold,
$tag_expiry_days: merged.tagExpiryDays,
+3 -4
View File
@@ -89,12 +89,11 @@ export function markPolled(id: string, error: string | null) {
);
}
/** Sources due for polling right now, based on their own interval (or the global default). */
export function sourcesDueForPoll(defaultIntervalMinutes: number): Source[] {
/** Sources due for polling right now, based on their own interval. */
export function sourcesDueForPoll(): Source[] {
const now = Date.now();
return listEnabledSources().filter((s) => {
if (!s.lastPolledAt) return true;
const interval = (s.pollIntervalMinutes || defaultIntervalMinutes) * 60_000;
return now - new Date(s.lastPolledAt).getTime() >= interval;
return now - new Date(s.lastPolledAt).getTime() >= s.pollIntervalMinutes * 60_000;
});
}
-1
View File
@@ -265,7 +265,6 @@ export interface Bookmark {
export interface GlobalSettings {
mergeStrictness: 1 | 2 | 3 | 4 | 5;
defaultPollIntervalMinutes: number;
holdBeforePublishMinutes: number;
tagDedupThreshold: number;
tagExpiryDays: number;
-1
View File
@@ -127,7 +127,6 @@ export interface AdminWidgetsEnabled {
export interface AdminSettings {
mergeStrictness: 1 | 2 | 3 | 4 | 5;
defaultPollIntervalMinutes: number;
holdBeforePublishMinutes: number;
tagDedupThreshold: number;
tagExpiryDays: number;
@@ -28,7 +28,6 @@
try {
await updateSettings({
mergeStrictness: local.mergeStrictness,
defaultPollIntervalMinutes: local.defaultPollIntervalMinutes,
holdBeforePublishMinutes: local.holdBeforePublishMinutes,
followUpMinHoursSinceLast: local.followUpMinHoursSinceLast,
followUpMinNewSources: local.followUpMinNewSources,
@@ -183,29 +182,14 @@
</div>
</div>
<div class="grid-2">
<div class="panel">
<span class="panel-title">Poll interval</span>
<p class="hint">
Fallback only — every source above sets its own poll interval, so this value has no
effect unless a source somehow has none set (not currently possible through this admin
panel or the API).
</p>
<select bind:value={local.defaultPollIntervalMinutes} onchange={scheduleSave}>
<option value={5}>Every 5 minutes</option>
<option value={15}>Every 15 minutes</option>
<option value={60}>Every hour</option>
</select>
</div>
<div class="panel">
<span class="panel-title">Hold before publish</span>
<p class="hint">Wait window to gather more sources before finalizing a story.</p>
<select bind:value={local.holdBeforePublishMinutes} onchange={scheduleSave}>
<option value={0}>Publish immediately</option>
<option value={30}>Wait 30 minutes</option>
<option value={120}>Wait 2 hours</option>
</select>
</div>
<div class="panel">
<span class="panel-title">Hold before publish</span>
<p class="hint">Wait window to gather more sources before finalizing a story.</p>
<select bind:value={local.holdBeforePublishMinutes} onchange={scheduleSave}>
<option value={0}>Publish immediately</option>
<option value={30}>Wait 30 minutes</option>
<option value={120}>Wait 2 hours</option>
</select>
</div>
<div class="panel">
-1
View File
@@ -3,7 +3,6 @@
let settings = {
mergeStrictness: 3,
defaultPollIntervalMinutes: 15,
holdBeforePublishMinutes: 30,
tagDedupThreshold: 0.82,
tagExpiryDays: 21,