From 6917acb778cb9ca34a70983bf59d356173b33d0e Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 8 May 2026 13:05:12 +0800 Subject: [PATCH] feat(jobs): wire mcp_tokens_purge runner into jobs.Module - Config.MCPTokensPurge + scheduleEntry branch - app.go constructs runner with mcpTokensPurgeAdapter - Registered as 'mcp_tokens_purge' in RunnerFns map Co-Authored-By: Claude Opus 4.6 --- internal/app/app.go | 16 ++++++++++++++++ internal/jobs/domain.go | 8 ++++++++ internal/jobs/module.go | 2 ++ 3 files changed, 26 insertions(+) diff --git a/internal/app/app.go b/internal/app/app.go index 52c806d..ed33db9 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -404,6 +404,8 @@ func New(ctx context.Context, cfg *config.Config, dist embed.FS) (*App, error) { jobPurgeRunner := runners.NewJobPurge(jobsRepo, cfg.Jobs.JobPurge.CompletedRetention, log) acpEventsPurgeRunner := runners.NewAcpEventsPurge( acpEventsPurgeAdapter{repo: acpRepo}, cfg.Jobs.AcpEventsPurge.Retention, log) + mcpTokensPurgeRunner := runners.NewMCPTokensPurge( + mcpTokensPurgeAdapter{repo: mcpRepo}, cfg.Jobs.MCPTokensPurge.Retention, log) deadLetterFn := func(ctx context.Context, job jobs.Job, herr error) { errMsg := herr.Error() @@ -479,6 +481,11 @@ func New(ctx context.Context, cfg *config.Config, dist embed.FS) (*App, error) { Interval: cfg.Jobs.AcpEventsPurge.Interval, Retention: cfg.Jobs.AcpEventsPurge.Retention, }, + MCPTokensPurge: jobs.MCPTokensPurgeConfig{ + Enabled: cfg.Jobs.MCPTokensPurge.Enabled, + Interval: cfg.Jobs.MCPTokensPurge.Interval, + Retention: cfg.Jobs.MCPTokensPurge.Retention, + }, }, jobs.ModuleDeps{ Repo: jobsRepo, Handlers: map[jobs.JobType]jobs.Handler{ @@ -491,6 +498,7 @@ func New(ctx context.Context, cfg *config.Config, dist embed.FS) (*App, error) { "job_reaper": jobReaperRunner.Run, "job_purge": jobPurgeRunner.Run, "acp_events_purge": acpEventsPurgeRunner.Run, + "mcp_tokens_purge": mcpTokensPurgeRunner.Run, }, Clock: clock.Real(), Log: log, @@ -848,3 +856,11 @@ type acpEventsPurgeAdapter struct{ repo acp.Repository } func (a acpEventsPurgeAdapter) PurgeEventsBefore(ctx context.Context, before time.Time) (int64, error) { return a.repo.PurgeEventsBefore(ctx, before) } + +// mcpTokensPurgeAdapter exposes mcp.Repository.PurgeExpired as the narrow +// interface required by runners.MCPTokensPurge. +type mcpTokensPurgeAdapter struct{ repo mcp.Repository } + +func (a mcpTokensPurgeAdapter) PurgeExpired(ctx context.Context, before time.Time) (int64, error) { + return a.repo.PurgeExpired(ctx, before) +} diff --git a/internal/jobs/domain.go b/internal/jobs/domain.go index d9bbe79..436aa35 100644 --- a/internal/jobs/domain.go +++ b/internal/jobs/domain.go @@ -127,6 +127,13 @@ type AcpEventsPurgeConfig struct { Retention time.Duration } +// MCPTokensPurgeConfig extends RunnerConfig with mcp_tokens retention. +type MCPTokensPurgeConfig struct { + Enabled bool + Interval time.Duration + Retention time.Duration +} + // Config is the full jobs.Module configuration. type Config struct { Enabled bool @@ -138,4 +145,5 @@ type Config struct { JobReaper JobReaperConfig JobPurge JobPurgeConfig AcpEventsPurge AcpEventsPurgeConfig + MCPTokensPurge MCPTokensPurgeConfig } diff --git a/internal/jobs/module.go b/internal/jobs/module.go index f3c5c1d..1a3d962 100644 --- a/internal/jobs/module.go +++ b/internal/jobs/module.go @@ -131,6 +131,8 @@ func scheduleEntry(cfg Config, name string) (schedEntry, bool) { return schedEntry{cfg.JobPurge.Interval, cfg.JobPurge.Enabled}, true case "acp_events_purge": return schedEntry{cfg.AcpEventsPurge.Interval, cfg.AcpEventsPurge.Enabled}, true + case "mcp_tokens_purge": + return schedEntry{cfg.MCPTokensPurge.Interval, cfg.MCPTokensPurge.Enabled}, true } return schedEntry{0, false}, false }