惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
The Cloudflare Blog
IT之家
IT之家
V
V2EX
雷峰网
雷峰网
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
小众软件
小众软件
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
A
About on SuperTechFans
B
Blog
月光博客
月光博客
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
fix(gateway): skip malformed compaction checkpoints · ope...
vincentkoc · 2026-05-16 · via Recent Commits to openclaw:main

@@ -256,20 +256,52 @@ function resolveNonNegativeNumber(value: number | null | undefined): number | un

256256

return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : undefined;

257257

}

258258259-

function resolveLatestCompactionCheckpoint(

259+

type SessionCompactionCheckpointEntry = NonNullable<SessionEntry["compactionCheckpoints"]>[number];

260+261+

function isProjectableCompactionCheckpoint(

262+

value: unknown,

263+

): value is SessionCompactionCheckpointEntry {

264+

if (!value || typeof value !== "object" || Array.isArray(value)) {

265+

return false;

266+

}

267+

const checkpoint = value as {

268+

checkpointId?: unknown;

269+

createdAt?: unknown;

270+

reason?: unknown;

271+

};

272+

return (

273+

Boolean(normalizeOptionalString(checkpoint.checkpointId)) &&

274+

typeof checkpoint.createdAt === "number" &&

275+

Number.isFinite(checkpoint.createdAt) &&

276+

(checkpoint.reason === "manual" ||

277+

checkpoint.reason === "auto-threshold" ||

278+

checkpoint.reason === "overflow-retry" ||

279+

checkpoint.reason === "timeout-retry")

280+

);

281+

}

282+283+

function resolveProjectableCompactionCheckpoints(

260284

entry?: Pick<SessionEntry, "compactionCheckpoints"> | null,

261-

): NonNullable<SessionEntry["compactionCheckpoints"]>[number] | undefined {

285+

): SessionCompactionCheckpointEntry[] {

262286

const checkpoints = entry?.compactionCheckpoints;

263287

if (!Array.isArray(checkpoints) || checkpoints.length === 0) {

264-

return undefined;

288+

return [];

265289

}

266-

return checkpoints.reduce((latest, checkpoint) =>

267-

!latest || checkpoint.createdAt > latest.createdAt ? checkpoint : latest,

290+

return checkpoints.filter(isProjectableCompactionCheckpoint);

291+

}

292+293+

function resolveLatestCompactionCheckpoint(

294+

checkpoints: readonly SessionCompactionCheckpointEntry[],

295+

): SessionCompactionCheckpointEntry | undefined {

296+

return checkpoints.reduce<SessionCompactionCheckpointEntry | undefined>(

297+

(latest, checkpoint) =>

298+

!latest || checkpoint.createdAt > latest.createdAt ? checkpoint : latest,

299+

undefined,

268300

);

269301

}

270302271303

function buildCompactionCheckpointPreview(

272-

checkpoint: NonNullable<SessionEntry["compactionCheckpoints"]>[number] | undefined,

304+

checkpoint: SessionCompactionCheckpointEntry | undefined,

273305

): GatewaySessionRow["latestCompactionCheckpoint"] {

274306

if (!checkpoint) {

275307

return undefined;

@@ -1772,8 +1804,12 @@ export function buildGatewaySessionRow(params: {

17721804

params.storeChildSessionsByKey.get(key),

17731805

)

17741806

: resolveChildSessionKeys(key, store, now, rowContext?.subagentRuns);

1807+

const compactionCheckpoints = resolveProjectableCompactionCheckpoints(entry);

1808+

const compactionCheckpointCount = Array.isArray(entry?.compactionCheckpoints)

1809+

? compactionCheckpoints.length

1810+

: undefined;

17751811

const latestCompactionCheckpoint = buildCompactionCheckpointPreview(

1776-

resolveLatestCompactionCheckpoint(entry),

1812+

resolveLatestCompactionCheckpoint(compactionCheckpoints),

17771813

);

17781814

const selectedOrRuntimeModelProvider = selectedModel?.provider ?? modelProvider;

17791815

const selectedOrRuntimeModel = selectedModel?.model ?? model;

@@ -1907,7 +1943,7 @@ export function buildGatewaySessionRow(params: {

19071943

lastTo: deliveryFields.lastTo ?? entry?.lastTo,

19081944

lastAccountId: deliveryFields.lastAccountId ?? entry?.lastAccountId,

19091945

lastThreadId: deliveryFields.lastThreadId ?? entry?.lastThreadId,

1910-

compactionCheckpointCount: entry?.compactionCheckpoints?.length,

1946+

compactionCheckpointCount,

19111947

latestCompactionCheckpoint,

19121948

pluginExtensions: pluginExtensions.length > 0 ? pluginExtensions : undefined,

19131949

};