π File detail
services/tips/tipScheduler.ts
π§© .tsπ 59 linesπΎ 1,664 bytesπ text
β Back to All Filesπ― Use case
This file lives under βservices/β, which covers long-lived services (LSP, MCP, OAuth, tool execution, memory, compaction, voice, settings sync, β¦). On the API surface it exposes selectTipWithLongestTimeSinceShown, getTipToShowOnSpinner, and recordShownTip β mainly functions, hooks, or classes. It composes internal code from utils, analytics, tipHistory, tipRegistry, and types (relative imports).
Generated from folder role, exports, dependency roots, and inline comments β not hand-reviewed for every path.
π§ Inline summary
import { getSettings_DEPRECATED } from '../../utils/settings/settings.js' import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent, } from '../analytics/index.js'
π€ Exports (heuristic)
selectTipWithLongestTimeSinceShowngetTipToShowOnSpinnerrecordShownTip
π₯οΈ Source preview
import { getSettings_DEPRECATED } from '../../utils/settings/settings.js'
import {
type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
logEvent,
} from '../analytics/index.js'
import { getSessionsSinceLastShown, recordTipShown } from './tipHistory.js'
import { getRelevantTips } from './tipRegistry.js'
import type { Tip, TipContext } from './types.js'
export function selectTipWithLongestTimeSinceShown(
availableTips: Tip[],
): Tip | undefined {
if (availableTips.length === 0) {
return undefined
}
if (availableTips.length === 1) {
return availableTips[0]
}
// Sort tips by sessions since last shown (descending) and take the first one
// This is the tip that hasn't been shown for the longest time
const tipsWithSessions = availableTips.map(tip => ({
tip,
sessions: getSessionsSinceLastShown(tip.id),
}))
tipsWithSessions.sort((a, b) => b.sessions - a.sessions)
return tipsWithSessions[0]?.tip
}
export async function getTipToShowOnSpinner(
context?: TipContext,
): Promise<Tip | undefined> {
// Check if tips are disabled (default to true if not set)
if (getSettings_DEPRECATED().spinnerTipsEnabled === false) {
return undefined
}
const tips = await getRelevantTips(context)
if (tips.length === 0) {
return undefined
}
return selectTipWithLongestTimeSinceShown(tips)
}
export function recordShownTip(tip: Tip): void {
// Record in history
recordTipShown(tip.id)
// Log event for analytics
logEvent('tengu_tip_shown', {
tipIdLength:
tip.id as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
cooldownSessions: tip.cooldownSessions,
})
}