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

推荐订阅源

P
Proofpoint News Feed
WordPress大学
WordPress大学
Recent Commits to openclaw:main
Recent Commits to openclaw:main
N
News and Events Feed by Topic
K
Kaspersky official blog
I
InfoQ
H
Hackread – Cybersecurity News, Data Breaches, AI and More
E
Exploit-DB.com RSS Feed
博客园 - 聂微东
Recent Announcements
Recent Announcements
D
Docker
小众软件
小众软件
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
S
Security Archives - TechRepublic
C
Cybersecurity and Infrastructure Security Agency CISA
Know Your Adversary
Know Your Adversary
The Register - Security
The Register - Security
GbyAI
GbyAI
Application and Cybersecurity Blog
Application and Cybersecurity Blog
F
Full Disclosure
博客园 - Franky
V
Vulnerabilities – Threatpost
Simon Willison's Weblog
Simon Willison's Weblog
Google DeepMind News
Google DeepMind News
L
LINUX DO - 最新话题
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
A
Arctic Wolf
J
Java Code Geeks
T
Tenable Blog
H
Hacker News: Front Page
美团技术团队
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Palo Alto Networks Blog
Cisco Talos Blog
Cisco Talos Blog
B
Blog
有赞技术团队
有赞技术团队
罗磊的独立博客
Spread Privacy
Spread Privacy
L
LangChain Blog
N
News and Events Feed by Topic
F
Fox-IT International blog
Google Online Security Blog
Google Online Security Blog
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
S
Schneier on Security
量子位
Microsoft Security Blog
Microsoft Security Blog
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

Recent Commits to openclaw:main

fix(imessage): bound private api negative cache expiry refactor(matrix): move ephemeral state to plugin sqlite (#88387) fix(imessage): bound approval reaction poll expiry fix(agents): bound exec followup handoff expiry · openclaw/openclaw@cbad1b6 test(release): wait for live probe cleanup · openclaw/openclaw@0e7773d fix(agents): bound exec approval request expiry · openclaw/openclaw@d8e7734 fix(google): bound realtime browser session expiry · openclaw/openclaw@da7fb64 fix(msteams): bound delegated token expiry · openclaw/openclaw@3fffb34 fix(workboard): bound claim expiry checks · openclaw/openclaw@0dd67e2 fix(browser): bound armed dialog expiry · openclaw/openclaw@4df27b9 fix(commands): bound private approval route expiry · openclaw/openclaw@e708a87 fix(agents): hide sessions_send alias normalization · openclaw/openclaw@2dacc6d fix(plugin-state): bound ttl expiry writes · openclaw/openclaw@9660e42 fix(skills): bound upload expiry checks · openclaw/openclaw@522da25 fix(exec): bound approval pending expiry · openclaw/openclaw@d44621b test(release): skip unavailable anthropic live models fix(matrix): bound allowlist store cache expiry · openclaw/openclaw@283238f fix(discord): bound unbound webhook echo expiry · openclaw/openclaw@5568ecc fix(zalouser): bound group context cache expiry · openclaw/openclaw@743d537 fix(tui): distinguish /new and /reset descriptions · openclaw/openclaw@63a3676 fix(voice-call): bound realtime stream token expiry feat(ui): add collapsible recent sessions section · openclaw/openclaw@a2fc4ca refactor: route model catalog imports to core package · openclaw/openclaw@8eeaa45 fix(sessions): repair prompt blobs on fast updates · openclaw/openclaw@4d13055 fix(qqbot): bound upload cache expiry · openclaw/openclaw@bfceffa fix(gateway): bound exec approval expiry · openclaw/openclaw@031583e fix(scripts): prebuild gateway cpu private qa artifacts · openclaw/openclaw@2ccbc67 fix(agents): bound code mode snapshot expiry · openclaw/openclaw@11b5728 [Fix] Deliver restart recovery replies (#86089) fix(feishu): bound card action token expiry · openclaw/openclaw@ac0fb97 fix(ci): repair current test type fixtures · openclaw/openclaw@1de9f99 fix(nvidia): bound featured model cache expiry fix(bedrock): bound discovery cache expiry · openclaw/openclaw@e52b4bc fix(plugins): ignore helper files in extension roots fix(bedrock): bound mantle iam token expiry · openclaw/openclaw@5ba3505 perf(gateway): reuse stable turn metadata · openclaw/openclaw@18e7d28 fix(outbound): bound current conversation expiry · openclaw/openclaw@02ca283 fix(plugin-sdk): bound live catalog cache expiry · openclaw/openclaw@4f0e3cb fix(outbound): pack newline-mode paragraphs up to limit fix(gateway): bound run session miss cache expiry · openclaw/openclaw@b1911a7 fix(agents): bound native permission approval expiry · openclaw/openclaw@450642a fix(discord): avoid private test session intersection fix(agents): bound native hook relay expiry fix(gateway): bound transcription relay session expiry fix(codex): refresh stale managed runtime plugin · openclaw/openclaw@3c91928 fix(gateway): bound realtime relay session expiry · openclaw/openclaw@6ac7564 fix(feishu): bound sender name cache expiry · openclaw/openclaw@23e1aac fix(discord): bound realtime wake followup expiry · openclaw/openclaw@c65af78 fix(scripts): make kitchen sink rpc help inert · openclaw/openclaw@4155ac1 fix(qqbot): honor legacy c2c stream progress fix(discord): bound speaker context cache expiry fix(gateway): bound config schema cache expiry Add per-agent SQLite cache store (#88349) · openclaw/openclaw@fc50f94 fix(qqbot): deliver partial tool progress fix(tailscale): bound whois cache expiry · openclaw/openclaw@f491d42 fix(google): bound gemini oauth token expiry fix(google): bound vertex adc token cache expiry · openclaw/openclaw@697bafa fix(msteams): bound parent thread cache expiry fix(msteams): bound team id cache expiry fix(whatsapp): bound group metadata cache expiry · openclaw/openclaw@5eb7192 fix(scripts): parse forwarded package script options fix(feishu): bound approval card expiry fix(feishu): bound quick action launcher expiry · openclaw/openclaw@0563470 fix(gateway): guard traced channel handoff stops · openclaw/openclaw@536c009 fix(feishu): bound card action chat cache clocks · openclaw/openclaw@c94c43d feat(ios): refresh app store metadata (#88235) · openclaw/openclaw@8a99c0d refactor: extract model catalog core package · openclaw/openclaw@30e1556 fix(feishu): bound group name cache clocks · openclaw/openclaw@ec15f90 fix(feishu): bound probe cache expiry clocks fix(zalo): bound hosted media expiry clocks · openclaw/openclaw@f91ddef fix(deps): remove photon root runtime · openclaw/openclaw@8438589 fix(workboard): bound claim expiry timestamps · openclaw/openclaw@6c7642b fix(phone-control): bound arm expiry timestamps test: isolate channel manager teardown feat(workboard): persist orchestration metadata in sqlite · openclaw/openclaw@7086e34 fix(mattermost): bound slash validation cache clocks · openclaw/openclaw@20fbb8b fix(slack): bound subteam member cache clocks · openclaw/openclaw@8e90a1c fix(slack): bound external menu cache clocks · openclaw/openclaw@7e3ebb8 fix(telegram): bound forum flag cache clocks · openclaw/openclaw@06b2bf1 fix(active-memory): bound recall cache clocks refactor: share approval lookup state · openclaw/openclaw@5adc681 fix(scripts): stop parsing after option terminators · openclaw/openclaw@53e8dc6 test: clear channel manager restart timers · openclaw/openclaw@2d0a0c5 fix(slack): bound thread resolution cache clocks · openclaw/openclaw@b668ffe fix(slack): bound thread starter cache clocks · openclaw/openclaw@6736936 fix(slack): bound app mention retry clocks · openclaw/openclaw@8539e02 perf(sessions): skip prompt hydration for metadata reads · openclaw/openclaw@ef88f0f fix(slack): bound member cache clocks · openclaw/openclaw@816c692 build: update rastermill to 0.3.1 · openclaw/openclaw@c635e56 fix(scripts): honor memory fd option terminator · openclaw/openclaw@ccb59d9 test(sdk): resolve local package deps in pack smoke · openclaw/openclaw@642f85d refactor: share skills method validation · openclaw/openclaw@53300a5 fix(ci): serialize gateway server vitest project · openclaw/openclaw@b51610a fix(imessage): bound probe cache clocks · openclaw/openclaw@5269924 fix(imessage): bound chat list cache clocks · openclaw/openclaw@62fa569 fix(signal): bound api mode cache clocks · openclaw/openclaw@2d4369d fix(web): bound tool cache expiry clocks · openclaw/openclaw@99e8cf2 fix(agents): type configured fallback model metadata · openclaw/openclaw@e780a6b fix(docs): route anchor audit through pnpm runner · openclaw/openclaw@3135540 fix(mattermost): bound reaction cache clocks · openclaw/openclaw@77b334a
fix(sandbox): bound novnc observer token expiry · openclaw/openclaw@f4cd5e4
steipete · 2026-05-31 · via Recent Commits to openclaw:main

@@ -1,5 +1,8 @@

11

import crypto from "node:crypto";

2-

import { asSafeIntegerInRange } from "../../shared/number-coercion.js";

2+

import {

3+

isFutureDateTimestampMs,

4+

resolveExpiresAtMsFromDurationMs,

5+

} from "../../shared/number-coercion.js";

36

import { normalizeOptionalString } from "../../shared/string-coerce.js";

4758

export const NOVNC_PASSWORD_ENV_KEY = "OPENCLAW_BROWSER_NOVNC_PASSWORD"; // pragma: allowlist secret

@@ -23,12 +26,25 @@ const NO_VNC_OBSERVER_TOKENS = new Map<string, NoVncObserverTokenEntry>();

23262427

function pruneExpiredNoVncObserverTokens(now: number) {

2528

for (const [token, entry] of NO_VNC_OBSERVER_TOKENS) {

26-

if (entry.expiresAt <= now) {

29+

if (!isFutureDateTimestampMs(entry.expiresAt, { nowMs: now })) {

2730

NO_VNC_OBSERVER_TOKENS.delete(token);

2831

}

2932

}

3033

}

313435+

function resolveNoVncObserverTokenExpiresAt(params: { ttlMs?: number; nowMs: number }) {

36+

return (

37+

resolveExpiresAtMsFromDurationMs(params.ttlMs, {

38+

nowMs: params.nowMs,

39+

minRemainingMs: 1,

40+

}) ??

41+

resolveExpiresAtMsFromDurationMs(NOVNC_TOKEN_TTL_MS, {

42+

nowMs: params.nowMs,

43+

minRemainingMs: 1,

44+

})

45+

);

46+

}

47+3248

export function isNoVncEnabled(params: { enableNoVnc: boolean; headless: boolean }) {

3349

return params.enableNoVnc && !params.headless;

3450

}

@@ -66,13 +82,21 @@ export function issueNoVncObserverToken(params: {

6682

const now = params.nowMs ?? Date.now();

6783

pruneExpiredNoVncObserverTokens(now);

6884

const token = crypto.randomBytes(24).toString("hex");

69-

const ttlMs =

70-

asSafeIntegerInRange(params.ttlMs, { min: 1, max: MAX_NOVNC_TOKEN_TTL_MS }) ??

71-

NOVNC_TOKEN_TTL_MS;

85+

const requestedTtlMs =

86+

typeof params.ttlMs === "number" && params.ttlMs <= MAX_NOVNC_TOKEN_TTL_MS

87+

? params.ttlMs

88+

: undefined;

89+

const expiresAt = resolveNoVncObserverTokenExpiresAt({

90+

ttlMs: requestedTtlMs,

91+

nowMs: now,

92+

});

93+

if (expiresAt === undefined) {

94+

return token;

95+

}

7296

NO_VNC_OBSERVER_TOKENS.set(token, {

7397

noVncPort: params.noVncPort,

7498

password: normalizeOptionalString(params.password),

75-

expiresAt: now + ttlMs,

99+

expiresAt,

76100

});

77101

return token;

78102

}

@@ -92,7 +116,7 @@ export function consumeNoVncObserverToken(

92116

return null;

93117

}

94118

NO_VNC_OBSERVER_TOKENS.delete(normalized);

95-

if (entry.expiresAt <= now) {

119+

if (!isFutureDateTimestampMs(entry.expiresAt, { nowMs: now })) {

96120

return null;

97121

}

98122

return { noVncPort: entry.noVncPort, password: entry.password };