a74e0155b6
Port from qwibitai/nanoclaw#3666: Slack represents a pasted table as 'table' blocks — usually nested in attachments[].blocks[], sometimes top-level. They appear in neither the message text nor the file list, so the agent received the sentence before the table and nothing else. - _render_slack_table_block(): projects rows as 'cell | cell' lines, collecting text leaves from raw_text/rich_text cell subtrees; capped at 20k chars with a visible '[table truncated]' marker. - Wired into all three ingestion paths: _extract_text_from_slack_blocks (thread history + attachment-nested blocks), the live inbound attachment loop, and _extract_additional_text_from_slack_blocks (top-level blocks on live messages). - _serialize_slack_blocks_for_agent skips 'table' blocks — the allowlist drops 'rows', so it only emitted an empty husk.