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

推荐订阅源

J
Java Code Geeks
博客园 - 司徒正美
博客园 - 【当耐特】
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
宝玉的分享
宝玉的分享
V
V2EX
S
SegmentFault 最新的问题
V
Visual Studio Blog
阮一峰的网络日志
阮一峰的网络日志
Martin Fowler
Martin Fowler
Jina AI
Jina AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
L
LangChain Blog
D
Docker
腾讯CDC

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): bound config.get tool results · openclaw/op...
vincentkoc · 2026-06-18 · via Recent Commits to openclaw:main

@@ -27,20 +27,25 @@ import {

2727

import { scheduleGatewaySigusr1Restart } from "../../infra/restart.js";

2828

import { createSubsystemLogger } from "../../logging/subsystem.js";

2929

import { collectEnabledInsecureOrDangerousFlags } from "../../security/dangerous-config-flags.js";

30+

import { parseConfigPathArrayIndex } from "../../shared/path-array-index.js";

3031

import { optionalNonNegativeIntegerSchema, stringEnum } from "../schema/typebox.js";

3132

import {

3233

type AnyAgentTool,

3334

jsonResult,

3435

readNonNegativeIntegerParam,

3536

readStringArrayParam,

3637

readStringParam,

38+

textResult,

39+

ToolInputError,

3740

} from "./common.js";

3841

import { gatewayCallOptionSchemaProperties } from "./gateway-schema.js";

3942

import { callGatewayTool, readGatewayCallOptions } from "./gateway.js";

40434144

const log = createSubsystemLogger("gateway-tool");

42454346

const DEFAULT_UPDATE_TIMEOUT_MS = 20 * 60_000;

47+

// Keep complete JSON below the smallest default tool-result presentation budget.

48+

const MAX_GATEWAY_CONFIG_GET_TEXT_CHARS = 12_000;

4449

const CONFIG_SCHEMA_PATH_NOT_FOUND_MESSAGE = "config schema path not found";

4550

// Per SECURITY.md the model/agent itself is not a trusted principal.

4651

// `assertGatewayConfigMutationAllowed` is the explicit model -> operator

@@ -111,6 +116,66 @@ function getSnapshotConfig(snapshot: unknown): Record<string, unknown> {

111116

return config as Record<string, unknown>;

112117

}

113118119+

function splitGatewayConfigGetPath(path: string): string[] {

120+

return path

121+

.trim()

122+

.replace(/\[(\d+)\]/g, ".$1")

123+

.split(".")

124+

.filter(Boolean);

125+

}

126+127+

function resolveGatewayConfigGetPath(config: Record<string, unknown>, path: string): unknown {

128+

const parts = splitGatewayConfigGetPath(path);

129+

if (parts.length === 0) {

130+

return undefined;

131+

}

132+

let current: unknown = config;

133+

for (const part of parts) {

134+

if (!current || typeof current !== "object") {

135+

return undefined;

136+

}

137+

if (Array.isArray(current)) {

138+

const index = parseConfigPathArrayIndex(part);

139+

if (index === undefined || index >= current.length) {

140+

return undefined;

141+

}

142+

current = current[index];

143+

continue;

144+

}

145+

if (!Object.hasOwn(current, part)) {

146+

return undefined;

147+

}

148+

current = (current as Record<string, unknown>)[part];

149+

}

150+

return current;

151+

}

152+153+

function selectGatewayConfigGetResult(snapshot: unknown, path: string | undefined): unknown {

154+

if (!path) {

155+

return snapshot;

156+

}

157+

const value = resolveGatewayConfigGetPath(getSnapshotConfig(snapshot), path);

158+

if (value === undefined) {

159+

throw new ToolInputError(`config path not found: ${path}`);

160+

}

161+

const hash = readStringValue((snapshot as { hash?: unknown }).hash);

162+

return {

163+

...(hash ? { hash } : {}),

164+

path,

165+

config: value,

166+

};

167+

}

168+169+

function createGatewayConfigGetToolResult(result: unknown) {

170+

const text = JSON.stringify({ ok: true, result }, null, 2);

171+

if (text.length > MAX_GATEWAY_CONFIG_GET_TEXT_CHARS) {

172+

throw new ToolInputError(

173+

"config.get response is too large; use path to request a narrower config subtree",

174+

);

175+

}

176+

return textResult(text, { ok: true });

177+

}

178+114179

// Direct RPC callers need the validated config echoed after writes; the

115180

// agent-facing gateway tool does not, and replaying it bloats transcripts.

116181

function stripConfigWriteResultPayload(result: unknown): unknown {

@@ -367,7 +432,7 @@ const GatewayToolSchema = Type.Object({

367432

continuationMessage: Type.Optional(Type.String()),

368433

// config.get, config.schema.lookup, config.apply, update.run

369434

...gatewayCallOptionSchemaProperties(),

370-

// config.schema.lookup

435+

// config.get, config.schema.lookup

371436

path: Type.Optional(Type.String()),

372437

// config.apply, config.patch

373438

raw: Type.Optional(Type.String()),

@@ -498,8 +563,10 @@ export function createGatewayTool(opts?: {

498563

};

499564500565

if (action === "config.get") {

501-

const result = await callGatewayTool("config.get", gatewayOpts, {});

502-

return jsonResult({ ok: true, result });

566+

const path = readStringParam(params, "path");

567+

const snapshot = await callGatewayTool("config.get", gatewayOpts, {});

568+

const result = selectGatewayConfigGetResult(snapshot, path);

569+

return createGatewayConfigGetToolResult(result);

503570

}

504571

if (action === "config.schema.lookup") {

505572

const path = readStringParam(params, "path", {