Skip to content

Expose Erato in Outlook organizer appointment compose - #929

Merged
bdart merged 4 commits into
mainfrom
feature/ermain-551-outlook-appointment-compose-expose-erato-and-support
Aug 9, 2026
Merged

Expose Erato in Outlook organizer appointment compose#929
bdart merged 4 commits into
mainfrom
feature/ermain-551-outlook-appointment-compose-expose-erato-and-support

Conversation

@bdart

@bdart bdart commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Makes the appointment organizer window a first-class add-in surface and hardens the appointment↔email partition throughout.

What's in here

Surface

  • Manifest activation rule (ItemIs Appointment/Edit) + AppointmentOrganizerCommandSurface button in both override generations of the local XML manifest; meetingDetailsOrganizer context in the unified manifest.

Facet pipeline

  • Appointment context/rewrite ride two config-defined facets (outlook_review_appointment, outlook_rewrite_appointment_selection) delivered as a configuration package (companion PR: EratoLab/erato-subscription-content#6). Sends and the context chips are gated on GET /me/facets, so the UI never claims context a send wouldn't carry.
  • Appointment fields are re-read from the live item at send time — editing an appointment form fires no ItemChanged, so bind-time state goes stale; reads are bounded with per-field fallback so a wedged host degrades instead of losing the send. Start/end go out as local-offset ISO plus a timezone arg.
  • Sticky scheduling never claims appointment-compose turns: the schedule facet's confirm path opens a new appointment, which is never right while editing one, and each proposal would refresh the stickiness window. Calendar reads stay reachable via the review facet's tool allowlist.
  • getComposeBodyType() failures on a compose→read race no longer reject the send.

Identity & isolation

  • Appointment identity is a page-load-scoped mint shared by the provider and anchor paths — never seriesId, which Office.js sets to the parent series id on every occurrence (two occurrences would share a chat and pass the insert gate). Minted identities don't count as navigation evidence.
  • Appointment attachments never surface as email context (provider skips reading them; email-source provider nulls its source once via an emailItem alias).
  • isMessageRead widened to SupportedOutlookItem, deleting eight compound guards; itemKind is now required in the facet resolver; dedup markers renamed to …DraftFingerprint to match their broadened semantics.

bdart added 3 commits August 9, 2026 21:17
Expose the add-in in appointment organizer windows (activation rule,
ribbon button, unified-manifest context). The surface rides two
config-defined action facets: sends and context chips are gated on
GET /me/facets, fields are re-read from the live item at send time
(local-offset times + timezone), identity is a page-load-scoped mint
(never seriesId, which merges series occurrences), attachments stay
out of email context, and sticky scheduling never claims
appointment-compose turns.
@bdart bdart self-assigned this Aug 9, 2026
@bdart bdart added the enhancement New feature or request label Aug 9, 2026
Comment thread office-addin/src/outlook/hooks/useOutlookComposeSelection.ts Fixed
Resolves the CodeQL insecure-randomness finding on the Math.random
mints; matches the existing generateDroppedKey convention.
@bdart
bdart enabled auto-merge (squash) August 9, 2026 19:29
@bdart
bdart merged commit 0c7d698 into main Aug 9, 2026
32 checks passed
@bdart
bdart deleted the feature/ermain-551-outlook-appointment-compose-expose-erato-and-support branch August 9, 2026 19:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants