@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.
Files changed (653) hide show
  1. package/README.md +58 -0
  2. package/dist/actions/_helpers.d.ts +12 -0
  3. package/dist/actions/_helpers.d.ts.map +1 -0
  4. package/dist/actions/_helpers.js +49 -0
  5. package/dist/actions/_helpers.js.map +1 -0
  6. package/dist/actions/accept-team-invite.d.ts +3 -0
  7. package/dist/actions/accept-team-invite.d.ts.map +1 -0
  8. package/dist/actions/accept-team-invite.js +27 -0
  9. package/dist/actions/accept-team-invite.js.map +1 -0
  10. package/dist/actions/add-booking-attendee.d.ts +3 -0
  11. package/dist/actions/add-booking-attendee.d.ts.map +1 -0
  12. package/dist/actions/add-booking-attendee.js +33 -0
  13. package/dist/actions/add-booking-attendee.js.map +1 -0
  14. package/dist/actions/add-booking-note.d.ts +3 -0
  15. package/dist/actions/add-booking-note.d.ts.map +1 -0
  16. package/dist/actions/add-booking-note.js +26 -0
  17. package/dist/actions/add-booking-note.js.map +1 -0
  18. package/dist/actions/add-date-override.d.ts +3 -0
  19. package/dist/actions/add-date-override.d.ts.map +1 -0
  20. package/dist/actions/add-date-override.js +16 -0
  21. package/dist/actions/add-date-override.js.map +1 -0
  22. package/dist/actions/add-private-link.d.ts +3 -0
  23. package/dist/actions/add-private-link.d.ts.map +1 -0
  24. package/dist/actions/add-private-link.js +31 -0
  25. package/dist/actions/add-private-link.js.map +1 -0
  26. package/dist/actions/assign-round-robin-host.d.ts +3 -0
  27. package/dist/actions/assign-round-robin-host.d.ts.map +1 -0
  28. package/dist/actions/assign-round-robin-host.js +48 -0
  29. package/dist/actions/assign-round-robin-host.js.map +1 -0
  30. package/dist/actions/cancel-booking.d.ts +3 -0
  31. package/dist/actions/cancel-booking.d.ts.map +1 -0
  32. package/dist/actions/cancel-booking.js +34 -0
  33. package/dist/actions/cancel-booking.js.map +1 -0
  34. package/dist/actions/check-availability.d.ts +3 -0
  35. package/dist/actions/check-availability.d.ts.map +1 -0
  36. package/dist/actions/check-availability.js +43 -0
  37. package/dist/actions/check-availability.js.map +1 -0
  38. package/dist/actions/confirm-booking.d.ts +3 -0
  39. package/dist/actions/confirm-booking.d.ts.map +1 -0
  40. package/dist/actions/confirm-booking.js +12 -0
  41. package/dist/actions/confirm-booking.js.map +1 -0
  42. package/dist/actions/connect-calendar.d.ts +3 -0
  43. package/dist/actions/connect-calendar.d.ts.map +1 -0
  44. package/dist/actions/connect-calendar.js +26 -0
  45. package/dist/actions/connect-calendar.js.map +1 -0
  46. package/dist/actions/connect-video.d.ts +3 -0
  47. package/dist/actions/connect-video.d.ts.map +1 -0
  48. package/dist/actions/connect-video.js +54 -0
  49. package/dist/actions/connect-video.js.map +1 -0
  50. package/dist/actions/create-booking.d.ts +3 -0
  51. package/dist/actions/create-booking.d.ts.map +1 -0
  52. package/dist/actions/create-booking.js +60 -0
  53. package/dist/actions/create-booking.js.map +1 -0
  54. package/dist/actions/create-event-type.d.ts +3 -0
  55. package/dist/actions/create-event-type.d.ts.map +1 -0
  56. package/dist/actions/create-event-type.js +45 -0
  57. package/dist/actions/create-event-type.js.map +1 -0
  58. package/dist/actions/create-host-group.d.ts +3 -0
  59. package/dist/actions/create-host-group.d.ts.map +1 -0
  60. package/dist/actions/create-host-group.js +25 -0
  61. package/dist/actions/create-host-group.js.map +1 -0
  62. package/dist/actions/create-routing-form.d.ts +3 -0
  63. package/dist/actions/create-routing-form.d.ts.map +1 -0
  64. package/dist/actions/create-routing-form.js +39 -0
  65. package/dist/actions/create-routing-form.js.map +1 -0
  66. package/dist/actions/create-schedule.d.ts +3 -0
  67. package/dist/actions/create-schedule.d.ts.map +1 -0
  68. package/dist/actions/create-schedule.js +32 -0
  69. package/dist/actions/create-schedule.js.map +1 -0
  70. package/dist/actions/create-team.d.ts +3 -0
  71. package/dist/actions/create-team.d.ts.map +1 -0
  72. package/dist/actions/create-team.js +44 -0
  73. package/dist/actions/create-team.js.map +1 -0
  74. package/dist/actions/create-workflow.d.ts +3 -0
  75. package/dist/actions/create-workflow.d.ts.map +1 -0
  76. package/dist/actions/create-workflow.js +81 -0
  77. package/dist/actions/create-workflow.js.map +1 -0
  78. package/dist/actions/delete-event-type.d.ts +3 -0
  79. package/dist/actions/delete-event-type.d.ts.map +1 -0
  80. package/dist/actions/delete-event-type.js +14 -0
  81. package/dist/actions/delete-event-type.js.map +1 -0
  82. package/dist/actions/delete-routing-form.d.ts +3 -0
  83. package/dist/actions/delete-routing-form.d.ts.map +1 -0
  84. package/dist/actions/delete-routing-form.js +21 -0
  85. package/dist/actions/delete-routing-form.js.map +1 -0
  86. package/dist/actions/delete-schedule.d.ts +3 -0
  87. package/dist/actions/delete-schedule.d.ts.map +1 -0
  88. package/dist/actions/delete-schedule.js +14 -0
  89. package/dist/actions/delete-schedule.js.map +1 -0
  90. package/dist/actions/delete-workflow.d.ts +3 -0
  91. package/dist/actions/delete-workflow.d.ts.map +1 -0
  92. package/dist/actions/delete-workflow.js +21 -0
  93. package/dist/actions/delete-workflow.js.map +1 -0
  94. package/dist/actions/disconnect-calendar.d.ts +3 -0
  95. package/dist/actions/disconnect-calendar.d.ts.map +1 -0
  96. package/dist/actions/disconnect-calendar.js +22 -0
  97. package/dist/actions/disconnect-calendar.js.map +1 -0
  98. package/dist/actions/duplicate-event-type.d.ts +3 -0
  99. package/dist/actions/duplicate-event-type.d.ts.map +1 -0
  100. package/dist/actions/duplicate-event-type.js +34 -0
  101. package/dist/actions/duplicate-event-type.js.map +1 -0
  102. package/dist/actions/export-bookings-csv.d.ts +3 -0
  103. package/dist/actions/export-bookings-csv.d.ts.map +1 -0
  104. package/dist/actions/export-bookings-csv.js +53 -0
  105. package/dist/actions/export-bookings-csv.js.map +1 -0
  106. package/dist/actions/find-available-slot.d.ts +3 -0
  107. package/dist/actions/find-available-slot.d.ts.map +1 -0
  108. package/dist/actions/find-available-slot.js +39 -0
  109. package/dist/actions/find-available-slot.js.map +1 -0
  110. package/dist/actions/get-availability.d.ts +3 -0
  111. package/dist/actions/get-availability.d.ts.map +1 -0
  112. package/dist/actions/get-availability.js +20 -0
  113. package/dist/actions/get-availability.js.map +1 -0
  114. package/dist/actions/get-booking.d.ts +3 -0
  115. package/dist/actions/get-booking.d.ts.map +1 -0
  116. package/dist/actions/get-booking.js +9 -0
  117. package/dist/actions/get-booking.js.map +1 -0
  118. package/dist/actions/get-event-type.d.ts +3 -0
  119. package/dist/actions/get-event-type.d.ts.map +1 -0
  120. package/dist/actions/get-event-type.js +27 -0
  121. package/dist/actions/get-event-type.js.map +1 -0
  122. package/dist/actions/install-conferencing-app.d.ts +3 -0
  123. package/dist/actions/install-conferencing-app.d.ts.map +1 -0
  124. package/dist/actions/install-conferencing-app.js +28 -0
  125. package/dist/actions/install-conferencing-app.js.map +1 -0
  126. package/dist/actions/invite-team-member.d.ts +3 -0
  127. package/dist/actions/invite-team-member.d.ts.map +1 -0
  128. package/dist/actions/invite-team-member.js +30 -0
  129. package/dist/actions/invite-team-member.js.map +1 -0
  130. package/dist/actions/list-bookings.d.ts +3 -0
  131. package/dist/actions/list-bookings.d.ts.map +1 -0
  132. package/dist/actions/list-bookings.js +35 -0
  133. package/dist/actions/list-bookings.js.map +1 -0
  134. package/dist/actions/list-calendar-integrations.d.ts +3 -0
  135. package/dist/actions/list-calendar-integrations.d.ts.map +1 -0
  136. package/dist/actions/list-calendar-integrations.js +26 -0
  137. package/dist/actions/list-calendar-integrations.js.map +1 -0
  138. package/dist/actions/list-event-types.d.ts +3 -0
  139. package/dist/actions/list-event-types.d.ts.map +1 -0
  140. package/dist/actions/list-event-types.js +31 -0
  141. package/dist/actions/list-event-types.js.map +1 -0
  142. package/dist/actions/list-routing-form-responses.d.ts +3 -0
  143. package/dist/actions/list-routing-form-responses.d.ts.map +1 -0
  144. package/dist/actions/list-routing-form-responses.js +24 -0
  145. package/dist/actions/list-routing-form-responses.js.map +1 -0
  146. package/dist/actions/list-routing-forms.d.ts +3 -0
  147. package/dist/actions/list-routing-forms.d.ts.map +1 -0
  148. package/dist/actions/list-routing-forms.js +29 -0
  149. package/dist/actions/list-routing-forms.js.map +1 -0
  150. package/dist/actions/list-schedules.d.ts +3 -0
  151. package/dist/actions/list-schedules.d.ts.map +1 -0
  152. package/dist/actions/list-schedules.js +16 -0
  153. package/dist/actions/list-schedules.js.map +1 -0
  154. package/dist/actions/list-selected-calendars.d.ts +3 -0
  155. package/dist/actions/list-selected-calendars.d.ts.map +1 -0
  156. package/dist/actions/list-selected-calendars.js +42 -0
  157. package/dist/actions/list-selected-calendars.js.map +1 -0
  158. package/dist/actions/list-workflows.d.ts +3 -0
  159. package/dist/actions/list-workflows.d.ts.map +1 -0
  160. package/dist/actions/list-workflows.js +29 -0
  161. package/dist/actions/list-workflows.js.map +1 -0
  162. package/dist/actions/mark-no-show.d.ts +3 -0
  163. package/dist/actions/mark-no-show.d.ts.map +1 -0
  164. package/dist/actions/mark-no-show.js +15 -0
  165. package/dist/actions/mark-no-show.js.map +1 -0
  166. package/dist/actions/refresh-busy-times.d.ts +3 -0
  167. package/dist/actions/refresh-busy-times.d.ts.map +1 -0
  168. package/dist/actions/refresh-busy-times.js +25 -0
  169. package/dist/actions/refresh-busy-times.js.map +1 -0
  170. package/dist/actions/remove-booking-attendee.d.ts +3 -0
  171. package/dist/actions/remove-booking-attendee.d.ts.map +1 -0
  172. package/dist/actions/remove-booking-attendee.js +20 -0
  173. package/dist/actions/remove-booking-attendee.js.map +1 -0
  174. package/dist/actions/remove-date-override.d.ts +3 -0
  175. package/dist/actions/remove-date-override.d.ts.map +1 -0
  176. package/dist/actions/remove-date-override.js +15 -0
  177. package/dist/actions/remove-date-override.js.map +1 -0
  178. package/dist/actions/remove-team-member.d.ts +3 -0
  179. package/dist/actions/remove-team-member.d.ts.map +1 -0
  180. package/dist/actions/remove-team-member.js +18 -0
  181. package/dist/actions/remove-team-member.js.map +1 -0
  182. package/dist/actions/reorder-event-types.d.ts +3 -0
  183. package/dist/actions/reorder-event-types.d.ts.map +1 -0
  184. package/dist/actions/reorder-event-types.js +18 -0
  185. package/dist/actions/reorder-event-types.js.map +1 -0
  186. package/dist/actions/reschedule-booking.d.ts +3 -0
  187. package/dist/actions/reschedule-booking.d.ts.map +1 -0
  188. package/dist/actions/reschedule-booking.js +38 -0
  189. package/dist/actions/reschedule-booking.js.map +1 -0
  190. package/dist/actions/revoke-private-link.d.ts +3 -0
  191. package/dist/actions/revoke-private-link.d.ts.map +1 -0
  192. package/dist/actions/revoke-private-link.js +16 -0
  193. package/dist/actions/revoke-private-link.js.map +1 -0
  194. package/dist/actions/send-reschedule-link.d.ts +3 -0
  195. package/dist/actions/send-reschedule-link.d.ts.map +1 -0
  196. package/dist/actions/send-reschedule-link.js +18 -0
  197. package/dist/actions/send-reschedule-link.js.map +1 -0
  198. package/dist/actions/set-appearance.d.ts +3 -0
  199. package/dist/actions/set-appearance.d.ts.map +1 -0
  200. package/dist/actions/set-appearance.js +23 -0
  201. package/dist/actions/set-appearance.js.map +1 -0
  202. package/dist/actions/set-default-conferencing-app.d.ts +3 -0
  203. package/dist/actions/set-default-conferencing-app.d.ts.map +1 -0
  204. package/dist/actions/set-default-conferencing-app.js +25 -0
  205. package/dist/actions/set-default-conferencing-app.js.map +1 -0
  206. package/dist/actions/set-default-schedule.d.ts +3 -0
  207. package/dist/actions/set-default-schedule.d.ts.map +1 -0
  208. package/dist/actions/set-default-schedule.js +15 -0
  209. package/dist/actions/set-default-schedule.js.map +1 -0
  210. package/dist/actions/set-destination-calendar.d.ts +3 -0
  211. package/dist/actions/set-destination-calendar.d.ts.map +1 -0
  212. package/dist/actions/set-destination-calendar.js +39 -0
  213. package/dist/actions/set-destination-calendar.js.map +1 -0
  214. package/dist/actions/set-event-type-hosts.d.ts +3 -0
  215. package/dist/actions/set-event-type-hosts.d.ts.map +1 -0
  216. package/dist/actions/set-event-type-hosts.js +41 -0
  217. package/dist/actions/set-event-type-hosts.js.map +1 -0
  218. package/dist/actions/set-event-type-location.d.ts +3 -0
  219. package/dist/actions/set-event-type-location.d.ts.map +1 -0
  220. package/dist/actions/set-event-type-location.js +18 -0
  221. package/dist/actions/set-event-type-location.js.map +1 -0
  222. package/dist/actions/set-host-availability-override.d.ts +3 -0
  223. package/dist/actions/set-host-availability-override.d.ts.map +1 -0
  224. package/dist/actions/set-host-availability-override.js +21 -0
  225. package/dist/actions/set-host-availability-override.js.map +1 -0
  226. package/dist/actions/set-team-branding.d.ts +3 -0
  227. package/dist/actions/set-team-branding.d.ts.map +1 -0
  228. package/dist/actions/set-team-branding.js +28 -0
  229. package/dist/actions/set-team-branding.js.map +1 -0
  230. package/dist/actions/submit-routing-form-response.d.ts +3 -0
  231. package/dist/actions/submit-routing-form-response.d.ts.map +1 -0
  232. package/dist/actions/submit-routing-form-response.js +46 -0
  233. package/dist/actions/submit-routing-form-response.js.map +1 -0
  234. package/dist/actions/toggle-event-type-hidden.d.ts +3 -0
  235. package/dist/actions/toggle-event-type-hidden.d.ts.map +1 -0
  236. package/dist/actions/toggle-event-type-hidden.js +19 -0
  237. package/dist/actions/toggle-event-type-hidden.js.map +1 -0
  238. package/dist/actions/toggle-selected-calendar.d.ts +3 -0
  239. package/dist/actions/toggle-selected-calendar.d.ts.map +1 -0
  240. package/dist/actions/toggle-selected-calendar.js +40 -0
  241. package/dist/actions/toggle-selected-calendar.js.map +1 -0
  242. package/dist/actions/toggle-workflow.d.ts +3 -0
  243. package/dist/actions/toggle-workflow.d.ts.map +1 -0
  244. package/dist/actions/toggle-workflow.js +26 -0
  245. package/dist/actions/toggle-workflow.js.map +1 -0
  246. package/dist/actions/update-event-type.d.ts +3 -0
  247. package/dist/actions/update-event-type.d.ts.map +1 -0
  248. package/dist/actions/update-event-type.js +54 -0
  249. package/dist/actions/update-event-type.js.map +1 -0
  250. package/dist/actions/update-member-role.d.ts +3 -0
  251. package/dist/actions/update-member-role.d.ts.map +1 -0
  252. package/dist/actions/update-member-role.js +23 -0
  253. package/dist/actions/update-member-role.js.map +1 -0
  254. package/dist/actions/update-profile.d.ts +3 -0
  255. package/dist/actions/update-profile.d.ts.map +1 -0
  256. package/dist/actions/update-profile.js +34 -0
  257. package/dist/actions/update-profile.js.map +1 -0
  258. package/dist/actions/update-routing-form.d.ts +3 -0
  259. package/dist/actions/update-routing-form.d.ts.map +1 -0
  260. package/dist/actions/update-routing-form.js +40 -0
  261. package/dist/actions/update-routing-form.js.map +1 -0
  262. package/dist/actions/update-schedule.d.ts +3 -0
  263. package/dist/actions/update-schedule.d.ts.map +1 -0
  264. package/dist/actions/update-schedule.js +44 -0
  265. package/dist/actions/update-schedule.js.map +1 -0
  266. package/dist/actions/update-workflow.d.ts +3 -0
  267. package/dist/actions/update-workflow.d.ts.map +1 -0
  268. package/dist/actions/update-workflow.js +89 -0
  269. package/dist/actions/update-workflow.js.map +1 -0
  270. package/dist/core/buffers.d.ts +25 -0
  271. package/dist/core/buffers.d.ts.map +1 -0
  272. package/dist/core/buffers.js +21 -0
  273. package/dist/core/buffers.js.map +1 -0
  274. package/dist/core/conflicts.d.ts +11 -0
  275. package/dist/core/conflicts.d.ts.map +1 -0
  276. package/dist/core/conflicts.js +42 -0
  277. package/dist/core/conflicts.js.map +1 -0
  278. package/dist/core/index.d.ts +9 -0
  279. package/dist/core/index.d.ts.map +1 -0
  280. package/dist/core/index.js +9 -0
  281. package/dist/core/index.js.map +1 -0
  282. package/dist/core/limits.d.ts +23 -0
  283. package/dist/core/limits.d.ts.map +1 -0
  284. package/dist/core/limits.js +28 -0
  285. package/dist/core/limits.js.map +1 -0
  286. package/dist/core/round-robin.d.ts +31 -0
  287. package/dist/core/round-robin.d.ts.map +1 -0
  288. package/dist/core/round-robin.js +57 -0
  289. package/dist/core/round-robin.js.map +1 -0
  290. package/dist/core/rrule.d.ts +2 -0
  291. package/dist/core/rrule.d.ts.map +1 -0
  292. package/dist/core/rrule.js +14 -0
  293. package/dist/core/rrule.js.map +1 -0
  294. package/dist/core/rules.d.ts +26 -0
  295. package/dist/core/rules.d.ts.map +1 -0
  296. package/dist/core/rules.js +40 -0
  297. package/dist/core/rules.js.map +1 -0
  298. package/dist/core/slots.d.ts +58 -0
  299. package/dist/core/slots.d.ts.map +1 -0
  300. package/dist/core/slots.js +98 -0
  301. package/dist/core/slots.js.map +1 -0
  302. package/dist/core/time.d.ts +52 -0
  303. package/dist/core/time.d.ts.map +1 -0
  304. package/dist/core/time.js +109 -0
  305. package/dist/core/time.js.map +1 -0
  306. package/dist/index.d.ts +14 -0
  307. package/dist/index.d.ts.map +1 -0
  308. package/dist/index.js +14 -0
  309. package/dist/index.js.map +1 -0
  310. package/dist/manifest.d.ts +28 -0
  311. package/dist/manifest.d.ts.map +1 -0
  312. package/dist/manifest.js +160 -0
  313. package/dist/manifest.js.map +1 -0
  314. package/dist/react/components/SlotPicker.d.ts +21 -0
  315. package/dist/react/components/SlotPicker.d.ts.map +1 -0
  316. package/dist/react/components/SlotPicker.js +15 -0
  317. package/dist/react/components/SlotPicker.js.map +1 -0
  318. package/dist/react/components/TimezoneSelect.d.ts +7 -0
  319. package/dist/react/components/TimezoneSelect.d.ts.map +1 -0
  320. package/dist/react/components/TimezoneSelect.js +31 -0
  321. package/dist/react/components/TimezoneSelect.js.map +1 -0
  322. package/dist/react/components/booking-links/AvailabilityEditor.d.ts +21 -0
  323. package/dist/react/components/booking-links/AvailabilityEditor.d.ts.map +1 -0
  324. package/dist/react/components/booking-links/AvailabilityEditor.js +102 -0
  325. package/dist/react/components/booking-links/AvailabilityEditor.js.map +1 -0
  326. package/dist/react/components/booking-links/BookingLinkCreateDialog.d.ts +22 -0
  327. package/dist/react/components/booking-links/BookingLinkCreateDialog.d.ts.map +1 -0
  328. package/dist/react/components/booking-links/BookingLinkCreateDialog.js +75 -0
  329. package/dist/react/components/booking-links/BookingLinkCreateDialog.js.map +1 -0
  330. package/dist/react/components/booking-links/ConferencingSelector.d.ts +19 -0
  331. package/dist/react/components/booking-links/ConferencingSelector.d.ts.map +1 -0
  332. package/dist/react/components/booking-links/ConferencingSelector.js +87 -0
  333. package/dist/react/components/booking-links/ConferencingSelector.js.map +1 -0
  334. package/dist/react/components/booking-links/CustomFieldsEditor.d.ts +19 -0
  335. package/dist/react/components/booking-links/CustomFieldsEditor.d.ts.map +1 -0
  336. package/dist/react/components/booking-links/CustomFieldsEditor.js +117 -0
  337. package/dist/react/components/booking-links/CustomFieldsEditor.js.map +1 -0
  338. package/dist/react/components/booking-links/DurationPicker.d.ts +9 -0
  339. package/dist/react/components/booking-links/DurationPicker.d.ts.map +1 -0
  340. package/dist/react/components/booking-links/DurationPicker.js +56 -0
  341. package/dist/react/components/booking-links/DurationPicker.js.map +1 -0
  342. package/dist/react/components/booking-links/SlugEditor.d.ts +15 -0
  343. package/dist/react/components/booking-links/SlugEditor.d.ts.map +1 -0
  344. package/dist/react/components/booking-links/SlugEditor.js +64 -0
  345. package/dist/react/components/booking-links/SlugEditor.js.map +1 -0
  346. package/dist/react/components/booking-links/index.d.ts +16 -0
  347. package/dist/react/components/booking-links/index.d.ts.map +1 -0
  348. package/dist/react/components/booking-links/index.js +16 -0
  349. package/dist/react/components/booking-links/index.js.map +1 -0
  350. package/dist/react/components/index.d.ts +14 -0
  351. package/dist/react/components/index.d.ts.map +1 -0
  352. package/dist/react/components/index.js +14 -0
  353. package/dist/react/components/index.js.map +1 -0
  354. package/dist/react/hooks/useBookingFlow.d.ts +33 -0
  355. package/dist/react/hooks/useBookingFlow.d.ts.map +1 -0
  356. package/dist/react/hooks/useBookingFlow.js +51 -0
  357. package/dist/react/hooks/useBookingFlow.js.map +1 -0
  358. package/dist/react/hooks/useEventType.d.ts +21 -0
  359. package/dist/react/hooks/useEventType.d.ts.map +1 -0
  360. package/dist/react/hooks/useEventType.js +38 -0
  361. package/dist/react/hooks/useEventType.js.map +1 -0
  362. package/dist/react/hooks/useReschedule.d.ts +13 -0
  363. package/dist/react/hooks/useReschedule.d.ts.map +1 -0
  364. package/dist/react/hooks/useReschedule.js +33 -0
  365. package/dist/react/hooks/useReschedule.js.map +1 -0
  366. package/dist/react/hooks/useSlots.d.ts +32 -0
  367. package/dist/react/hooks/useSlots.d.ts.map +1 -0
  368. package/dist/react/hooks/useSlots.js +59 -0
  369. package/dist/react/hooks/useSlots.js.map +1 -0
  370. package/dist/react/hooks/useTimezone.d.ts +3 -0
  371. package/dist/react/hooks/useTimezone.d.ts.map +1 -0
  372. package/dist/react/hooks/useTimezone.js +30 -0
  373. package/dist/react/hooks/useTimezone.js.map +1 -0
  374. package/dist/react/index.d.ts +11 -0
  375. package/dist/react/index.d.ts.map +1 -0
  376. package/dist/react/index.js +11 -0
  377. package/dist/react/index.js.map +1 -0
  378. package/dist/schema/bookings.d.ts +1201 -0
  379. package/dist/schema/bookings.d.ts.map +1 -0
  380. package/dist/schema/bookings.js +100 -0
  381. package/dist/schema/bookings.js.map +1 -0
  382. package/dist/schema/calendar-cache.d.ts +160 -0
  383. package/dist/schema/calendar-cache.d.ts.map +1 -0
  384. package/dist/schema/calendar-cache.js +23 -0
  385. package/dist/schema/calendar-cache.js.map +1 -0
  386. package/dist/schema/credentials.d.ts +743 -0
  387. package/dist/schema/credentials.d.ts.map +1 -0
  388. package/dist/schema/credentials.js +79 -0
  389. package/dist/schema/credentials.js.map +1 -0
  390. package/dist/schema/event-types.d.ts +1292 -0
  391. package/dist/schema/event-types.d.ts.map +1 -0
  392. package/dist/schema/event-types.js +131 -0
  393. package/dist/schema/event-types.js.map +1 -0
  394. package/dist/schema/index.d.ts +20 -0
  395. package/dist/schema/index.d.ts.map +1 -0
  396. package/dist/schema/index.js +20 -0
  397. package/dist/schema/index.js.map +1 -0
  398. package/dist/schema/routing-forms.d.ts +571 -0
  399. package/dist/schema/routing-forms.d.ts.map +1 -0
  400. package/dist/schema/routing-forms.js +44 -0
  401. package/dist/schema/routing-forms.js.map +1 -0
  402. package/dist/schema/schedules.d.ts +830 -0
  403. package/dist/schema/schedules.d.ts.map +1 -0
  404. package/dist/schema/schedules.js +72 -0
  405. package/dist/schema/schedules.js.map +1 -0
  406. package/dist/schema/teams.d.ts +569 -0
  407. package/dist/schema/teams.d.ts.map +1 -0
  408. package/dist/schema/teams.js +38 -0
  409. package/dist/schema/teams.js.map +1 -0
  410. package/dist/schema/workflows.d.ts +1367 -0
  411. package/dist/schema/workflows.d.ts.map +1 -0
  412. package/dist/schema/workflows.js +116 -0
  413. package/dist/schema/workflows.js.map +1 -0
  414. package/dist/server/availability-engine.d.ts +21 -0
  415. package/dist/server/availability-engine.d.ts.map +1 -0
  416. package/dist/server/availability-engine.js +135 -0
  417. package/dist/server/availability-engine.js.map +1 -0
  418. package/dist/server/booking-service.d.ts +46 -0
  419. package/dist/server/booking-service.d.ts.map +1 -0
  420. package/dist/server/booking-service.js +198 -0
  421. package/dist/server/booking-service.js.map +1 -0
  422. package/dist/server/bookings-repo.d.ts +48 -0
  423. package/dist/server/bookings-repo.d.ts.map +1 -0
  424. package/dist/server/bookings-repo.js +244 -0
  425. package/dist/server/bookings-repo.js.map +1 -0
  426. package/dist/server/context.d.ts +33 -0
  427. package/dist/server/context.d.ts.map +1 -0
  428. package/dist/server/context.js +11 -0
  429. package/dist/server/context.js.map +1 -0
  430. package/dist/server/db-types.d.ts +15 -0
  431. package/dist/server/db-types.d.ts.map +1 -0
  432. package/dist/server/db-types.js +2 -0
  433. package/dist/server/db-types.js.map +1 -0
  434. package/dist/server/event-types-repo.d.ts +46 -0
  435. package/dist/server/event-types-repo.d.ts.map +1 -0
  436. package/dist/server/event-types-repo.js +320 -0
  437. package/dist/server/event-types-repo.js.map +1 -0
  438. package/dist/server/hooks.d.ts +6 -0
  439. package/dist/server/hooks.d.ts.map +1 -0
  440. package/dist/server/hooks.js +173 -0
  441. package/dist/server/hooks.js.map +1 -0
  442. package/dist/server/ics.d.ts +12 -0
  443. package/dist/server/ics.d.ts.map +1 -0
  444. package/dist/server/ics.js +81 -0
  445. package/dist/server/ics.js.map +1 -0
  446. package/dist/server/index.d.ts +12 -0
  447. package/dist/server/index.d.ts.map +1 -0
  448. package/dist/server/index.js +12 -0
  449. package/dist/server/index.js.map +1 -0
  450. package/dist/server/providers/builtin-video.d.ts +12 -0
  451. package/dist/server/providers/builtin-video.d.ts.map +1 -0
  452. package/dist/server/providers/builtin-video.js +50 -0
  453. package/dist/server/providers/builtin-video.js.map +1 -0
  454. package/dist/server/providers/cal-video.d.ts +12 -0
  455. package/dist/server/providers/cal-video.d.ts.map +1 -0
  456. package/dist/server/providers/cal-video.js +50 -0
  457. package/dist/server/providers/cal-video.js.map +1 -0
  458. package/dist/server/providers/google-calendar.d.ts +28 -0
  459. package/dist/server/providers/google-calendar.d.ts.map +1 -0
  460. package/dist/server/providers/google-calendar.js +163 -0
  461. package/dist/server/providers/google-calendar.js.map +1 -0
  462. package/dist/server/providers/google-meet.d.ts +10 -0
  463. package/dist/server/providers/google-meet.d.ts.map +1 -0
  464. package/dist/server/providers/google-meet.js +14 -0
  465. package/dist/server/providers/google-meet.js.map +1 -0
  466. package/dist/server/providers/index.d.ts +8 -0
  467. package/dist/server/providers/index.d.ts.map +1 -0
  468. package/dist/server/providers/index.js +8 -0
  469. package/dist/server/providers/index.js.map +1 -0
  470. package/dist/server/providers/office365.d.ts +21 -0
  471. package/dist/server/providers/office365.d.ts.map +1 -0
  472. package/dist/server/providers/office365.js +146 -0
  473. package/dist/server/providers/office365.js.map +1 -0
  474. package/dist/server/providers/registry.d.ts +14 -0
  475. package/dist/server/providers/registry.d.ts.map +1 -0
  476. package/dist/server/providers/registry.js +28 -0
  477. package/dist/server/providers/registry.js.map +1 -0
  478. package/dist/server/providers/types.d.ts +133 -0
  479. package/dist/server/providers/types.d.ts.map +1 -0
  480. package/dist/server/providers/types.js +2 -0
  481. package/dist/server/providers/types.js.map +1 -0
  482. package/dist/server/providers/zoom.d.ts +34 -0
  483. package/dist/server/providers/zoom.d.ts.map +1 -0
  484. package/dist/server/providers/zoom.js +111 -0
  485. package/dist/server/providers/zoom.js.map +1 -0
  486. package/dist/server/schedules-repo.d.ts +26 -0
  487. package/dist/server/schedules-repo.d.ts.map +1 -0
  488. package/dist/server/schedules-repo.js +223 -0
  489. package/dist/server/schedules-repo.js.map +1 -0
  490. package/dist/server/video-oauth-state.d.ts +28 -0
  491. package/dist/server/video-oauth-state.d.ts.map +1 -0
  492. package/dist/server/video-oauth-state.js +101 -0
  493. package/dist/server/video-oauth-state.js.map +1 -0
  494. package/dist/server/video-oauth.d.ts +18 -0
  495. package/dist/server/video-oauth.d.ts.map +1 -0
  496. package/dist/server/video-oauth.js +82 -0
  497. package/dist/server/video-oauth.js.map +1 -0
  498. package/dist/shared/index.d.ts +298 -0
  499. package/dist/shared/index.d.ts.map +1 -0
  500. package/dist/shared/index.js +6 -0
  501. package/dist/shared/index.js.map +1 -0
  502. package/dist/version.d.ts +2 -0
  503. package/dist/version.d.ts.map +1 -0
  504. package/dist/version.js +2 -0
  505. package/dist/version.js.map +1 -0
  506. package/docs/UI_UNIFICATION.md +78 -0
  507. package/docs/actions.md +64 -0
  508. package/docs/eject.md +18 -0
  509. package/docs/llms-full.txt +1022 -0
  510. package/docs/llms.txt +89 -0
  511. package/docs/providers.md +68 -0
  512. package/docs/schema.md +86 -0
  513. package/docs/skills/availability/SKILL.md +44 -0
  514. package/docs/skills/booker/SKILL.md +51 -0
  515. package/docs/skills/bookings/SKILL.md +43 -0
  516. package/docs/skills/embeds/SKILL.md +49 -0
  517. package/docs/skills/event-types/SKILL.md +40 -0
  518. package/docs/skills/integrations/SKILL.md +52 -0
  519. package/docs/skills/routing-forms/SKILL.md +39 -0
  520. package/docs/skills/scheduling-basics/SKILL.md +51 -0
  521. package/docs/skills/slot-engine/SKILL.md +52 -0
  522. package/docs/skills/team-scheduling/SKILL.md +54 -0
  523. package/docs/skills/workflows/SKILL.md +55 -0
  524. package/package.json +87 -0
  525. package/src/actions/_helpers.ts +62 -0
  526. package/src/actions/accept-team-invite.ts +26 -0
  527. package/src/actions/add-booking-attendee.ts +32 -0
  528. package/src/actions/add-booking-note.ts +25 -0
  529. package/src/actions/add-date-override.ts +23 -0
  530. package/src/actions/add-private-link.ts +31 -0
  531. package/src/actions/assign-round-robin-host.ts +54 -0
  532. package/src/actions/cancel-booking.ts +39 -0
  533. package/src/actions/check-availability.ts +46 -0
  534. package/src/actions/confirm-booking.ts +15 -0
  535. package/src/actions/connect-calendar.ts +27 -0
  536. package/src/actions/connect-video.ts +57 -0
  537. package/src/actions/create-booking.ts +62 -0
  538. package/src/actions/create-event-type.ts +45 -0
  539. package/src/actions/create-host-group.ts +25 -0
  540. package/src/actions/create-routing-form.ts +39 -0
  541. package/src/actions/create-schedule.ts +36 -0
  542. package/src/actions/create-team.ts +44 -0
  543. package/src/actions/create-workflow.ts +83 -0
  544. package/src/actions/delete-event-type.ts +14 -0
  545. package/src/actions/delete-routing-form.ts +21 -0
  546. package/src/actions/delete-schedule.ts +14 -0
  547. package/src/actions/delete-workflow.ts +21 -0
  548. package/src/actions/disconnect-calendar.ts +22 -0
  549. package/src/actions/duplicate-event-type.ts +36 -0
  550. package/src/actions/export-bookings-csv.ts +54 -0
  551. package/src/actions/find-available-slot.ts +40 -0
  552. package/src/actions/get-availability.ts +20 -0
  553. package/src/actions/get-booking.ts +9 -0
  554. package/src/actions/get-event-type.ts +29 -0
  555. package/src/actions/install-conferencing-app.ts +29 -0
  556. package/src/actions/invite-team-member.ts +30 -0
  557. package/src/actions/list-bookings.ts +36 -0
  558. package/src/actions/list-calendar-integrations.ts +26 -0
  559. package/src/actions/list-event-types.ts +31 -0
  560. package/src/actions/list-routing-form-responses.ts +24 -0
  561. package/src/actions/list-routing-forms.ts +34 -0
  562. package/src/actions/list-schedules.ts +16 -0
  563. package/src/actions/list-selected-calendars.ts +41 -0
  564. package/src/actions/list-workflows.ts +34 -0
  565. package/src/actions/mark-no-show.ts +15 -0
  566. package/src/actions/refresh-busy-times.ts +26 -0
  567. package/src/actions/remove-booking-attendee.ts +24 -0
  568. package/src/actions/remove-date-override.ts +15 -0
  569. package/src/actions/remove-team-member.ts +23 -0
  570. package/src/actions/reorder-event-types.ts +18 -0
  571. package/src/actions/reschedule-booking.ts +45 -0
  572. package/src/actions/revoke-private-link.ts +16 -0
  573. package/src/actions/send-reschedule-link.ts +18 -0
  574. package/src/actions/set-appearance.ts +24 -0
  575. package/src/actions/set-default-conferencing-app.ts +25 -0
  576. package/src/actions/set-default-schedule.ts +15 -0
  577. package/src/actions/set-destination-calendar.ts +39 -0
  578. package/src/actions/set-event-type-hosts.ts +43 -0
  579. package/src/actions/set-event-type-location.ts +18 -0
  580. package/src/actions/set-host-availability-override.ts +27 -0
  581. package/src/actions/set-team-branding.ts +28 -0
  582. package/src/actions/submit-routing-form-response.ts +47 -0
  583. package/src/actions/toggle-event-type-hidden.ts +21 -0
  584. package/src/actions/toggle-selected-calendar.ts +43 -0
  585. package/src/actions/toggle-workflow.ts +25 -0
  586. package/src/actions/update-event-type.ts +54 -0
  587. package/src/actions/update-member-role.ts +28 -0
  588. package/src/actions/update-profile.ts +36 -0
  589. package/src/actions/update-routing-form.ts +36 -0
  590. package/src/actions/update-schedule.ts +53 -0
  591. package/src/actions/update-workflow.ts +89 -0
  592. package/src/core/buffers.ts +46 -0
  593. package/src/core/conflicts.ts +49 -0
  594. package/src/core/index.ts +8 -0
  595. package/src/core/limits.ts +60 -0
  596. package/src/core/round-robin.test.ts +95 -0
  597. package/src/core/round-robin.ts +103 -0
  598. package/src/core/rrule.ts +20 -0
  599. package/src/core/rules.ts +66 -0
  600. package/src/core/slots.test.ts +246 -0
  601. package/src/core/slots.ts +223 -0
  602. package/src/core/time.ts +136 -0
  603. package/src/index.ts +14 -0
  604. package/src/manifest.ts +174 -0
  605. package/src/react/components/SlotPicker.tsx +72 -0
  606. package/src/react/components/TimezoneSelect.tsx +55 -0
  607. package/src/react/components/_shadcn-shims.d.ts +251 -0
  608. package/src/react/components/booking-links/AvailabilityEditor.tsx +177 -0
  609. package/src/react/components/booking-links/BookingLinkCreateDialog.tsx +189 -0
  610. package/src/react/components/booking-links/ConferencingSelector.tsx +255 -0
  611. package/src/react/components/booking-links/CustomFieldsEditor.tsx +420 -0
  612. package/src/react/components/booking-links/DurationPicker.tsx +115 -0
  613. package/src/react/components/booking-links/SlugEditor.tsx +149 -0
  614. package/src/react/components/booking-links/index.ts +15 -0
  615. package/src/react/components/index.ts +13 -0
  616. package/src/react/hooks/useBookingFlow.ts +113 -0
  617. package/src/react/hooks/useEventType.ts +52 -0
  618. package/src/react/hooks/useReschedule.ts +39 -0
  619. package/src/react/hooks/useSlots.ts +88 -0
  620. package/src/react/hooks/useTimezone.ts +29 -0
  621. package/src/react/index.ts +10 -0
  622. package/src/schema/bookings.ts +124 -0
  623. package/src/schema/calendar-cache.ts +23 -0
  624. package/src/schema/credentials.ts +83 -0
  625. package/src/schema/event-types.ts +154 -0
  626. package/src/schema/index.ts +19 -0
  627. package/src/schema/routing-forms.ts +52 -0
  628. package/src/schema/schedules.ts +83 -0
  629. package/src/schema/teams.ts +46 -0
  630. package/src/schema/workflows.ts +128 -0
  631. package/src/server/availability-engine.ts +193 -0
  632. package/src/server/booking-service.ts +264 -0
  633. package/src/server/bookings-repo.ts +330 -0
  634. package/src/server/context.ts +49 -0
  635. package/src/server/db-types.ts +16 -0
  636. package/src/server/event-types-repo.ts +385 -0
  637. package/src/server/hooks.ts +213 -0
  638. package/src/server/ics.ts +99 -0
  639. package/src/server/index.ts +11 -0
  640. package/src/server/providers/builtin-video.ts +62 -0
  641. package/src/server/providers/google-calendar.ts +237 -0
  642. package/src/server/providers/google-meet.ts +22 -0
  643. package/src/server/providers/index.ts +7 -0
  644. package/src/server/providers/office365.ts +208 -0
  645. package/src/server/providers/registry.ts +43 -0
  646. package/src/server/providers/types.ts +126 -0
  647. package/src/server/providers/zoom.ts +173 -0
  648. package/src/server/schedules-repo.ts +279 -0
  649. package/src/server/video-oauth-state.test.ts +120 -0
  650. package/src/server/video-oauth-state.ts +116 -0
  651. package/src/server/video-oauth.ts +99 -0
  652. package/src/shared/index.ts +366 -0
  653. package/src/version.ts +1 -0
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Slot computation — the heart of the scheduling package.
3
+ *
4
+ * Input: an event type's config (duration, buffers, limits, period),
5
+ * a schedule (weekly hours + date overrides),
6
+ * a set of busy intervals (from external calendars + existing bookings),
7
+ * a time range to compute over.
8
+ * Output: an array of Slot objects (UTC start/end) that are available
9
+ * and pass every constraint.
10
+ *
11
+ * Correctness priorities, in order:
12
+ * 1. Never return a slot in the past (respect `now + minimumBookingNotice`)
13
+ * 2. Never return a slot that overlaps a busy interval (with buffers)
14
+ * 3. Never return a slot outside the schedule's available windows
15
+ * 4. Never exceed booking limits (per-day/week/month/year)
16
+ * 5. Respect the event type's period (rolling / range / unlimited)
17
+ * 6. Correctness across DST transitions
18
+ */
19
+ import type {
20
+ Slot,
21
+ BusyInterval,
22
+ BookingLimits,
23
+ PeriodType,
24
+ } from "../shared/index.js";
25
+ import {
26
+ addMinutes,
27
+ getDayOfWeek,
28
+ formatLocalDate,
29
+ zonedTimeToUtc,
30
+ localDatesInRange,
31
+ overlaps,
32
+ } from "./time.js";
33
+ import { evaluateAvailabilityForDate, type ScheduleInput } from "./rules.js";
34
+ import { hasConflict, mergeBusy } from "./conflicts.js";
35
+ import {
36
+ exceedsLimits,
37
+ bucketKeysForSlot,
38
+ type BookingCounts,
39
+ } from "./limits.js";
40
+ import { expandSlotForConflictCheck } from "./buffers.js";
41
+
42
+ export interface ComputeSlotsInput {
43
+ /** Event type duration, minutes */
44
+ duration: number;
45
+ /** Minutes before event start where the event type becomes unbookable; 0 = up to now */
46
+ minimumBookingNotice: number;
47
+ /** Buffers in minutes applied to any existing busy interval and the candidate slot */
48
+ beforeEventBuffer: number;
49
+ afterEventBuffer: number;
50
+ /** Null = increment by duration */
51
+ slotInterval: number | null;
52
+ periodType: PeriodType;
53
+ periodDays?: number;
54
+ periodStartDate?: string;
55
+ periodEndDate?: string;
56
+ bookingLimits?: BookingLimits;
57
+ /** Schedule — intervals in schedule's timezone */
58
+ schedule: ScheduleInput;
59
+ /** Busy intervals in UTC (already aggregated from all sources) */
60
+ busy: BusyInterval[];
61
+ /** Existing bookings grouped by bucket key — used for limit enforcement */
62
+ bookingCounts?: BookingCounts;
63
+ /** Week start for limit-bucketing */
64
+ weekStartsOn?: 0 | 1;
65
+ /** Range to compute over, UTC */
66
+ rangeStart: Date;
67
+ rangeEnd: Date;
68
+ /** Current time (UTC). Defaults to now. */
69
+ now?: Date;
70
+ /** Seats per slot — if > 1, slot stays available until seats exhausted */
71
+ seatsPerTimeSlot?: number;
72
+ /** Seat count already reserved, keyed by ISO start */
73
+ seatsTaken?: Map<string, number>;
74
+ /** Timezone in which the Booker displays the slots (for limit buckets) */
75
+ viewerTimezone?: string;
76
+ }
77
+
78
+ export function computeAvailableSlots(input: ComputeSlotsInput): Slot[] {
79
+ const now = input.now ?? new Date();
80
+ const minBookableTime = addMinutes(now, input.minimumBookingNotice);
81
+
82
+ const rangeStart = capToPeriodStart(input, input.rangeStart, now);
83
+ const rangeEnd = capToPeriodEnd(input, input.rangeEnd, now);
84
+ if (rangeStart >= rangeEnd) return [];
85
+
86
+ const mergedBusy = mergeBusy(input.busy);
87
+ const interval = input.slotInterval ?? input.duration;
88
+ const viewerTz = input.viewerTimezone ?? input.schedule.timezone;
89
+ const slots: Slot[] = [];
90
+
91
+ // Enumerate each local day in the schedule's timezone that the range touches.
92
+ const dates = localDatesInRange(
93
+ rangeStart,
94
+ rangeEnd,
95
+ input.schedule.timezone,
96
+ );
97
+
98
+ for (const localDate of dates) {
99
+ const dow = dayOfWeekForLocalDate(localDate, input.schedule.timezone);
100
+ const dayIntervals = evaluateAvailabilityForDate(
101
+ input.schedule,
102
+ localDate,
103
+ dow,
104
+ );
105
+ if (dayIntervals.length === 0) continue;
106
+
107
+ for (const iv of dayIntervals) {
108
+ const dayStartUtc = zonedTimeToUtc(
109
+ localDate,
110
+ iv.startTime,
111
+ input.schedule.timezone,
112
+ );
113
+ const dayEndUtc = zonedTimeToUtc(
114
+ localDate,
115
+ iv.endTime,
116
+ input.schedule.timezone,
117
+ );
118
+
119
+ let slotStart = dayStartUtc;
120
+ while (addMinutes(slotStart, input.duration) <= dayEndUtc) {
121
+ const slotEnd = addMinutes(slotStart, input.duration);
122
+
123
+ // Cap to range
124
+ if (slotStart < rangeStart || slotEnd > rangeEnd) {
125
+ slotStart = addMinutes(slotStart, interval);
126
+ continue;
127
+ }
128
+
129
+ // Respect minimum notice
130
+ if (slotStart < minBookableTime) {
131
+ slotStart = addMinutes(slotStart, interval);
132
+ continue;
133
+ }
134
+
135
+ // Conflict check (expanded with buffers)
136
+ const expanded = expandSlotForConflictCheck(
137
+ slotStart,
138
+ slotEnd,
139
+ input.beforeEventBuffer,
140
+ input.afterEventBuffer,
141
+ );
142
+ if (hasConflict(expanded, mergedBusy)) {
143
+ slotStart = addMinutes(slotStart, interval);
144
+ continue;
145
+ }
146
+
147
+ // Booking limits (in viewer's timezone for perDay buckets)
148
+ if (
149
+ input.bookingCounts &&
150
+ exceedsLimits(
151
+ slotStart,
152
+ viewerTz,
153
+ input.bookingLimits,
154
+ input.bookingCounts,
155
+ input.weekStartsOn ?? 0,
156
+ )
157
+ ) {
158
+ slotStart = addMinutes(slotStart, interval);
159
+ continue;
160
+ }
161
+
162
+ // Seats
163
+ const seatsTaken = input.seatsTaken?.get(slotStart.toISOString()) ?? 0;
164
+ const seatsRemaining =
165
+ input.seatsPerTimeSlot != null
166
+ ? Math.max(0, input.seatsPerTimeSlot - seatsTaken)
167
+ : undefined;
168
+
169
+ if (input.seatsPerTimeSlot != null && seatsRemaining === 0) {
170
+ slotStart = addMinutes(slotStart, interval);
171
+ continue;
172
+ }
173
+
174
+ slots.push({
175
+ start: slotStart.toISOString(),
176
+ end: slotEnd.toISOString(),
177
+ available: true,
178
+ seatsRemaining,
179
+ });
180
+
181
+ slotStart = addMinutes(slotStart, interval);
182
+ }
183
+ }
184
+ }
185
+
186
+ return slots;
187
+ }
188
+
189
+ function capToPeriodStart(
190
+ input: ComputeSlotsInput,
191
+ rangeStart: Date,
192
+ now: Date,
193
+ ): Date {
194
+ if (input.periodType === "range" && input.periodStartDate) {
195
+ const start = new Date(input.periodStartDate);
196
+ return rangeStart > start ? rangeStart : start;
197
+ }
198
+ // Rolling + unlimited don't restrict start
199
+ return rangeStart > now ? rangeStart : now;
200
+ }
201
+
202
+ function capToPeriodEnd(
203
+ input: ComputeSlotsInput,
204
+ rangeEnd: Date,
205
+ now: Date,
206
+ ): Date {
207
+ if (input.periodType === "range" && input.periodEndDate) {
208
+ const end = new Date(input.periodEndDate);
209
+ return rangeEnd < end ? rangeEnd : end;
210
+ }
211
+ if (input.periodType === "rolling" && input.periodDays != null) {
212
+ const rollingEnd = addMinutes(now, input.periodDays * 24 * 60);
213
+ return rangeEnd < rollingEnd ? rangeEnd : rollingEnd;
214
+ }
215
+ return rangeEnd;
216
+ }
217
+
218
+ function dayOfWeekForLocalDate(localDate: string, timezone: string): number {
219
+ // Construct a UTC date that corresponds to noon on that local date in the
220
+ // target timezone, then ask what day-of-week it is in that timezone.
221
+ const noon = zonedTimeToUtc(localDate, "12:00", timezone);
222
+ return getDayOfWeek(noon, timezone);
223
+ }
@@ -0,0 +1,136 @@
1
+ /**
2
+ * DST-safe time math.
3
+ *
4
+ * Rules:
5
+ * - Never use raw `Date` arithmetic for anything timezone-aware.
6
+ * - Always work in UTC internally; convert at the edges.
7
+ * - Date strings are ISO-8601 (UTC). Local-day strings are "YYYY-MM-DD".
8
+ * - Times of day are "HH:MM" (24h, no seconds).
9
+ * - Timezones are IANA identifiers like "America/Los_Angeles".
10
+ */
11
+ import { TZDate } from "@date-fns/tz";
12
+ import { addMinutes as _addMinutes, differenceInMinutes } from "date-fns";
13
+
14
+ /** Parse an ISO 8601 string to a UTC Date. */
15
+ export function parseISO(iso: string): Date {
16
+ return new Date(iso);
17
+ }
18
+
19
+ /** Format a Date to an ISO 8601 UTC string ending in "Z". */
20
+ export function toISO(d: Date): string {
21
+ return d.toISOString();
22
+ }
23
+
24
+ /** Add minutes to a Date (UTC-safe; DST-safe because we stay in UTC). */
25
+ export function addMinutes(d: Date, minutes: number): Date {
26
+ return _addMinutes(d, minutes);
27
+ }
28
+
29
+ /** Minutes between two Dates (end - start). Can be negative. */
30
+ export function minutesBetween(start: Date, end: Date): number {
31
+ return differenceInMinutes(end, start);
32
+ }
33
+
34
+ /**
35
+ * Build a UTC Date from a local date + time of day + timezone.
36
+ *
37
+ * Example:
38
+ * zonedTimeToUtc("2026-04-04", "09:00", "America/Los_Angeles")
39
+ * → Date where UTC hour depends on whether PDT or PST is active.
40
+ */
41
+ export function zonedTimeToUtc(
42
+ localDate: string,
43
+ localTime: string,
44
+ timezone: string,
45
+ ): Date {
46
+ const [y, m, d] = localDate.split("-").map(Number);
47
+ const [h, mm] = localTime.split(":").map(Number);
48
+ // TZDate constructor takes local-in-timezone components and produces a
49
+ // Date whose UTC value is correct for that wall-clock time in `timezone`.
50
+ const tz = new TZDate(y, (m ?? 1) - 1, d ?? 1, h ?? 0, mm ?? 0, 0, timezone);
51
+ return new Date(tz.getTime());
52
+ }
53
+
54
+ /** Format a UTC Date into a "YYYY-MM-DD" string in the target timezone. */
55
+ export function formatLocalDate(d: Date, timezone: string): string {
56
+ const tz = new TZDate(d.getTime(), timezone);
57
+ const yyyy = tz.getFullYear();
58
+ const mm = String(tz.getMonth() + 1).padStart(2, "0");
59
+ const dd = String(tz.getDate()).padStart(2, "0");
60
+ return `${yyyy}-${mm}-${dd}`;
61
+ }
62
+
63
+ /** Format a UTC Date into a "HH:MM" string in the target timezone. */
64
+ export function formatLocalTime(d: Date, timezone: string): string {
65
+ const tz = new TZDate(d.getTime(), timezone);
66
+ const hh = String(tz.getHours()).padStart(2, "0");
67
+ const mm = String(tz.getMinutes()).padStart(2, "0");
68
+ return `${hh}:${mm}`;
69
+ }
70
+
71
+ /** Day of week (0=Sun, 6=Sat) for a UTC Date in the target timezone. */
72
+ export function getDayOfWeek(d: Date, timezone: string): number {
73
+ const tz = new TZDate(d.getTime(), timezone);
74
+ return tz.getDay();
75
+ }
76
+
77
+ /** True if two intervals overlap (end-exclusive). */
78
+ export function overlaps(
79
+ a: { start: Date; end: Date },
80
+ b: { start: Date; end: Date },
81
+ ): boolean {
82
+ return a.start < b.end && b.start < a.end;
83
+ }
84
+
85
+ /** Clamp a date range to a window. Returns null if they don't intersect. */
86
+ export function clampRange(
87
+ range: { start: Date; end: Date },
88
+ window: { start: Date; end: Date },
89
+ ): { start: Date; end: Date } | null {
90
+ const start = range.start > window.start ? range.start : window.start;
91
+ const end = range.end < window.end ? range.end : window.end;
92
+ if (start >= end) return null;
93
+ return { start, end };
94
+ }
95
+
96
+ /**
97
+ * Iterate UTC Date objects from start (inclusive) to end (exclusive) by
98
+ * stepping `stepMinutes`. Safe across DST because we never touch local time.
99
+ */
100
+ export function* steppedDates(
101
+ start: Date,
102
+ end: Date,
103
+ stepMinutes: number,
104
+ ): Generator<Date> {
105
+ let cursor = new Date(start.getTime());
106
+ while (cursor < end) {
107
+ yield cursor;
108
+ cursor = addMinutes(cursor, stepMinutes);
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Enumerate "YYYY-MM-DD" local dates in `timezone` from `startUtc` to `endUtc`.
114
+ * Useful for iterating per-day availability over a booking window.
115
+ */
116
+ export function localDatesInRange(
117
+ startUtc: Date,
118
+ endUtc: Date,
119
+ timezone: string,
120
+ ): string[] {
121
+ const out: string[] = [];
122
+ let cursor = startUtc;
123
+ let last = "";
124
+ while (cursor < endUtc) {
125
+ const d = formatLocalDate(cursor, timezone);
126
+ if (d !== last) {
127
+ out.push(d);
128
+ last = d;
129
+ }
130
+ cursor = addMinutes(cursor, 60);
131
+ }
132
+ // Include final local day even if loop stopped exactly at midnight boundary
133
+ const endLocal = formatLocalDate(new Date(endUtc.getTime() - 1), timezone);
134
+ if (out[out.length - 1] !== endLocal) out.push(endLocal);
135
+ return out;
136
+ }
package/src/index.ts ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @agent-native/scheduling
3
+ *
4
+ * Root entry — re-exports shared types and constants only.
5
+ * Subpath imports are the primary API surface:
6
+ *
7
+ * import { eventTypes, bookings } from "@agent-native/scheduling/schema";
8
+ * import { computeAvailableSlots } from "@agent-native/scheduling/core";
9
+ * import { useSlots } from "@agent-native/scheduling/react";
10
+ */
11
+
12
+ export * from "./shared/index.js";
13
+ export { MANIFEST } from "./manifest.js";
14
+ export { VERSION } from "./version.js";
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Machine-readable manifest of what this package ships.
3
+ *
4
+ * Consumed by `agent-native add scheduling` (or the template scaffolder) to:
5
+ * - generate stub action files in the consumer's `actions/` folder
6
+ * - symlink/copy skill files into the consumer's `.agents/skills/`
7
+ * - append required secret declarations
8
+ * - print the list in `agent-native info @agent-native/scheduling`
9
+ */
10
+
11
+ export interface SchedulingManifest {
12
+ name: string;
13
+ version: string;
14
+ actions: string[];
15
+ schemaEntryPoint: string;
16
+ docs: {
17
+ llms: string;
18
+ llmsFull: string;
19
+ skills: string[];
20
+ };
21
+ requiredSecrets: { key: string; label: string; optional?: boolean }[];
22
+ peerProviders: string[];
23
+ }
24
+
25
+ export const MANIFEST: SchedulingManifest = {
26
+ name: "@agent-native/scheduling",
27
+ version: "0.1.0",
28
+ actions: [
29
+ // Event types
30
+ "list-event-types",
31
+ "get-event-type",
32
+ "create-event-type",
33
+ "update-event-type",
34
+ "duplicate-event-type",
35
+ "delete-event-type",
36
+ "toggle-event-type-hidden",
37
+ "reorder-event-types",
38
+ "set-event-type-location",
39
+ "add-private-link",
40
+ "revoke-private-link",
41
+ // Availability / schedules
42
+ "list-schedules",
43
+ "create-schedule",
44
+ "update-schedule",
45
+ "delete-schedule",
46
+ "set-default-schedule",
47
+ "add-date-override",
48
+ "remove-date-override",
49
+ "get-availability",
50
+ "check-availability",
51
+ "find-available-slot",
52
+ // Bookings
53
+ "list-bookings",
54
+ "get-booking",
55
+ "create-booking",
56
+ "reschedule-booking",
57
+ "cancel-booking",
58
+ "confirm-booking",
59
+ "mark-no-show",
60
+ "add-booking-attendee",
61
+ "remove-booking-attendee",
62
+ "send-reschedule-link",
63
+ "add-booking-note",
64
+ "export-bookings-csv",
65
+ // Integrations
66
+ "list-calendar-integrations",
67
+ "connect-calendar",
68
+ "connect-video",
69
+ "disconnect-calendar",
70
+ "list-selected-calendars",
71
+ "toggle-selected-calendar",
72
+ "set-destination-calendar",
73
+ "refresh-busy-times",
74
+ "install-conferencing-app",
75
+ // Team
76
+ "create-team",
77
+ "invite-team-member",
78
+ "accept-team-invite",
79
+ "remove-team-member",
80
+ "update-member-role",
81
+ "set-team-branding",
82
+ // Round-robin / hosts
83
+ "assign-round-robin-host",
84
+ "set-event-type-hosts",
85
+ "set-host-availability-override",
86
+ "create-host-group",
87
+ // Settings / profile
88
+ "update-profile",
89
+ "set-appearance",
90
+ "set-default-conferencing-app",
91
+ // Workflows
92
+ "list-workflows",
93
+ "create-workflow",
94
+ "update-workflow",
95
+ "delete-workflow",
96
+ "toggle-workflow",
97
+ // Routing forms
98
+ "list-routing-forms",
99
+ "create-routing-form",
100
+ "update-routing-form",
101
+ "delete-routing-form",
102
+ "submit-routing-form-response",
103
+ "list-routing-form-responses",
104
+ ],
105
+ schemaEntryPoint: "@agent-native/scheduling/schema",
106
+ docs: {
107
+ llms: "docs/llms.txt",
108
+ llmsFull: "docs/llms-full.txt",
109
+ skills: [
110
+ "scheduling-basics",
111
+ "event-types",
112
+ "availability",
113
+ "bookings",
114
+ "booker",
115
+ "slot-engine",
116
+ "team-scheduling",
117
+ "integrations",
118
+ "embeds",
119
+ "workflows",
120
+ "routing-forms",
121
+ ],
122
+ },
123
+ requiredSecrets: [
124
+ {
125
+ key: "GOOGLE_CLIENT_ID",
126
+ label: "Google OAuth Client ID",
127
+ optional: true,
128
+ },
129
+ {
130
+ key: "GOOGLE_CLIENT_SECRET",
131
+ label: "Google OAuth Client Secret",
132
+ optional: true,
133
+ },
134
+ {
135
+ key: "MICROSOFT_CLIENT_ID",
136
+ label: "Microsoft OAuth Client ID",
137
+ optional: true,
138
+ },
139
+ {
140
+ key: "MICROSOFT_CLIENT_SECRET",
141
+ label: "Microsoft OAuth Client Secret",
142
+ optional: true,
143
+ },
144
+ { key: "ZOOM_CLIENT_ID", label: "Zoom OAuth Client ID", optional: true },
145
+ {
146
+ key: "ZOOM_CLIENT_SECRET",
147
+ label: "Zoom OAuth Client Secret",
148
+ optional: true,
149
+ },
150
+ {
151
+ key: "DAILY_API_KEY",
152
+ label: "Daily.co API Key (built-in video)",
153
+ optional: true,
154
+ },
155
+ {
156
+ key: "TWILIO_ACCOUNT_SID",
157
+ label: "Twilio Account SID (SMS workflows)",
158
+ optional: true,
159
+ },
160
+ { key: "TWILIO_AUTH_TOKEN", label: "Twilio Auth Token", optional: true },
161
+ {
162
+ key: "TWILIO_FROM_NUMBER",
163
+ label: "Twilio sender number",
164
+ optional: true,
165
+ },
166
+ ],
167
+ peerProviders: [
168
+ "google-calendar",
169
+ "office365",
170
+ "zoom",
171
+ "google-meet",
172
+ "builtin-video",
173
+ ],
174
+ };
@@ -0,0 +1,72 @@
1
+ /**
2
+ * SlotPicker — minimal, unstyled primitive that renders a vertical list of
3
+ * available slots grouped by date. Consumers style the buttons via their
4
+ * own Tailwind class layer.
5
+ *
6
+ * This is the "headless" spec: if you want a fully styled picker, look at
7
+ * `templates/scheduling/app/components/booker/SlotPicker.tsx`.
8
+ */
9
+ import type { Slot } from "../../shared/index.js";
10
+ import { TZDate } from "@date-fns/tz";
11
+ import { format } from "date-fns";
12
+ import React from "react";
13
+
14
+ export interface SlotPickerProps {
15
+ slots: Slot[];
16
+ timezone: string;
17
+ selectedStart?: string;
18
+ onSelect: (slot: Slot) => void;
19
+ timeFormat?: "12h" | "24h";
20
+ className?: string;
21
+ slotClassName?: string;
22
+ dayClassName?: string;
23
+ }
24
+
25
+ export function SlotPicker(props: SlotPickerProps) {
26
+ const grouped = new Map<string, Slot[]>();
27
+ for (const s of props.slots) {
28
+ const localDay = format(
29
+ new TZDate(new Date(s.start).getTime(), props.timezone),
30
+ "yyyy-MM-dd",
31
+ );
32
+ if (!grouped.has(localDay)) grouped.set(localDay, []);
33
+ grouped.get(localDay)!.push(s);
34
+ }
35
+ const fmt = props.timeFormat === "24h" ? "HH:mm" : "h:mma";
36
+
37
+ return (
38
+ <div className={props.className ?? ""}>
39
+ {Array.from(grouped.entries()).map(([date, daySlots]) => (
40
+ <section key={date} className={props.dayClassName ?? ""}>
41
+ <header>
42
+ {format(
43
+ new TZDate(`${date}T12:00:00Z`, props.timezone),
44
+ "EEEE, MMM d",
45
+ )}
46
+ </header>
47
+ <ul>
48
+ {daySlots.map((s) => (
49
+ <li key={s.start}>
50
+ <button
51
+ type="button"
52
+ className={props.slotClassName ?? ""}
53
+ aria-pressed={props.selectedStart === s.start}
54
+ disabled={!s.available}
55
+ onClick={() => props.onSelect(s)}
56
+ >
57
+ {format(
58
+ new TZDate(new Date(s.start).getTime(), props.timezone),
59
+ fmt,
60
+ )}
61
+ {s.seatsRemaining != null && s.seatsRemaining > 0 && (
62
+ <span> · {s.seatsRemaining} left</span>
63
+ )}
64
+ </button>
65
+ </li>
66
+ ))}
67
+ </ul>
68
+ </section>
69
+ ))}
70
+ </div>
71
+ );
72
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * TimezoneSelect — unstyled primitive. A native <select> with the full IANA
3
+ * list. Consumer should swap the outer element for shadcn Select.
4
+ */
5
+ import React from "react";
6
+
7
+ export interface TimezoneSelectProps {
8
+ value: string;
9
+ onChange: (tz: string) => void;
10
+ className?: string;
11
+ }
12
+
13
+ // A compact list; consumers can replace with the full 600+ IANA zones from
14
+ // `Intl.supportedValuesOf("timeZone")` at the call site if they need all of them.
15
+ const COMMON_ZONES = [
16
+ "UTC",
17
+ "America/New_York",
18
+ "America/Chicago",
19
+ "America/Denver",
20
+ "America/Los_Angeles",
21
+ "America/Sao_Paulo",
22
+ "Europe/London",
23
+ "Europe/Paris",
24
+ "Europe/Berlin",
25
+ "Europe/Moscow",
26
+ "Africa/Cairo",
27
+ "Asia/Jerusalem",
28
+ "Asia/Dubai",
29
+ "Asia/Kolkata",
30
+ "Asia/Singapore",
31
+ "Asia/Tokyo",
32
+ "Asia/Shanghai",
33
+ "Australia/Sydney",
34
+ "Pacific/Auckland",
35
+ ];
36
+
37
+ export function TimezoneSelect(props: TimezoneSelectProps) {
38
+ const supported =
39
+ typeof Intl !== "undefined" && (Intl as any).supportedValuesOf
40
+ ? (Intl as any).supportedValuesOf("timeZone")
41
+ : COMMON_ZONES;
42
+ return (
43
+ <select
44
+ value={props.value}
45
+ onChange={(e) => props.onChange(e.currentTarget.value)}
46
+ className={props.className ?? ""}
47
+ >
48
+ {supported.map((tz: string) => (
49
+ <option key={tz} value={tz}>
50
+ {tz}
51
+ </option>
52
+ ))}
53
+ </select>
54
+ );
55
+ }