@agent-native/scheduling 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -0
- package/dist/actions/_helpers.d.ts +12 -0
- package/dist/actions/_helpers.d.ts.map +1 -0
- package/dist/actions/_helpers.js +49 -0
- package/dist/actions/_helpers.js.map +1 -0
- package/dist/actions/accept-team-invite.d.ts +3 -0
- package/dist/actions/accept-team-invite.d.ts.map +1 -0
- package/dist/actions/accept-team-invite.js +27 -0
- package/dist/actions/accept-team-invite.js.map +1 -0
- package/dist/actions/add-booking-attendee.d.ts +3 -0
- package/dist/actions/add-booking-attendee.d.ts.map +1 -0
- package/dist/actions/add-booking-attendee.js +33 -0
- package/dist/actions/add-booking-attendee.js.map +1 -0
- package/dist/actions/add-booking-note.d.ts +3 -0
- package/dist/actions/add-booking-note.d.ts.map +1 -0
- package/dist/actions/add-booking-note.js +26 -0
- package/dist/actions/add-booking-note.js.map +1 -0
- package/dist/actions/add-date-override.d.ts +3 -0
- package/dist/actions/add-date-override.d.ts.map +1 -0
- package/dist/actions/add-date-override.js +16 -0
- package/dist/actions/add-date-override.js.map +1 -0
- package/dist/actions/add-private-link.d.ts +3 -0
- package/dist/actions/add-private-link.d.ts.map +1 -0
- package/dist/actions/add-private-link.js +31 -0
- package/dist/actions/add-private-link.js.map +1 -0
- package/dist/actions/assign-round-robin-host.d.ts +3 -0
- package/dist/actions/assign-round-robin-host.d.ts.map +1 -0
- package/dist/actions/assign-round-robin-host.js +48 -0
- package/dist/actions/assign-round-robin-host.js.map +1 -0
- package/dist/actions/cancel-booking.d.ts +3 -0
- package/dist/actions/cancel-booking.d.ts.map +1 -0
- package/dist/actions/cancel-booking.js +34 -0
- package/dist/actions/cancel-booking.js.map +1 -0
- package/dist/actions/check-availability.d.ts +3 -0
- package/dist/actions/check-availability.d.ts.map +1 -0
- package/dist/actions/check-availability.js +43 -0
- package/dist/actions/check-availability.js.map +1 -0
- package/dist/actions/confirm-booking.d.ts +3 -0
- package/dist/actions/confirm-booking.d.ts.map +1 -0
- package/dist/actions/confirm-booking.js +12 -0
- package/dist/actions/confirm-booking.js.map +1 -0
- package/dist/actions/connect-calendar.d.ts +3 -0
- package/dist/actions/connect-calendar.d.ts.map +1 -0
- package/dist/actions/connect-calendar.js +26 -0
- package/dist/actions/connect-calendar.js.map +1 -0
- package/dist/actions/connect-video.d.ts +3 -0
- package/dist/actions/connect-video.d.ts.map +1 -0
- package/dist/actions/connect-video.js +54 -0
- package/dist/actions/connect-video.js.map +1 -0
- package/dist/actions/create-booking.d.ts +3 -0
- package/dist/actions/create-booking.d.ts.map +1 -0
- package/dist/actions/create-booking.js +60 -0
- package/dist/actions/create-booking.js.map +1 -0
- package/dist/actions/create-event-type.d.ts +3 -0
- package/dist/actions/create-event-type.d.ts.map +1 -0
- package/dist/actions/create-event-type.js +45 -0
- package/dist/actions/create-event-type.js.map +1 -0
- package/dist/actions/create-host-group.d.ts +3 -0
- package/dist/actions/create-host-group.d.ts.map +1 -0
- package/dist/actions/create-host-group.js +25 -0
- package/dist/actions/create-host-group.js.map +1 -0
- package/dist/actions/create-routing-form.d.ts +3 -0
- package/dist/actions/create-routing-form.d.ts.map +1 -0
- package/dist/actions/create-routing-form.js +39 -0
- package/dist/actions/create-routing-form.js.map +1 -0
- package/dist/actions/create-schedule.d.ts +3 -0
- package/dist/actions/create-schedule.d.ts.map +1 -0
- package/dist/actions/create-schedule.js +32 -0
- package/dist/actions/create-schedule.js.map +1 -0
- package/dist/actions/create-team.d.ts +3 -0
- package/dist/actions/create-team.d.ts.map +1 -0
- package/dist/actions/create-team.js +44 -0
- package/dist/actions/create-team.js.map +1 -0
- package/dist/actions/create-workflow.d.ts +3 -0
- package/dist/actions/create-workflow.d.ts.map +1 -0
- package/dist/actions/create-workflow.js +81 -0
- package/dist/actions/create-workflow.js.map +1 -0
- package/dist/actions/delete-event-type.d.ts +3 -0
- package/dist/actions/delete-event-type.d.ts.map +1 -0
- package/dist/actions/delete-event-type.js +14 -0
- package/dist/actions/delete-event-type.js.map +1 -0
- package/dist/actions/delete-routing-form.d.ts +3 -0
- package/dist/actions/delete-routing-form.d.ts.map +1 -0
- package/dist/actions/delete-routing-form.js +21 -0
- package/dist/actions/delete-routing-form.js.map +1 -0
- package/dist/actions/delete-schedule.d.ts +3 -0
- package/dist/actions/delete-schedule.d.ts.map +1 -0
- package/dist/actions/delete-schedule.js +14 -0
- package/dist/actions/delete-schedule.js.map +1 -0
- package/dist/actions/delete-workflow.d.ts +3 -0
- package/dist/actions/delete-workflow.d.ts.map +1 -0
- package/dist/actions/delete-workflow.js +21 -0
- package/dist/actions/delete-workflow.js.map +1 -0
- package/dist/actions/disconnect-calendar.d.ts +3 -0
- package/dist/actions/disconnect-calendar.d.ts.map +1 -0
- package/dist/actions/disconnect-calendar.js +22 -0
- package/dist/actions/disconnect-calendar.js.map +1 -0
- package/dist/actions/duplicate-event-type.d.ts +3 -0
- package/dist/actions/duplicate-event-type.d.ts.map +1 -0
- package/dist/actions/duplicate-event-type.js +34 -0
- package/dist/actions/duplicate-event-type.js.map +1 -0
- package/dist/actions/export-bookings-csv.d.ts +3 -0
- package/dist/actions/export-bookings-csv.d.ts.map +1 -0
- package/dist/actions/export-bookings-csv.js +53 -0
- package/dist/actions/export-bookings-csv.js.map +1 -0
- package/dist/actions/find-available-slot.d.ts +3 -0
- package/dist/actions/find-available-slot.d.ts.map +1 -0
- package/dist/actions/find-available-slot.js +39 -0
- package/dist/actions/find-available-slot.js.map +1 -0
- package/dist/actions/get-availability.d.ts +3 -0
- package/dist/actions/get-availability.d.ts.map +1 -0
- package/dist/actions/get-availability.js +20 -0
- package/dist/actions/get-availability.js.map +1 -0
- package/dist/actions/get-booking.d.ts +3 -0
- package/dist/actions/get-booking.d.ts.map +1 -0
- package/dist/actions/get-booking.js +9 -0
- package/dist/actions/get-booking.js.map +1 -0
- package/dist/actions/get-event-type.d.ts +3 -0
- package/dist/actions/get-event-type.d.ts.map +1 -0
- package/dist/actions/get-event-type.js +27 -0
- package/dist/actions/get-event-type.js.map +1 -0
- package/dist/actions/install-conferencing-app.d.ts +3 -0
- package/dist/actions/install-conferencing-app.d.ts.map +1 -0
- package/dist/actions/install-conferencing-app.js +28 -0
- package/dist/actions/install-conferencing-app.js.map +1 -0
- package/dist/actions/invite-team-member.d.ts +3 -0
- package/dist/actions/invite-team-member.d.ts.map +1 -0
- package/dist/actions/invite-team-member.js +30 -0
- package/dist/actions/invite-team-member.js.map +1 -0
- package/dist/actions/list-bookings.d.ts +3 -0
- package/dist/actions/list-bookings.d.ts.map +1 -0
- package/dist/actions/list-bookings.js +35 -0
- package/dist/actions/list-bookings.js.map +1 -0
- package/dist/actions/list-calendar-integrations.d.ts +3 -0
- package/dist/actions/list-calendar-integrations.d.ts.map +1 -0
- package/dist/actions/list-calendar-integrations.js +26 -0
- package/dist/actions/list-calendar-integrations.js.map +1 -0
- package/dist/actions/list-event-types.d.ts +3 -0
- package/dist/actions/list-event-types.d.ts.map +1 -0
- package/dist/actions/list-event-types.js +31 -0
- package/dist/actions/list-event-types.js.map +1 -0
- package/dist/actions/list-routing-form-responses.d.ts +3 -0
- package/dist/actions/list-routing-form-responses.d.ts.map +1 -0
- package/dist/actions/list-routing-form-responses.js +24 -0
- package/dist/actions/list-routing-form-responses.js.map +1 -0
- package/dist/actions/list-routing-forms.d.ts +3 -0
- package/dist/actions/list-routing-forms.d.ts.map +1 -0
- package/dist/actions/list-routing-forms.js +29 -0
- package/dist/actions/list-routing-forms.js.map +1 -0
- package/dist/actions/list-schedules.d.ts +3 -0
- package/dist/actions/list-schedules.d.ts.map +1 -0
- package/dist/actions/list-schedules.js +16 -0
- package/dist/actions/list-schedules.js.map +1 -0
- package/dist/actions/list-selected-calendars.d.ts +3 -0
- package/dist/actions/list-selected-calendars.d.ts.map +1 -0
- package/dist/actions/list-selected-calendars.js +42 -0
- package/dist/actions/list-selected-calendars.js.map +1 -0
- package/dist/actions/list-workflows.d.ts +3 -0
- package/dist/actions/list-workflows.d.ts.map +1 -0
- package/dist/actions/list-workflows.js +29 -0
- package/dist/actions/list-workflows.js.map +1 -0
- package/dist/actions/mark-no-show.d.ts +3 -0
- package/dist/actions/mark-no-show.d.ts.map +1 -0
- package/dist/actions/mark-no-show.js +15 -0
- package/dist/actions/mark-no-show.js.map +1 -0
- package/dist/actions/refresh-busy-times.d.ts +3 -0
- package/dist/actions/refresh-busy-times.d.ts.map +1 -0
- package/dist/actions/refresh-busy-times.js +25 -0
- package/dist/actions/refresh-busy-times.js.map +1 -0
- package/dist/actions/remove-booking-attendee.d.ts +3 -0
- package/dist/actions/remove-booking-attendee.d.ts.map +1 -0
- package/dist/actions/remove-booking-attendee.js +20 -0
- package/dist/actions/remove-booking-attendee.js.map +1 -0
- package/dist/actions/remove-date-override.d.ts +3 -0
- package/dist/actions/remove-date-override.d.ts.map +1 -0
- package/dist/actions/remove-date-override.js +15 -0
- package/dist/actions/remove-date-override.js.map +1 -0
- package/dist/actions/remove-team-member.d.ts +3 -0
- package/dist/actions/remove-team-member.d.ts.map +1 -0
- package/dist/actions/remove-team-member.js +18 -0
- package/dist/actions/remove-team-member.js.map +1 -0
- package/dist/actions/reorder-event-types.d.ts +3 -0
- package/dist/actions/reorder-event-types.d.ts.map +1 -0
- package/dist/actions/reorder-event-types.js +18 -0
- package/dist/actions/reorder-event-types.js.map +1 -0
- package/dist/actions/reschedule-booking.d.ts +3 -0
- package/dist/actions/reschedule-booking.d.ts.map +1 -0
- package/dist/actions/reschedule-booking.js +38 -0
- package/dist/actions/reschedule-booking.js.map +1 -0
- package/dist/actions/revoke-private-link.d.ts +3 -0
- package/dist/actions/revoke-private-link.d.ts.map +1 -0
- package/dist/actions/revoke-private-link.js +16 -0
- package/dist/actions/revoke-private-link.js.map +1 -0
- package/dist/actions/send-reschedule-link.d.ts +3 -0
- package/dist/actions/send-reschedule-link.d.ts.map +1 -0
- package/dist/actions/send-reschedule-link.js +18 -0
- package/dist/actions/send-reschedule-link.js.map +1 -0
- package/dist/actions/set-appearance.d.ts +3 -0
- package/dist/actions/set-appearance.d.ts.map +1 -0
- package/dist/actions/set-appearance.js +23 -0
- package/dist/actions/set-appearance.js.map +1 -0
- package/dist/actions/set-default-conferencing-app.d.ts +3 -0
- package/dist/actions/set-default-conferencing-app.d.ts.map +1 -0
- package/dist/actions/set-default-conferencing-app.js +25 -0
- package/dist/actions/set-default-conferencing-app.js.map +1 -0
- package/dist/actions/set-default-schedule.d.ts +3 -0
- package/dist/actions/set-default-schedule.d.ts.map +1 -0
- package/dist/actions/set-default-schedule.js +15 -0
- package/dist/actions/set-default-schedule.js.map +1 -0
- package/dist/actions/set-destination-calendar.d.ts +3 -0
- package/dist/actions/set-destination-calendar.d.ts.map +1 -0
- package/dist/actions/set-destination-calendar.js +39 -0
- package/dist/actions/set-destination-calendar.js.map +1 -0
- package/dist/actions/set-event-type-hosts.d.ts +3 -0
- package/dist/actions/set-event-type-hosts.d.ts.map +1 -0
- package/dist/actions/set-event-type-hosts.js +41 -0
- package/dist/actions/set-event-type-hosts.js.map +1 -0
- package/dist/actions/set-event-type-location.d.ts +3 -0
- package/dist/actions/set-event-type-location.d.ts.map +1 -0
- package/dist/actions/set-event-type-location.js +18 -0
- package/dist/actions/set-event-type-location.js.map +1 -0
- package/dist/actions/set-host-availability-override.d.ts +3 -0
- package/dist/actions/set-host-availability-override.d.ts.map +1 -0
- package/dist/actions/set-host-availability-override.js +21 -0
- package/dist/actions/set-host-availability-override.js.map +1 -0
- package/dist/actions/set-team-branding.d.ts +3 -0
- package/dist/actions/set-team-branding.d.ts.map +1 -0
- package/dist/actions/set-team-branding.js +28 -0
- package/dist/actions/set-team-branding.js.map +1 -0
- package/dist/actions/submit-routing-form-response.d.ts +3 -0
- package/dist/actions/submit-routing-form-response.d.ts.map +1 -0
- package/dist/actions/submit-routing-form-response.js +46 -0
- package/dist/actions/submit-routing-form-response.js.map +1 -0
- package/dist/actions/toggle-event-type-hidden.d.ts +3 -0
- package/dist/actions/toggle-event-type-hidden.d.ts.map +1 -0
- package/dist/actions/toggle-event-type-hidden.js +19 -0
- package/dist/actions/toggle-event-type-hidden.js.map +1 -0
- package/dist/actions/toggle-selected-calendar.d.ts +3 -0
- package/dist/actions/toggle-selected-calendar.d.ts.map +1 -0
- package/dist/actions/toggle-selected-calendar.js +40 -0
- package/dist/actions/toggle-selected-calendar.js.map +1 -0
- package/dist/actions/toggle-workflow.d.ts +3 -0
- package/dist/actions/toggle-workflow.d.ts.map +1 -0
- package/dist/actions/toggle-workflow.js +26 -0
- package/dist/actions/toggle-workflow.js.map +1 -0
- package/dist/actions/update-event-type.d.ts +3 -0
- package/dist/actions/update-event-type.d.ts.map +1 -0
- package/dist/actions/update-event-type.js +54 -0
- package/dist/actions/update-event-type.js.map +1 -0
- package/dist/actions/update-member-role.d.ts +3 -0
- package/dist/actions/update-member-role.d.ts.map +1 -0
- package/dist/actions/update-member-role.js +23 -0
- package/dist/actions/update-member-role.js.map +1 -0
- package/dist/actions/update-profile.d.ts +3 -0
- package/dist/actions/update-profile.d.ts.map +1 -0
- package/dist/actions/update-profile.js +34 -0
- package/dist/actions/update-profile.js.map +1 -0
- package/dist/actions/update-routing-form.d.ts +3 -0
- package/dist/actions/update-routing-form.d.ts.map +1 -0
- package/dist/actions/update-routing-form.js +40 -0
- package/dist/actions/update-routing-form.js.map +1 -0
- package/dist/actions/update-schedule.d.ts +3 -0
- package/dist/actions/update-schedule.d.ts.map +1 -0
- package/dist/actions/update-schedule.js +44 -0
- package/dist/actions/update-schedule.js.map +1 -0
- package/dist/actions/update-workflow.d.ts +3 -0
- package/dist/actions/update-workflow.d.ts.map +1 -0
- package/dist/actions/update-workflow.js +89 -0
- package/dist/actions/update-workflow.js.map +1 -0
- package/dist/core/buffers.d.ts +25 -0
- package/dist/core/buffers.d.ts.map +1 -0
- package/dist/core/buffers.js +21 -0
- package/dist/core/buffers.js.map +1 -0
- package/dist/core/conflicts.d.ts +11 -0
- package/dist/core/conflicts.d.ts.map +1 -0
- package/dist/core/conflicts.js +42 -0
- package/dist/core/conflicts.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/limits.d.ts +23 -0
- package/dist/core/limits.d.ts.map +1 -0
- package/dist/core/limits.js +28 -0
- package/dist/core/limits.js.map +1 -0
- package/dist/core/round-robin.d.ts +31 -0
- package/dist/core/round-robin.d.ts.map +1 -0
- package/dist/core/round-robin.js +57 -0
- package/dist/core/round-robin.js.map +1 -0
- package/dist/core/rrule.d.ts +2 -0
- package/dist/core/rrule.d.ts.map +1 -0
- package/dist/core/rrule.js +14 -0
- package/dist/core/rrule.js.map +1 -0
- package/dist/core/rules.d.ts +26 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +40 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/slots.d.ts +58 -0
- package/dist/core/slots.d.ts.map +1 -0
- package/dist/core/slots.js +98 -0
- package/dist/core/slots.js.map +1 -0
- package/dist/core/time.d.ts +52 -0
- package/dist/core/time.d.ts.map +1 -0
- package/dist/core/time.js +109 -0
- package/dist/core/time.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +28 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +160 -0
- package/dist/manifest.js.map +1 -0
- package/dist/react/components/SlotPicker.d.ts +21 -0
- package/dist/react/components/SlotPicker.d.ts.map +1 -0
- package/dist/react/components/SlotPicker.js +15 -0
- package/dist/react/components/SlotPicker.js.map +1 -0
- package/dist/react/components/TimezoneSelect.d.ts +7 -0
- package/dist/react/components/TimezoneSelect.d.ts.map +1 -0
- package/dist/react/components/TimezoneSelect.js +31 -0
- package/dist/react/components/TimezoneSelect.js.map +1 -0
- package/dist/react/components/booking-links/AvailabilityEditor.d.ts +21 -0
- package/dist/react/components/booking-links/AvailabilityEditor.d.ts.map +1 -0
- package/dist/react/components/booking-links/AvailabilityEditor.js +102 -0
- package/dist/react/components/booking-links/AvailabilityEditor.js.map +1 -0
- package/dist/react/components/booking-links/BookingLinkCreateDialog.d.ts +22 -0
- package/dist/react/components/booking-links/BookingLinkCreateDialog.d.ts.map +1 -0
- package/dist/react/components/booking-links/BookingLinkCreateDialog.js +75 -0
- package/dist/react/components/booking-links/BookingLinkCreateDialog.js.map +1 -0
- package/dist/react/components/booking-links/ConferencingSelector.d.ts +19 -0
- package/dist/react/components/booking-links/ConferencingSelector.d.ts.map +1 -0
- package/dist/react/components/booking-links/ConferencingSelector.js +87 -0
- package/dist/react/components/booking-links/ConferencingSelector.js.map +1 -0
- package/dist/react/components/booking-links/CustomFieldsEditor.d.ts +19 -0
- package/dist/react/components/booking-links/CustomFieldsEditor.d.ts.map +1 -0
- package/dist/react/components/booking-links/CustomFieldsEditor.js +117 -0
- package/dist/react/components/booking-links/CustomFieldsEditor.js.map +1 -0
- package/dist/react/components/booking-links/DurationPicker.d.ts +9 -0
- package/dist/react/components/booking-links/DurationPicker.d.ts.map +1 -0
- package/dist/react/components/booking-links/DurationPicker.js +56 -0
- package/dist/react/components/booking-links/DurationPicker.js.map +1 -0
- package/dist/react/components/booking-links/SlugEditor.d.ts +15 -0
- package/dist/react/components/booking-links/SlugEditor.d.ts.map +1 -0
- package/dist/react/components/booking-links/SlugEditor.js +64 -0
- package/dist/react/components/booking-links/SlugEditor.js.map +1 -0
- package/dist/react/components/booking-links/index.d.ts +16 -0
- package/dist/react/components/booking-links/index.d.ts.map +1 -0
- package/dist/react/components/booking-links/index.js +16 -0
- package/dist/react/components/booking-links/index.js.map +1 -0
- package/dist/react/components/index.d.ts +14 -0
- package/dist/react/components/index.d.ts.map +1 -0
- package/dist/react/components/index.js +14 -0
- package/dist/react/components/index.js.map +1 -0
- package/dist/react/hooks/useBookingFlow.d.ts +33 -0
- package/dist/react/hooks/useBookingFlow.d.ts.map +1 -0
- package/dist/react/hooks/useBookingFlow.js +51 -0
- package/dist/react/hooks/useBookingFlow.js.map +1 -0
- package/dist/react/hooks/useEventType.d.ts +21 -0
- package/dist/react/hooks/useEventType.d.ts.map +1 -0
- package/dist/react/hooks/useEventType.js +38 -0
- package/dist/react/hooks/useEventType.js.map +1 -0
- package/dist/react/hooks/useReschedule.d.ts +13 -0
- package/dist/react/hooks/useReschedule.d.ts.map +1 -0
- package/dist/react/hooks/useReschedule.js +33 -0
- package/dist/react/hooks/useReschedule.js.map +1 -0
- package/dist/react/hooks/useSlots.d.ts +32 -0
- package/dist/react/hooks/useSlots.d.ts.map +1 -0
- package/dist/react/hooks/useSlots.js +59 -0
- package/dist/react/hooks/useSlots.js.map +1 -0
- package/dist/react/hooks/useTimezone.d.ts +3 -0
- package/dist/react/hooks/useTimezone.d.ts.map +1 -0
- package/dist/react/hooks/useTimezone.js +30 -0
- package/dist/react/hooks/useTimezone.js.map +1 -0
- package/dist/react/index.d.ts +11 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +11 -0
- package/dist/react/index.js.map +1 -0
- package/dist/schema/bookings.d.ts +1201 -0
- package/dist/schema/bookings.d.ts.map +1 -0
- package/dist/schema/bookings.js +100 -0
- package/dist/schema/bookings.js.map +1 -0
- package/dist/schema/calendar-cache.d.ts +160 -0
- package/dist/schema/calendar-cache.d.ts.map +1 -0
- package/dist/schema/calendar-cache.js +23 -0
- package/dist/schema/calendar-cache.js.map +1 -0
- package/dist/schema/credentials.d.ts +743 -0
- package/dist/schema/credentials.d.ts.map +1 -0
- package/dist/schema/credentials.js +79 -0
- package/dist/schema/credentials.js.map +1 -0
- package/dist/schema/event-types.d.ts +1292 -0
- package/dist/schema/event-types.d.ts.map +1 -0
- package/dist/schema/event-types.js +131 -0
- package/dist/schema/event-types.js.map +1 -0
- package/dist/schema/index.d.ts +20 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +20 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/routing-forms.d.ts +571 -0
- package/dist/schema/routing-forms.d.ts.map +1 -0
- package/dist/schema/routing-forms.js +44 -0
- package/dist/schema/routing-forms.js.map +1 -0
- package/dist/schema/schedules.d.ts +830 -0
- package/dist/schema/schedules.d.ts.map +1 -0
- package/dist/schema/schedules.js +72 -0
- package/dist/schema/schedules.js.map +1 -0
- package/dist/schema/teams.d.ts +569 -0
- package/dist/schema/teams.d.ts.map +1 -0
- package/dist/schema/teams.js +38 -0
- package/dist/schema/teams.js.map +1 -0
- package/dist/schema/workflows.d.ts +1367 -0
- package/dist/schema/workflows.d.ts.map +1 -0
- package/dist/schema/workflows.js +116 -0
- package/dist/schema/workflows.js.map +1 -0
- package/dist/server/availability-engine.d.ts +21 -0
- package/dist/server/availability-engine.d.ts.map +1 -0
- package/dist/server/availability-engine.js +135 -0
- package/dist/server/availability-engine.js.map +1 -0
- package/dist/server/booking-service.d.ts +46 -0
- package/dist/server/booking-service.d.ts.map +1 -0
- package/dist/server/booking-service.js +198 -0
- package/dist/server/booking-service.js.map +1 -0
- package/dist/server/bookings-repo.d.ts +48 -0
- package/dist/server/bookings-repo.d.ts.map +1 -0
- package/dist/server/bookings-repo.js +244 -0
- package/dist/server/bookings-repo.js.map +1 -0
- package/dist/server/context.d.ts +33 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +11 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/db-types.d.ts +15 -0
- package/dist/server/db-types.d.ts.map +1 -0
- package/dist/server/db-types.js +2 -0
- package/dist/server/db-types.js.map +1 -0
- package/dist/server/event-types-repo.d.ts +46 -0
- package/dist/server/event-types-repo.d.ts.map +1 -0
- package/dist/server/event-types-repo.js +320 -0
- package/dist/server/event-types-repo.js.map +1 -0
- package/dist/server/hooks.d.ts +6 -0
- package/dist/server/hooks.d.ts.map +1 -0
- package/dist/server/hooks.js +173 -0
- package/dist/server/hooks.js.map +1 -0
- package/dist/server/ics.d.ts +12 -0
- package/dist/server/ics.d.ts.map +1 -0
- package/dist/server/ics.js +81 -0
- package/dist/server/ics.js.map +1 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +12 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/providers/builtin-video.d.ts +12 -0
- package/dist/server/providers/builtin-video.d.ts.map +1 -0
- package/dist/server/providers/builtin-video.js +50 -0
- package/dist/server/providers/builtin-video.js.map +1 -0
- package/dist/server/providers/cal-video.d.ts +12 -0
- package/dist/server/providers/cal-video.d.ts.map +1 -0
- package/dist/server/providers/cal-video.js +50 -0
- package/dist/server/providers/cal-video.js.map +1 -0
- package/dist/server/providers/google-calendar.d.ts +28 -0
- package/dist/server/providers/google-calendar.d.ts.map +1 -0
- package/dist/server/providers/google-calendar.js +163 -0
- package/dist/server/providers/google-calendar.js.map +1 -0
- package/dist/server/providers/google-meet.d.ts +10 -0
- package/dist/server/providers/google-meet.d.ts.map +1 -0
- package/dist/server/providers/google-meet.js +14 -0
- package/dist/server/providers/google-meet.js.map +1 -0
- package/dist/server/providers/index.d.ts +8 -0
- package/dist/server/providers/index.d.ts.map +1 -0
- package/dist/server/providers/index.js +8 -0
- package/dist/server/providers/index.js.map +1 -0
- package/dist/server/providers/office365.d.ts +21 -0
- package/dist/server/providers/office365.d.ts.map +1 -0
- package/dist/server/providers/office365.js +146 -0
- package/dist/server/providers/office365.js.map +1 -0
- package/dist/server/providers/registry.d.ts +14 -0
- package/dist/server/providers/registry.d.ts.map +1 -0
- package/dist/server/providers/registry.js +28 -0
- package/dist/server/providers/registry.js.map +1 -0
- package/dist/server/providers/types.d.ts +133 -0
- package/dist/server/providers/types.d.ts.map +1 -0
- package/dist/server/providers/types.js +2 -0
- package/dist/server/providers/types.js.map +1 -0
- package/dist/server/providers/zoom.d.ts +34 -0
- package/dist/server/providers/zoom.d.ts.map +1 -0
- package/dist/server/providers/zoom.js +111 -0
- package/dist/server/providers/zoom.js.map +1 -0
- package/dist/server/schedules-repo.d.ts +26 -0
- package/dist/server/schedules-repo.d.ts.map +1 -0
- package/dist/server/schedules-repo.js +223 -0
- package/dist/server/schedules-repo.js.map +1 -0
- package/dist/server/video-oauth-state.d.ts +28 -0
- package/dist/server/video-oauth-state.d.ts.map +1 -0
- package/dist/server/video-oauth-state.js +101 -0
- package/dist/server/video-oauth-state.js.map +1 -0
- package/dist/server/video-oauth.d.ts +18 -0
- package/dist/server/video-oauth.d.ts.map +1 -0
- package/dist/server/video-oauth.js +82 -0
- package/dist/server/video-oauth.js.map +1 -0
- package/dist/shared/index.d.ts +298 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +6 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/docs/UI_UNIFICATION.md +78 -0
- package/docs/actions.md +64 -0
- package/docs/eject.md +18 -0
- package/docs/llms-full.txt +1022 -0
- package/docs/llms.txt +89 -0
- package/docs/providers.md +68 -0
- package/docs/schema.md +86 -0
- package/docs/skills/availability/SKILL.md +44 -0
- package/docs/skills/booker/SKILL.md +51 -0
- package/docs/skills/bookings/SKILL.md +43 -0
- package/docs/skills/embeds/SKILL.md +49 -0
- package/docs/skills/event-types/SKILL.md +40 -0
- package/docs/skills/integrations/SKILL.md +52 -0
- package/docs/skills/routing-forms/SKILL.md +39 -0
- package/docs/skills/scheduling-basics/SKILL.md +51 -0
- package/docs/skills/slot-engine/SKILL.md +52 -0
- package/docs/skills/team-scheduling/SKILL.md +54 -0
- package/docs/skills/workflows/SKILL.md +55 -0
- package/package.json +87 -0
- package/src/actions/_helpers.ts +62 -0
- package/src/actions/accept-team-invite.ts +26 -0
- package/src/actions/add-booking-attendee.ts +32 -0
- package/src/actions/add-booking-note.ts +25 -0
- package/src/actions/add-date-override.ts +23 -0
- package/src/actions/add-private-link.ts +31 -0
- package/src/actions/assign-round-robin-host.ts +54 -0
- package/src/actions/cancel-booking.ts +39 -0
- package/src/actions/check-availability.ts +46 -0
- package/src/actions/confirm-booking.ts +15 -0
- package/src/actions/connect-calendar.ts +27 -0
- package/src/actions/connect-video.ts +57 -0
- package/src/actions/create-booking.ts +62 -0
- package/src/actions/create-event-type.ts +45 -0
- package/src/actions/create-host-group.ts +25 -0
- package/src/actions/create-routing-form.ts +39 -0
- package/src/actions/create-schedule.ts +36 -0
- package/src/actions/create-team.ts +44 -0
- package/src/actions/create-workflow.ts +83 -0
- package/src/actions/delete-event-type.ts +14 -0
- package/src/actions/delete-routing-form.ts +21 -0
- package/src/actions/delete-schedule.ts +14 -0
- package/src/actions/delete-workflow.ts +21 -0
- package/src/actions/disconnect-calendar.ts +22 -0
- package/src/actions/duplicate-event-type.ts +36 -0
- package/src/actions/export-bookings-csv.ts +54 -0
- package/src/actions/find-available-slot.ts +40 -0
- package/src/actions/get-availability.ts +20 -0
- package/src/actions/get-booking.ts +9 -0
- package/src/actions/get-event-type.ts +29 -0
- package/src/actions/install-conferencing-app.ts +29 -0
- package/src/actions/invite-team-member.ts +30 -0
- package/src/actions/list-bookings.ts +36 -0
- package/src/actions/list-calendar-integrations.ts +26 -0
- package/src/actions/list-event-types.ts +31 -0
- package/src/actions/list-routing-form-responses.ts +24 -0
- package/src/actions/list-routing-forms.ts +34 -0
- package/src/actions/list-schedules.ts +16 -0
- package/src/actions/list-selected-calendars.ts +41 -0
- package/src/actions/list-workflows.ts +34 -0
- package/src/actions/mark-no-show.ts +15 -0
- package/src/actions/refresh-busy-times.ts +26 -0
- package/src/actions/remove-booking-attendee.ts +24 -0
- package/src/actions/remove-date-override.ts +15 -0
- package/src/actions/remove-team-member.ts +23 -0
- package/src/actions/reorder-event-types.ts +18 -0
- package/src/actions/reschedule-booking.ts +45 -0
- package/src/actions/revoke-private-link.ts +16 -0
- package/src/actions/send-reschedule-link.ts +18 -0
- package/src/actions/set-appearance.ts +24 -0
- package/src/actions/set-default-conferencing-app.ts +25 -0
- package/src/actions/set-default-schedule.ts +15 -0
- package/src/actions/set-destination-calendar.ts +39 -0
- package/src/actions/set-event-type-hosts.ts +43 -0
- package/src/actions/set-event-type-location.ts +18 -0
- package/src/actions/set-host-availability-override.ts +27 -0
- package/src/actions/set-team-branding.ts +28 -0
- package/src/actions/submit-routing-form-response.ts +47 -0
- package/src/actions/toggle-event-type-hidden.ts +21 -0
- package/src/actions/toggle-selected-calendar.ts +43 -0
- package/src/actions/toggle-workflow.ts +25 -0
- package/src/actions/update-event-type.ts +54 -0
- package/src/actions/update-member-role.ts +28 -0
- package/src/actions/update-profile.ts +36 -0
- package/src/actions/update-routing-form.ts +36 -0
- package/src/actions/update-schedule.ts +53 -0
- package/src/actions/update-workflow.ts +89 -0
- package/src/core/buffers.ts +46 -0
- package/src/core/conflicts.ts +49 -0
- package/src/core/index.ts +8 -0
- package/src/core/limits.ts +60 -0
- package/src/core/round-robin.test.ts +95 -0
- package/src/core/round-robin.ts +103 -0
- package/src/core/rrule.ts +20 -0
- package/src/core/rules.ts +66 -0
- package/src/core/slots.test.ts +246 -0
- package/src/core/slots.ts +223 -0
- package/src/core/time.ts +136 -0
- package/src/index.ts +14 -0
- package/src/manifest.ts +174 -0
- package/src/react/components/SlotPicker.tsx +72 -0
- package/src/react/components/TimezoneSelect.tsx +55 -0
- package/src/react/components/_shadcn-shims.d.ts +251 -0
- package/src/react/components/booking-links/AvailabilityEditor.tsx +177 -0
- package/src/react/components/booking-links/BookingLinkCreateDialog.tsx +189 -0
- package/src/react/components/booking-links/ConferencingSelector.tsx +255 -0
- package/src/react/components/booking-links/CustomFieldsEditor.tsx +420 -0
- package/src/react/components/booking-links/DurationPicker.tsx +115 -0
- package/src/react/components/booking-links/SlugEditor.tsx +149 -0
- package/src/react/components/booking-links/index.ts +15 -0
- package/src/react/components/index.ts +13 -0
- package/src/react/hooks/useBookingFlow.ts +113 -0
- package/src/react/hooks/useEventType.ts +52 -0
- package/src/react/hooks/useReschedule.ts +39 -0
- package/src/react/hooks/useSlots.ts +88 -0
- package/src/react/hooks/useTimezone.ts +29 -0
- package/src/react/index.ts +10 -0
- package/src/schema/bookings.ts +124 -0
- package/src/schema/calendar-cache.ts +23 -0
- package/src/schema/credentials.ts +83 -0
- package/src/schema/event-types.ts +154 -0
- package/src/schema/index.ts +19 -0
- package/src/schema/routing-forms.ts +52 -0
- package/src/schema/schedules.ts +83 -0
- package/src/schema/teams.ts +46 -0
- package/src/schema/workflows.ts +128 -0
- package/src/server/availability-engine.ts +193 -0
- package/src/server/booking-service.ts +264 -0
- package/src/server/bookings-repo.ts +330 -0
- package/src/server/context.ts +49 -0
- package/src/server/db-types.ts +16 -0
- package/src/server/event-types-repo.ts +385 -0
- package/src/server/hooks.ts +213 -0
- package/src/server/ics.ts +99 -0
- package/src/server/index.ts +11 -0
- package/src/server/providers/builtin-video.ts +62 -0
- package/src/server/providers/google-calendar.ts +237 -0
- package/src/server/providers/google-meet.ts +22 -0
- package/src/server/providers/index.ts +7 -0
- package/src/server/providers/office365.ts +208 -0
- package/src/server/providers/registry.ts +43 -0
- package/src/server/providers/types.ts +126 -0
- package/src/server/providers/zoom.ts +173 -0
- package/src/server/schedules-repo.ts +279 -0
- package/src/server/video-oauth-state.test.ts +120 -0
- package/src/server/video-oauth-state.ts +116 -0
- package/src/server/video-oauth.ts +99 -0
- package/src/shared/index.ts +366 -0
- package/src/version.ts +1 -0
|
@@ -0,0 +1,1022 @@
|
|
|
1
|
+
# @agent-native/scheduling — Full Documentation Bundle
|
|
2
|
+
|
|
3
|
+
Generated by scripts/build-llms-full.mjs. Includes every markdown doc
|
|
4
|
+
and skill. For a curated index, see llms.txt.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
## UI_UNIFICATION.md
|
|
9
|
+
|
|
10
|
+
# UI Unification — booking-link / event-type editor
|
|
11
|
+
|
|
12
|
+
As of 0.1.x the `@agent-native/scheduling` package ships a small set of
|
|
13
|
+
shared React components the `calendar` and `scheduling` templates both
|
|
14
|
+
consume so the two apps keep visual parity without duplicating logic.
|
|
15
|
+
|
|
16
|
+
Exported from `@agent-native/scheduling/react/components`:
|
|
17
|
+
|
|
18
|
+
| Component | Purpose |
|
|
19
|
+
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
|
|
20
|
+
| `ConferencingSelector` | 2x2 grid of "No conferencing / Google Meet / Zoom / Custom link"; includes a "Connect Zoom" affordance that starts real OAuth |
|
|
21
|
+
| `SlugEditor` | Inline-editable URL preview (`host/prefix/username/slug`) with click-to-edit segments |
|
|
22
|
+
| `CustomFieldsEditor` | Add / edit / reorder / remove custom booking-form fields, with presets (LinkedIn, Company, Phone, Website) |
|
|
23
|
+
| `DurationPicker` | Multi-select pills (15 / 30 / 45 / 60 + custom) for per-event-type durations |
|
|
24
|
+
| `BookingLinkCreateDialog` | Modal prompting for Title / URL / Duration / Description when creating a new event type |
|
|
25
|
+
| `AvailabilityEditor` | Weekly schedule grid with toggles + start/end time pickers; `summarizeAvailability(ws)` helper for list subtitles |
|
|
26
|
+
|
|
27
|
+
The existing `SlotPicker` and `TimezoneSelect` continue to live alongside
|
|
28
|
+
these.
|
|
29
|
+
|
|
30
|
+
## Shadcn primitives required in the consumer
|
|
31
|
+
|
|
32
|
+
Every component in this package imports shadcn primitives via the
|
|
33
|
+
standard `@/components/ui/*` alias (resolved by the consumer's bundler).
|
|
34
|
+
The package ships type shims for them in
|
|
35
|
+
`react/components/_shadcn-shims.d.ts` so it compiles cleanly on its own.
|
|
36
|
+
|
|
37
|
+
Add these to your template's `app/components/ui/` before importing any
|
|
38
|
+
of the shared components:
|
|
39
|
+
|
|
40
|
+
| Component required | Used by |
|
|
41
|
+
| ------------------ | ----------------------------------------------------------------------------------------------------- |
|
|
42
|
+
| `button` | ConferencingSelector, BookingLinkCreateDialog, DurationPicker |
|
|
43
|
+
| `input` | ConferencingSelector, CustomFieldsEditor, DurationPicker, BookingLinkCreateDialog, AvailabilityEditor |
|
|
44
|
+
| `label` | ConferencingSelector, CustomFieldsEditor, SlugEditor, BookingLinkCreateDialog, AvailabilityEditor |
|
|
45
|
+
| `textarea` | CustomFieldsEditor, BookingLinkCreateDialog |
|
|
46
|
+
| `switch` | CustomFieldsEditor, AvailabilityEditor |
|
|
47
|
+
| `badge` | ConferencingSelector |
|
|
48
|
+
| `dialog` | BookingLinkCreateDialog |
|
|
49
|
+
|
|
50
|
+
Icons come from `@tabler/icons-react` (not bundled; each template already
|
|
51
|
+
depends on it).
|
|
52
|
+
|
|
53
|
+
## What moved where
|
|
54
|
+
|
|
55
|
+
| Old home (calendar template) | New home |
|
|
56
|
+
| ---------------------------------------- | --------------------------------------------------------------------- |
|
|
57
|
+
| `ConferencingEditor` in BookingLinksPage | `ConferencingSelector` in `@agent-native/scheduling/react/components` |
|
|
58
|
+
| `EditableBookingUrl` in BookingLinksPage | `SlugEditor` in the package |
|
|
59
|
+
| `CustomFieldsEditor` in BookingLinksPage | `CustomFieldsEditor` in the package |
|
|
60
|
+
|
|
61
|
+
| Old home (scheduling template) | New home |
|
|
62
|
+
| ------------------------------------------ | --------------------------------------------------------------------------- |
|
|
63
|
+
| `DurationsEditor` in event-type editor | `DurationPicker` in the package |
|
|
64
|
+
| `LocationEditor` + `AppsGrid` (two places) | `ConferencingSelector` in the package (Apps tab removed — it was redundant) |
|
|
65
|
+
| Inline create dialog in `_index` | `BookingLinkCreateDialog` in the package |
|
|
66
|
+
|
|
67
|
+
## Zoom became real OAuth
|
|
68
|
+
|
|
69
|
+
Previously the calendar template's Zoom option asked the user to paste a
|
|
70
|
+
personal meeting URL. The scheduling template had no OAuth-based Zoom at
|
|
71
|
+
all (only the `zoom_video` "app install" placeholder).
|
|
72
|
+
|
|
73
|
+
Both now use real Zoom OAuth via the provider's new optional
|
|
74
|
+
`startOAuth` / `completeOAuth` methods on `VideoProvider`. Consumers:
|
|
75
|
+
|
|
76
|
+
- **Scheduling template** — calls the package's `connect-video` action
|
|
77
|
+
for `zoom_video`, callback lands at
|
|
78
|
+
`/_agent-native/oauth/zoom/callback.get.ts`, tokens stored via
|
|
79
|
+
`completeVideoOAuth()`.
|
|
80
|
+
- **Calendar template** — ships a lightweight `server/lib/zoom.ts` that
|
|
81
|
+
uses the package's `createZoomProvider` but stores tokens directly in
|
|
82
|
+
core's `oauth_tokens` keyed by Zoom user id + owner email. The
|
|
83
|
+
booking-create handler calls `createZoomMeeting()` when the booking
|
|
84
|
+
link's conferencing type is `zoom`.
|
|
85
|
+
|
|
86
|
+
Both flows auto-refresh the Zoom access token when it's within 60s of
|
|
87
|
+
expiry and mark credentials invalid if Zoom returns 401/403.
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
## actions.md
|
|
92
|
+
|
|
93
|
+
# Actions
|
|
94
|
+
|
|
95
|
+
Every action is a `defineAction` module you can re-export into your
|
|
96
|
+
template's `actions/` folder:
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
// actions/create-booking.ts
|
|
100
|
+
export { default } from "@agent-native/scheduling/actions/create-booking";
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
The action scaffolder can do this for you. Full list:
|
|
104
|
+
|
|
105
|
+
## Event types
|
|
106
|
+
|
|
107
|
+
- list-event-types, get-event-type, create-event-type, update-event-type,
|
|
108
|
+
delete-event-type, duplicate-event-type, toggle-event-type-hidden,
|
|
109
|
+
reorder-event-types, set-event-type-location, add-private-link,
|
|
110
|
+
revoke-private-link
|
|
111
|
+
|
|
112
|
+
## Availability
|
|
113
|
+
|
|
114
|
+
- list-schedules, create-schedule, update-schedule, delete-schedule,
|
|
115
|
+
set-default-schedule, add-date-override, remove-date-override,
|
|
116
|
+
get-availability, check-availability, find-available-slot
|
|
117
|
+
|
|
118
|
+
## Bookings
|
|
119
|
+
|
|
120
|
+
- list-bookings, get-booking, create-booking, reschedule-booking,
|
|
121
|
+
cancel-booking, confirm-booking, mark-no-show, add-booking-attendee,
|
|
122
|
+
remove-booking-attendee, send-reschedule-link, add-booking-note,
|
|
123
|
+
export-bookings-csv
|
|
124
|
+
|
|
125
|
+
## Integrations
|
|
126
|
+
|
|
127
|
+
- list-calendar-integrations, connect-calendar, disconnect-calendar,
|
|
128
|
+
list-selected-calendars, toggle-selected-calendar, set-destination-calendar,
|
|
129
|
+
refresh-busy-times, install-conferencing-app
|
|
130
|
+
|
|
131
|
+
## Team
|
|
132
|
+
|
|
133
|
+
- create-team, invite-team-member, accept-team-invite, remove-team-member,
|
|
134
|
+
update-member-role, set-team-branding
|
|
135
|
+
|
|
136
|
+
## Round-robin & hosts
|
|
137
|
+
|
|
138
|
+
- assign-round-robin-host, set-event-type-hosts,
|
|
139
|
+
set-host-availability-override, create-host-group
|
|
140
|
+
|
|
141
|
+
## Settings
|
|
142
|
+
|
|
143
|
+
- update-profile, set-appearance, set-default-conferencing-app
|
|
144
|
+
|
|
145
|
+
## Workflows
|
|
146
|
+
|
|
147
|
+
- list-workflows, create-workflow, update-workflow, delete-workflow,
|
|
148
|
+
toggle-workflow
|
|
149
|
+
|
|
150
|
+
## Routing forms
|
|
151
|
+
|
|
152
|
+
- list-routing-forms, create-routing-form, update-routing-form,
|
|
153
|
+
delete-routing-form, list-routing-form-responses
|
|
154
|
+
|
|
155
|
+
All actions respect the framework sharing system — if a resource is not
|
|
156
|
+
owned by or shared with the current user, read/write actions throw.
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
## eject.md
|
|
161
|
+
|
|
162
|
+
# Ejecting `@agent-native/scheduling`
|
|
163
|
+
|
|
164
|
+
For full customization, you can move the package source into your own repo.
|
|
165
|
+
|
|
166
|
+
**Planned for v0.2:** `agent-native eject @agent-native/scheduling`.
|
|
167
|
+
|
|
168
|
+
**Today (v0.1)** — do it manually:
|
|
169
|
+
|
|
170
|
+
1. `cp -r node_modules/@agent-native/scheduling/src packages/scheduling-local/src`
|
|
171
|
+
2. Add `packages/scheduling-local/` to your workspaces.
|
|
172
|
+
3. Replace `"@agent-native/scheduling": "^0.1"` in dependencies with
|
|
173
|
+
`"@local/scheduling": "workspace:*"` (or similar).
|
|
174
|
+
4. Run a find/replace across your repo from `@agent-native/scheduling` to
|
|
175
|
+
`@local/scheduling`.
|
|
176
|
+
5. Install: `pnpm install`.
|
|
177
|
+
|
|
178
|
+
Now you own the code and can modify freely. Upstream updates are available via
|
|
179
|
+
`npm view @agent-native/scheduling versions` — you can selectively port changes.
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
## llms.txt
|
|
184
|
+
|
|
185
|
+
# @agent-native/scheduling
|
|
186
|
+
|
|
187
|
+
Scheduling primitives for agent-native apps — event types, availability,
|
|
188
|
+
bookings, team scheduling, workflows, routing forms. A self-hosted,
|
|
189
|
+
locally-owned scheduling stack, not an API wrapper.
|
|
190
|
+
|
|
191
|
+
## What this package provides
|
|
192
|
+
|
|
193
|
+
- **Drizzle schemas** (`/schema`) — event_types, schedules, availability,
|
|
194
|
+
date_overrides, bookings, booking_attendees, booking_references, teams,
|
|
195
|
+
team_members, credentials, calendar_cache, selected_calendars,
|
|
196
|
+
destination_calendars, hashed_links, workflows, workflow_steps,
|
|
197
|
+
scheduled_reminders, webhooks, routing_forms, routing_form_responses,
|
|
198
|
+
api_keys, out_of_office_entries, travel_schedules.
|
|
199
|
+
- **Pure helpers** (`/core`) — DST-safe slot computation, timezone math,
|
|
200
|
+
availability rule evaluation, round-robin host selection, buffer
|
|
201
|
+
application, booking-limit bucketing, recurring-event expansion.
|
|
202
|
+
- **Server layer** (`/server`) — DB repos, availability engine, booking
|
|
203
|
+
service, pluggable calendar + video providers (Google Calendar, Outlook,
|
|
204
|
+
Zoom, Google Meet, built-in video), iCal generator, lifecycle hooks →
|
|
205
|
+
workflows.
|
|
206
|
+
- **Actions** (`/actions/*`) — ~55 `defineAction` modules covering every
|
|
207
|
+
operation in the product (event type CRUD, availability edit, booking
|
|
208
|
+
lifecycle, calendar connect, team ops, round-robin, workflows, routing
|
|
209
|
+
forms). Re-export from a consumer template's `actions/` folder for
|
|
210
|
+
zero-boilerplate adoption.
|
|
211
|
+
- **React primitives** (`/react`, `/react/components`) — headless hooks for
|
|
212
|
+
timezone, slots, booking flow; minimal unstyled primitives (SlotPicker,
|
|
213
|
+
TimezoneSelect).
|
|
214
|
+
- **Skill docs** (`/skills/*`) — drop-in agent skills for scheduling
|
|
215
|
+
concepts: `scheduling-basics`, `event-types`, `availability`, `bookings`,
|
|
216
|
+
`booker`, `slot-engine`, `team-scheduling`, `integrations`, `embeds`,
|
|
217
|
+
`workflows`, `routing-forms`.
|
|
218
|
+
|
|
219
|
+
## Quick start
|
|
220
|
+
|
|
221
|
+
```ts
|
|
222
|
+
// server/db/schema.ts
|
|
223
|
+
export * from "@agent-native/scheduling/schema";
|
|
224
|
+
|
|
225
|
+
// server/bootstrap.ts
|
|
226
|
+
import { setSchedulingContext } from "@agent-native/scheduling/server";
|
|
227
|
+
import {
|
|
228
|
+
registerCalendarProvider,
|
|
229
|
+
registerVideoProvider,
|
|
230
|
+
createGoogleCalendarProvider,
|
|
231
|
+
createDailyVideoProvider,
|
|
232
|
+
} from "@agent-native/scheduling/server/providers";
|
|
233
|
+
import { getDb, schema } from "./db/index.js";
|
|
234
|
+
|
|
235
|
+
setSchedulingContext({
|
|
236
|
+
getDb,
|
|
237
|
+
schema,
|
|
238
|
+
getCurrentUserEmail: () => getRequestUserEmail(),
|
|
239
|
+
getCurrentOrgId: () => getRequestOrgId(),
|
|
240
|
+
publicBaseUrl: process.env.PUBLIC_URL,
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
registerCalendarProvider(createGoogleCalendarProvider({
|
|
244
|
+
clientId: process.env.GOOGLE_CLIENT_ID!,
|
|
245
|
+
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
|
|
246
|
+
getAccessToken: fetchGoogleToken, // your implementation
|
|
247
|
+
}));
|
|
248
|
+
|
|
249
|
+
registerVideoProvider(createDailyVideoProvider({
|
|
250
|
+
apiKey: process.env.DAILY_API_KEY!,
|
|
251
|
+
}));
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Full documentation
|
|
255
|
+
|
|
256
|
+
For the full bundled docs (every .md file concatenated), see
|
|
257
|
+
`llms-full.txt` in this folder.
|
|
258
|
+
|
|
259
|
+
## Individual skills
|
|
260
|
+
|
|
261
|
+
- skills/scheduling-basics/SKILL.md — Core concepts, terminology.
|
|
262
|
+
- skills/event-types/SKILL.md — Event type model, tabs, scheduling types.
|
|
263
|
+
- skills/availability/SKILL.md — Schedules, date overrides, timezone rules.
|
|
264
|
+
- skills/bookings/SKILL.md — Lifecycle, reschedule, cancel, no-show.
|
|
265
|
+
- skills/booker/SKILL.md — Public booking flow, state machine.
|
|
266
|
+
- skills/slot-engine/SKILL.md — The pure slot-computation function and
|
|
267
|
+
invariants.
|
|
268
|
+
- skills/team-scheduling/SKILL.md — Team event types, round-robin,
|
|
269
|
+
collective.
|
|
270
|
+
- skills/integrations/SKILL.md — Calendar + video provider integrations.
|
|
271
|
+
- skills/embeds/SKILL.md — Inline/popup/floating-button embeds.
|
|
272
|
+
- skills/workflows/SKILL.md — Trigger-based automations.
|
|
273
|
+
- skills/routing-forms/SKILL.md — Pre-booking routing forms.
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
## providers.md
|
|
278
|
+
|
|
279
|
+
# Writing a custom provider
|
|
280
|
+
|
|
281
|
+
Scheduling needs two kinds of providers:
|
|
282
|
+
|
|
283
|
+
- **CalendarProvider** — reads busy intervals + writes events.
|
|
284
|
+
- **VideoProvider** — creates meeting rooms when a booking is confirmed.
|
|
285
|
+
|
|
286
|
+
Built-ins: Google Calendar, Office 365, Zoom, built-in video (Daily.co), Google
|
|
287
|
+
Meet (piggy-backs on Google Calendar).
|
|
288
|
+
|
|
289
|
+
## CalendarProvider
|
|
290
|
+
|
|
291
|
+
```ts
|
|
292
|
+
import { registerCalendarProvider } from "@agent-native/scheduling/server/providers";
|
|
293
|
+
|
|
294
|
+
registerCalendarProvider({
|
|
295
|
+
kind: "my_calendar",
|
|
296
|
+
label: "My Calendar",
|
|
297
|
+
async startOAuth({ redirectUri, state }) {
|
|
298
|
+
/* return { authUrl } */
|
|
299
|
+
},
|
|
300
|
+
async completeOAuth({ code, credentialId, userEmail, redirectUri }) {
|
|
301
|
+
/* exchange code, persist tokens, return externalEmail + calendars */
|
|
302
|
+
},
|
|
303
|
+
async listCalendars({ credentialId }) {
|
|
304
|
+
/* ... */
|
|
305
|
+
},
|
|
306
|
+
async getBusy({ credentialId, calendarExternalIds, start, end }) {
|
|
307
|
+
/* ... */
|
|
308
|
+
},
|
|
309
|
+
async createEvent({
|
|
310
|
+
credentialId,
|
|
311
|
+
calendarExternalId,
|
|
312
|
+
booking,
|
|
313
|
+
includeConference,
|
|
314
|
+
}) {
|
|
315
|
+
/* ... */
|
|
316
|
+
},
|
|
317
|
+
async updateEvent({ credentialId, externalId, booking }) {
|
|
318
|
+
/* ... */
|
|
319
|
+
},
|
|
320
|
+
async deleteEvent({ credentialId, externalId }) {
|
|
321
|
+
/* ... */
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
All methods receive a `credentialId` — use it to look up the OAuth token via
|
|
327
|
+
your token store. The package's `setSchedulingContext()` doesn't touch
|
|
328
|
+
tokens; consumers typically use core's `oauth_tokens` and pass a
|
|
329
|
+
`getAccessToken(credentialId)` callback.
|
|
330
|
+
|
|
331
|
+
## VideoProvider
|
|
332
|
+
|
|
333
|
+
```ts
|
|
334
|
+
registerVideoProvider({
|
|
335
|
+
kind: "my_video",
|
|
336
|
+
label: "My Video",
|
|
337
|
+
async createMeeting({ credentialId, booking }) {
|
|
338
|
+
return { meetingUrl, meetingId, meetingPassword? };
|
|
339
|
+
},
|
|
340
|
+
async deleteMeeting?({ credentialId, meetingId }) { /* ... */ },
|
|
341
|
+
});
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Video providers are invoked by the booking service when a booking's location
|
|
345
|
+
is `builtin-video`, `zoom`, `google-meet`, or `teams`. Meeting URLs land in
|
|
346
|
+
`booking_references`.
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
## schema.md
|
|
351
|
+
|
|
352
|
+
# Schema reference
|
|
353
|
+
|
|
354
|
+
All tables use dialect-agnostic helpers from `@agent-native/core/db/schema`
|
|
355
|
+
and compose with `ownableColumns()` + `createSharesTable()` for framework-
|
|
356
|
+
wide sharing.
|
|
357
|
+
|
|
358
|
+
## event_types
|
|
359
|
+
|
|
360
|
+
The primary bookable resource. Duration, location options, custom fields,
|
|
361
|
+
buffers, limits, period (rolling/range/unlimited), scheduling type
|
|
362
|
+
(personal/collective/round-robin/managed), optional team assignment,
|
|
363
|
+
hashed-link support.
|
|
364
|
+
|
|
365
|
+
## event_type_hosts
|
|
366
|
+
|
|
367
|
+
Join between event types and users for collective / round-robin. Each host
|
|
368
|
+
has `isFixed`, `weight`, `priority`, optional per-host `scheduleId` override.
|
|
369
|
+
|
|
370
|
+
## hashed_links
|
|
371
|
+
|
|
372
|
+
Private booking links: `/d/:hash/:slug`. Optional `expiresAt` and
|
|
373
|
+
`isSingleUse`.
|
|
374
|
+
|
|
375
|
+
## event_type_slug_redirects
|
|
376
|
+
|
|
377
|
+
Rename history so old URLs keep working.
|
|
378
|
+
|
|
379
|
+
## schedules / schedule_availability / date_overrides
|
|
380
|
+
|
|
381
|
+
Named availability presets. `schedules` is the header (name, timezone,
|
|
382
|
+
isDefault). `schedule_availability` rows are one weekly interval per day.
|
|
383
|
+
`date_overrides` replaces the weekly rule for a specific date (empty =
|
|
384
|
+
fully blocked).
|
|
385
|
+
|
|
386
|
+
## travel_schedules / out_of_office_entries
|
|
387
|
+
|
|
388
|
+
Per-user timezone overrides for trips; OOO windows that block bookings and
|
|
389
|
+
optionally redirect.
|
|
390
|
+
|
|
391
|
+
## bookings / booking_attendees / booking_references / booking_seats /
|
|
392
|
+
|
|
393
|
+
## booking_notes
|
|
394
|
+
|
|
395
|
+
Bookings are the materialized appointments. Attendees are N per booking.
|
|
396
|
+
References are external IDs (Google event id, Zoom meeting id). Seats are
|
|
397
|
+
reservation tokens for seated events. Notes are host-only.
|
|
398
|
+
|
|
399
|
+
## teams / team_members
|
|
400
|
+
|
|
401
|
+
Teams group users. `team_members.role` ∈ owner|admin|member.
|
|
402
|
+
|
|
403
|
+
## scheduling_credentials / selected_calendars / destination_calendars
|
|
404
|
+
|
|
405
|
+
`scheduling_credentials` is a view over OAuth tokens (with display metadata
|
|
406
|
+
and `invalid` flag). Selected calendars are read for busy-time. Destination
|
|
407
|
+
calendar is where new events get written.
|
|
408
|
+
|
|
409
|
+
## calendar_cache
|
|
410
|
+
|
|
411
|
+
Short-TTL cache of busy intervals. Busted on booking write.
|
|
412
|
+
|
|
413
|
+
## workflows / workflow_steps / scheduled_reminders
|
|
414
|
+
|
|
415
|
+
Trigger-based automations. `workflows` is the rule; `workflow_steps` are
|
|
416
|
+
ordered actions; `scheduled_reminders` are materialized sends waiting to
|
|
417
|
+
fire (drained by a recurring job).
|
|
418
|
+
|
|
419
|
+
## webhooks / webhook_deliveries / api_keys
|
|
420
|
+
|
|
421
|
+
Developer-facing surface: outgoing webhooks with HMAC-signed payloads, and
|
|
422
|
+
API keys for programmatic access.
|
|
423
|
+
|
|
424
|
+
## routing_forms / routing_form_responses
|
|
425
|
+
|
|
426
|
+
ChiliPiper-style routing forms. Fields + rules → either an event type,
|
|
427
|
+
external URL, or custom message.
|
|
428
|
+
|
|
429
|
+
## verified_emails / verified_numbers
|
|
430
|
+
|
|
431
|
+
Verified sender addresses / numbers used by workflows.
|
|
432
|
+
|
|
433
|
+
## Shares tables
|
|
434
|
+
|
|
435
|
+
For every ownable resource: `event_type_shares`, `schedule_shares`,
|
|
436
|
+
`team_shares`, `workflow_shares`, `routing_form_shares`, `booking_shares`.
|
|
437
|
+
Use `share-resource` / `set-resource-visibility` framework actions.
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
## skills/availability/SKILL.md
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
name: availability
|
|
445
|
+
description: How schedules, weekly rules, date overrides, travel schedules, and out-of-office entries combine to determine when someone is bookable.
|
|
446
|
+
---
|
|
447
|
+
|
|
448
|
+
# Availability
|
|
449
|
+
|
|
450
|
+
## Schedule
|
|
451
|
+
|
|
452
|
+
A named set of rules (e.g. "Working Hours"). Each user has ≥1 schedule and
|
|
453
|
+
marks one as `isDefault`. Event types either use the user's default or
|
|
454
|
+
reference a specific schedule.
|
|
455
|
+
|
|
456
|
+
Timezone is set on the schedule, not the user — lets you have a "Europe
|
|
457
|
+
hours" schedule and a "US hours" schedule for the same person.
|
|
458
|
+
|
|
459
|
+
## Weekly availability
|
|
460
|
+
|
|
461
|
+
Rows in `schedule_availability`: (day 0-6, startTime "HH:MM", endTime
|
|
462
|
+
"HH:MM"). You can have multiple intervals per day — e.g. Mon 9-12 and 1-5.
|
|
463
|
+
|
|
464
|
+
## Date overrides
|
|
465
|
+
|
|
466
|
+
Rows in `date_overrides`: (date "YYYY-MM-DD", intervals JSON).
|
|
467
|
+
- `intervals: []` → day fully blocked.
|
|
468
|
+
- `intervals: [{start, end}]` → only those times available on that date.
|
|
469
|
+
|
|
470
|
+
## Travel schedules
|
|
471
|
+
|
|
472
|
+
`travel_schedules` overrides the user's default timezone for a date range.
|
|
473
|
+
|
|
474
|
+
## Out of office
|
|
475
|
+
|
|
476
|
+
`out_of_office_entries` blocks bookings across a range, optionally with a
|
|
477
|
+
redirect to another team member.
|
|
478
|
+
|
|
479
|
+
## Common tasks
|
|
480
|
+
|
|
481
|
+
| User request | Action |
|
|
482
|
+
|---|---|
|
|
483
|
+
| "I'm unavailable next Friday" | `add-date-override --scheduleId <id> --date 2026-04-10 --intervals []` |
|
|
484
|
+
| "I take lunch 12-1 weekdays" | `update-schedule --weeklyAvailability [...9-12, 13-17...]` |
|
|
485
|
+
| "Create evenings schedule" | `create-schedule --name Evenings --weeklyAvailability [...]` |
|
|
486
|
+
| "Going to Tokyo next week" | Insert a `travel_schedules` row (no dedicated action yet) |
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
## skills/booker/SKILL.md
|
|
491
|
+
|
|
492
|
+
---
|
|
493
|
+
name: booker
|
|
494
|
+
description: Public booking flow — the state machine, animations, and URL/app-state sync.
|
|
495
|
+
---
|
|
496
|
+
|
|
497
|
+
# Booker
|
|
498
|
+
|
|
499
|
+
## Stages
|
|
500
|
+
|
|
501
|
+
1. **pick-date** — month grid shows days with availability
|
|
502
|
+
2. **pick-slot** — available slots on the selected day
|
|
503
|
+
3. **fill-form** — attendee form (name, email, custom fields)
|
|
504
|
+
4. **success** — confirmation with add-to-calendar buttons
|
|
505
|
+
|
|
506
|
+
Plus **reschedule** mode — prefilled from existing booking uid.
|
|
507
|
+
|
|
508
|
+
## Animations
|
|
509
|
+
|
|
510
|
+
Use motion (`motion/react`) `AnimatePresence` with `fadeInLeft` variants. The outer
|
|
511
|
+
container animates its width across stages: narrow (calendar only) → wider
|
|
512
|
+
(calendar + slots) → widest (form).
|
|
513
|
+
|
|
514
|
+
## Timezone + 12/24h
|
|
515
|
+
|
|
516
|
+
- Detect browser timezone at mount; let user override via dropdown.
|
|
517
|
+
- Persist choice to localStorage key `scheduling.timezone`.
|
|
518
|
+
- 12/24h toggle near slot column; persist to user settings.
|
|
519
|
+
|
|
520
|
+
## URL + application-state sync
|
|
521
|
+
|
|
522
|
+
Selected date, slot, timezone, and duration are mirrored to URL query
|
|
523
|
+
params AND `application_state.booker-state` so:
|
|
524
|
+
- Page refresh preserves selection.
|
|
525
|
+
- Agent can read the user's current pick.
|
|
526
|
+
|
|
527
|
+
## Copy-link affordance
|
|
528
|
+
|
|
529
|
+
Every event-type row has a "copy link" button. On click, write to clipboard
|
|
530
|
+
and toast "Copied!" with Sonner. Works on mobile Safari too.
|
|
531
|
+
|
|
532
|
+
## Accessibility
|
|
533
|
+
|
|
534
|
+
- Month grid is ARIA `grid` + `gridcell` with arrow-key nav.
|
|
535
|
+
- Slot buttons are keyboard-focusable, with `aria-pressed`.
|
|
536
|
+
- Focus returns to trigger on modal close.
|
|
537
|
+
- Toast content announced via `aria-live=polite`.
|
|
538
|
+
|
|
539
|
+
## Mobile
|
|
540
|
+
|
|
541
|
+
`< 768px`: stack vertically. Calendar full-width, slot list below, form
|
|
542
|
+
slides in as full-screen sheet.
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
---
|
|
546
|
+
## skills/bookings/SKILL.md
|
|
547
|
+
|
|
548
|
+
---
|
|
549
|
+
name: bookings
|
|
550
|
+
description: Booking lifecycle — pending, confirmed, rescheduled, cancelled — plus attendees, references, no-shows, and reminders.
|
|
551
|
+
---
|
|
552
|
+
|
|
553
|
+
# Bookings
|
|
554
|
+
|
|
555
|
+
## Lifecycle
|
|
556
|
+
|
|
557
|
+
- **pending** — requires-confirmation event types start here
|
|
558
|
+
- **confirmed** — normal state
|
|
559
|
+
- **rescheduled** — the old booking after a reschedule (the new one is
|
|
560
|
+
confirmed; `from_reschedule` links them)
|
|
561
|
+
- **cancelled** — either party cancelled
|
|
562
|
+
- **rejected** — pending was declined
|
|
563
|
+
|
|
564
|
+
## Reschedule vs cancel+rebook
|
|
565
|
+
|
|
566
|
+
The `reschedule-booking` action creates a new booking with a link back to
|
|
567
|
+
the old via `fromReschedule`. iCalUID is preserved across the reschedule
|
|
568
|
+
chain (RFC 5545), and `iCalSequence` is bumped.
|
|
569
|
+
|
|
570
|
+
## No-show
|
|
571
|
+
|
|
572
|
+
`mark-no-show` sets `noShow: true` on an attendee. Round-robin calibration
|
|
573
|
+
uses this to penalize hosts whose attendees no-show frequently.
|
|
574
|
+
|
|
575
|
+
## Cancel / reschedule tokens
|
|
576
|
+
|
|
577
|
+
Every booking has a `cancelToken` and `rescheduleToken` used in public
|
|
578
|
+
magic links sent to attendees. These let them manage the booking without
|
|
579
|
+
logging in.
|
|
580
|
+
|
|
581
|
+
## References
|
|
582
|
+
|
|
583
|
+
External system IDs: Google Calendar event id, Zoom meeting id, Daily.co
|
|
584
|
+
room name. Stored in `booking_references`, used during cancel/reschedule to
|
|
585
|
+
propagate changes back to the source system.
|
|
586
|
+
|
|
587
|
+
## ICS
|
|
588
|
+
|
|
589
|
+
`/booking/:uid.ics` returns the RFC 5545 calendar file. Used for
|
|
590
|
+
confirmation-email attachments and "Add to calendar" buttons.
|
|
591
|
+
|
|
592
|
+
|
|
593
|
+
---
|
|
594
|
+
## skills/embeds/SKILL.md
|
|
595
|
+
|
|
596
|
+
---
|
|
597
|
+
name: embeds
|
|
598
|
+
description: Inline, popup, and floating-button embeds — snippet generation and theming.
|
|
599
|
+
---
|
|
600
|
+
|
|
601
|
+
# Embeds
|
|
602
|
+
|
|
603
|
+
## Modes
|
|
604
|
+
|
|
605
|
+
- **inline** — iframe embedded in the page
|
|
606
|
+
- **popup** — trigger opens modal overlay with iframe
|
|
607
|
+
- **element-click / floating-button** — fixed-position trigger anywhere on
|
|
608
|
+
the page
|
|
609
|
+
|
|
610
|
+
## URL
|
|
611
|
+
|
|
612
|
+
Embed page: `/:user/:slug/embed` — same Booker, no chrome, theme honored
|
|
613
|
+
via query params.
|
|
614
|
+
|
|
615
|
+
## Snippet
|
|
616
|
+
|
|
617
|
+
```html
|
|
618
|
+
<script src="https://<host>/embed.js" async></script>
|
|
619
|
+
<div id="cal-inline-embed"></div>
|
|
620
|
+
<script>
|
|
621
|
+
Cal("init", { origin: "https://<host>" });
|
|
622
|
+
Cal("inline", {
|
|
623
|
+
elementOrSelector: "#cal-inline-embed",
|
|
624
|
+
calLink: "my-user/intro",
|
|
625
|
+
config: { theme: "light" }
|
|
626
|
+
});
|
|
627
|
+
</script>
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
## Theming
|
|
631
|
+
|
|
632
|
+
Query params on the embed URL:
|
|
633
|
+
- `theme=light|dark`
|
|
634
|
+
- `primaryColor=<hex>`
|
|
635
|
+
- `locale=en|es|...`
|
|
636
|
+
- `timeZone=America/Los_Angeles`
|
|
637
|
+
|
|
638
|
+
These override the event type's defaults for the embedded session only.
|
|
639
|
+
|
|
640
|
+
## Message passing
|
|
641
|
+
|
|
642
|
+
The iframe posts messages to the parent on lifecycle events:
|
|
643
|
+
`__cal.init`, `__cal.booking-successful`, `__cal.booking-cancelled`,
|
|
644
|
+
`__cal.booking-rescheduled`.
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
---
|
|
648
|
+
## skills/event-types/SKILL.md
|
|
649
|
+
|
|
650
|
+
---
|
|
651
|
+
name: event-types
|
|
652
|
+
description: How event types work — fields, scheduling types, tabs in the editor, and the full set of configurable options.
|
|
653
|
+
---
|
|
654
|
+
|
|
655
|
+
# Event types
|
|
656
|
+
|
|
657
|
+
## Editor tabs
|
|
658
|
+
- **Setup** — title, slug, duration(s), description, default location
|
|
659
|
+
- **Availability** — pick a schedule or override per-event-type
|
|
660
|
+
- **Limits** — buffers, min notice, booking window (rolling/range), caps
|
|
661
|
+
(perDay/perWeek/perMonth/perYear), slot interval
|
|
662
|
+
- **Advanced** — event name template, lock timezone, require confirmation,
|
|
663
|
+
disable guests, redirect URL, private hashed links, seats
|
|
664
|
+
- **Apps** — connect per-event location types (Zoom, Meet, etc.)
|
|
665
|
+
- **Workflows** — attach workflows to run on booking lifecycle events
|
|
666
|
+
|
|
667
|
+
## Scheduling types
|
|
668
|
+
|
|
669
|
+
| Type | Meaning |
|
|
670
|
+
|---|---|
|
|
671
|
+
| `personal` | Owned by a user, only they host |
|
|
672
|
+
| `collective` | Team event; all selected hosts must be free |
|
|
673
|
+
| `round-robin` | Team event; assign to one host by rotation |
|
|
674
|
+
| `managed` | Parent event pushed to child event types across members |
|
|
675
|
+
|
|
676
|
+
## Location kinds
|
|
677
|
+
|
|
678
|
+
`builtin-video`, `zoom`, `google-meet`, `teams`, `phone`, `in-person`,
|
|
679
|
+
`custom-link`, `attendee-phone`, `organizer-phone`, `attendee-choice`.
|
|
680
|
+
|
|
681
|
+
## Custom fields
|
|
682
|
+
|
|
683
|
+
Text, textarea, number, email, phone, select, multiselect, boolean, radio.
|
|
684
|
+
Stored on the event type; responses stored on the booking.
|
|
685
|
+
|
|
686
|
+
## Hashed links
|
|
687
|
+
|
|
688
|
+
Private booking URLs at `/d/:hash/:slug`. Create via `add-private-link`,
|
|
689
|
+
optionally with `expiresAt` and `isSingleUse`.
|
|
690
|
+
|
|
691
|
+
|
|
692
|
+
---
|
|
693
|
+
## skills/integrations/SKILL.md
|
|
694
|
+
|
|
695
|
+
---
|
|
696
|
+
name: integrations
|
|
697
|
+
description: Calendar + video provider integrations — Google Calendar, Office 365, Zoom, built-in video, Google Meet — and how to write new ones.
|
|
698
|
+
---
|
|
699
|
+
|
|
700
|
+
# Integrations
|
|
701
|
+
|
|
702
|
+
## Calendar providers
|
|
703
|
+
|
|
704
|
+
- **google_calendar** — OAuth; read freeBusy + write events; optionally
|
|
705
|
+
create Google Meet conference via `includeConference=true`.
|
|
706
|
+
- **office365_calendar** — Microsoft Graph; read freeBusy + write events.
|
|
707
|
+
- **caldav** (planned) — generic CalDAV for Apple iCloud, Fastmail, etc.
|
|
708
|
+
|
|
709
|
+
## Video providers
|
|
710
|
+
|
|
711
|
+
- **builtin_video** — Daily.co-backed; zero OAuth; server-to-server API key.
|
|
712
|
+
- **zoom_video** — OAuth; create meetings via Zoom REST API.
|
|
713
|
+
- **google_meet** — piggy-backs on Google Calendar credential.
|
|
714
|
+
- **teams_video** (planned) — Microsoft Teams.
|
|
715
|
+
|
|
716
|
+
## Credential lifecycle
|
|
717
|
+
|
|
718
|
+
1. User clicks "Connect" → `connect-calendar` returns `authUrl` + `state`
|
|
719
|
+
2. Redirect to provider → consent → provider redirects to our callback
|
|
720
|
+
3. Server exchanges code → writes `scheduling_credentials` row +
|
|
721
|
+
core `oauth_tokens` entry
|
|
722
|
+
4. We fetch calendar list, let user pick "checked" + "destination"
|
|
723
|
+
5. Token expires → refresh flow runs silently; on failure, set
|
|
724
|
+
`invalid: true` and show re-connect banner
|
|
725
|
+
|
|
726
|
+
## Busy-time aggregation
|
|
727
|
+
|
|
728
|
+
`aggregateBusy({userEmail, rangeStart, rangeEnd})` merges:
|
|
729
|
+
- Confirmed bookings hosted by the user
|
|
730
|
+
- External busy from each `selected_calendars` entry via the provider
|
|
731
|
+
|
|
732
|
+
Cached in `calendar_cache` (short TTL, default 5 min). Busted on any
|
|
733
|
+
booking write for that host.
|
|
734
|
+
|
|
735
|
+
## Writing a new provider
|
|
736
|
+
|
|
737
|
+
See `docs/providers.md` for the full interface.
|
|
738
|
+
|
|
739
|
+
## Common tasks
|
|
740
|
+
|
|
741
|
+
| User | Action |
|
|
742
|
+
|---|---|
|
|
743
|
+
| "Connect Google Calendar" | `connect-calendar --kind google_calendar --redirectUri ...` → redirect to returned `authUrl` |
|
|
744
|
+
| "Stop checking my vacation calendar" | `toggle-selected-calendar --include false` for that externalId |
|
|
745
|
+
| "Default to Zoom for new bookings" | `set-default-conferencing-app --credentialId <zoom-cred>` |
|
|
746
|
+
| "Refresh calendar cache" | `refresh-busy-times` |
|
|
747
|
+
|
|
748
|
+
|
|
749
|
+
---
|
|
750
|
+
## skills/routing-forms/SKILL.md
|
|
751
|
+
|
|
752
|
+
---
|
|
753
|
+
name: routing-forms
|
|
754
|
+
description: ChiliPiper-style pre-booking forms that route prospects to the right event type based on their answers.
|
|
755
|
+
---
|
|
756
|
+
|
|
757
|
+
# Routing forms
|
|
758
|
+
|
|
759
|
+
## Shape
|
|
760
|
+
|
|
761
|
+
- **Fields** — text, email, phone, number, select, multi
|
|
762
|
+
- **Rules** — ordered list of `{conditions, action}`
|
|
763
|
+
- **Fallback** — action taken when no rule matches
|
|
764
|
+
|
|
765
|
+
## Rule conditions
|
|
766
|
+
|
|
767
|
+
`conditions: [{fieldId, op, value}, …]` — all ANDed together. Ops:
|
|
768
|
+
- `equals`, `not-equals`, `contains`, `starts-with`, `in` (value is array)
|
|
769
|
+
|
|
770
|
+
## Rule actions
|
|
771
|
+
|
|
772
|
+
- `{kind: "event-type", eventTypeId, teamId?}` → redirect to Booker
|
|
773
|
+
- `{kind: "external-url", url}` → redirect off-site
|
|
774
|
+
- `{kind: "custom-message", message}` → render message, no booking
|
|
775
|
+
|
|
776
|
+
## Public URL
|
|
777
|
+
|
|
778
|
+
`/forms/:formId` renders the form. On submit:
|
|
779
|
+
1. Walk rules in order; first match wins.
|
|
780
|
+
2. If none match, use `fallback`.
|
|
781
|
+
3. Record the response in `routing_form_responses` with `matchedRuleId`.
|
|
782
|
+
4. If the action is `event-type`, redirect to Booker with prefilled
|
|
783
|
+
`name` / `email` / custom-field values from the form answers.
|
|
784
|
+
|
|
785
|
+
## Common tasks
|
|
786
|
+
|
|
787
|
+
| User | Action |
|
|
788
|
+
|---|---|
|
|
789
|
+
| "Route enterprise prospects to Bob" | `create-routing-form` with a rule matching company size → Bob's event type |
|
|
790
|
+
| "See submissions" | `list-routing-form-responses --formId <id>` |
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
---
|
|
794
|
+
## skills/scheduling-basics/SKILL.md
|
|
795
|
+
|
|
796
|
+
---
|
|
797
|
+
name: scheduling-basics
|
|
798
|
+
description: Core concepts of the scheduling package — event types, schedules, bookings, hosts, teams, and how they compose.
|
|
799
|
+
---
|
|
800
|
+
|
|
801
|
+
# Scheduling basics
|
|
802
|
+
|
|
803
|
+
The mental model:
|
|
804
|
+
|
|
805
|
+
- **Event Type** — a definition of "a bookable thing" (30-minute intro call,
|
|
806
|
+
45-minute demo). Lives at `/:user/:slug` or `/team/:teamSlug/:slug`.
|
|
807
|
+
- **Schedule** — a named set of availability rules ("Working Hours",
|
|
808
|
+
"Evenings"). Weekly intervals plus date-specific overrides. Each user
|
|
809
|
+
has a default schedule; event types can pick any.
|
|
810
|
+
- **Booking** — the materialized appointment. Has attendees, references to
|
|
811
|
+
external systems (Google Calendar event, Zoom meeting), and a stable
|
|
812
|
+
iCalUID across reschedules.
|
|
813
|
+
- **Host** — a user assigned to an event type. Hosts have weights and
|
|
814
|
+
priorities for round-robin.
|
|
815
|
+
- **Team** — a group of users who can co-host event types.
|
|
816
|
+
- **Location** — where the meeting happens. Video (built-in, Zoom, Meet,
|
|
817
|
+
Teams), phone, in-person, or custom link.
|
|
818
|
+
|
|
819
|
+
## Workflows and routing forms
|
|
820
|
+
|
|
821
|
+
- **Workflow** — trigger + ordered steps. "Email attendee 1h before event."
|
|
822
|
+
- **Routing Form** — pre-booking form with rules that route to the right
|
|
823
|
+
event type based on answers. Like ChiliPiper.
|
|
824
|
+
|
|
825
|
+
## Public URLs
|
|
826
|
+
|
|
827
|
+
- `/:user` — user profile with event type list
|
|
828
|
+
- `/:user/:slug` — Booker for a personal event type
|
|
829
|
+
- `/:user/:slug/embed` — chromeless for iframe embedding
|
|
830
|
+
- `/team/:teamSlug` — team profile
|
|
831
|
+
- `/team/:teamSlug/:slug` — Booker for team event type (round-robin or collective)
|
|
832
|
+
- `/d/:hash/:slug` — private hashed-link Booker
|
|
833
|
+
- `/booking/:uid` — booking detail / manage
|
|
834
|
+
- `/reschedule/:uid` — reschedule Booker
|
|
835
|
+
- `/forms/:formId` — public routing form
|
|
836
|
+
|
|
837
|
+
## Common tasks
|
|
838
|
+
|
|
839
|
+
| User request | Action(s) |
|
|
840
|
+
|---|---|
|
|
841
|
+
| "Create a 30-minute intro meeting" | `create-event-type --title "Intro" --slug intro --length 30` |
|
|
842
|
+
| "What's my availability tomorrow?" | `check-availability --slug <slug> --from ... --to ...` |
|
|
843
|
+
| "Cancel my 3pm with Alex" | `list-bookings --status upcoming`, then `cancel-booking --uid ...` |
|
|
844
|
+
| "Block next Friday" | `add-date-override --scheduleId <id> --date 2026-04-10 --intervals []` |
|
|
845
|
+
| "Connect Google Calendar" | `connect-calendar --kind google_calendar --redirectUri ...` |
|
|
846
|
+
| "Make a team event rotating between Alice and Bob" | `create-event-type --schedulingType round-robin --teamId ...`, then `set-event-type-hosts` |
|
|
847
|
+
|
|
848
|
+
|
|
849
|
+
---
|
|
850
|
+
## skills/slot-engine/SKILL.md
|
|
851
|
+
|
|
852
|
+
---
|
|
853
|
+
name: slot-engine
|
|
854
|
+
description: The pure `computeAvailableSlots` function — inputs, outputs, invariants, and debugging guide.
|
|
855
|
+
---
|
|
856
|
+
|
|
857
|
+
# Slot engine
|
|
858
|
+
|
|
859
|
+
`import { computeAvailableSlots } from "@agent-native/scheduling/core"`
|
|
860
|
+
|
|
861
|
+
## Inputs
|
|
862
|
+
- Event type config (duration, buffers, minimum notice, period, limits,
|
|
863
|
+
slot interval)
|
|
864
|
+
- Schedule (timezone + weekly availability + date overrides)
|
|
865
|
+
- Busy intervals (UTC, aggregated from external calendars + existing
|
|
866
|
+
bookings)
|
|
867
|
+
- Booking counts by bucket (day/week/month/year) for limit enforcement
|
|
868
|
+
- Time range to compute over
|
|
869
|
+
- Optional seats-per-slot + seats-taken map
|
|
870
|
+
- Viewer timezone (for limit bucketing, if it differs from the schedule)
|
|
871
|
+
|
|
872
|
+
## Output
|
|
873
|
+
- Array of `Slot { start: ISO, end: ISO, available: boolean, seatsRemaining?, hostEmail? }`
|
|
874
|
+
|
|
875
|
+
## Invariants
|
|
876
|
+
|
|
877
|
+
The function guarantees, in order:
|
|
878
|
+
|
|
879
|
+
1. No slot falls in the past (`now + minimumBookingNotice` is the floor).
|
|
880
|
+
2. No slot overlaps a busy interval (with buffers applied).
|
|
881
|
+
3. No slot falls outside the schedule's available intervals for that day.
|
|
882
|
+
4. No slot exceeds a booking limit.
|
|
883
|
+
5. No slot falls outside the event's period (rolling/range).
|
|
884
|
+
6. DST-safe: we convert to UTC using the schedule's timezone before doing
|
|
885
|
+
any interval arithmetic.
|
|
886
|
+
|
|
887
|
+
## Debugging
|
|
888
|
+
|
|
889
|
+
If a slot is unexpectedly missing:
|
|
890
|
+
1. Check the schedule's weekly availability for that day-of-week in the
|
|
891
|
+
schedule's timezone (not UTC — weekends can shift across the date line).
|
|
892
|
+
2. Check date overrides for that local date (empty intervals = fully
|
|
893
|
+
blocked).
|
|
894
|
+
3. Check merged busy intervals for overlap, *including* the before/after
|
|
895
|
+
buffer expansion.
|
|
896
|
+
4. Check booking limits: a single existing booking can close a day.
|
|
897
|
+
5. Check period caps: rolling periods restrict how far in the future slots
|
|
898
|
+
appear.
|
|
899
|
+
|
|
900
|
+
If a slot is unexpectedly present:
|
|
901
|
+
1. Check that `now` is being passed correctly (defaults to `new Date()`).
|
|
902
|
+
2. Check that busy intervals from providers are in UTC.
|
|
903
|
+
3. Confirm slot interval matches what you expect (default = duration).
|
|
904
|
+
|
|
905
|
+
|
|
906
|
+
---
|
|
907
|
+
## skills/team-scheduling/SKILL.md
|
|
908
|
+
|
|
909
|
+
---
|
|
910
|
+
name: team-scheduling
|
|
911
|
+
description: Team event types, round-robin assignment, collective bookings, host weights, and no-show calibration.
|
|
912
|
+
---
|
|
913
|
+
|
|
914
|
+
# Team scheduling
|
|
915
|
+
|
|
916
|
+
## Scheduling types
|
|
917
|
+
|
|
918
|
+
- **Collective** — all selected team members must be free; booking lists
|
|
919
|
+
all as organizers.
|
|
920
|
+
- **Round-robin** — one team member is chosen per booking by a rotation
|
|
921
|
+
strategy.
|
|
922
|
+
- **Managed** — parent event type pushed to member-level children (advanced;
|
|
923
|
+
stub in v1).
|
|
924
|
+
|
|
925
|
+
## Round-robin strategies
|
|
926
|
+
|
|
927
|
+
| Strategy | How |
|
|
928
|
+
|---|---|
|
|
929
|
+
| `lowest-recent-bookings` | (Default) host with fewest bookings in past 30d wins; tiebreak by priority, then weight, then email |
|
|
930
|
+
| `weighted` | Weighted random pick; deterministic given the same seed |
|
|
931
|
+
| `calibrated` | Weighted with no-show penalty (hosts with high no-show rates get fewer) |
|
|
932
|
+
|
|
933
|
+
## Hosts
|
|
934
|
+
|
|
935
|
+
Rows in `event_type_hosts`: `{userEmail, isFixed, weight, priority,
|
|
936
|
+
scheduleId?}`. Fixed hosts always attend (like collective within a
|
|
937
|
+
round-robin set). Weight scales the relative share. Priority (lower =
|
|
938
|
+
higher) breaks ties.
|
|
939
|
+
|
|
940
|
+
## Host schedule override
|
|
941
|
+
|
|
942
|
+
Normally each host's default schedule is used for their slots. A
|
|
943
|
+
per-event-type-per-host override is possible via
|
|
944
|
+
`set-host-availability-override`.
|
|
945
|
+
|
|
946
|
+
## Out-of-office
|
|
947
|
+
|
|
948
|
+
OOO hosts are auto-excluded from round-robin for the duration of the OOO
|
|
949
|
+
window. Bookings can redirect to the OOO's `redirectUserEmail`.
|
|
950
|
+
|
|
951
|
+
## Host groups
|
|
952
|
+
|
|
953
|
+
`event_type_host_groups` lets you split hosts into groups — useful for
|
|
954
|
+
"collective within each group, round-robin across groups".
|
|
955
|
+
|
|
956
|
+
## Common tasks
|
|
957
|
+
|
|
958
|
+
| User | Action |
|
|
959
|
+
|---|---|
|
|
960
|
+
| "Make a sales demo that rotates Alice / Bob / Carol" | `create-event-type --schedulingType round-robin --teamId ...`, then `set-event-type-hosts` |
|
|
961
|
+
| "Add Dave as a fixed host" | `set-event-type-hosts` with Dave as `isFixed: true` |
|
|
962
|
+
| "Stop routing to Alice while she's on PTO" | Insert an `out_of_office_entries` row for Alice's range |
|
|
963
|
+
|
|
964
|
+
|
|
965
|
+
---
|
|
966
|
+
## skills/workflows/SKILL.md
|
|
967
|
+
|
|
968
|
+
---
|
|
969
|
+
name: workflows
|
|
970
|
+
description: Trigger-based automations — reminders, follow-ups, webhooks — across the booking lifecycle.
|
|
971
|
+
---
|
|
972
|
+
|
|
973
|
+
# Workflows
|
|
974
|
+
|
|
975
|
+
## Triggers
|
|
976
|
+
|
|
977
|
+
- `new-booking` — fires when a booking is created
|
|
978
|
+
- `before-event` — offset minutes BEFORE `startTime`
|
|
979
|
+
- `after-event` — offset minutes AFTER `endTime`
|
|
980
|
+
- `reschedule` — booking rescheduled
|
|
981
|
+
- `cancellation` — booking cancelled
|
|
982
|
+
- `no-show` — a host marked an attendee as no-show
|
|
983
|
+
|
|
984
|
+
## Steps
|
|
985
|
+
|
|
986
|
+
| Action | Sends |
|
|
987
|
+
|---|---|
|
|
988
|
+
| `email-host` | Email to the organizer |
|
|
989
|
+
| `email-attendee` | Email to the attendee |
|
|
990
|
+
| `email-address` | Email to a fixed address (e.g. ops@example.com) |
|
|
991
|
+
| `sms-attendee` | SMS to the attendee's phone (requires attendee `phone` custom field) |
|
|
992
|
+
| `sms-host` | SMS to the host |
|
|
993
|
+
| `sms-number` | SMS to a fixed number |
|
|
994
|
+
| `webhook` | HTTP POST to a URL |
|
|
995
|
+
|
|
996
|
+
Step `offsetMinutes` is relative to the trigger time. For `before-event`
|
|
997
|
+
use positive values (we apply them with a minus sign internally).
|
|
998
|
+
|
|
999
|
+
## Template variables
|
|
1000
|
+
|
|
1001
|
+
In email subjects / bodies and SMS bodies:
|
|
1002
|
+
- `{eventName}` — event type title
|
|
1003
|
+
- `{attendeeName}`, `{attendeeEmail}` — first attendee
|
|
1004
|
+
- `{hostName}`, `{hostEmail}` — organizer
|
|
1005
|
+
- `{startTime}`, `{endTime}` — formatted in host's timezone
|
|
1006
|
+
- `{location}` — meeting URL or address
|
|
1007
|
+
- `{cancelUrl}`, `{rescheduleUrl}` — public magic links
|
|
1008
|
+
|
|
1009
|
+
## Firing
|
|
1010
|
+
|
|
1011
|
+
When a booking fires a trigger, the hook dispatcher materializes rows in
|
|
1012
|
+
`scheduled_reminders`. A recurring job processes due rows and fires the
|
|
1013
|
+
actual emails/SMS/webhooks. Framework-side recurring jobs handle the
|
|
1014
|
+
polling.
|
|
1015
|
+
|
|
1016
|
+
## Common tasks
|
|
1017
|
+
|
|
1018
|
+
| User | Action |
|
|
1019
|
+
|---|---|
|
|
1020
|
+
| "Email attendees 24h before the meeting" | `create-workflow --trigger before-event --steps '[{action: email-attendee, offsetMinutes: 1440}]'` |
|
|
1021
|
+
| "Text me when someone books" | `create-workflow --trigger new-booking --steps '[{action: sms-host, ...}]'` |
|
|
1022
|
+
| "Stop all reminders on an event type" | `toggle-workflow` to disable |
|