{"record":{"id":"b6d6dd493a90bc9c","repo":"usebruno/bruno","slug":"invalid-scutil-proxy-output-format","errorCode":null,"errorMessage":"Invalid scutil --proxy output format","messagePattern":"Invalid scutil --proxy output format","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/bruno-requests/src/network/system-proxy/utils/macos.ts","lineNumber":32,"sourceCode":"      const { stdout } = await execFileAsync('scutil', ['--proxy'], execOpts);\n      return this.parseScutilOutput(stdout);\n    } catch (error) {\n      throw new Error(`macOS proxy detection failed: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  private parseScutilOutput(output: string): ProxyConfiguration {\n    if (typeof output !== 'string') {\n      throw new Error('Invalid scutil --proxy output');\n    }\n\n    const cleanLines = output.split('\\n')\n      .map((line) => line.trim())\n      .filter((line) => line.length > 0);\n\n    const dictStart = cleanLines.findIndex((line) => line.includes('<dictionary>'));\n    if (dictStart === -1) {\n      throw new Error('Invalid scutil --proxy output format');\n    }\n    const config = this.parseConfiguration(cleanLines, dictStart);\n    return this.buildProxyConfiguration(config);\n  }\n\n  private parseConfiguration(lines: string[], startIndex: number): Record<string, any> {\n    const config: Record<string, any> = {};\n    let i = startIndex + 1;\n\n    while (i < lines.length && !lines[i].includes('}')) {\n      const line = lines[i];\n\n      if (!line.trim()) {\n        i++;\n        continue;\n      }\n\n      const keyValueMatch = line.match(/^([^:]+)\\s*:\\s*(.+)$/);","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/usebruno/bruno/blob/9bdd81c7bdc57006e5f5ebffb79321a8d979f712/packages/bruno-requests/src/network/system-proxy/utils/macos.ts#L14-L50","documentation":"parseScutilOutput expects scutil's output to contain a '<dictionary>' marker; if findIndex returns -1 the output shape is unrecognized and the parser cannot locate the proxy config block, so it throws.","triggerScenarios":"scutil --proxy returned output without the '<dictionary>' line — e.g. an empty result, an error string from scutil, or a radically different macOS version output format.","commonSituations":"macOS version mismatch (older/newer release with changed scutil formatting); scutil emitting an error like 'ncopydict: not a dictionary' instead of proxy state; running on a hackintosh/virtualized macOS with non-standard system configuration framework.","solutions":["Run `scutil --proxy` in Terminal and inspect the output — if no '<dictionary>' appears, the parser cannot handle this macOS build.","Report the output format to bruno and use explicit proxy config instead of 'system' mode meanwhile.","Upgrade bruno-requests to a version whose parser matches the macOS release in use."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"function hasDictionaryBlock(stdout) { return typeof stdout === 'string' && stdout.includes('<dictionary>'); }\n// guard before parsing\nif (!hasDictionaryBlock(stdout)) { /* fall back to direct connection / explicit proxy */ }","typeGuard":null,"tryCatchPattern":"try { return resolver.parseScutilOutput(stdout); } catch (e) { if (/Invalid scutil --proxy output format/.test(e.message)) return DIRECT_CONFIG; throw e; }","preventionTips":["Pin bruno-requests to a version matching your macOS release.","Use explicit proxy config when scutil output format diverges."],"tags":["proxy","macos","scutil","parsing","format-mismatch"],"backgroundTag":null,"analyzedSha":"9bdd81c7bdc57006e5f5ebffb79321a8d979f712","analyzedAt":"2026-08-13T04:09:25.751Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}