style: 完成所有文件的lint

This commit is contained in:
claude-code-best
2026-05-01 21:39:30 +08:00
parent d136872cc9
commit 6182015005
1333 changed files with 68255 additions and 77882 deletions

View File

@@ -225,7 +225,9 @@ export function createBridgeApiClient(deps: BridgeApiDeps): BridgeApiClient {
)
handleErrorStatus(response.status, response.data, 'Poll')
rcLog(`poll response: status=${response.status} hasData=${!!response.data} url=${deps.baseUrl}`)
rcLog(
`poll response: status=${response.status} hasData=${!!response.data} url=${deps.baseUrl}`,
)
// Empty body or null = no work available
if (!response.data) {

View File

@@ -447,9 +447,11 @@ export async function runBridgeLoop(
): (status: SessionDoneStatus) => void {
return (rawStatus: SessionDoneStatus): void => {
const workId = sessionWorkIds.get(sessionId)
rcLog(`session done: sessionId=${sessionId} workId=${workId ?? 'none'} status=${rawStatus}` +
` wasTimedOut=${timedOutSessions.has(sessionId)} duration=${Math.round((Date.now() - startTime) / 1000)}s` +
` stderr=${handle.lastStderr.length > 0 ? handle.lastStderr.join('\\n').slice(0, 500) : '(none)'}`)
rcLog(
`session done: sessionId=${sessionId} workId=${workId ?? 'none'} status=${rawStatus}` +
` wasTimedOut=${timedOutSessions.has(sessionId)} duration=${Math.round((Date.now() - startTime) / 1000)}s` +
` stderr=${handle.lastStderr.length > 0 ? handle.lastStderr.join('\\n').slice(0, 500) : '(none)'}`,
)
activeSessions.delete(sessionId)
sessionStartTimes.delete(sessionId)
sessionWorkIds.delete(sessionId)
@@ -608,7 +610,9 @@ export async function runBridgeLoop(
const pollConfig = getPollIntervalConfig()
try {
rcLog(`poll: envId=${environmentId} activeSessions=${activeSessions.size}`)
rcLog(
`poll: envId=${environmentId} activeSessions=${activeSessions.size}`,
)
const work = await api.pollForWork(
environmentId,
environmentSecret,
@@ -863,7 +867,9 @@ export async function runBridgeLoop(
break
case 'session': {
const sessionId = work.data.id
rcLog(`work received: type=session sessionId=${sessionId} workId=${work.id}`)
rcLog(
`work received: type=session sessionId=${sessionId} workId=${work.id}`,
)
try {
validateBridgeId(sessionId, 'session_id')
} catch {
@@ -1031,9 +1037,9 @@ export async function runBridgeLoop(
rcLog(
`spawning session: sessionId=${sessionId} sdkUrl=${sdkUrl}` +
` useCcrV2=${useCcrV2} workerEpoch=${workerEpoch}` +
` dir=${sessionDir}` +
` accessToken=${secret.session_ingress_token ? secret.session_ingress_token.slice(0, 8) + '...' : 'NONE'}`,
` useCcrV2=${useCcrV2} workerEpoch=${workerEpoch}` +
` dir=${sessionDir}` +
` accessToken=${secret.session_ingress_token ? secret.session_ingress_token.slice(0, 8) + '...' : 'NONE'}`,
)
const spawnResult = safeSpawn(
spawner,
@@ -1280,8 +1286,8 @@ export async function runBridgeLoop(
const errMsg = describeAxiosError(err)
rcLog(
`poll error: ${errMsg}` +
` isConn=${isConnectionError(err)} isServer=${isServerError(err)}` +
` activeSessions=${activeSessions.size}`,
` isConn=${isConnectionError(err)} isServer=${isServerError(err)}` +
` activeSessions=${activeSessions.size}`,
)
if (isConnectionError(err) || isServerError(err)) {

View File

@@ -116,7 +116,8 @@ export function isEligibleBridgeMessage(m: Message): boolean {
export function extractTitleText(m: Message): string | undefined {
if (m.type !== 'user' || m.isMeta || m.toolUseResult || m.isCompactSummary)
return undefined
if (m.origin && (m.origin as { kind?: string }).kind !== 'human') return undefined
if (m.origin && (m.origin as { kind?: string }).kind !== 'human')
return undefined
const content = m.message!.content
let raw: string | undefined
if (typeof content === 'string') {
@@ -135,8 +136,7 @@ export function extractTitleText(m: Message): string | undefined {
}
const SYSTEM_REMINDER_TAG = 'system-reminder'
const XML_BLOCK_PATTERN =
/\s*<([a-z][\w-]*)(?:\s[^>]*)?>[\s\S]*?<\/\1>\s*/gy
const XML_BLOCK_PATTERN = /\s*<([a-z][\w-]*)(?:\s[^>]*)?>[\s\S]*?<\/\1>\s*/gy
const RUNNING_STATE_META_TAGS = new Set([
BASH_INPUT_TAG,
CHANNEL_MESSAGE_TAG,
@@ -357,7 +357,13 @@ export function handleServerControlRequest(
// Outbound-only: reply error for mutable requests so claude.ai doesn't show
// false success. initialize must still succeed (server kills the connection
// if it doesn't — see comment above).
const req = request.request as { subtype: string; model?: string; max_thinking_tokens?: number | null; mode?: string; [key: string]: unknown }
const req = request.request as {
subtype: string
model?: string
max_thinking_tokens?: number | null
mode?: string
[key: string]: unknown
}
if (outboundOnly && req.subtype !== 'initialize') {
response = {
type: 'control_response',
@@ -480,8 +486,8 @@ export function handleServerControlRequest(
void transport.write(event)
rcLog(
`control_response: subtype=${req.subtype}` +
` request_id=${request.request_id}` +
` result=${(response.response as { subtype?: string }).subtype}`,
` request_id=${request.request_id}` +
` result=${(response.response as { subtype?: string }).subtype}`,
)
logForDebugging(
`[bridge:repl] Sent control_response for ${req.subtype} request_id=${request.request_id} result=${(response.response as { subtype?: string }).subtype}`,

View File

@@ -24,7 +24,9 @@ export function extractInboundMessageFields(
| { content: string | Array<ContentBlockParam>; uuid: UUID | undefined }
| undefined {
if (msg.type !== 'user') return undefined
const content = (msg.message as { content?: string | Array<ContentBlockParam> } | undefined)?.content
const content = (
msg.message as { content?: string | Array<ContentBlockParam> } | undefined
)?.content
if (!content) return undefined
if (Array.isArray(content) && content.length === 0) return undefined

View File

@@ -290,7 +290,9 @@ export async function initReplBridge(
isSyntheticMessage(msg)
)
continue
const rawContent = getContentText(msg.message!.content as string | ContentBlockParam[])
const rawContent = getContentText(
msg.message!.content as string | ContentBlockParam[],
)
if (!rawContent) continue
const derived = deriveTitle(rawContent)
if (!derived) continue

View File

@@ -20,7 +20,10 @@ export function rcLog(msg: string): void {
try {
if (!headerWritten) {
ensureLogDir()
appendFileSync(LOG_PATH, `\n===== RC-DEBUG session ${new Date().toISOString()} =====\n`)
appendFileSync(
LOG_PATH,
`\n===== RC-DEBUG session ${new Date().toISOString()} =====\n`,
)
headerWritten = true
}
const ts = new Date().toISOString().slice(11, 23) // HH:mm:ss.SSS

View File

@@ -850,7 +850,10 @@ export async function initEnvLessBridgeCore(
for (const msg of filtered) {
if (msg.uuid) recentPostedUUIDs.add(msg.uuid as string)
}
const events = filtered.map(m => ({ ...m, session_id: sessionId })) as StdoutMessage[]
const events = filtered.map(m => ({
...m,
session_id: sessionId,
})) as StdoutMessage[]
void transport.writeBatch(events)
},
sendControlRequest(request: SDKControlRequest) {
@@ -860,8 +863,14 @@ export async function initEnvLessBridgeCore(
)
return
}
const event: TransportMessage = { ...request, session_id: sessionId } as TransportMessage
if ((request as { request?: { subtype?: string } }).request?.subtype === 'can_use_tool') {
const event: TransportMessage = {
...request,
session_id: sessionId,
} as TransportMessage
if (
(request as { request?: { subtype?: string } }).request?.subtype ===
'can_use_tool'
) {
transport.reportState('requires_action')
}
void transport.write(event as StdoutMessage)
@@ -876,7 +885,10 @@ export async function initEnvLessBridgeCore(
)
return
}
const event: TransportMessage = { ...response, session_id: sessionId } as TransportMessage
const event: TransportMessage = {
...response,
session_id: sessionId,
} as TransportMessage
transport.reportState('running')
void transport.write(event as StdoutMessage)
logForDebugging('[remote-bridge] Sent control_response')

View File

@@ -454,7 +454,6 @@ export async function initBridgeCore(
// re-created after a connection loss.
let currentSessionId: string
if (reusedPriorSession && prior) {
currentSessionId = prior.sessionId
logForDebugging(
@@ -645,9 +644,9 @@ export async function initBridgeCore(
environmentRecreations++
rcLog(
`doReconnect: attempt=${environmentRecreations}/${MAX_ENVIRONMENT_RECREATIONS}` +
` envId=${environmentId}` +
` sessionId=${currentSessionId}` +
` workId=${currentWorkId}`,
` envId=${environmentId}` +
` sessionId=${currentSessionId}` +
` workId=${currentWorkId}`,
)
// Invalidate any in-flight v2 handshake — the environment is being
// recreated, so a stale transport arriving post-reconnect would be
@@ -859,7 +858,6 @@ export async function initBridgeCore(
// UUIDs are scoped per-session on the server, so re-flushing is safe.
previouslyFlushedUUIDs?.clear()
// Reset the counter so independent reconnections hours apart don't
// exhaust the limit — it guards against rapid consecutive failures,
// not lifetime total.
@@ -920,8 +918,8 @@ export async function initBridgeCore(
function handleTransportPermanentClose(closeCode: number | undefined): void {
rcLog(
`handleTransportPermanentClose: code=${closeCode}` +
` transport=${transport ? 'exists' : 'null'}` +
` pollAborted=${pollController.signal.aborted}`,
` transport=${transport ? 'exists' : 'null'}` +
` pollAborted=${pollController.signal.aborted}`,
)
logForDebugging(
`[bridge:repl] Transport permanently closed: code=${closeCode}`,
@@ -1316,7 +1314,9 @@ export async function initBridgeCore(
session_id: currentSessionId,
})) as TransportMessage[]
const dropsBefore = newTransport.droppedBatchCount
void newTransport.writeBatch(events as StdoutMessage[]).then(() => {
void newTransport
.writeBatch(events as StdoutMessage[])
.then(() => {
// If any batch was dropped during this flush (SI down for
// maxConsecutiveFailures attempts), flush() still resolved
// normally but the events were NOT delivered. Don't mark
@@ -1370,10 +1370,10 @@ export async function initBridgeCore(
const parsed = JSON.parse(data)
rcLog(
`ingress: type=${parsed.type}` +
`${parsed.type === 'control_request' ? ` subtype=${(parsed.request as Record<string, unknown>)?.subtype} request_id=${parsed.request_id}` : ''}` +
`${parsed.type === 'control_response' ? ` subtype=${(parsed.response as Record<string, unknown>)?.subtype} request_id=${(parsed.response as Record<string, unknown>)?.request_id}` : ''}` +
`${parsed.type === 'user' ? ` uuid=${parsed.uuid}` : ''}` +
`${parsed.type === 'keep_alive' ? '' : ` len=${data.length}`}`,
`${parsed.type === 'control_request' ? ` subtype=${(parsed.request as Record<string, unknown>)?.subtype} request_id=${parsed.request_id}` : ''}` +
`${parsed.type === 'control_response' ? ` subtype=${(parsed.response as Record<string, unknown>)?.subtype} request_id=${(parsed.response as Record<string, unknown>)?.request_id}` : ''}` +
`${parsed.type === 'user' ? ` uuid=${parsed.uuid}` : ''}` +
`${parsed.type === 'keep_alive' ? '' : ` len=${data.length}`}`,
)
} catch {
rcLog(`ingress (non-JSON): ${String(data).slice(0, 200)}`)
@@ -1400,9 +1400,9 @@ export async function initBridgeCore(
if (transport !== newTransport) return
rcLog(
`transport onClose: code=${closeCode}` +
` connected=${newTransport.isConnectedStatus()}` +
` state=${newTransport.getStateLabel()}` +
` seq=${newTransport.getLastSequenceNum()}`,
` connected=${newTransport.isConnectedStatus()}` +
` state=${newTransport.getStateLabel()}` +
` seq=${newTransport.getLastSequenceNum()}`,
)
handleTransportPermanentClose(closeCode)
})
@@ -1831,7 +1831,10 @@ export async function initBridgeCore(
for (const msg of filtered) {
if (msg.uuid) recentPostedUUIDs.add(msg.uuid as string)
}
const events: TransportMessage[] = filtered.map(m => ({ ...m, session_id: currentSessionId })) as TransportMessage[]
const events: TransportMessage[] = filtered.map(m => ({
...m,
session_id: currentSessionId,
})) as TransportMessage[]
void transport.writeBatch(events as StdoutMessage[])
},
sendControlRequest(request: SDKControlRequest) {
@@ -1841,7 +1844,10 @@ export async function initBridgeCore(
)
return
}
const event: TransportMessage = { ...request, session_id: currentSessionId } as TransportMessage
const event: TransportMessage = {
...request,
session_id: currentSessionId,
} as TransportMessage
void transport.write(event as StdoutMessage)
logForDebugging(
`[bridge:repl] Sent control_request request_id=${request.request_id}`,
@@ -1854,7 +1860,10 @@ export async function initBridgeCore(
)
return
}
const event: TransportMessage = { ...response, session_id: currentSessionId } as TransportMessage
const event: TransportMessage = {
...response,
session_id: currentSessionId,
} as TransportMessage
void transport.write(event as StdoutMessage)
logForDebugging('[bridge:repl] Sent control_response')
},

View File

@@ -11,21 +11,44 @@
/** Patterns that match known secret/token formats. */
const SECRET_PATTERNS: Array<{ pattern: RegExp; replacement: string }> = [
// GitHub tokens (PAT, OAuth, App, Server-to-server)
{ pattern: /\b(ghp|gho|ghs|ghu|github_pat)_[A-Za-z0-9_]{10,}\b/g, replacement: '[REDACTED_GITHUB_TOKEN]' },
{
pattern: /\b(ghp|gho|ghs|ghu|github_pat)_[A-Za-z0-9_]{10,}\b/g,
replacement: '[REDACTED_GITHUB_TOKEN]',
},
// Anthropic API keys
{ pattern: /\bsk-ant-[A-Za-z0-9_-]{10,}\b/g, replacement: '[REDACTED_ANTHROPIC_KEY]' },
{
pattern: /\bsk-ant-[A-Za-z0-9_-]{10,}\b/g,
replacement: '[REDACTED_ANTHROPIC_KEY]',
},
// Generic Bearer tokens in headers
{ pattern: /(Bearer\s+)[A-Za-z0-9._\-/+=]{20,}/gi, replacement: '$1[REDACTED_TOKEN]' },
{
pattern: /(Bearer\s+)[A-Za-z0-9._\-/+=]{20,}/gi,
replacement: '$1[REDACTED_TOKEN]',
},
// AWS access keys
{ pattern: /\b(AKIA|ASIA)[A-Z0-9]{16}\b/g, replacement: '[REDACTED_AWS_KEY]' },
{
pattern: /\b(AKIA|ASIA)[A-Z0-9]{16}\b/g,
replacement: '[REDACTED_AWS_KEY]',
},
// AWS secret keys (40-char base64-like strings after common labels)
{ pattern: /(aws_secret_access_key|secret_key|SecretAccessKey)['":\s=]+[A-Za-z0-9/+=]{30,}/gi, replacement: '$1=[REDACTED_AWS_SECRET]' },
{
pattern:
/(aws_secret_access_key|secret_key|SecretAccessKey)['":\s=]+[A-Za-z0-9/+=]{30,}/gi,
replacement: '$1=[REDACTED_AWS_SECRET]',
},
// Generic API key patterns (key=value or "key": "value")
{ pattern: /(api[_-]?key|apikey|secret|password|token|credential)['":\s=]+["']?[A-Za-z0-9._\-/+=]{16,}["']?/gi, replacement: '$1=[REDACTED]' },
{
pattern:
/(api[_-]?key|apikey|secret|password|token|credential)['":\s=]+["']?[A-Za-z0-9._\-/+=]{16,}["']?/gi,
replacement: '$1=[REDACTED]',
},
// npm tokens
{ pattern: /\bnpm_[A-Za-z0-9]{36}\b/g, replacement: '[REDACTED_NPM_TOKEN]' },
// Slack tokens
{ pattern: /\bxox[bporas]-[A-Za-z0-9-]{10,}\b/g, replacement: '[REDACTED_SLACK_TOKEN]' },
{
pattern: /\bxox[bporas]-[A-Za-z0-9-]{10,}\b/g,
replacement: '[REDACTED_SLACK_TOKEN]',
},
]
/** Maximum content length before truncation (100KB). */