fix(integrations): close stale and empty value leaks from the Google and Microsoft sweeps

Merged
WA
2d ago
+433-386

Summary

This PR comes from a final staging→main review of the Google (#9947, #9954) and Microsoft (#9949) integration sweeps. The review targeted backwards compatibility for workflows saved on main. Most fixes share one root cause:

  • The generic handler builds tool params as { ...inputs, ...transformedParams }.
  • The serializer fills empty defaults for dropdowns declared with value: () => '', and keeps advanced values when advanced options are collapsed.
  • So a value stored for another operation, or a never-touched empty default, reached a tool whenever the block mapper skipped that key.

Fixes:

  • Outlook:
    • Reply, Reply All and Forward now always set cc/bcc. Before, a CC saved while the block was on Send was added to replies and forwards after switching operations.
    • Send and Draft now always set importance. Before, an Update Message importance leaked into sends.
    • The new Importance dropdown defaults to unset, where it used to persist "Low".
  • Google Groups Update Settings: the mapper assigns every setting. Before, an untouched block sent five settings as '', where main sent an empty PATCH.
  • Google Tasks List: the tri-state filters are assigned explicitly, and the tool skips empty values. Before, showHidden=&showDeleted=&showAssigned= were sent when advanced options were shown.
  • OneDrive: "If File Exists" defaults to unset, so opening an old upload block no longer starts sending conflictBehavior=replace.
  • Google Sheets: a Batch Get Major Dimension is cleared for every other operation. Before, it could transpose Read/Write values.
  • Azure DevOps:
    • List Pipelines and Get Comments keep main's fallback to the shared Max Results value.
    • Each paged operation has its own continuation token.
    • Multi-item reads (query, batch) omit the raw field bag and relations to keep payloads near main's size. Single-item reads keep them.
  • SharePoint upload: . folder segments are dropped, as on main. .. is still rejected.
  • Entra: transitive and includeManager use one strict check, so "false" stays off.
  • Dataverse: a cleared Page Size counts as unset.
  • Behaviour-neutral cleanups:
    • A shared Gmail header lookup.
    • One Groups settings mapper.
    • Word reuses OneDrive's identity mapper and one metadata output constant.
    • One Dataverse isSet.
    • SharePoint internals use graphPathSegment.
    • Typed identity reads in Azure DevOps.
    • Teams fallback trigger payload sets new outputs to null.
    • Smaller Calendar and Meet tidy-ups.
    • One Azure DevOps test now uses vi.stubGlobal.

Type of Change

  • Bug fix

Testing

  • New regression tests for the Outlook, Google Groups and Google Tasks block mappers. All 6 fail on the pre-fix staging code and pass now.
  • vitest across 62 files: 555 passed, covering the touched tools, blocks, internal operations, webhook providers and blocks.test.ts.
  • These checks pass:
    • check-block-registry.ts origin/staging
    • check:tool-metadata, check:docs, check:integration-catalog
    • check:utils, check:test-patterns
    • explicit-any
    • biome

Checklist

  • Code follows project style guidelines
  • Self-reviewed my changes
  • Tests added/updated and passing (new tests pass the test-audit authoring gate)
  • No new warnings introduced
  • I confirm that I have read and agree to the terms outlined in the Contributor License Agreement (CLA)