Save Mac Terminal session to text file

This can be done with the standard unix command script(1) though requires running a subshell under the current shell. That is, start a terminal, and run script, issue whatever commands need to be logged, then exit from that shell:

$ script
Script started, output file is typescript
$ uptime
11:30  up 22 days, 16:15, 1 user, load averages: 1.43 1.37 1.38
$ exit

Script done, output file is typescript
$ 

Then in the output typescript file there should be a record of the shell session run under script(1).

But wait, there's more! With expect one can also save a session and possibly replay it. This requires installing expect from a ports system (Fink, Homebrew, or here MacPorts) which should install autoexpect:

$ port installed | grep expect
  expect @5.45.3_0 (active)
$ which autoexpect
/opt/local/bin/autoexpect
$ autoexpect $SHELL
autoexpect started, file is script.exp
$ uptime
 6:47  up 23 days, 11:32, 1 user, load averages: 1.37 1.39 1.33
$ exit
autoexpect done, file is script.exp
$ 

Doing something useful with script.exp in turn probably requires knowledge of expect and TCL, so this is a more advanced option. (expect in particular has a log_file option that can be toggled to save everything, but then you'd be writing everything in TCL and not bash...)

Otherwise the terminal itself must save the session; iTerm.app probably has more options for this (Session -> Log -> Start) than Terminal.app.