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 <noreply@anthropic.com>
This commit is contained in:
2026-05-08 13:05:12 +08:00
parent 18f6c8bd2e
commit 6917acb778
3 changed files with 26 additions and 0 deletions
+16
View File
@@ -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) jobPurgeRunner := runners.NewJobPurge(jobsRepo, cfg.Jobs.JobPurge.CompletedRetention, log)
acpEventsPurgeRunner := runners.NewAcpEventsPurge( acpEventsPurgeRunner := runners.NewAcpEventsPurge(
acpEventsPurgeAdapter{repo: acpRepo}, cfg.Jobs.AcpEventsPurge.Retention, log) 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) { deadLetterFn := func(ctx context.Context, job jobs.Job, herr error) {
errMsg := 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, Interval: cfg.Jobs.AcpEventsPurge.Interval,
Retention: cfg.Jobs.AcpEventsPurge.Retention, 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{ }, jobs.ModuleDeps{
Repo: jobsRepo, Repo: jobsRepo,
Handlers: map[jobs.JobType]jobs.Handler{ 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_reaper": jobReaperRunner.Run,
"job_purge": jobPurgeRunner.Run, "job_purge": jobPurgeRunner.Run,
"acp_events_purge": acpEventsPurgeRunner.Run, "acp_events_purge": acpEventsPurgeRunner.Run,
"mcp_tokens_purge": mcpTokensPurgeRunner.Run,
}, },
Clock: clock.Real(), Clock: clock.Real(),
Log: log, Log: log,
@@ -848,3 +856,11 @@ type acpEventsPurgeAdapter struct{ repo acp.Repository }
func (a acpEventsPurgeAdapter) PurgeEventsBefore(ctx context.Context, before time.Time) (int64, error) { func (a acpEventsPurgeAdapter) PurgeEventsBefore(ctx context.Context, before time.Time) (int64, error) {
return a.repo.PurgeEventsBefore(ctx, before) 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)
}
+8
View File
@@ -127,6 +127,13 @@ type AcpEventsPurgeConfig struct {
Retention time.Duration 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. // Config is the full jobs.Module configuration.
type Config struct { type Config struct {
Enabled bool Enabled bool
@@ -138,4 +145,5 @@ type Config struct {
JobReaper JobReaperConfig JobReaper JobReaperConfig
JobPurge JobPurgeConfig JobPurge JobPurgeConfig
AcpEventsPurge AcpEventsPurgeConfig AcpEventsPurge AcpEventsPurgeConfig
MCPTokensPurge MCPTokensPurgeConfig
} }
+2
View File
@@ -131,6 +131,8 @@ func scheduleEntry(cfg Config, name string) (schedEntry, bool) {
return schedEntry{cfg.JobPurge.Interval, cfg.JobPurge.Enabled}, true return schedEntry{cfg.JobPurge.Interval, cfg.JobPurge.Enabled}, true
case "acp_events_purge": case "acp_events_purge":
return schedEntry{cfg.AcpEventsPurge.Interval, cfg.AcpEventsPurge.Enabled}, true 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 return schedEntry{0, false}, false
} }