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

推荐订阅源

博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
Y
Y Combinator Blog
T
Tailwind CSS Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
SegmentFault 最新的问题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 【当耐特】
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
J
Java Code Geeks
美团技术团队
Google DeepMind News
Google DeepMind News
博客园_首页
Apple Machine Learning Research
Apple Machine Learning Research
T
The Blog of Author Tim Ferriss

Recent Commits to openclaw:main

fix(ui): hide thinking options for non-reasoning models (#85406) fix(ui): attach pasted data image text (#85392) · openclaw/openclaw@a03a8d9 fix(gateway): preserve OpenAI usage aliases in chat history (#85383) fix(browser): hint WSL portproxy CDP empty replies (#85379) fix(installer): persist portable Git on Windows fix(opencode-go): strip Kimi reasoning replay fields (#85377) · openclaw/openclaw@d22bcfc fix(build): normalize cache paths on Windows (#85437) · openclaw/openclaw@81d22c8 fix(update): detect nested macOS gateway ancestry (#85391) · openclaw/openclaw@adc6adc fix(docker): seed offline prune store in runtime stage · openclaw/openclaw@faf2a6c fix(ci): stabilize npm shrinkwrap metadata · openclaw/openclaw@21bedd3 fix(codex): route node exec through OpenClaw tools · openclaw/openclaw@5cc0dbc test(installer): track portable node root helper · openclaw/openclaw@9364b21 fix(ui): sync talk transcript translations fix(ui): localize talk transcript labels · openclaw/openclaw@8fc48af fix(release): stabilize config restart QA · openclaw/openclaw@cc91ff0 fix(installer): extract portable Node directly test(qa-lab): report scenario pack coverage · openclaw/openclaw@dcd98bf fix(plugins): drop stale tlon tool contract · openclaw/openclaw@d70dc4b fix(installer): prefer tar for portable Node extraction · openclaw/openclaw@a54a881 fix(codex): deliver native subagent completions feat: add context-engine host capability requirements (#84994) · openclaw/openclaw@cff5244 fix(release): keep shrinkwrap pinned to pnpm lock · openclaw/openclaw@9d24fde fix: surface plan updates as status notices · openclaw/openclaw@dc04503 test(google): narrow web search fake timers · openclaw/openclaw@fe7d13c fix(installer): extract portable Node with ZipFile · openclaw/openclaw@ffa6cd8 fix(gateway): defer provider auth prewarm after startup (#85369) · openclaw/openclaw@69255f8 fix(talk): stabilize realtime voice consults · openclaw/openclaw@683ad75 test(qa): tolerate slow gateway rpc startup · openclaw/openclaw@29118a0 chore(diagnostics): refresh plugin sdk baseline · openclaw/openclaw@ab684f5 fix(diagnostics): surface async queue drops fix(diagnostics): bound diagnostic buffers · openclaw/openclaw@bdcaac0 fix(installer): copy portable Node into place · openclaw/openclaw@c21ca88 fix(cli): recover replaced device approvals (#85342) · openclaw/openclaw@6ea907c test(release): align prerelease validation · openclaw/openclaw@0def3e2 fix(installer): install portable Node directory atomically · openclaw/openclaw@2890b1a fix(runtime-llm): avoid duplicate provider prefix in allowlist diagno… · openclaw/openclaw@937a756 fix(gateway): include openclaw bin in service PATH (#84475) · openclaw/openclaw@66d1d13 fix(gateway): handle concurrent launchd bootstrap restart race (#84722) · openclaw/openclaw@ba86716 feat: support pi and opencode autoreview engines · openclaw/openclaw@31a189d ci(package): gate acceptance on package integrity · openclaw/openclaw@5275929 ci(release): bypass pnpm for tsdown package build · openclaw/openclaw@fea89cd test(release): align prerelease validation baselines · openclaw/openclaw@04ebdc6 ci(release): harden docker package build · openclaw/openclaw@7b1fbe1 fix(codex): skip native web search transcript mirroring (#85346) · openclaw/openclaw@c3531fc fix(gateway): harden launchd reload handoff race recovery (#84641) · openclaw/openclaw@fc7a531 fix: honor per-model provider transport overrides (#80488) fix(skills): type watcher mock calls in dedupe regression tests · openclaw/openclaw@bb73f0a fix(skills): dedupe shared-directory watchers across agent workspaces… · openclaw/openclaw@3e94290 fix(skills): document watcher edge cases, add teardown/rebuild tests,… · openclaw/openclaw@19ff77e fix(infra): allow macos browser open over ssh env (#85340) · openclaw/openclaw@47d66fe fix(update): preserve package service state during cutover (#83026) · openclaw/openclaw@a15797a fix(gateway): broadcast agent-run error payloads (#85355) · openclaw/openclaw@07e61fc test(e2e): avoid synthetic channel config in plugin smoke fix(cli): suppress systemd hints for live gateway (#85336) · openclaw/openclaw@a00c583 fix(cli): honor agent for model auth logout (#85326) · openclaw/openclaw@fc47c1f fix(gateway): eager-load lifecycle runtime to survive in-place upgrad… · openclaw/openclaw@4a91385 fix(doctor): point codex asset warning at migrate plan (#85324) fix(update): harden managed handoff cwd (#83875) · openclaw/openclaw@1bafc23 docs(release): prepare 2026.5.21 notes ci(crabbox): harden docker hydration refactor(crabbox): parse provider list from binary help instead of ha… test(plugins): keep rpc source walk on source call gateway test(plugins): add kitchen sink rpc docker lane · openclaw/openclaw@6f6da5f test(plugins): run kitchen sink rpc lane without tsx test(qa-lab): add bus tool trace scenario · openclaw/openclaw@2b39613 fix(cron): classify network retry errors (#85344) fix(installer): bootstrap portable Windows Node · openclaw/openclaw@3551e98 fix(ui): move chat session search into picker (#85303) · openclaw/openclaw@1fdc73a fix: honor shrinkwrap when bundling plugin deps fix: opt codex out of bundled runtime deps · openclaw/openclaw@fcecbd8 fix: include plugin shrinkwraps in dependency reports · openclaw/openclaw@82f69a2 fix: make bundled plugin packages portable test: update shrinkwrap packaging expectations · openclaw/openclaw@a1b05aa fix: publish explicit plugin bundled dependencies · openclaw/openclaw@976da39 chore: refresh shrinkwrap for Testbox npm · openclaw/openclaw@b2dc449 fix: cover plugin package locks in dependency review · openclaw/openclaw@bfa5b39 fix: opt acpx out of bundled runtime deps · openclaw/openclaw@9914e25 chore: refresh shrinkwrap metadata chore: harden npm shrinkwrap release path fix: keep bundled plugin peers nested · openclaw/openclaw@86faf65 chore: add shrinkwrap to plugin npm packages · openclaw/openclaw@b6c8807 feat: bundle plugin npm dependencies · openclaw/openclaw@de022bb fix: honor overrides in npm shrinkwrap generation · openclaw/openclaw@0d28040 test: refresh shrinkwrap after rebase · openclaw/openclaw@8b0537c fix: limit subagent bootstrap defaults · openclaw/openclaw@56308a7 feat: update autoreview engine coverage · openclaw/openclaw@ab1fedb fix(messages): strip unsupported citation markers (#85204) (thanks @n… · openclaw/openclaw@0a95e53 test(qa-lab): report live transport coverage lanes · openclaw/openclaw@fda0baf fix(gateway): close child ACP sessions on parent reset/delete · openclaw/openclaw@136c927 fix: preserve Google Gemini 3 cron thinking (#85300) docs(skills): exclude SDK boundary bug sweeps · openclaw/openclaw@85e468d feat(plugin-sdk): add generic channel poll sender (#85299) · openclaw/openclaw@c9a0f03 fix(agents): preserve OpenAI reasoning token usage · openclaw/openclaw@0ddf51c test(e2e): harden plugin smoke cleanup fix(plugins): resolve native plugin sdk aliases (#85298) · openclaw/openclaw@6b1c868 fix(update): keep service logs out of json output · openclaw/openclaw@03f61cd fix(agent): retry transient gateway handshake closes · openclaw/openclaw@ff79299 fix(codex): keep interrupted turns visible-answer eligible (#84494) · openclaw/openclaw@8523e09 test(agents): narrow bundle mcp e2e setup · openclaw/openclaw@6bd430e test: add mocked Control UI E2E tests and playwright for local verifi…
feat(ios): add realtime talk relay mode · openclaw/openclaw@e730e9b
Solvely-Coli · 2026-05-23 · via Recent Commits to openclaw:main

@@ -20,6 +20,47 @@ import UIKit

2020

@MainActor

2121

@Observable

2222

final class GatewayConnectionController {

23+

struct ManualAuthOverride: Equatable {

24+

let token: String?

25+

let bootstrapToken: String?

26+

let password: String?

27+28+

static func explicit(

29+

token: String?,

30+

bootstrapToken: String?,

31+

password: String?) -> ManualAuthOverride

32+

{

33+

let trimmedToken = token?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""

34+

let trimmedBootstrapToken = bootstrapToken?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""

35+

let trimmedPassword = password?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""

36+

return ManualAuthOverride(

37+

token: trimmedToken.isEmpty ? nil : trimmedToken,

38+

bootstrapToken: trimmedBootstrapToken.isEmpty ? nil : trimmedBootstrapToken,

39+

password: trimmedPassword.isEmpty ? nil : trimmedPassword)

40+

}

41+42+

static func normalized(

43+

token: String?,

44+

bootstrapToken: String?,

45+

password: String?) -> ManualAuthOverride?

46+

{

47+

let override = ManualAuthOverride.explicit(

48+

token: token,

49+

bootstrapToken: bootstrapToken,

50+

password: password)

51+

guard override.token != nil || override.bootstrapToken != nil || override.password != nil

52+

else { return nil }

53+

return override

54+

}

55+

}

56+57+

private struct PendingTrustConnect {

58+

let url: URL

59+

let stableID: String

60+

let isManual: Bool

61+

let authOverride: ManualAuthOverride?

62+

}

63+2364

struct TrustPrompt: Identifiable, Equatable {

2465

let stableID: String

2566

let gatewayName: String

@@ -42,7 +83,7 @@ final class GatewayConnectionController {

4283

private weak var appModel: NodeAppModel?

4384

private var didAutoConnect = false

4485

private var pendingServiceResolvers: [String: GatewayServiceResolver] = [:]

45-

private var pendingTrustConnect: (url: URL, stableID: String, isManual: Bool)?

86+

private var pendingTrustConnect: PendingTrustConnect?

46874788

init(appModel: NodeAppModel, startDiscovery: Bool = true) {

4889

self.appModel = appModel

@@ -125,7 +166,11 @@ final class GatewayConnectionController {

125166

guard let fp = await self.probeTLSFingerprint(url: url) else {

126167

return "Failed to read TLS fingerprint from discovered gateway."

127168

}

128-

self.pendingTrustConnect = (url: url, stableID: stableID, isManual: false)

169+

self.pendingTrustConnect = PendingTrustConnect(

170+

url: url,

171+

stableID: stableID,

172+

isManual: false,

173+

authOverride: nil)

129174

self.pendingTrustPrompt = TrustPrompt(

130175

stableID: stableID,

131176

gatewayName: gateway.name,

@@ -162,12 +207,23 @@ final class GatewayConnectionController {

162207

_ = await self.connectWithDiagnostics(gateway)

163208

}

164209165-

func connectManual(host: String, port: Int, useTLS: Bool) async {

166-

let instanceId = UserDefaults.standard.string(forKey: "node.instanceId")?

167-

.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""

168-

let token = GatewaySettingsStore.loadGatewayToken(instanceId: instanceId)

169-

let bootstrapToken = GatewaySettingsStore.loadGatewayBootstrapToken(instanceId: instanceId)

170-

let password = GatewaySettingsStore.loadGatewayPassword(instanceId: instanceId)

210+

func connectManual(

211+

host: String,

212+

port: Int,

213+

useTLS: Bool,

214+

authOverride: ManualAuthOverride? = nil) async

215+

{

216+

let instanceId = GatewaySettingsStore.currentInstanceID()

217+

let token =

218+

authOverride.map(\.token) ?? GatewaySettingsStore.loadGatewayToken(instanceId: instanceId)

219+

let bootstrapToken =

220+

authOverride.map(\.bootstrapToken) ?? GatewaySettingsStore.loadGatewayBootstrapToken(instanceId: instanceId)

221+

let password =

222+

authOverride.map(\.password) ?? GatewaySettingsStore.loadGatewayPassword(instanceId: instanceId)

223+

let pendingAuthOverride = authOverride ?? ManualAuthOverride.normalized(

224+

token: token,

225+

bootstrapToken: bootstrapToken,

226+

password: password)

171227

let resolvedUseTLS = self.resolveManualUseTLS(host: host, useTLS: useTLS)

172228

guard let resolvedPort = self.resolveManualPort(host: host, port: port, useTLS: resolvedUseTLS)

173229

else { return }

@@ -181,7 +237,11 @@ final class GatewayConnectionController {

181237

+ "Remote gateways must use HTTPS/WSS."

182238

return

183239

}

184-

self.pendingTrustConnect = (url: url, stableID: stableID, isManual: true)

240+

self.pendingTrustConnect = PendingTrustConnect(

241+

url: url,

242+

stableID: stableID,

243+

isManual: true,

244+

authOverride: pendingAuthOverride)

185245

self.pendingTrustPrompt = TrustPrompt(

186246

stableID: stableID,

187247

gatewayName: "\(host):\(resolvedPort)",

@@ -269,11 +329,14 @@ final class GatewayConnectionController {

269329

GatewaySettingsStore.saveLastGatewayConnectionDiscovered(stableID: pending.stableID, useTLS: true)

270330

}

271331272-

let instanceId = UserDefaults.standard.string(forKey: "node.instanceId")?

273-

.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""

274-

let token = GatewaySettingsStore.loadGatewayToken(instanceId: instanceId)

275-

let bootstrapToken = GatewaySettingsStore.loadGatewayBootstrapToken(instanceId: instanceId)

276-

let password = GatewaySettingsStore.loadGatewayPassword(instanceId: instanceId)

332+

let instanceId = GatewaySettingsStore.currentInstanceID()

333+

let token =

334+

pending.authOverride.map(\.token) ?? GatewaySettingsStore.loadGatewayToken(instanceId: instanceId)

335+

let bootstrapToken =

336+

pending.authOverride.map(\.bootstrapToken) ?? GatewaySettingsStore.loadGatewayBootstrapToken(

337+

instanceId: instanceId)

338+

let password =

339+

pending.authOverride.map(\.password) ?? GatewaySettingsStore.loadGatewayPassword(instanceId: instanceId)

277340

let tlsParams = GatewayTLSParams(

278341

required: true,

279342

expectedFingerprint: prompt.fingerprintSha256,