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

推荐订阅源

N
News and Events Feed by Topic
Malwarebytes
Malwarebytes
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cybersecurity and Infrastructure Security Agency CISA
F
Future of Privacy Forum
C
Cisco Blogs
T
The Exploit Database - CXSecurity.com
A
Arctic Wolf
S
Securelist
K
Kaspersky official blog
S
Schneier on Security
T
ThreatConnect
T
Tenable Blog
Spread Privacy
Spread Privacy
T
True Tiger Recordings
AWS News Blog
AWS News Blog
F
Fox-IT International blog
量子位
T
Threatpost
V
Vulnerabilities – Threatpost
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
GbyAI
GbyAI
宝玉的分享
宝玉的分享
腾讯CDC
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
U
Unit 42
雷峰网
雷峰网
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
O
OpenAI News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
The Register - Security
The Register - Security
MyScale Blog
MyScale Blog
小众软件
小众软件
A
About on SuperTechFans
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
博客园 - 三生石上(FineUI控件)
美团技术团队
Google Online Security Blog
Google Online Security Blog
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog

Recent Commits to openclaw:main

fix(test): make import timing scripts Windows-safe · openclaw/openclaw@8ae9977 fix(test): make max Vitest scripts Windows-safe · openclaw/openclaw@b681d5d fix(doctor): migrate Feishu account bot names (#86081) · openclaw/openclaw@9e8cc7e fix(scripts): prefilter conflict marker scans docs: add ClawSweeper review policy to AGENTS (#86197) · openclaw/openclaw@242e876 fix(installer): avoid before with npm release-age configs (#85491) · openclaw/openclaw@4742db6 fix(e2e): retry Windows kitchen sink probes · openclaw/openclaw@3e275a5 fix(installer): install node with apk on alpine fix(installer): detect musl linux shells · openclaw/openclaw@acfed37 perf(plugins,gateway): thread metadata snapshot + discovery through h… · openclaw/openclaw@8ccb11c fix(ui): split control ui runtime chunks · openclaw/openclaw@8bf4f7d refactor(config): extract GoogleChat schema into zod-schema.providers… · openclaw/openclaw@fe34141 fix(update): suppress internal handoff version warnings · openclaw/openclaw@6cc8244 test(e2e): select installable bundled plugins · openclaw/openclaw@0acc3e3 fix(scripts): harden Windows native opus install · openclaw/openclaw@43252c8 fix(agents): match runtime policy entries when session provider is em… fix(scripts): harden Windows generated formatting · openclaw/openclaw@0a98559 fix(mcp): bound tools/list during catalog discovery (#85063) · openclaw/openclaw@07f500a fix(test): focus plugin binding Docker smoke · openclaw/openclaw@dfa1a51 test(e2e): fail release memory indexing errors test(daemon): fail launchd integration bootstrap errors · openclaw/openclaw@af07769 feat(imessage): support thumb approval reactions (#85952) · openclaw/openclaw@5c7980f fix(crabbox): default macos aws runs on demand fix(scripts): preserve test passthrough args · openclaw/openclaw@e4332f7 fix(e2e): harden Windows plugin assertions fix(test): mount upgrade survivor helper · openclaw/openclaw@5f03154 fix(android): prevent stale chat during session switches fix(android): keep permission setup action visible · openclaw/openclaw@94bc18a style(android): sharpen voice mode surfaces · openclaw/openclaw@c452510 fix(android): hide internal chat content blocks · openclaw/openclaw@d86ed21 style(android): refine list surface spacing · openclaw/openclaw@955909c feat(android): add pair new gateway action · openclaw/openclaw@cc5eb97 Advance iMessage catchup cursor after live handling (#85475) · openclaw/openclaw@102555c fix(scripts): ignore forwarded arg separator · openclaw/openclaw@79ee70c fix(test): fail empty gateway startup samples · openclaw/openclaw@5a8ce6a fix(e2e): harden Windows kitchen sink assertions · openclaw/openclaw@87a2eba fix(e2e): harden Telegram credential paths on Windows · openclaw/openclaw@c643370 fix(android): align setup pairing scopes fix(android): complete qr setup operator handoff · openclaw/openclaw@be9bb77 fix(test): copy cleanup smoke prepare hook · openclaw/openclaw@dbc08f6 fix(secrets): allow hash in exec SecretRef ids (#86072) · openclaw/openclaw@675158c fix(media): use static image compression metadata · openclaw/openclaw@694d45e fix(release): verify large plugin npm packs fix(test): require kitchen sink diagnostic canaries · openclaw/openclaw@7e51f83 fix(scripts): harden Windows upgrade survivor recipe · openclaw/openclaw@483d7be fix(installer): count verify progress stage fix: Refine PR template for review state (#86054) fix(test): repair split agent shard runs · openclaw/openclaw@125d82c fix(codex): harden Windows protocol formatting · openclaw/openclaw@ce48e4c fix(openrouter): use endpoint context limits (#86041) · openclaw/openclaw@dd01a2e test(qa): remove brittle capability flip setup turn fix(telegram): migrate legacy cache sidecars · openclaw/openclaw@eb9b882 fix(telegram): migrate account topic cache sidecars · openclaw/openclaw@5cfb12f fix(scripts): harden Windows ZAI fallback repro · openclaw/openclaw@5be62e7 style(android): sharpen v2 screen rhythm · openclaw/openclaw@400d90a test(qa): extend capability flip setup budget · openclaw/openclaw@c91c3c6 fix(android): simplify gateway status copy fix(android): route offline voice to gateway setup fix(scripts): harden Windows control UI i18n commands · openclaw/openclaw@581c8a6 fix(android): stop operator chat subscription · openclaw/openclaw@5c15859 fix(test): fail missing kitchen sink rss samples test(qa): widen capability flip restart budget · openclaw/openclaw@c7d4e9e fix(android): smooth gateway pairing recovery · openclaw/openclaw@60e6ccd fix(test): suppress rolldown timing noise · openclaw/openclaw@6d9b388 style(android): fix talk mode ktlint formatting · openclaw/openclaw@01b284c fix(telegram): store topic cache in plugin state fix(telegram): store bot info cache in plugin state · openclaw/openclaw@2ed5296 fix(test): sync sparse AWS Crabbox runs from full checkout · openclaw/openclaw@0f82c81 fix(release): harden Windows cross-os command shims · openclaw/openclaw@7154767 fix(test): harden Docker resource ceilings test(telegram): keep startup limiter coverage focused test(telegram): isolate startup probe limiter timing · openclaw/openclaw@04d86e0 test(release): harden plugin prerelease checks · openclaw/openclaw@578e73f fix(telegram): serialize topic dispatch replies (#85709) · openclaw/openclaw@62b51a6 test(release): stabilize plugin prerelease checks · openclaw/openclaw@3679151 fix(test): fail live gateway false greens · openclaw/openclaw@295339d fix(test): build startup artifacts for smoke scripts · openclaw/openclaw@3838e45 test(telegram): wait for startup probe slots · openclaw/openclaw@0a8af67 test(codex): match sandbox exec-server yolo policy · openclaw/openclaw@783290f fix(test): fail missing explicit test targets · openclaw/openclaw@9ff4d36 test(codex): avoid full sandbox exec-server turn run · openclaw/openclaw@558c1bc fix(ci): keep Crabbox pnpm hydration shims writable · openclaw/openclaw@bca1ac0 fix(release): harden Windows release-check npm probes · openclaw/openclaw@75ac11a fix(docker): parse peer-suffixed lockfile packages · openclaw/openclaw@cf46f2e fix(docker): seed lockfile packages before prune · openclaw/openclaw@f799da0 fix(docker): seed lockfile snapshot tarballs before prune · openclaw/openclaw@2cd93f1 test(codex): type thread start mock params · openclaw/openclaw@a4ef3a2 test(codex): avoid full sandbox run in thread-start test · openclaw/openclaw@11bf642 fix(plugins): harden Windows npm package staging · openclaw/openclaw@abdd8a4 test(codex): complete sandbox turn inline · openclaw/openclaw@c14a0c6 fix(release): harden Windows npm shim verification · openclaw/openclaw@a56f452 test(release): type metadata snapshot mock params · openclaw/openclaw@f878959 test(release): finish plugin metadata prerelease sync fix(update): avoid broad tag fetches for dev updates (#84737) · openclaw/openclaw@501f2cb Fix iMessage slash command acknowledgements (#82642) · openclaw/openclaw@4d15020 test(release): align prerelease contracts · openclaw/openclaw@02f53e6 test(release): align plugin prerelease checks fix(docker): copy prepare hook before install · openclaw/openclaw@0ba6b23 fix: share signed thinking replay policy fix(memory): strip invalid thinking signatures for signed-thinking pr… · openclaw/openclaw@41329c0
fix(telegram): transient Telegram pairing prompts (#85555) · openclaw/openclaw@8209426
RomneyDa · 2026-05-25 · via Recent Commits to openclaw:main

@@ -1350,6 +1350,145 @@ describe("createTelegramBot", () => {

13501350

}

13511351

});

135213521353+

it("sends a friendly retry hint when the pairing allowlist store cannot be read", async () => {

1354+

loadConfig.mockReturnValue({

1355+

channels: { telegram: { dmPolicy: "pairing" } },

1356+

});

1357+

readChannelAllowFromStore.mockRejectedValueOnce(new Error("store temporarily unavailable"));

1358+

upsertChannelPairingRequest.mockClear();

1359+

sendMessageSpy.mockClear();

1360+

replySpy.mockClear();

1361+1362+

createTelegramBot({ token: "tok" });

1363+

const handler = getOnHandler("message") as (ctx: Record<string, unknown>) => Promise<void>;

1364+1365+

await handler({

1366+

message: {

1367+

chat: { id: 1234, type: "private" },

1368+

text: "hello",

1369+

message_id: 9,

1370+

date: 1736380800,

1371+

from: { id: 123456789, username: "testuser" },

1372+

},

1373+

me: { username: "openclaw_bot" },

1374+

getFile: async () => ({ download: async () => new Uint8Array() }),

1375+

});

1376+1377+

expect(upsertChannelPairingRequest).not.toHaveBeenCalled();

1378+

expect(replySpy).not.toHaveBeenCalled();

1379+

expect(sendMessageSpy).toHaveBeenCalledTimes(1);

1380+

expect(sendMessageSpy).toHaveBeenCalledWith(

1381+

1234,

1382+

"⚠️ Couldn't process this message, please try again in a moment.",

1383+

expect.objectContaining({

1384+

reply_parameters: expect.objectContaining({ message_id: 9 }),

1385+

}),

1386+

);

1387+

});

1388+1389+

it("keeps the same private chat usable after a transient pairing store read failure", async () => {

1390+

loadConfig.mockReturnValue({

1391+

channels: { telegram: { dmPolicy: "pairing" } },

1392+

});

1393+

readChannelAllowFromStore

1394+

.mockRejectedValueOnce(new Error("store temporarily unavailable"))

1395+

.mockResolvedValueOnce(["123456789"]);

1396+

upsertChannelPairingRequest.mockClear();

1397+

sendMessageSpy.mockClear();

1398+

replySpy.mockClear();

1399+1400+

createTelegramBot({ token: "tok" });

1401+

const handler = getOnHandler("message") as (ctx: Record<string, unknown>) => Promise<void>;

1402+1403+

const firstMessage = {

1404+

chat: { id: 1234, type: "private" },

1405+

text: "hello",

1406+

date: 1736380800,

1407+

message_id: 10,

1408+

from: { id: 123456789, username: "testuser" },

1409+

};

1410+

await handler({

1411+

message: firstMessage,

1412+

me: { username: "openclaw_bot" },

1413+

getFile: async () => ({ download: async () => new Uint8Array() }),

1414+

});

1415+

await handler({

1416+

message: {

1417+

...firstMessage,

1418+

text: "still there?",

1419+

date: 1736380801,

1420+

message_id: 11,

1421+

},

1422+

me: { username: "openclaw_bot" },

1423+

getFile: async () => ({ download: async () => new Uint8Array() }),

1424+

});

1425+1426+

expect(readChannelAllowFromStore).toHaveBeenCalledTimes(2);

1427+

expect(upsertChannelPairingRequest).not.toHaveBeenCalled();

1428+

// First message: failure → retry hint via sendMessageSpy. Second message: success → agent reply via replySpy.

1429+

expect(sendMessageSpy).toHaveBeenCalledTimes(1);

1430+

expect(sendMessageSpy.mock.calls[0]?.[1]).toMatch(/please try again/i);

1431+

expect(replySpy).toHaveBeenCalledTimes(1);

1432+

});

1433+1434+

it("allows a configured private sender when the pairing allowlist store cannot be read", async () => {

1435+

loadConfig.mockReturnValue({

1436+

channels: { telegram: { dmPolicy: "pairing", allowFrom: ["123456789"] } },

1437+

});

1438+

readChannelAllowFromStore.mockRejectedValueOnce(new Error("store temporarily unavailable"));

1439+

upsertChannelPairingRequest.mockClear();

1440+

sendMessageSpy.mockClear();

1441+

replySpy.mockClear();

1442+1443+

createTelegramBot({ token: "tok" });

1444+

const handler = getOnHandler("message") as (ctx: Record<string, unknown>) => Promise<void>;

1445+1446+

await handler({

1447+

message: {

1448+

chat: { id: 1234, type: "private" },

1449+

text: "hello",

1450+

date: 1736380800,

1451+

from: { id: 123456789, username: "testuser" },

1452+

},

1453+

me: { username: "openclaw_bot" },

1454+

getFile: async () => ({ download: async () => new Uint8Array() }),

1455+

});

1456+1457+

expect(readChannelAllowFromStore).not.toHaveBeenCalled();

1458+

expect(upsertChannelPairingRequest).not.toHaveBeenCalled();

1459+

expect(sendMessageSpy).not.toHaveBeenCalled();

1460+

expect(replySpy).toHaveBeenCalledTimes(1);

1461+

});

1462+1463+

it("does not require the pairing allowlist store for open private messages", async () => {

1464+

loadConfig.mockReturnValue({

1465+

channels: { telegram: { dmPolicy: "open", allowFrom: ["*"] } },

1466+

});

1467+

readChannelAllowFromStore.mockRejectedValueOnce(new Error("store temporarily unavailable"));

1468+

upsertChannelPairingRequest.mockClear();

1469+

sendMessageSpy.mockClear();

1470+

replySpy.mockClear();

1471+1472+

createTelegramBot({ token: "tok" });

1473+

const handler = getOnHandler("message") as (ctx: Record<string, unknown>) => Promise<void>;

1474+1475+

await handler({

1476+

message: {

1477+

chat: { id: 1234, type: "private" },

1478+

text: "hello",

1479+

date: 1736380800,

1480+

from: { id: 123456789, username: "testuser" },

1481+

},

1482+

me: { username: "openclaw_bot" },

1483+

getFile: async () => ({ download: async () => new Uint8Array() }),

1484+

});

1485+1486+

expect(readChannelAllowFromStore).not.toHaveBeenCalled();

1487+

expect(upsertChannelPairingRequest).not.toHaveBeenCalled();

1488+

expect(sendMessageSpy).not.toHaveBeenCalled();

1489+

expect(replySpy).toHaveBeenCalledTimes(1);

1490+

});

1491+13531492

it("ignores private self-authored message updates instead of issuing a pairing challenge", async () => {

13541493

loadConfig.mockReturnValue({

13551494

channels: { telegram: { dmPolicy: "pairing" } },