Unfortunately no read on villain, and semi-solid player leans toward TAG. I already see that I didn't bet quite enough to force out the draws, but that isn't my real question.
What should I have done on the river? Call, Fold, Push? And what did the villian have?

I'll update with results after much discussion

PokerStars No-Limit Hold'em, $0.25 BB (8 handed) FTR converter on zerodivide.cx

UTG+1 ($0.50)
MP1 ($43.80)
MP2 ($8.70)
CO =#A500AF(Villain)/ ($16.35)
Silly String ($18.15)
SB ($8.45)
BB =#A500AF(Semi-solid player)/ ($2.55)
UTG ($31.05)

Preflop: Silly String is Button with 3, 3.
5 folds, CO =#A500AF(Villain)/ calls $0.25, Silly String calls $0.25, SB completes, BB =#A500AF(Semi-solid player)/ checks.

Flop: ($1) 5, 8, 3 (3 players)
SB checks, Semi-solid player checks, Villain checks, Silly String bets $0.5, SB calls $0.50, Semi-solid player calls $0.50, Villain calls $0.50.

Turn: ($3) 2 (3 players)
SB checks, Semi-solid player checks, Villain checks, Silly String bets $2, SB folds, Semi-solid player calls $1.80 (All-In), Villain raises to $4, Silly String calls $2.

River: ($12.80) A (2 players, 1 all-in)
Villain bets $10