diff --git a/src/bridge/remoteBridgeCore.ts b/src/bridge/remoteBridgeCore.ts index 5550d26..dcd8ab0 100644 --- a/src/bridge/remoteBridgeCore.ts +++ b/src/bridge/remoteBridgeCore.ts @@ -181,7 +181,7 @@ export async function initEnvLessBridgeCore( return null } const sessionId: string = createdSessionId - logForDebugging(`[remote-bridge] Created session ${sessionId}`) + logForDebugging('[remote-bridge] Created remote bridge session') logForDiagnosticsNoPII('info', 'bridge_repl_v2_session_created') // ── 2. Fetch bridge credentials (POST /bridge → worker_jwt, expires_in, api_base_url) ── @@ -214,7 +214,7 @@ export async function initEnvLessBridgeCore( // ── 3. Build v2 transport (SSETransport + CCRClient) ──────────────────── const sessionUrl = buildCCRv2SdkUrl(credentials.api_base_url, sessionId) - logForDebugging(`[remote-bridge] v2 session URL: ${sessionUrl}`) + logForDebugging('[remote-bridge] Configured v2 session transport endpoint') let transport: ReplBridgeTransport try { diff --git a/src/bridge/replBridge.ts b/src/bridge/replBridge.ts index 2f66074..311de89 100644 --- a/src/bridge/replBridge.ts +++ b/src/bridge/replBridge.ts @@ -1365,7 +1365,7 @@ export async function initBridgeCore( const sessionUrl = buildCCRv2SdkUrl(baseUrl, workSessionId) const thisGen = v2Generation logForDebugging( - `[bridge:repl] CCR v2: sessionUrl=${sessionUrl} session=${workSessionId} gen=${thisGen}`, + `[bridge:repl] CCR v2: creating transport for session=${workSessionId} gen=${thisGen}`, ) void createV2ReplTransport({ sessionUrl, @@ -1435,7 +1435,7 @@ export async function initBridgeCore( // secret. refreshHeaders picks up the latest OAuth token on each // WS reconnect attempt. const wsUrl = buildSdkUrl(sessionIngressUrl, workSessionId) - logForDebugging(`[bridge:repl] Ingress URL: ${wsUrl}`) + logForDebugging('[bridge:repl] Using session ingress WebSocket endpoint') logForDebugging( `[bridge:repl] Creating HybridTransport: session=${workSessionId}`, ) diff --git a/src/remote/SessionsWebSocket.ts b/src/remote/SessionsWebSocket.ts index c083ce8..c84cbfc 100644 --- a/src/remote/SessionsWebSocket.ts +++ b/src/remote/SessionsWebSocket.ts @@ -108,7 +108,9 @@ export class SessionsWebSocket { const baseUrl = getOauthConfig().BASE_API_URL.replace('https://', 'wss://') const url = `${baseUrl}/v1/sessions/ws/${this.sessionId}/subscribe?organization_uuid=${this.orgUuid}` - logForDebugging(`[SessionsWebSocket] Connecting to ${url}`) + logForDebugging( + '[SessionsWebSocket] Connecting to session subscription endpoint', + ) // Get fresh token for each connection attempt const accessToken = this.getAccessToken() diff --git a/src/services/api/sessionIngress.ts b/src/services/api/sessionIngress.ts index c49b0d4..365b7a2 100644 --- a/src/services/api/sessionIngress.ts +++ b/src/services/api/sessionIngress.ts @@ -19,6 +19,25 @@ interface SessionIngressError { } } +function summarizeSessionIngressPayload(payload: unknown): string { + if (payload === null) return 'null' + if (payload === undefined) return 'undefined' + if (Array.isArray(payload)) return `array(${payload.length})` + if (typeof payload === 'object') { + const value = payload as Record + return jsonStringify({ + payloadType: 'object', + keys: Object.keys(value) + .sort() + .slice(0, 10), + loglinesCount: Array.isArray(value.loglines) ? value.loglines.length : 0, + dataCount: Array.isArray(value.data) ? value.data.length : 0, + hasNextCursor: typeof value.next_cursor === 'string', + }) + } + return typeof payload +} + // Module-level state const lastUuidMap: Map = new Map() @@ -249,7 +268,7 @@ export async function getSessionLogsViaOAuth( orgUUID: string, ): Promise { const url = `${getOauthConfig().BASE_API_URL}/v1/session_ingress/session/${sessionId}` - logForDebugging(`[session-ingress] Fetching session logs from: ${url}`) + logForDebugging('[session-ingress] Fetching session logs via OAuth endpoint') const headers = { ...getOAuthHeaders(accessToken), 'x-organization-uuid': orgUUID, @@ -299,7 +318,7 @@ export async function getTeleportEvents( 'x-organization-uuid': orgUUID, } - logForDebugging(`[teleport] Fetching events from: ${baseUrl}`) + logForDebugging('[teleport] Fetching session events via teleport endpoint') const all: Entry[] = [] let cursor: string | undefined @@ -362,7 +381,9 @@ export async function getTeleportEvents( if (response.status !== 200) { logError( new Error( - `Teleport events returned ${response.status}: ${jsonStringify(response.data)}`, + `Teleport events returned ${response.status}: ${summarizeSessionIngressPayload( + response.data, + )}`, ), ) logForDiagnosticsNoPII('error', 'teleport_events_bad_status') @@ -373,7 +394,9 @@ export async function getTeleportEvents( if (!Array.isArray(data)) { logError( new Error( - `Teleport events invalid response shape: ${jsonStringify(response.data)}`, + `Teleport events invalid response shape: ${summarizeSessionIngressPayload( + response.data, + )}`, ), ) logForDiagnosticsNoPII('error', 'teleport_events_invalid_shape') @@ -439,7 +462,9 @@ async function fetchSessionLogsFromUrl( if (!data || typeof data !== 'object' || !Array.isArray(data.loglines)) { logError( new Error( - `Invalid session logs response format: ${jsonStringify(data)}`, + `Invalid session logs response format: ${summarizeSessionIngressPayload( + data, + )}`, ), ) logForDiagnosticsNoPII('error', 'session_get_fail_invalid_response') diff --git a/src/utils/deepLink/protocolHandler.ts b/src/utils/deepLink/protocolHandler.ts index c6f6aab..eb0036c 100644 --- a/src/utils/deepLink/protocolHandler.ts +++ b/src/utils/deepLink/protocolHandler.ts @@ -17,12 +17,19 @@ import { filterExistingPaths, getKnownPathsForRepo, } from '../githubRepoPathMapping.js' -import { jsonStringify } from '../slowOperations.js' import { readLastFetchTime } from './banner.js' import { parseDeepLink } from './parseDeepLink.js' import { MACOS_BUNDLE_ID } from './registerProtocol.js' import { launchInTerminal } from './terminalLauncher.js' +function summarizeDeepLinkAction(action: { + query?: string + cwd?: string + repo?: string +}): string { + return `hasQuery=${Boolean(action.query)} hasCwd=${Boolean(action.cwd)} hasRepo=${Boolean(action.repo)}` +} + /** * Handle an incoming deep link URI. * @@ -34,7 +41,7 @@ import { launchInTerminal } from './terminalLauncher.js' * @returns exit code (0 = success) */ export async function handleDeepLinkUri(uri: string): Promise { - logForDebugging(`Handling deep link URI: ${uri}`) + logForDebugging('Handling deep link URI') let action try { @@ -46,7 +53,7 @@ export async function handleDeepLinkUri(uri: string): Promise { return 1 } - logForDebugging(`Parsed deep link action: ${jsonStringify(action)}`) + logForDebugging(`Parsed deep link action (${summarizeDeepLinkAction(action)})`) // Always the running executable — no PATH lookup. The OS launched us via // an absolute path (bundle symlink / .desktop Exec= / registry command) @@ -125,11 +132,11 @@ async function resolveCwd(action: { const known = getKnownPathsForRepo(action.repo) const existing = await filterExistingPaths(known) if (existing[0]) { - logForDebugging(`Resolved repo ${action.repo} → ${existing[0]}`) + logForDebugging('Resolved repo deep link to local clone') return { cwd: existing[0], resolvedRepo: action.repo } } logForDebugging( - `No local clone found for repo ${action.repo}, falling back to home`, + 'No local clone found for repo deep link, falling back to home', ) } return { cwd: homedir() }