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

推荐订阅源

人人都是产品经理
人人都是产品经理
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
月光博客
月光博客
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
Microsoft Security Blog
Microsoft Security Blog
M
MIT News - Artificial intelligence
WordPress大学
WordPress大学
MongoDB | Blog
MongoDB | Blog
V
V2EX
博客园 - 【当耐特】
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
I
InfoQ
Martin Fowler
Martin Fowler
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hugging Face - Blog
Hugging Face - Blog
B
Blog
V
Visual Studio Blog
D
DataBreaches.Net
C
Check Point Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
F
Fortinet All Blogs

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
chore: apply extension lint cleanups · openclaw/openclaw@...
steipete · 2026-04-23 · via Recent Commits to openclaw:main

File tree

  • extensions

    • bluebubbles/src

    • codex/src/app-server

    • discord/src

      • voice

    • duckduckgo/src

    • feishu/src

    • line/src

    • matrix/src

    • mattermost/src/mattermost

    • memory-lancedb

    • nostr/src

    • qa-lab/web/src

    • qqbot/src/engine

      • commands

      • gateway

      • messaging

      • tools

      • utils

    • signal/src

    • slack/src/monitor

    • synology-chat/src

    • telegram/src

      • bot

    • tlon/src

      • monitor

      • urbit

    • voice-call/src

      • providers

    • whatsapp/src

      • auto-reply/monitor

      • inbound

Original file line numberDiff line numberDiff line change

@@ -178,7 +178,7 @@ async function queryBlueBubblesChats(params: {

178178

return [];

179179

}

180180

const payload = (await res.json().catch(() => null)) as Record<string, unknown> | null;

181-

const data = payload && typeof payload.data !== "undefined" ? (payload.data as unknown) : null;

181+

const data = payload && payload.data !== undefined ? (payload.data as unknown) : null;

182182

return Array.isArray(data) ? (data as BlueBubblesChatRecord[]) : [];

183183

}

184184
Original file line numberDiff line numberDiff line change

@@ -226,7 +226,7 @@ async function queryChats(params: {

226226

return [];

227227

}

228228

const payload = (await res.json().catch(() => null)) as Record<string, unknown> | null;

229-

const data = payload && typeof payload.data !== "undefined" ? (payload.data as unknown) : null;

229+

const data = payload && payload.data !== undefined ? (payload.data as unknown) : null;

230230

return Array.isArray(data) ? (data as BlueBubblesChatRecord[]) : [];

231231

}

232232
Original file line numberDiff line numberDiff line change

@@ -189,7 +189,7 @@ function readNativeCompactionCompletion(

189189
190190

function resolveCompactionWaitTimeoutMs(): number {

191191

const raw = process.env.OPENCLAW_CODEX_COMPACTION_WAIT_TIMEOUT_MS?.trim();

192-

const parsed = raw ? Number.parseInt(raw, 10) : NaN;

192+

const parsed = raw ? Number.parseInt(raw, 10) : Number.NaN;

193193

if (Number.isFinite(parsed) && parsed > 0) {

194194

return parsed;

195195

}

Original file line numberDiff line numberDiff line change

@@ -68,8 +68,8 @@ export async function getAudioDuration(filePath: string): Promise<number> {

6868

"csv=p=0",

6969

filePath,

7070

]);

71-

const duration = parseFloat(stdout.trim());

72-

if (isNaN(duration)) {

71+

const duration = Number.parseFloat(stdout.trim());

72+

if (Number.isNaN(duration)) {

7373

throw new Error("Could not parse duration");

7474

}

7575

return Math.round(duration * 100) / 100; // Round to 2 decimal places

Original file line numberDiff line numberDiff line change

@@ -2,8 +2,8 @@ import { formatErrorMessage } from "openclaw/plugin-sdk/ssrf-runtime";

22
33

const DECRYPT_FAILURE_WINDOW_MS = 30_000;

44

const DECRYPT_FAILURE_RECONNECT_THRESHOLD = 3;

5-

const DECRYPT_FAILURE_PATTERN = /DecryptionFailed\(/;

6-

const DAVE_PASSTHROUGH_DISABLED_PATTERN = /UnencryptedWhenPassthroughDisabled/;

5+

const DECRYPT_FAILURE_MARKER = "DecryptionFailed(";

6+

const DAVE_PASSTHROUGH_DISABLED_MARKER = "UnencryptedWhenPassthroughDisabled";

77
88

export const DAVE_RECEIVE_PASSTHROUGH_INITIAL_EXPIRY_SECONDS = 30;

99

export const DAVE_RECEIVE_PASSTHROUGH_REARM_EXPIRY_SECONDS = 15;

@@ -80,12 +80,12 @@ export function isAbortLikeReceiveError(err: unknown): boolean {

8080
8181

export function analyzeVoiceReceiveError(err: unknown): VoiceReceiveErrorAnalysis {

8282

const message = formatErrorMessage(err);

83-

const shouldAttemptPassthrough = DAVE_PASSTHROUGH_DISABLED_PATTERN.test(message);

83+

const shouldAttemptPassthrough = message.includes(DAVE_PASSTHROUGH_DISABLED_MARKER);

8484

return {

8585

message,

8686

isAbortLike: isAbortLikeReceiveError(err),

8787

shouldAttemptPassthrough,

88-

countsAsDecryptFailure: DECRYPT_FAILURE_PATTERN.test(message) || shouldAttemptPassthrough,

88+

countsAsDecryptFailure: message.includes(DECRYPT_FAILURE_MARKER) || shouldAttemptPassthrough,

8989

};

9090

}

9191
Original file line numberDiff line numberDiff line change

@@ -49,7 +49,7 @@ function decodeHtmlEntities(text: string): string {

4949

.replace(/&mdash;/g, "--")

5050

.replace(/&hellip;/g, "...")

5151

.replace(/&#(\d+);/g, (_, code) => String.fromCodePoint(Number(code)))

52-

.replace(/&#x([0-9a-f]+);/gi, (_, code) => String.fromCodePoint(parseInt(code, 16)));

52+

.replace(/&#x([0-9a-f]+);/gi, (_, code) => String.fromCodePoint(Number.parseInt(code, 16)));

5353

}

5454
5555

function stripHtml(html: string): string {

Original file line numberDiff line numberDiff line change

@@ -38,9 +38,7 @@ type FeishuMessageLike = {

3838
3939

export type GroupSessionScope = "group" | "group_sender" | "group_topic" | "group_topic_sender";

4040
41-

type FeishuLogger = {

42-

(...args: unknown[]): void;

43-

};

41+

type FeishuLogger = (...args: unknown[]) => void;

4442
4543

export type ResolvedFeishuGroupSession = {

4644

peerId: string;

@@ -215,7 +213,7 @@ export function parseMergeForwardContent(params: { content: string; log?: Feishu

215213
216214

log?.(`feishu: merge_forward contains ${subMessages.length} sub-messages`);

217215

subMessages.sort(

218-

(a, b) => parseInt(a.create_time || "0", 10) - parseInt(b.create_time || "0", 10),

216+

(a, b) => Number.parseInt(a.create_time || "0", 10) - Number.parseInt(b.create_time || "0", 10),

219217

);

220218
221219

const lines = ["[Merged and Forwarded Messages]"];

Original file line numberDiff line numberDiff line change

@@ -17,9 +17,7 @@ type FeishuContactUserGetResponse = Awaited<

1717

ReturnType<ReturnType<typeof createFeishuClient>["contact"]["user"]["get"]>

1818

>;

1919
20-

type FeishuLogger = {

21-

(...args: unknown[]): void;

22-

};

20+

type FeishuLogger = (...args: unknown[]) => void;

2321
2422

const IGNORED_PERMISSION_SCOPE_TOKENS = ["contact:contact.base:readonly"];

2523

const FEISHU_SCOPE_CORRECTIONS: Record<string, string> = {

Original file line numberDiff line numberDiff line change

@@ -409,7 +409,7 @@ export async function handleFeishuMessage(params: {

409409

// instead of the delivery/processing time. Feishu uses a millisecond

410410

// epoch string; fall back to Date.now() only when the field is absent.

411411

const messageCreateTimeMs = event.message.create_time

412-

? parseInt(event.message.create_time, 10)

412+

? Number.parseInt(event.message.create_time, 10)

413413

: Date.now();

414414
415415

let requireMention = false; // DMs never require mention; groups may override below

Original file line numberDiff line numberDiff line change

@@ -1,6 +1,6 @@

1-

import fs from "fs";

2-

import path from "path";

3-

import { Readable } from "stream";

1+

import fs from "node:fs";

2+

import path from "node:path";

3+

import { Readable } from "node:stream";

44

import type * as Lark from "@larksuiteoapi/node-sdk";

55

import { mediaKindFromMime } from "openclaw/plugin-sdk/media-runtime";

66

import { withTempDownloadPath } from "openclaw/plugin-sdk/temp-path";

@@ -627,22 +627,21 @@ export async function sendMediaFeishu(params: {

627627

if (routing.msgType === "image") {

628628

const { imageKey } = await uploadImageFeishu({ cfg, image: buffer, accountId });

629629

return sendImageFeishu({ cfg, to, imageKey, replyToMessageId, replyInThread, accountId });

630-

} else {

631-

const { fileKey } = await uploadFileFeishu({

632-

cfg,

633-

file: buffer,

634-

fileName: name,

635-

fileType: routing.fileType ?? "stream",

636-

accountId,

637-

});

638-

return sendFileFeishu({

639-

cfg,

640-

to,

641-

fileKey,

642-

msgType: routing.msgType,

643-

replyToMessageId,

644-

replyInThread,

645-

accountId,

646-

});

647630

}

631+

const { fileKey } = await uploadFileFeishu({

632+

cfg,

633+

file: buffer,

634+

fileName: name,

635+

fileType: routing.fileType ?? "stream",

636+

accountId,

637+

});

638+

return sendFileFeishu({

639+

cfg,

640+

to,

641+

fileKey,

642+

msgType: routing.msgType,

643+

replyToMessageId,

644+

replyInThread,

645+

accountId,

646+

});

648647

}