Skip to content

Commit 27b665a

Browse files
authored
Fix type (#1242)
* 完善所有用到的type对象,并添加中文注释 * 补充遗失的type * 修复claude-for-chrome-mcp中的type和interface类型缺失 * 完善注释
1 parent ea399f1 commit 27b665a

14 files changed

Lines changed: 193 additions & 59 deletions

File tree

packages/@ant/claude-for-chrome-mcp/src/bridgeClient.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { SocketConnectionError } from './mcpSocketClient.js'
99
import {
1010
localPlatformLabel,
1111
type BridgePermissionRequest,
12+
toLoggerDetail,
1213
type ChromeExtensionInfo,
1314
type ClaudeForChromeContext,
1415
type PermissionMode,
@@ -578,7 +579,7 @@ export class BridgeClient implements SocketClient {
578579
const durationMs = Date.now() - this.connectionStartTime
579580
logger.error(
580581
`[${serverName}] Failed to create WebSocket after ${durationMs}ms:`,
581-
error,
582+
toLoggerDetail(error),
582583
)
583584
trackEvent?.('chrome_bridge_connection_failed', {
584585
duration_ms: durationMs,
@@ -618,7 +619,10 @@ export class BridgeClient implements SocketClient {
618619
)
619620
this.handleMessage(message)
620621
} catch (error) {
621-
logger.error(`[${serverName}] Failed to parse bridge message:`, error)
622+
logger.error(
623+
`[${serverName}] Failed to parse bridge message:`,
624+
toLoggerDetail(error),
625+
)
622626
}
623627
})
624628

@@ -862,7 +866,10 @@ export class BridgeClient implements SocketClient {
862866
const allowed = await pending.onPermissionRequest(request)
863867
this.sendPermissionResponse(requestId, allowed)
864868
} catch (error) {
865-
logger.error(`[${serverName}] Error handling permission request:`, error)
869+
logger.error(
870+
`[${serverName}] Error handling permission request:`,
871+
toLoggerDetail(error),
872+
)
866873
this.sendPermissionResponse(requestId, false)
867874
}
868875
}

packages/@ant/claude-for-chrome-mcp/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ export { localPlatformLabel } from './types.js'
88
export type {
99
BridgeConfig,
1010
ChromeExtensionInfo,
11+
ChromeBridgeTrackEventMetadata,
1112
ClaudeForChromeContext,
1213
Logger,
14+
LoggerDetail,
1315
PermissionMode,
1416
SocketClient,
1517
} from './types.js'
18+
export { toLoggerDetail } from './types.js'

packages/@ant/claude-for-chrome-mcp/src/mcpSocketClient.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import type {
99
PermissionMode,
1010
PermissionOverrides,
1111
} from './types.js'
12+
import { toLoggerDetail } from './types.js'
1213

1314
export class SocketConnectionError extends Error {
1415
constructor(message: string) {
@@ -87,7 +88,10 @@ class McpSocketClient {
8788
await this.validateSocketSecurity(socketPath)
8889
} catch (error) {
8990
this.connecting = false
90-
logger.info(`[${serverName}] Security validation failed:`, error)
91+
logger.info(
92+
`[${serverName}] Security validation failed:`,
93+
toLoggerDetail(error),
94+
)
9195
// Don't retry on security failures (wrong perms/owner) - those won't
9296
// self-resolve. Only the error handler retries on transient errors.
9397
return
@@ -145,14 +149,20 @@ class McpSocketClient {
145149
logger.info(`[${serverName}] Received unknown message: ${message}`)
146150
}
147151
} catch (error) {
148-
logger.info(`[${serverName}] Failed to parse message:`, error)
152+
logger.info(
153+
`[${serverName}] Failed to parse message:`,
154+
toLoggerDetail(error),
155+
)
149156
}
150157
}
151158
})
152159

153160
this.socket.on('error', (error: Error & { code?: string }) => {
154161
clearTimeout(connectTimeout)
155-
logger.info(`[${serverName}] Socket error (code: ${error.code}):`, error)
162+
logger.info(
163+
`[${serverName}] Socket error (code: ${error.code}):`,
164+
toLoggerDetail(error),
165+
)
156166
this.connected = false
157167
this.connecting = false
158168

packages/@ant/claude-for-chrome-mcp/src/toolCalls.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {
77
PermissionOverrides,
88
SocketClient,
99
} from './types.js'
10+
import { toLoggerDetail } from './types.js'
1011

1112
export const handleToolCall = async (
1213
context: ClaudeForChromeContext,
@@ -44,7 +45,10 @@ export const handleToolCall = async (
4445

4546
return handleToolCallDisconnected(context)
4647
} catch (error) {
47-
context.logger.info(`[${context.serverName}] Error calling tool:`, error)
48+
context.logger.info(
49+
`[${context.serverName}] Error calling tool:`,
50+
toLoggerDetail(error),
51+
)
4852

4953
if (error instanceof SocketConnectionError) {
5054
return handleToolCallDisconnected(context)
@@ -165,8 +169,7 @@ async function handleToolCallConnected(
165169

166170
// Fallback for unexpected result format
167171
context.logger.warn(
168-
`[${context.serverName}] Unexpected result format from socket bridge`,
169-
response,
172+
`[${context.serverName}] Unexpected result format from socket bridge: ${JSON.stringify(response)}`,
170173
)
171174

172175
return {

packages/@ant/claude-for-chrome-mcp/src/types.ts

Lines changed: 82 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,84 @@
1+
/**
2+
* Logger 第二参数的可选类型。
3+
* 调用方通过 util.format 追加详情,实践中多为 catch 到的异常对象。
4+
*/
5+
export type LoggerDetail = Error | NodeJS.ErrnoException
6+
7+
/** 将 unknown 收窄为 LoggerDetail,供 catch 块传给 logger 使用。 */
8+
export function toLoggerDetail(detail: unknown): LoggerDetail | undefined {
9+
return detail instanceof Error ? detail : undefined
10+
}
11+
12+
/** 宿主注入的日志接口,与 DebugLogger(util.format)对齐。 */
113
export interface Logger {
2-
info: (message: string, ...args: unknown[]) => void
3-
error: (message: string, ...args: unknown[]) => void
4-
warn: (message: string, ...args: unknown[]) => void
5-
debug: (message: string, ...args: unknown[]) => void
6-
silly: (message: string, ...args: unknown[]) => void
14+
info: (message: string, detail?: LoggerDetail) => void // 信息
15+
error: (message: string, detail?: LoggerDetail) => void // 错误
16+
warn: (message: string, detail?: LoggerDetail) => void // 警告
17+
debug: (message: string, detail?: LoggerDetail) => void // 调试
18+
silly: (message: string, detail?: LoggerDetail) => void // 最细粒度调试
19+
}
20+
21+
/**
22+
* Bridge 连接失败时的 error_type 枚举。
23+
* 由 bridgeClient 在 getUserId / getOAuthToken / WebSocket 创建失败时上报。
24+
*/
25+
export type ChromeBridgeConnectionErrorType =
26+
| 'no_user_id' // 无法获取用户 UUID
27+
| 'no_oauth_token' // 无法获取 OAuth token
28+
| 'websocket_error' // WebSocket 创建或运行异常
29+
30+
/** 工具调用相关遥测元数据(started / completed / timeout / error)。 */
31+
export type ChromeBridgeToolCallMetadata = {
32+
tool_name: string // MCP 工具名
33+
tool_use_id: string // 本次调用的 UUID
34+
duration_ms?: number // 耗时(毫秒)
35+
timeout_ms?: number // 超时阈值(毫秒),仅 timeout 事件
36+
error_message?: string // 错误摘要(截断),仅 error 事件
37+
}
38+
39+
/** Bridge 连接失败遥测元数据。 */
40+
export type ChromeBridgeConnectionFailedMetadata = {
41+
duration_ms: number // 自连接开始到失败的耗时(毫秒)
42+
error_type: ChromeBridgeConnectionErrorType // 失败原因分类
43+
reconnect_attempt: number // 当前重连尝试次数
744
}
845

46+
/** Bridge 开始连接遥测元数据。 */
47+
export type ChromeBridgeConnectionStartedMetadata = {
48+
bridge_url: string // 目标 WebSocket URL(含用户路径)
49+
}
50+
51+
/** Bridge 断开连接遥测元数据。 */
52+
export type ChromeBridgeDisconnectedMetadata = {
53+
close_code: number // WebSocket 关闭码
54+
duration_since_connect_ms: number // 自连接成功到断开的时长(毫秒)
55+
reconnect_attempt: number // 即将进行的重连序号
56+
}
57+
58+
/** Bridge 连接成功遥测元数据。 */
59+
export type ChromeBridgeConnectionSucceededMetadata = {
60+
duration_ms: number // 自开始到连接就绪的耗时(毫秒)
61+
status: 'paired' | 'waiting' // paired=已配对扩展;waiting=等待扩展接入
62+
}
63+
64+
/** Bridge 重连次数耗尽遥测元数据。 */
65+
export type ChromeBridgeReconnectExhaustedMetadata = {
66+
total_attempts: number // 累计重连次数上限
67+
}
68+
69+
/**
70+
* trackEvent 回调的 metadata 联合类型。
71+
* 各变体对应 bridgeClient 内 chrome_bridge_* 事件;null 表示无附加字段。
72+
*/
73+
export type ChromeBridgeTrackEventMetadata =
74+
| ChromeBridgeToolCallMetadata
75+
| ChromeBridgeConnectionFailedMetadata
76+
| ChromeBridgeConnectionStartedMetadata
77+
| ChromeBridgeDisconnectedMetadata
78+
| ChromeBridgeConnectionSucceededMetadata
79+
| ChromeBridgeReconnectExhaustedMetadata
80+
| null // 无元数据(如 peer_connected / peer_disconnected)
81+
982
export type PermissionMode =
1083
| 'ask'
1184
| 'skip_all_permission_checks'
@@ -48,10 +121,10 @@ export interface ClaudeForChromeContext {
48121
bridgeConfig?: BridgeConfig
49122
/** If set, permission mode is sent to the extension immediately on bridge connection. */
50123
initialPermissionMode?: PermissionMode
51-
/** Optional callback to track telemetry events for bridge connections */
52-
trackEvent?: <K extends string>(
53-
eventName: K,
54-
metadata: Record<string, unknown> | null,
124+
/** Bridge 遥测回调;eventName 为 chrome_bridge_* 事件名 */
125+
trackEvent?: (
126+
eventName: string, // 事件名
127+
metadata: ChromeBridgeTrackEventMetadata, // 事件元数据
55128
) => void
56129
/** Called when user pairs with an extension via the browser pairing flow. */
57130
onExtensionPaired?: (deviceId: string, name: string) => void

packages/@ant/computer-use-mcp/src/pixelCompare.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
*/
2121

2222
import type { ScreenshotResult } from './executor.js'
23-
import type { Logger } from './types.js'
23+
import { type Logger, toLoggerDetail } from './types.js'
2424

2525
/** Injected by the host. See `ComputerUseHostAdapter.cropRawPatch`. */
2626
export type CropRawPatchFn = (
@@ -165,7 +165,10 @@ export async function validateClickTarget(
165165
} catch (err) {
166166
// Skip validation on technical errors, execute action anyway.
167167
// Battle-tested: validation failure must never block the click.
168-
logger.debug('[pixelCompare] validation error, skipping', err)
168+
logger.debug(
169+
'[pixelCompare] validation error, skipping',
170+
toLoggerDetail(err),
171+
)
169172
return { valid: true, skipped: true }
170173
}
171174
}

packages/@ant/computer-use-mcp/src/toolCalls.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ import type {
9191
ResolvedAppRequest,
9292
TeachStepRequest,
9393
} from './types.js'
94+
import { toLoggerDetail } from './types.js'
9495

9596
/**
9697
* Finder is never hidden by the hide loop (hiding Finder kills the Desktop),
@@ -4446,7 +4447,10 @@ export async function handleToolCall(
44464447
// For ungated tools, the executor may have been mid-call; that's fine —
44474448
// the result is still a tool error, never an implicit success.
44484449
const msg = err instanceof Error ? err.message : String(err)
4449-
logger.error(`[${serverName}] tool=${name} threw: ${msg}`, err)
4450+
logger.error(
4451+
`[${serverName}] tool=${name} threw: ${msg}`,
4452+
toLoggerDetail(err),
4453+
)
44504454
return errorResult(`Tool "${name}" failed: ${msg}`, 'executor_threw')
44514455
}
44524456
}

packages/@ant/computer-use-mcp/src/types.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,24 @@ import type {
88
* cross-respawn `scaleCoord` survival. */
99
export type ScreenshotDims = Omit<ScreenshotResult, 'base64'>
1010

11-
/** Shape mirrors claude-for-chrome-mcp/src/types.ts:1-7 */
11+
/**
12+
* Logger 第二参数的可选类型(与 claude-for-chrome-mcp 对齐)。
13+
* 实践中多为 catch 到的 Error。
14+
*/
15+
export type LoggerDetail = Error | NodeJS.ErrnoException
16+
17+
/** 将 unknown 收窄为 LoggerDetail,供 catch 块传给 logger 使用。 */
18+
export function toLoggerDetail(detail: unknown): LoggerDetail | undefined {
19+
return detail instanceof Error ? detail : undefined
20+
}
21+
22+
/** 宿主注入的日志接口(与 claude-for-chrome-mcp/src/types.ts 对齐)。 */
1223
export interface Logger {
13-
info: (message: string, ...args: unknown[]) => void
14-
error: (message: string, ...args: unknown[]) => void
15-
warn: (message: string, ...args: unknown[]) => void
16-
debug: (message: string, ...args: unknown[]) => void
17-
silly: (message: string, ...args: unknown[]) => void
24+
info: (message: string, detail?: LoggerDetail) => void // 信息
25+
error: (message: string, detail?: LoggerDetail) => void // 错误
26+
warn: (message: string, detail?: LoggerDetail) => void // 警告
27+
debug: (message: string, detail?: LoggerDetail) => void // 调试
28+
silly: (message: string, detail?: LoggerDetail) => void // 最细粒度调试
1829
}
1930

2031
/**

packages/@ant/ink/src/core/dom.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { EventHandlerProps } from './events/event-handlers.js'
12
import type { FocusManager } from './focus.js'
23
import { createLayoutNode } from './layout/engine.js'
34
import type { LayoutNode } from './layout/node.js'
@@ -45,10 +46,9 @@ export type DOMElement = {
4546
dirty: boolean
4647
// Set by the reconciler's hideInstance/unhideInstance; survives style updates.
4748
isHidden?: boolean
48-
// Event handlers set by the reconciler for the capture/bubble dispatcher.
49-
// Stored separately from attributes so handler identity changes don't
50-
// mark dirty and defeat the blit optimization.
51-
_eventHandlers?: Record<string, unknown>
49+
// 协调器写入的事件处理器(捕获/冒泡分发用)。
50+
// 与 attributes 分离,避免 handler 引用变化触发 dirty 破坏 blit 优化。
51+
_eventHandlers?: Partial<EventHandlerProps> // 见 event-handlers.ts EventHandlerProps
5252

5353
// Scroll state for overflow: 'scroll' boxes. scrollTop is the number of
5454
// rows the content is scrolled down by. scrollHeight/scrollViewportHeight

packages/@ant/ink/src/core/events/terminal-event.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ export class TerminalEvent extends Event {
101101
_prepareForTarget(_target: EventTarget): void {}
102102
}
103103

104+
import type { EventHandlerProps } from './event-handlers.js'
105+
106+
/** 终端事件系统的目标节点(DOM 树节点或根节点)。 */
104107
export type EventTarget = {
105-
parentNode: EventTarget | undefined
106-
_eventHandlers?: Record<string, unknown>
108+
parentNode: EventTarget | undefined // 父节点,根节点为 undefined
109+
_eventHandlers?: Partial<EventHandlerProps> // 事件处理器,与 dom.ts DOMElement 同构
107110
}

0 commit comments

Comments
 (0)