You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(sendgrid): fix active field coercion, add pagination, tighten output typing (#5368)
* fix(sendgrid): fix active field coercion, add pagination, tighten output typing
- Fix active field for create_template_version being sent as the string
"true"/"false" instead of the SendGrid-required int 0/1
- Add missing authMode: ApiKey on SendGridBlock
- Add pageToken/nextPageToken pagination support to list_templates and
list_all_lists (SendGrid page_token cursor, parsed from _metadata.next)
- Fix nullable output fields to use ?? null / ?? [] with optional: true
across get_contact, search_contacts, remove_contacts_from_list,
create_template_version, add_contact, send_mail
- Remove dead data.templates fallback in list_templates (API only
ever returns result)
- Remove unused UpdateContactParams/UpdateListParams/UpdateTemplateParams
dead types; make CreateTemplateParams.generation optional to match
actual tool behavior
* fix(sendgrid): address Cursor Bugbot findings on pagination and active coercion
- Gate listPageToken/templatePageToken remap on operation so a stale
token from the other list operation can't override the intended one
- Fix active coercion to also treat a real boolean true (from a dynamic
<Block.output> reference) as active, not just the dropdown string 'true'
* fix(sendgrid): coerce active to int at the tool layer too
Per Greptile: the block-level active coercion only covered the UI
path. A direct sendgrid_create_template_version tool invocation with
a boolean active would still send a raw boolean to SendGrid. Coerce
to 0/1 in the tool's own request body so both paths are correct.
* fix(sendgrid): always send page_size on list_templates
SendGrid's GET /v3/templates requires page_size on every request
(no server-side default) — omitting it errors. Default to 20 to
match our own documented default when the caller doesn't set one.
* fix(sendgrid): explicit false/'false' check for active flag
Per Cursor Bugbot: params.active ? 1 : 0 treated any truthy string
(including "false") as active. Extracted a toActiveFlag helper that
only treats real false or the string 'false' as inactive, everything
else (including unset) defaults to active — matches the tool's
documented default.
* fix(sendgrid): handle numeric 0 in toActiveFlag
Per Greptile: the block coerces active to a number (0/1) before
calling the tool, but toActiveFlag only checked for false/'false',
so the block's inactive selection (0) fell through to the
"active" branch. Check against an explicit inactive-values set
covering the boolean, string, and numeric forms.
* fix(sendgrid): nest add_contact custom fields under custom_fields
Pre-existing bug (predates this PR): custom fields were merged onto
the contact object as top-level sibling keys via safeAssign/Object.assign,
but SendGrid's PUT /v3/marketing/contacts requires them nested under a
custom_fields object. SendGrid silently drops unrecognized top-level
keys, so the documented customFields param never actually reached
SendGrid. Caught during a final adversarial re-verification pass
before merge.
* fix(sendgrid): document consistent page_size requirement for list_templates pagination
Per Cursor Bugbot: list_templates always defaults page_size to 20
when unset (required by SendGrid), so a follow-up pageToken-only
call after a first call with a larger pageSize would silently
shrink to 20 and desync page boundaries. This is inherent to a
stateless tool call (SendGrid requires page_size on every request,
and the tool has no way to remember the prior call's value), so
clarify via param description and UI placeholder that callers must
repeat the same pageSize across paginated calls.
* chore(api-validation): bump stale route-count ratchet baseline 883->884
Unrelated to the SendGrid work in this branch. staging's own HEAD
already has 884 compliant Zod-backed API routes (0 non-Zod), but this
ratchet baseline was never bumped when that route landed, so any PR
rebasing onto current staging fails check:api-validation:strict with
"route count increased from 883 to 884". All routes remain fully
Zod-backed; this is a mechanical counter update, not a policy change.
* fix(sendgrid): dedupe active coercion between block and tool
Per Cursor Bugbot: the block's pre-coercion only recognized the
dropdown string 'true' or boolean true as active, so a dynamic
reference producing numeric 1 or string '1' fell through to 0 and
silently created an inactive template version. Exported the tool's
toActiveFlag and reused it in the block instead of duplicating the
inactive-value logic, so both layers can no longer drift out of sync.
0 commit comments