add_budget_items
ChatGPTAdd one or more budget line items to a scenario (defaults to the active scenario). Pass an array even for a single item. categoryName MUST match either an existing user-created category OR one of the 16 default categories: Venue, Catering & Food, Accommodation, Music & Entertainment, Photography & Video, Decor & Florals, Mandap & Ceremony, Bridal Attire & Jewelry, Groom Attire, Hair & Makeup, Baraat & Procession, Mehndi Artists, Transportation, Invitations & Stationery, Gifts & Favors, Contingency. Unknown names are REJECTED with structured suggestions — do not invent categories like "Floral Arrangements" when "Decor & Florals" exists. Use list_budget_items first if unsure of the user's existing categories. Pass scenarioId to seed a non-active scenario without flipping which one is active. Use for initial budget seeding or "add $X for [item]" (single).
add_budget_items
ChatGPTAdd one or more budget line items to a scenario (defaults to the active scenario). Pass an array even for a single item. categoryName MUST match either an existing user-created category OR one of the 16 default categories: Venue, Catering & Food, Accommodation, Music & Entertainment, Photography & Video, Decor & Florals, Mandap & Ceremony, Bridal Attire & Jewelry, Groom Attire, Hair & Makeup, Baraat & Procession, Mehndi Artists, Transportation, Invitations & Stationery, Gifts & Favors, Contingency. Unknown names are REJECTED with structured suggestions — do not invent categories like "Floral Arrangements" when "Decor & Florals" exists. Use list_budget_items first if unsure of the user's existing categories. Pass scenarioId to seed a non-active scenario without flipping which one is active. Use for initial budget seeding or "add $X for [item]" (single).
add_events
ChatGPTCreate one or more wedding events (sangeet, mehendi, ceremony, reception, etc.). Pass an array even for a single event — multi-day SA weddings often dictate 4-7 events at once. Time fields: date is UTC midnight on the event's calendar day (do NOT naively format — US/CA clients render the previous day); time is a free-text label like "4:00 PM"; dateISO is an ISO-8601 string composed in the wedding's IANA timezone (default America/New_York) and is the field clients should display or parse.
add_events
ChatGPTCreate one or more wedding events (sangeet, mehendi, ceremony, reception, etc.). Pass an array even for a single event — multi-day SA weddings often dictate 4-7 events at once. Time fields: date is UTC midnight on the event's calendar day (do NOT naively format — US/CA clients render the previous day); time is a free-text label like "4:00 PM"; dateISO is an ISO-8601 string composed in the wedding's IANA timezone (default America/New_York) and is the field clients should display or parse.
add_guests
ChatGPTAdd one or more guests to the wedding. Pass an array even for a single guest. Use when the user says "add [name]" (one) or "add these family members" / pastes a list of names (many). Provide firstName (and optionally lastName) for each row — this is the preferred shape. A back-compat name field is accepted; when firstName is not provided it is split on the LAST whitespace, so bracketed prefixes like "[QA TEST] Aria Kapoor" stay attached to the first name. Single-token names (e.g. "Madonna") become firstName with empty lastName. Best-effort: a failing row does not abort the rest; the result reports per-row success/error.
add_guests
ChatGPTAdd one or more guests to the wedding. Pass an array even for a single guest. Use when the user says "add [name]" (one) or "add these family members" / pastes a list of names (many). Provide firstName (and optionally lastName) for each row — this is the preferred shape. A back-compat name field is accepted; when firstName is not provided it is split on the LAST whitespace, so bracketed prefixes like "[QA TEST] Aria Kapoor" stay attached to the first name. Single-token names (e.g. "Madonna") become firstName with empty lastName. Best-effort: a failing row does not abort the rest; the result reports per-row success/error.
add_guests_to_group
ChatGPTAdd one or more guests to a group. Returns { added, notFoundIds, alreadyInGroup, groupName } where notFoundIds lists guest IDs not in this wedding and alreadyInGroup lists ids that were already in the target group (no-op). Use when the user says "put [guests] in the [group] group".
add_guests_to_group
ChatGPTAdd one or more guests to a group. Returns { added, notFoundIds, alreadyInGroup, groupName } where notFoundIds lists guest IDs not in this wedding and alreadyInGroup lists ids that were already in the target group (no-op). Use when the user says "put [guests] in the [group] group".
add_tasks
ChatGPTCreate one or more planning tasks. Pass an array even for a single task. Use when the user says "add a task to..." or "set up my pre-wedding checklist". Tasks may optionally be assigned to a wedding member (assigneeId, from list_members) or linked to an event (eventId, from list_events) — for instance "schedule this task for the mehndi event". Best-effort partial-failure. For body edits use update_task; for status changes use update_tasks_status.
add_tasks
ChatGPTCreate one or more planning tasks. Pass an array even for a single task. Use when the user says "add a task to..." or "set up my pre-wedding checklist". Tasks may optionally be assigned to a wedding member (assigneeId, from list_members) or linked to an event (eventId, from list_events) — for instance "schedule this task for the mehndi event". Best-effort partial-failure. For body edits use update_task; for status changes use update_tasks_status.
add_vendor
ChatGPTAdd a single new vendor to the wedding's vendor list. Required: name + category (one of the 18 canonical keys: photography, catering, venue, dj_music, florist, etc.). Optional: contact name, email, phone, website, quoted price, notes. For multiple vendors, call this in sequence per row.
add_vendor
ChatGPTAdd a single new vendor to the wedding's vendor list. Required: name + category (one of the 18 canonical keys: photography, catering, venue, dj_music, florist, etc.). Optional: contact name, email, phone, website, quoted price, notes. For multiple vendors, call this in sequence per row.
assign_guests_to_events
ChatGPTInvite one or more guests to one or more events. Produces the cross product (every guest × every event). Use when the user says "add all of dad's side to ceremony and reception" or invites a single guest to a single event (just pass single-element arrays). Best-effort partial-failure.
assign_guests_to_events
ChatGPTInvite one or more guests to one or more events. Produces the cross product (every guest × every event). Use when the user says "add all of dad's side to ceremony and reception" or invites a single guest to a single event (just pass single-element arrays). Best-effort partial-failure.
compare_vendors
ChatGPTCompare 2-5 vendors side by side. Returns { vendors, notFoundIds, comparison } — notFoundIds lists input IDs that did not resolve. Use when the user wants to decide between or compare vendors.
compare_vendors
ChatGPTCompare 2-5 vendors side by side. Returns { vendors, notFoundIds, comparison } — notFoundIds lists input IDs that did not resolve. Use when the user wants to decide between or compare vendors.
create_budget_category
ChatGPTCreate a new budget category in the active scenario. Use BEFORE add_budget_items when no existing or default category fits — e.g. "Wedding Planner Services", "Other", or any custom name the user prefers. Once created, the name becomes a valid categoryName for add_budget_items / update_budget_item (the strict validator accepts existing user categories). Refuses on duplicate name (case-insensitive).
create_budget_category
ChatGPTCreate a new budget category in the active scenario. Use BEFORE add_budget_items when no existing or default category fits — e.g. "Wedding Planner Services", "Other", or any custom name the user prefers. Once created, the name becomes a valid categoryName for add_budget_items / update_budget_item (the strict validator accepts existing user categories). Refuses on duplicate name (case-insensitive).
create_budget_scenario
ChatGPTCreate a new blank DRAFT budget scenario with no categories or items. Use when the user wants to start a fresh "what-if" budget from scratch. To clone the active scenario instead (carrying over categories, items, vendor alternatives, and funding sources), use snapshot_budget.
create_budget_scenario
ChatGPTCreate a new blank DRAFT budget scenario with no categories or items. Use when the user wants to start a fresh "what-if" budget from scratch. To clone the active scenario instead (carrying over categories, items, vendor alternatives, and funding sources), use snapshot_budget.
create_guest_group
ChatGPTCreate a new guest group for organizing guests into families or social circles. Group names are unique per wedding (case-insensitive); attempting to reuse an existing name throws. Use when the user says "create a group for the Sharma family" or "group my college friends".
create_guest_group
ChatGPTCreate a new guest group for organizing guests into families or social circles. Group names are unique per wedding (case-insensitive); attempting to reuse an existing name throws. Use when the user says "create a group for the Sharma family" or "group my college friends".
delete_budget_category
ChatGPTDelete one or more budget categories from the specified scenario (defaults to the active scenario). Pass a single name for a plain delete, or multiple names with reassignToCategoryName to MERGE duplicates (items are re-parented into the target; allocated amounts sum into the target; sources are deleted). Without reassignToCategoryName, items in the sources are cascade-deleted along with the category — refuses if any have completed payments unless allowItemsWithPayments=true. Source names are resolved case-insensitively and one name MAY match multiple categories (the duplicate-cleanup case). The reassign target must resolve to exactly one category. Requires FAMILY_ADMIN. Returns { deletedCount, deletedNames, unmatchedNames, itemsReassigned, itemsDeleted, allocatedMerged, scenarioId, target }.
delete_budget_category
ChatGPTDelete one or more budget categories from the specified scenario (defaults to the active scenario). Pass a single name for a plain delete, or multiple names with reassignToCategoryName to MERGE duplicates (items are re-parented into the target; allocated amounts sum into the target; sources are deleted). Without reassignToCategoryName, items in the sources are cascade-deleted along with the category — refuses if any have completed payments unless allowItemsWithPayments=true. Source names are resolved case-insensitively and one name MAY match multiple categories (the duplicate-cleanup case). The reassign target must resolve to exactly one category. Requires FAMILY_ADMIN. Returns { deletedCount, deletedNames, unmatchedNames, itemsReassigned, itemsDeleted, allocatedMerged, scenarioId, target }.
delete_budget_item
ChatGPTDelete a budget line item from the active scenario. Refuses to delete items with completed payments — clear those first. Requires FAMILY_ADMIN.
delete_budget_item
ChatGPTDelete a budget line item from the active scenario. Refuses to delete items with completed payments — clear those first. Requires FAMILY_ADMIN.
delete_budget_scenario
ChatGPTDelete a budget scenario. Cannot delete the currently active scenario.
delete_budget_scenario
ChatGPTDelete a budget scenario. Cannot delete the currently active scenario.
delete_event
ChatGPTPermanently delete a wedding event and all its guest assignments (the GuestEvent join rows are removed in the same transaction). Use when the user explicitly asks to remove or cancel an event. Requires FAMILY_ADMIN.
delete_event
ChatGPTPermanently delete a wedding event and all its guest assignments (the GuestEvent join rows are removed in the same transaction). Use when the user explicitly asks to remove or cancel an event. Requires FAMILY_ADMIN.
delete_guest
ChatGPTDelete a single guest. Cascades to their event invites, RSVPs, gifts, broadcast deliveries, seat assignments, intake responses, and conversations. Comments authored about the guest are soft-deleted. Requires FAMILY_ADMIN. For bulk delete use delete_guests.
delete_guest
ChatGPTDelete a single guest. Cascades to their event invites, RSVPs, gifts, broadcast deliveries, seat assignments, intake responses, and conversations. Comments authored about the guest are soft-deleted. Requires FAMILY_ADMIN. For bulk delete use delete_guests.
delete_guest_group
ChatGPTDelete a guest group. Guests in the group are NOT deleted — their groupId is detached (set to null) before the group itself is removed (the schema declares Guest.groupId as a nullable foreign key with onDelete: SetNull). Returns { success, deletedId, removedName, detachedGuests } so the caller can surface how many guests were ungrouped. Requires FAMILY_ADMIN.
delete_guest_group
ChatGPTDelete a guest group. Guests in the group are NOT deleted — their groupId is detached (set to null) before the group itself is removed (the schema declares Guest.groupId as a nullable foreign key with onDelete: SetNull). Returns { success, deletedId, removedName, detachedGuests } so the caller can surface how many guests were ungrouped. Requires FAMILY_ADMIN.
delete_guests
ChatGPTBulk-delete guests. Returns { deleted, notFoundIds } so the caller can tell the user which IDs were ignored (e.g. wrong wedding or already deleted). Cascade rules and audit logging match delete_guest. Requires FAMILY_ADMIN.
delete_guests
ChatGPTBulk-delete guests. Returns { deleted, notFoundIds } so the caller can tell the user which IDs were ignored (e.g. wrong wedding or already deleted). Cascade rules and audit logging match delete_guest. Requires FAMILY_ADMIN.
delete_task
ChatGPTDelete a single task. Requires FAMILY_ADMIN. For multi-delete use delete_tasks.
delete_task
ChatGPTDelete a single task. Requires FAMILY_ADMIN. For multi-delete use delete_tasks.
delete_tasks
ChatGPTBulk-delete tasks. Returns { deleted, notFoundIds } so the caller can tell the user which IDs were ignored (e.g. wrong wedding or already deleted). Requires FAMILY_ADMIN.
delete_tasks
ChatGPTBulk-delete tasks. Returns { deleted, notFoundIds } so the caller can tell the user which IDs were ignored (e.g. wrong wedding or already deleted). Requires FAMILY_ADMIN.
delete_vendor
ChatGPTPermanently delete a vendor and its directly-owned data (attachments, email threads/drafts, vendor alternatives, packages, payments, vendor comments). Scenario items remain — only the vendor alternative + any active selection are removed. Requires FAMILY_ADMIN. Use when the user says "remove this vendor" or "delete [vendor]".
delete_vendor
ChatGPTPermanently delete a vendor and its directly-owned data (attachments, email threads/drafts, vendor alternatives, packages, payments, vendor comments). Scenario items remain — only the vendor alternative + any active selection are removed. Requires FAMILY_ADMIN. Use when the user says "remove this vendor" or "delete [vendor]".
get_budget_summary
ChatGPTGet the active scenario budget overview. Returns: totalBudget (the cap the user set); totalEstimated (sum of line-item estimates already committed on paper); totalActual (sum of recorded spend); totalPaid (sum of paid vendor payments); unbudgeted (= totalBudget - totalEstimated — how much of the cap is still un-allocated to line items; use this when advising "how much can I still plan for?"); unspent (= totalBudget - totalActual — money not yet spent against the cap); currency (ISO code, defaults to "USD"); plus a per-category breakdown with allocated vs estimated vs actual vs paid. Each money field is also emitted as a *Display 2-decimal string ("750.50") to avoid float trimming on the client. Pass scenarioId to scope to a non-active scenario; omit for the active one. Use when the user asks "how is my budget?" or "what have I spent?".
get_budget_summary
ChatGPTGet the active scenario budget overview. Returns: totalBudget (the cap the user set); totalEstimated (sum of line-item estimates already committed on paper); totalActual (sum of recorded spend); totalPaid (sum of paid vendor payments); unbudgeted (= totalBudget - totalEstimated — how much of the cap is still un-allocated to line items; use this when advising "how much can I still plan for?"); unspent (= totalBudget - totalActual — money not yet spent against the cap); currency (ISO code, defaults to "USD"); plus a per-category breakdown with allocated vs estimated vs actual vs paid. Each money field is also emitted as a *Display 2-decimal string ("750.50") to avoid float trimming on the client. Pass scenarioId to scope to a non-active scenario; omit for the active one. Use when the user asks "how is my budget?" or "what have I spent?".
get_dashboard
ChatGPTGet a wedding overview including guest count, RSVP statistics, budget summary, vendor count, upcoming events, and near-due tasks. The returned rsvp object is per-GUEST (not per-invite) and always reconciles: rsvp.PENDING + rsvp.CONFIRMED + rsvp.MAYBE + rsvp.DECLINED === guests.total. Guests with no event invites at all are bucketed as PENDING (they have not responded yet). Use this when the user asks "how is my wedding going?" or wants a general status update.
get_dashboard
ChatGPTGet a wedding overview including guest count, RSVP statistics, budget summary, vendor count, upcoming events, and near-due tasks. The returned rsvp object is per-GUEST (not per-invite) and always reconciles: rsvp.PENDING + rsvp.CONFIRMED + rsvp.MAYBE + rsvp.DECLINED === guests.total. Guests with no event invites at all are bucketed as PENDING (they have not responded yet). Use this when the user asks "how is my wedding going?" or wants a general status update.
get_event
ChatGPTFetch a single wedding event with full detail: description, address, ceremony type, dress code, and the full list of assigned guests with their RSVP status. Use after list_events when the user drills into one event ("who's coming to the sangeet?", "what's the dress code for mehndi?"). Time fields: date is UTC midnight on the event's calendar day (do NOT naively format — US/CA clients render the previous day); time is a free-text label like "4:00 PM"; dateISO is an ISO-8601 string composed in the wedding's IANA timezone (default America/New_York) and is the field clients should display or parse.
get_event
ChatGPTFetch a single wedding event with full detail: description, address, ceremony type, dress code, and the full list of assigned guests with their RSVP status. Use after list_events when the user drills into one event ("who's coming to the sangeet?", "what's the dress code for mehndi?"). Time fields: date is UTC midnight on the event's calendar day (do NOT naively format — US/CA clients render the previous day); time is a free-text label like "4:00 PM"; dateISO is an ISO-8601 string composed in the wedding's IANA timezone (default America/New_York) and is the field clients should display or parse.
get_guest
ChatGPTGet detailed information about a specific guest including their events, RSVP status, dietary preferences, and gifts. Use when the user asks about a specific person.
get_guest
ChatGPTGet detailed information about a specific guest including their events, RSVP status, dietary preferences, and gifts. Use when the user asks about a specific person.
get_rsvp_summary
ChatGPTGet RSVP breakdown for each wedding event AND a wedding-wide per-guest summary, plus dietary aggregates. The top-level summary object uses the same per-guest bucketing as get_dashboard.rsvp so the two tools agree: summary.total === pending + confirmed + maybe + declined === number of guests. Per-event events[] counts remain per-invite (each event has its own explicit invite list). Use when the user asks about RSVPs, headcount, or who has responded.
get_rsvp_summary
ChatGPTGet RSVP breakdown for each wedding event AND a wedding-wide per-guest summary, plus dietary aggregates. The top-level summary object uses the same per-guest bucketing as get_dashboard.rsvp so the two tools agree: summary.total === pending + confirmed + maybe + declined === number of guests. Per-event events[] counts remain per-invite (each event has its own explicit invite list). Use when the user asks about RSVPs, headcount, or who has responded.
get_vendor
ChatGPTGet detailed vendor information including attachments, quote, and linked budget item. Use when the user asks about a specific vendor.
get_vendor
ChatGPTGet detailed vendor information including attachments, quote, and linked budget item. Use when the user asks about a specific vendor.
list_activity
ChatGPTGet an activity stream (comments + status changes). Pass entityType+entityId to scope to one entity (vendor, guest, task, etc.). Omit them to get wedding-wide recent activity. entityType alone (without entityId) acts as a wedding-wide filter. The output may also include COMMENT, BUDGET_SCENARIO, and WEDDING entries — all valid filter values.
list_activity
ChatGPTGet an activity stream (comments + status changes). Pass entityType+entityId to scope to one entity (vendor, guest, task, etc.). Omit them to get wedding-wide recent activity. entityType alone (without entityId) acts as a wedding-wide filter. The output may also include COMMENT, BUDGET_SCENARIO, and WEDDING entries — all valid filter values.
list_budget_items
ChatGPTList budget line items from a scenario (defaults to the active one), optionally filtered by category name. Shows estimated and actual amounts (with *Display 2dp strings), vendor alternatives, and payments. Pass scenarioId to inspect a specific scenario without activating it.
list_budget_items
ChatGPTList budget line items from a scenario (defaults to the active one), optionally filtered by category name. Shows estimated and actual amounts (with *Display 2dp strings), vendor alternatives, and payments. Pass scenarioId to inspect a specific scenario without activating it.
list_budget_scenarios
ChatGPTList all budget scenarios with their status (ACTIVE, DRAFT, ARCHIVED), total budget, and category count. Shows which one is currently active. Use when the user asks about budget what-if scenarios.
list_budget_scenarios
ChatGPTList all budget scenarios with their status (ACTIVE, DRAFT, ARCHIVED), total budget, and category count. Shows which one is currently active. Use when the user asks about budget what-if scenarios.
list_events
ChatGPTList wedding events (ceremonies, receptions, etc.) with dates, locations, and guest counts. Use for "what's on the schedule?", "show me the mehndi events", or to find an event ID before another action. Time fields: date is UTC midnight on the event's calendar day (do NOT naively format — US/CA clients render the previous day); time is a free-text label like "4:00 PM"; dateISO is an ISO-8601 string composed in the wedding's IANA timezone (default America/New_York) and is the field clients should display or parse.
list_events
ChatGPTList wedding events (ceremonies, receptions, etc.) with dates, locations, and guest counts. Use for "what's on the schedule?", "show me the mehndi events", or to find an event ID before another action. Time fields: date is UTC midnight on the event's calendar day (do NOT naively format — US/CA clients render the previous day); time is a free-text label like "4:00 PM"; dateISO is an ISO-8601 string composed in the wedding's IANA timezone (default America/New_York) and is the field clients should display or parse.
list_guest_groups
ChatGPTList all guest groups (families, friend groups, etc.) with member counts. Use when the user asks about guest groups or families.
list_guest_groups
ChatGPTList all guest groups (families, friend groups, etc.) with member counts. Use when the user asks about guest groups or families.
list_guests
ChatGPTList wedding guests. Filters: side, tag, rsvpStatus (per-guest — PENDING includes guests with no invites yet), eventId, groupId, search (name + email). Pagination: limit (default 50, max 200) + cursor (the nextCursor from a previous call). Returns a raw Guest[] for unfiltered calls; with any of cursor/limit/search/groupId it returns { items, nextCursor }. Use when the user asks about their guest list, who is invited, or who matches a filter.
list_guests
ChatGPTList wedding guests. Filters: side, tag, rsvpStatus (per-guest — PENDING includes guests with no invites yet), eventId, groupId, search (name + email). Pagination: limit (default 50, max 200) + cursor (the nextCursor from a previous call). Returns a raw Guest[] for unfiltered calls; with any of cursor/limit/search/groupId it returns { items, nextCursor }. Use when the user asks about their guest list, who is invited, or who matches a filter.
list_members
ChatGPTList all wedding team members with their roles (COUPLE_PRIMARY, FAMILY_ADMIN, FAMILY_CONTRIBUTOR, GUEST). Each row includes an isSelf flag so callers can identify the authenticated user. Use when the user asks "who has access?" or "list collaborators".
list_members
ChatGPTList all wedding team members with their roles (COUPLE_PRIMARY, FAMILY_ADMIN, FAMILY_CONTRIBUTOR, GUEST). Each row includes an isSelf flag so callers can identify the authenticated user. Use when the user asks "who has access?" or "list collaborators".
list_signals
ChatGPTList active planning intelligence signals for the wedding. Signals are AI-generated insights about budget risks, timeline conflicts, vendor gaps, guest patterns, and milestone celebrations. Filter by category or severity (one of: critical, warning, info, suggestion, celebration). Set format="summary" to get a per-severity breakdown plus the full list (use this when the user asks "how is my wedding planning going?" or "any issues I should know about?"); the default format="list" returns just the filterable raw list.
list_signals
ChatGPTList active planning intelligence signals for the wedding. Signals are AI-generated insights about budget risks, timeline conflicts, vendor gaps, guest patterns, and milestone celebrations. Filter by category or severity (one of: critical, warning, info, suggestion, celebration). Set format="summary" to get a per-severity breakdown plus the full list (use this when the user asks "how is my wedding planning going?" or "any issues I should know about?"); the default format="list" returns just the filterable raw list.
list_tasks
ChatGPTList wedding planning tasks. Filters: status (TODO/IN_PROGRESS/DONE), priority (NORMAL/HIGH), category, eventId, assignee (id/name/email), dueBefore/dueAfter (ISO-8601), overdue, search (title + description). Use for "what do I need to do?", "what's overdue?", or "tasks for the sangeet?".
list_tasks
ChatGPTList wedding planning tasks. Filters: status (TODO/IN_PROGRESS/DONE), priority (NORMAL/HIGH), category, eventId, assignee (id/name/email), dueBefore/dueAfter (ISO-8601), overdue, search (title + description). Use for "what do I need to do?", "what's overdue?", or "tasks for the sangeet?".
list_vendors
ChatGPTList all wedding vendors. Can filter by status (RESEARCHING/CONTACTED/QUOTED/BOOKED/PAID/CANCELLED) or category (photography, catering, etc.). Use when the user asks about their vendors.
list_vendors
ChatGPTList all wedding vendors. Can filter by status (RESEARCHING/CONTACTED/QUOTED/BOOKED/PAID/CANCELLED) or category (photography, catering, etc.). Use when the user asks about their vendors.
remove_guests_from_group
ChatGPTRemove one or more guests from their current group (ungroup them). Returns { removed, notFoundIds, notInGroup } where notFoundIds lists guest IDs not in this wedding and notInGroup lists ids that had no group to begin with (no-op).
remove_guests_from_group
ChatGPTRemove one or more guests from their current group (ungroup them). Returns { removed, notFoundIds, notInGroup } where notFoundIds lists guest IDs not in this wedding and notInGroup lists ids that had no group to begin with (no-op).
set_main_scenario
ChatGPTActivate a budget scenario — demotes the current active scenario to DRAFT and promotes the target to ACTIVE.
set_main_scenario
ChatGPTActivate a budget scenario — demotes the current active scenario to DRAFT and promotes the target to ACTIVE.
set_total_budget
ChatGPTSet the total budget on the active scenario. Use when the user says "our total budget is $X".
set_total_budget
ChatGPTSet the total budget on the active scenario. Use when the user says "our total budget is $X".
snapshot_budget
ChatGPTClone the active budget scenario as a new DRAFT. Copies all categories, items, vendor alternatives, and funding sources. Use when the user says "save the current budget" or "create a what-if copy".
snapshot_budget
ChatGPTClone the active budget scenario as a new DRAFT. Copies all categories, items, vendor alternatives, and funding sources. Use when the user says "save the current budget" or "create a what-if copy".
unassign_guests_from_events
ChatGPTRemove one or more guests from a single event (inverse of assign_guests_to_events for one event). Returns { unassigned, notFoundIds } where notFoundIds are guests that were never assigned (or do not belong to this wedding). Idempotent.
unassign_guests_from_events
ChatGPTRemove one or more guests from a single event (inverse of assign_guests_to_events for one event). Returns { unassigned, notFoundIds } where notFoundIds are guests that were never assigned (or do not belong to this wedding). Idempotent.
update_budget_item
ChatGPTUpdate a budget line item in the active scenario — change the name, amounts, who pays, notes, or move it to another category. At least one updatable field must be provided; an empty patch is rejected.
update_budget_item
ChatGPTUpdate a budget line item in the active scenario — change the name, amounts, who pays, notes, or move it to another category. At least one updatable field must be provided; an empty patch is rejected.
update_event
ChatGPTUpdate an existing event's details (name, date, location, dress code, etc.). Time fields: date is UTC midnight on the event's calendar day (do NOT naively format — US/CA clients render the previous day); time is a free-text label like "4:00 PM"; dateISO is an ISO-8601 string composed in the wedding's IANA timezone (default America/New_York) and is the field clients should display or parse.
update_event
ChatGPTUpdate an existing event's details (name, date, location, dress code, etc.). Time fields: date is UTC midnight on the event's calendar day (do NOT naively format — US/CA clients render the previous day); time is a free-text label like "4:00 PM"; dateISO is an ISO-8601 string composed in the wedding's IANA timezone (default America/New_York) and is the field clients should display or parse.
update_guests
ChatGPTUpdate one or more guests' information. Two modes: (1) per-row patches via updates: [{guestId, ...patch}, ...] when guests need different changes ("update Priya's email and Arjun's phone"); (2) bulk shorthand via guestIds + patch when applying the same patch to many ("tag all college friends as 'family'", "move these 12 to bride's side"). Provide exactly one mode. Best-effort partial-failure: per-row failures don't abort the rest. Note: tags REPLACES the existing tag set; for additive tagging, fetch via list_guests first and merge client-side. The name back-compat field splits on the LAST whitespace (matches add_guests).
update_guests
ChatGPTUpdate one or more guests' information. Two modes: (1) per-row patches via updates: [{guestId, ...patch}, ...] when guests need different changes ("update Priya's email and Arjun's phone"); (2) bulk shorthand via guestIds + patch when applying the same patch to many ("tag all college friends as 'family'", "move these 12 to bride's side"). Provide exactly one mode. Best-effort partial-failure: per-row failures don't abort the rest. Note: tags REPLACES the existing tag set; for additive tagging, fetch via list_guests first and merge client-side. The name back-compat field splits on the LAST whitespace (matches add_guests).
update_guests_rsvp
ChatGPTUpdate one or more guests' RSVP for specific events. Pass an array of {guestId, eventId, status, ...} rows. Valid status values: PENDING, CONFIRMED, DECLINED, MAYBE. Bad statuses, missing guests, or missing events are surfaced as per-row failures (not a whole-call rejection) so a 5-row batch with one bad row still applies the other four — matches the per-row semantics of update_guests (audit Bug 25). Use when the user says "mark these 5 as confirmed for the reception" or a single guest declines.
update_guests_rsvp
ChatGPTUpdate one or more guests' RSVP for specific events. Pass an array of {guestId, eventId, status, ...} rows. Valid status values: PENDING, CONFIRMED, DECLINED, MAYBE. Bad statuses, missing guests, or missing events are surfaced as per-row failures (not a whole-call rejection) so a 5-row batch with one bad row still applies the other four — matches the per-row semantics of update_guests (audit Bug 25). Use when the user says "mark these 5 as confirmed for the reception" or a single guest declines.
update_task
ChatGPTEdit a single task's body (title, description, dueDate, priority, category, eventId, assigneeId). Field semantics: omit a field to leave it unchanged; pass null to clear a nullable field (description, dueDate, category, eventId, assigneeId); pass a value to set it. title and priority cannot be cleared. Rejects empty patches. For bulk status changes (e.g. "mark these 5 done") use update_tasks_status instead.
update_task
ChatGPTEdit a single task's body (title, description, dueDate, priority, category, eventId, assigneeId). Field semantics: omit a field to leave it unchanged; pass null to clear a nullable field (description, dueDate, category, eventId, assigneeId); pass a value to set it. title and priority cannot be cleared. Rejects empty patches. For bulk status changes (e.g. "mark these 5 done") use update_tasks_status instead.
update_tasks_status
ChatGPTUpdate the status on one or more tasks at once (the same status applies to all). Use when the user says "mark all photographer tasks done" or "I finished [task]" (single). Best-effort partial-failure: a row whose taskId does not exist surfaces as ok: false with a "not found" error rather than silently succeeding. For full body edits to a single task use update_task.
update_tasks_status
ChatGPTUpdate the status on one or more tasks at once (the same status applies to all). Use when the user says "mark all photographer tasks done" or "I finished [task]" (single). Best-effort partial-failure: a row whose taskId does not exist surfaces as ok: false with a "not found" error rather than silently succeeding. For full body edits to a single task use update_task.
update_vendor
ChatGPTUpdate vendor details or status. At least one field beyond vendorId must be provided; empty patches are rejected. Status changes are validated against a conservative state machine: RESEARCHING -> CONTACTED|QUOTED|CANCELLED; CONTACTED -> QUOTED|CANCELLED|RESEARCHING; QUOTED -> BOOKED|CANCELLED|CONTACTED; BOOKED -> PAID|CANCELLED; PAID -> CANCELLED; CANCELLED is terminal. Use when the user says "book [vendor]", "update their quote", or changes vendor information.
update_vendor
ChatGPTUpdate vendor details or status. At least one field beyond vendorId must be provided; empty patches are rejected. Status changes are validated against a conservative state machine: RESEARCHING -> CONTACTED|QUOTED|CANCELLED; CONTACTED -> QUOTED|CANCELLED|RESEARCHING; QUOTED -> BOOKED|CANCELLED|CONTACTED; BOOKED -> PAID|CANCELLED; PAID -> CANCELLED; CANCELLED is terminal. Use when the user says "book [vendor]", "update their quote", or changes vendor information.
update_wedding_metadata
ChatGPTUpdate top-level wedding metadata: the wedding date and/or estimated guest count. Pass at least one of weddingDate or estimatedGuests. Pass null to clear a field, or omit to leave it unchanged. Note: weddingDate is stored on the canonical wedding ceremony event (ceremonyType="wedding"); if no such event exists this returns an error and the caller should add_events first.
update_wedding_metadata
ChatGPTUpdate top-level wedding metadata: the wedding date and/or estimated guest count. Pass at least one of weddingDate or estimatedGuests. Pass null to clear a field, or omit to leave it unchanged. Note: weddingDate is stored on the canonical wedding ceremony event (ceremonyType="wedding"); if no such event exists this returns an error and the caller should add_events first.