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

推荐订阅源

Vercel News
Vercel News
博客园 - 司徒正美
C
Check Point Blog
G
Google Developers Blog
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
P
Proofpoint News Feed
IT之家
IT之家
B
Blog
博客园_首页
量子位
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
J
Java Code Geeks
H
Help Net Security
A
About on SuperTechFans
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
D
DataBreaches.Net
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
云风的 BLOG
云风的 BLOG
Google DeepMind News
Google DeepMind News

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
refactor(gateway): reuse shared session change broadcaste...
vincentkoc · 2026-06-22 · via Recent Commits to openclaw:main

@@ -149,7 +149,6 @@ import {

149149

import { reactivateCompletedSubagentSession } from "../session-subagent-reactivation.js";

150150

import {

151151

canonicalizeSpawnedByForAgent,

152-

loadGatewaySessionRow,

153152

loadSessionEntry,

154153

migrateAndPruneGatewaySessionStoreKey,

155154

resolveGatewaySessionStoreTarget,

@@ -166,6 +165,7 @@ import {

166165

waitForTerminalGatewayDedupe,

167166

} from "./agent-wait-dedupe.js";

168167

import { normalizeRpcAttachmentsToChatAttachments } from "./attachment-normalize.js";

168+

import { emitSessionsChanged } from "./session-change-event.js";

169169

import type {

170170

GatewayRequestContext,

171171

GatewayRequestHandlerOptions,

@@ -571,92 +571,6 @@ function requestGroupMatchesTrusted(params: {

571571

return Boolean(params.trustedGroupId && requestGroupId === params.trustedGroupId);

572572

}

573573574-

function emitSessionsChanged(

575-

context: Pick<

576-

GatewayRequestHandlerOptions["context"],

577-

"broadcastToConnIds" | "getSessionEventSubscriberConnIds"

578-

>,

579-

payload: { sessionKey?: string; agentId?: string; reason: string },

580-

) {

581-

const connIds = context.getSessionEventSubscriberConnIds();

582-

if (connIds.size === 0) {

583-

return;

584-

}

585-

const sessionRow = payload.sessionKey

586-

? loadGatewaySessionRow(

587-

payload.sessionKey,

588-

payload.sessionKey === "global" && payload.agentId

589-

? { agentId: payload.agentId }

590-

: undefined,

591-

)

592-

: null;

593-

// Unscoped global updates must not leak one agent's goal into another agent's UI row.

594-

const omitUnscopedGlobalGoal = payload.sessionKey === "global" && !payload.agentId;

595-

context.broadcastToConnIds(

596-

"sessions.changed",

597-

{

598-

...payload,

599-

ts: Date.now(),

600-

...(sessionRow

601-

? {

602-

updatedAt: sessionRow.updatedAt ?? undefined,

603-

sessionId: sessionRow.sessionId,

604-

kind: sessionRow.kind,

605-

channel: sessionRow.channel,

606-

subject: sessionRow.subject,

607-

groupChannel: sessionRow.groupChannel,

608-

space: sessionRow.space,

609-

chatType: sessionRow.chatType,

610-

origin: sessionRow.origin,

611-

spawnedBy: sessionRow.spawnedBy,

612-

spawnedWorkspaceDir: sessionRow.spawnedWorkspaceDir,

613-

spawnedCwd: sessionRow.spawnedCwd,

614-

forkedFromParent: sessionRow.forkedFromParent,

615-

spawnDepth: sessionRow.spawnDepth,

616-

subagentRole: sessionRow.subagentRole,

617-

subagentControlScope: sessionRow.subagentControlScope,

618-

label: sessionRow.label,

619-

displayName: sessionRow.displayName,

620-

deliveryContext: sessionRow.deliveryContext,

621-

parentSessionKey: sessionRow.parentSessionKey,

622-

childSessions: sessionRow.childSessions,

623-

thinkingLevel: sessionRow.thinkingLevel,

624-

fastMode: sessionRow.fastMode,

625-

verboseLevel: sessionRow.verboseLevel,

626-

traceLevel: sessionRow.traceLevel,

627-

reasoningLevel: sessionRow.reasoningLevel,

628-

elevatedLevel: sessionRow.elevatedLevel,

629-

sendPolicy: sessionRow.sendPolicy,

630-

systemSent: sessionRow.systemSent,

631-

abortedLastRun: sessionRow.abortedLastRun,

632-

inputTokens: sessionRow.inputTokens,

633-

outputTokens: sessionRow.outputTokens,

634-

lastChannel: sessionRow.lastChannel,

635-

lastTo: sessionRow.lastTo,

636-

lastAccountId: sessionRow.lastAccountId,

637-

lastThreadId: sessionRow.lastThreadId,

638-

totalTokens: sessionRow.totalTokens,

639-

totalTokensFresh: sessionRow.totalTokensFresh,

640-

...(omitUnscopedGlobalGoal ? {} : { goal: sessionRow.goal ?? null }),

641-

contextTokens: sessionRow.contextTokens,

642-

estimatedCostUsd: sessionRow.estimatedCostUsd,

643-

responseUsage: sessionRow.responseUsage,

644-

modelProvider: sessionRow.modelProvider,

645-

model: sessionRow.model,

646-

status: sessionRow.status,

647-

startedAt: sessionRow.startedAt,

648-

endedAt: sessionRow.endedAt,

649-

runtimeMs: sessionRow.runtimeMs,

650-

compactionCheckpointCount: sessionRow.compactionCheckpointCount,

651-

latestCompactionCheckpoint: sessionRow.latestCompactionCheckpoint,

652-

}

653-

: {}),

654-

},

655-

connIds,

656-

{ dropIfSlow: true },

657-

);

658-

}

659-660574

type GatewayAgentTaskTerminalStatus = Extract<

661575

TaskStatus,

662576

"succeeded" | "failed" | "timed_out" | "cancelled"